@neilurk12/pi-agent-modes 0.1.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.
@@ -0,0 +1,175 @@
1
+ export const REQUIRED_BUILT_IN_MODES = ["yolo", "plan", "code", "ask", "orchestrator"];
2
+ function diagnostic(level, message, extras = {}) {
3
+ return { level, message, ...extras };
4
+ }
5
+ function validateModeDefinition(parsed, expectedMode, file) {
6
+ if (!parsed || typeof parsed !== "object") {
7
+ throw new Error("YAML frontmatter must be an object");
8
+ }
9
+ if (parsed.mode !== expectedMode) {
10
+ throw new Error(`Mode field '${parsed.mode}' does not match filename '${expectedMode}'`);
11
+ }
12
+ if (parsed.enabled_tools !== undefined) {
13
+ if (!Array.isArray(parsed.enabled_tools)) {
14
+ throw new Error("enabled_tools must be an array when present");
15
+ }
16
+ if (!parsed.enabled_tools.every((tool) => typeof tool === "string")) {
17
+ throw new Error("enabled_tools must contain only strings");
18
+ }
19
+ }
20
+ if (parsed.bash_policy !== undefined && !["strict_readonly", "non_destructive", "off"].includes(parsed.bash_policy)) {
21
+ throw new Error("bash_policy must be one of strict_readonly, non_destructive, off");
22
+ }
23
+ if (parsed.border_style !== undefined && !["accent", "warning", "success", "muted"].includes(parsed.border_style)) {
24
+ throw new Error("border_style must be one of accent, warning, success, muted");
25
+ }
26
+ return {
27
+ mode: parsed.mode,
28
+ enabled_tools: parsed.enabled_tools,
29
+ bash_policy: parsed.bash_policy,
30
+ prompt_suffix: parsed.prompt_suffix,
31
+ description: parsed.description,
32
+ border_label: parsed.border_label,
33
+ border_style: parsed.border_style,
34
+ };
35
+ }
36
+ async function parseModeDocumentFromMarkdown(filePath, mode) {
37
+ const fs = (await import("fs")).promises;
38
+ const yaml = (await import("js-yaml")).default;
39
+ try {
40
+ const raw = await fs.readFile(filePath, "utf-8");
41
+ const frontmatterMatch = raw.match(/^---\s*\n([\s\S]*?)\n---/);
42
+ if (!frontmatterMatch) {
43
+ throw new Error("No YAML frontmatter found");
44
+ }
45
+ return { mode, file: filePath, parsed: yaml.load(frontmatterMatch[1]) };
46
+ }
47
+ catch (err) {
48
+ return { mode, file: filePath, error: err.message };
49
+ }
50
+ }
51
+ export async function loadModeFromMarkdown(filePath, mode) {
52
+ const document = await parseModeDocumentFromMarkdown(filePath, mode);
53
+ if (document.error)
54
+ throw new Error(document.error);
55
+ return validateModeDefinition(document.parsed, mode, filePath);
56
+ }
57
+ async function listMarkdownModes(modesDir, diagnostics) {
58
+ const fs = (await import("fs")).promises;
59
+ const modes = new Set(REQUIRED_BUILT_IN_MODES);
60
+ try {
61
+ const files = await fs.readdir(modesDir);
62
+ for (const file of files) {
63
+ if (file.endsWith(".md"))
64
+ modes.add(file.replace(/\.md$/, ""));
65
+ }
66
+ }
67
+ catch (err) {
68
+ diagnostics.push(diagnostic("error", `Modes directory read error: ${err.message}`, { file: modesDir }));
69
+ }
70
+ return modes;
71
+ }
72
+ async function parseUserOverrides(userConfigPath) {
73
+ const fs = (await import("fs")).promises;
74
+ const yaml = (await import("js-yaml")).default;
75
+ try {
76
+ const raw = await fs.readFile(userConfigPath, "utf-8");
77
+ try {
78
+ return { file: userConfigPath, parsed: yaml.load(raw) };
79
+ }
80
+ catch (err) {
81
+ return { file: userConfigPath, parseError: err.message };
82
+ }
83
+ }
84
+ catch (err) {
85
+ if (err.code === "ENOENT")
86
+ return undefined;
87
+ return { file: userConfigPath, readError: err.message };
88
+ }
89
+ }
90
+ function applyUserOverrides(definitions, userOverrides, diagnostics) {
91
+ if (!userOverrides)
92
+ return;
93
+ if (userOverrides.readError) {
94
+ diagnostics.push(diagnostic("warning", `User override read error: ${userOverrides.readError}`, { file: userOverrides.file }));
95
+ return;
96
+ }
97
+ if (userOverrides.parseError) {
98
+ diagnostics.push(diagnostic("warning", `User override parse error: ${userOverrides.parseError}`, { file: userOverrides.file }));
99
+ return;
100
+ }
101
+ const parsed = userOverrides.parsed;
102
+ if (!parsed || typeof parsed !== "object")
103
+ return;
104
+ for (const [mode, overrides] of Object.entries(parsed)) {
105
+ if (!definitions.has(mode)) {
106
+ diagnostics.push(diagnostic("warning", `Unknown user override ignored: ${mode}`, { mode, file: userOverrides.file }));
107
+ continue;
108
+ }
109
+ if (!overrides || typeof overrides !== "object" || Array.isArray(overrides)) {
110
+ diagnostics.push(diagnostic("warning", `User override for '${mode}' must be an object`, { mode, file: userOverrides.file }));
111
+ continue;
112
+ }
113
+ definitions.set(mode, { ...definitions.get(mode), ...overrides, mode });
114
+ }
115
+ }
116
+ export function buildModeCatalog(input) {
117
+ const diagnostics = [...(input.diagnostics ?? [])];
118
+ const definitions = new Map();
119
+ const fileForMode = input.fileForMode ?? ((mode) => mode);
120
+ for (const document of input.modeDocuments) {
121
+ if (document.error) {
122
+ const required = REQUIRED_BUILT_IN_MODES.includes(document.mode);
123
+ diagnostics.push(diagnostic(required ? "error" : "warning", `Mode '${document.mode}' load error: ${document.error}`, { mode: document.mode, file: document.file }));
124
+ continue;
125
+ }
126
+ try {
127
+ definitions.set(document.mode, validateModeDefinition(document.parsed, document.mode, document.file));
128
+ }
129
+ catch (err) {
130
+ const required = REQUIRED_BUILT_IN_MODES.includes(document.mode);
131
+ diagnostics.push(diagnostic(required ? "error" : "warning", `Mode '${document.mode}' load error: ${err.message}`, { mode: document.mode, file: document.file }));
132
+ }
133
+ }
134
+ for (const mode of REQUIRED_BUILT_IN_MODES) {
135
+ if (!definitions.has(mode)) {
136
+ diagnostics.push(diagnostic("error", `Required built-in mode missing: ${mode}`, { mode, file: fileForMode(mode) }));
137
+ }
138
+ }
139
+ if (diagnostics.some(d => d.level === "error")) {
140
+ return { ok: false, diagnostics };
141
+ }
142
+ applyUserOverrides(definitions, input.userOverrides, diagnostics);
143
+ return {
144
+ ok: true,
145
+ catalog: { definitions, loadedAt: input.now?.() ?? Date.now() },
146
+ diagnostics,
147
+ };
148
+ }
149
+ export async function loadAllModes(options = {}) {
150
+ const path = await import("path");
151
+ const os = await import("os");
152
+ const baseDir = path.dirname(new URL(import.meta.url).pathname);
153
+ const modesDir = options.modesDir ?? path.join(baseDir, "..", "modes");
154
+ const userConfigPath = options.userConfigPath ?? path.join(os.homedir(), ".pi", "modes", "config.yaml");
155
+ const diagnostics = [];
156
+ const modesToLoad = await listMarkdownModes(modesDir, diagnostics);
157
+ const modeDocuments = [];
158
+ for (const mode of modesToLoad) {
159
+ const filePath = path.join(modesDir, `${mode}.md`);
160
+ modeDocuments.push(await parseModeDocumentFromMarkdown(filePath, mode));
161
+ }
162
+ return buildModeCatalog({
163
+ modeDocuments,
164
+ userOverrides: await parseUserOverrides(userConfigPath),
165
+ diagnostics,
166
+ fileForMode: (mode) => path.join(modesDir, `${mode}.md`),
167
+ now: options.now,
168
+ });
169
+ }
170
+ export function notifyModeCatalogDiagnostics(ctx, diagnostics) {
171
+ for (const item of diagnostics) {
172
+ ctx.ui.notify(item.message, item.level === "error" ? "error" : "warning");
173
+ }
174
+ }
175
+ //# sourceMappingURL=mode-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-catalog.js","sourceRoot":"","sources":["../src/mode-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import type { ModeCatalog } from "./mode-catalog.js";
2
+ import type { ModeDefinition } from "./types.js";
3
+ export type Mode = string;
4
+ export interface ModeRuntimeControllerOptions {
5
+ defaultMode?: Mode;
6
+ safeFallbackModes?: readonly Mode[];
7
+ }
8
+ export interface ModeRuntimeSnapshot {
9
+ currentMode: Mode;
10
+ modes: Mode[];
11
+ loadedAt: number;
12
+ }
13
+ export interface ModeRuntimeEffects {
14
+ modeChanged: boolean;
15
+ persist: boolean;
16
+ activeTools: string[];
17
+ }
18
+ export interface ModeRestoreInput {
19
+ cliMode?: string;
20
+ sessionMode?: string;
21
+ }
22
+ export interface SetModeResult {
23
+ ok: boolean;
24
+ mode?: Mode;
25
+ effects?: ModeRuntimeEffects;
26
+ error?: string;
27
+ }
28
+ export interface ReloadCatalogResult {
29
+ accepted: boolean;
30
+ modeChanged: boolean;
31
+ fallbackMode?: Mode;
32
+ effects?: ModeRuntimeEffects;
33
+ }
34
+ export type ModeRuntimeEventType = "session_start" | "mode_select" | "mode_cycle" | "mode_reload_result" | "tool_call" | "turn_end";
35
+ export interface ModeRuntimeTransitionInput {
36
+ type: ModeRuntimeEventType;
37
+ cliMode?: string;
38
+ sessionMode?: string;
39
+ requestedMode?: string;
40
+ catalog?: ModeCatalog;
41
+ toolName?: string;
42
+ }
43
+ export interface ModeRuntimeStatus {
44
+ mode: Mode;
45
+ borderStyle: NonNullable<ModeDefinition["border_style"]>;
46
+ }
47
+ export interface ModeRuntimeNotification {
48
+ level: "info" | "warning" | "error";
49
+ message: string;
50
+ }
51
+ export interface ModeRuntimeDecision {
52
+ nextState: ModeRuntimeSnapshot;
53
+ modeChanged: boolean;
54
+ activeTools: string[];
55
+ status: ModeRuntimeStatus;
56
+ persistModeState: boolean;
57
+ notifications: ModeRuntimeNotification[];
58
+ toolCallVerdict?: {
59
+ allow: boolean;
60
+ reason?: string;
61
+ };
62
+ acceptedCatalog?: boolean;
63
+ fallbackMode?: Mode;
64
+ error?: string;
65
+ }
66
+ export declare class ModeRuntimeController {
67
+ private catalog;
68
+ private currentMode;
69
+ private baselineTools;
70
+ private readonly defaultMode;
71
+ private readonly safeFallbackModes;
72
+ constructor(catalog: ModeCatalog, options?: ModeRuntimeControllerOptions);
73
+ snapshot(): ModeRuntimeSnapshot;
74
+ modes(): Mode[];
75
+ definition(mode?: Mode): ModeDefinition | undefined;
76
+ lastLoadTime(): number;
77
+ captureBaselineTools(toolNames: string[]): void;
78
+ transition(input: ModeRuntimeTransitionInput): ModeRuntimeDecision;
79
+ restore(input: ModeRestoreInput): ModeRuntimeEffects;
80
+ setMode(mode: Mode): SetModeResult;
81
+ cycleMode(): ModeRuntimeEffects;
82
+ acceptCatalog(catalog: ModeCatalog): ReloadCatalogResult;
83
+ keepCatalog(): ReloadCatalogResult;
84
+ currentPromptSuffix(): string | undefined;
85
+ activeTools(): string[];
86
+ private pickRestoreMode;
87
+ private safeFallbackMode;
88
+ private firstAvailableMode;
89
+ private effectsFromDecision;
90
+ private decision;
91
+ }
92
+ //# sourceMappingURL=mode-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-runtime.d.ts","sourceRoot":"","sources":["../src/mode-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ export class ModeRuntimeController {
2
+ constructor(catalog, options = {}) {
3
+ this.baselineTools = [];
4
+ this.catalog = catalog;
5
+ this.defaultMode = options.defaultMode ?? "yolo";
6
+ this.safeFallbackModes = options.safeFallbackModes ?? ["plan", "ask", "yolo"];
7
+ this.currentMode = this.catalog.definitions.has(this.defaultMode)
8
+ ? this.defaultMode
9
+ : this.firstAvailableMode();
10
+ }
11
+ snapshot() {
12
+ return {
13
+ currentMode: this.currentMode,
14
+ modes: this.modes(),
15
+ loadedAt: this.catalog.loadedAt,
16
+ };
17
+ }
18
+ modes() {
19
+ return Array.from(this.catalog.definitions.keys());
20
+ }
21
+ definition(mode = this.currentMode) {
22
+ return this.catalog.definitions.get(mode);
23
+ }
24
+ lastLoadTime() {
25
+ return this.catalog.loadedAt;
26
+ }
27
+ captureBaselineTools(toolNames) {
28
+ if (this.baselineTools.length === 0) {
29
+ this.baselineTools = [...toolNames];
30
+ }
31
+ }
32
+ transition(input) {
33
+ switch (input.type) {
34
+ case "session_start": {
35
+ const nextMode = this.pickRestoreMode(input.cliMode, input.sessionMode);
36
+ const modeChanged = nextMode !== this.currentMode;
37
+ this.currentMode = nextMode;
38
+ return this.decision({ modeChanged, persistModeState: false });
39
+ }
40
+ case "mode_select": {
41
+ const requestedMode = normalizeMode(input.requestedMode);
42
+ if (!requestedMode || !this.catalog.definitions.has(requestedMode)) {
43
+ return this.decision({
44
+ modeChanged: false,
45
+ persistModeState: false,
46
+ error: `Invalid mode: ${input.requestedMode}. Available: ${this.modes().join(", ")}`,
47
+ notifications: [{
48
+ level: "error",
49
+ message: `Invalid mode: ${input.requestedMode}. Available: ${this.modes().join(", ")}`,
50
+ }],
51
+ });
52
+ }
53
+ const modeChanged = requestedMode !== this.currentMode;
54
+ this.currentMode = requestedMode;
55
+ return this.decision({ modeChanged, persistModeState: modeChanged });
56
+ }
57
+ case "mode_cycle": {
58
+ const modes = this.modes();
59
+ const curIndex = modes.indexOf(this.currentMode);
60
+ const next = modes[(curIndex + 1) % modes.length] ?? this.firstAvailableMode();
61
+ const modeChanged = next !== this.currentMode;
62
+ this.currentMode = next;
63
+ return this.decision({ modeChanged, persistModeState: modeChanged });
64
+ }
65
+ case "mode_reload_result": {
66
+ if (!input.catalog) {
67
+ return this.decision({ acceptedCatalog: false });
68
+ }
69
+ this.catalog = input.catalog;
70
+ let fallbackMode;
71
+ let modeChanged = false;
72
+ const notifications = [];
73
+ if (!this.catalog.definitions.has(this.currentMode)) {
74
+ fallbackMode = this.safeFallbackMode();
75
+ modeChanged = fallbackMode !== this.currentMode;
76
+ this.currentMode = fallbackMode;
77
+ }
78
+ if (fallbackMode) {
79
+ notifications.push({
80
+ level: "warning",
81
+ message: `Mode definitions reloaded; current mode missing, fell back to ${fallbackMode.toUpperCase()}`,
82
+ });
83
+ }
84
+ else {
85
+ notifications.push({ level: "info", message: "Mode definitions reloaded" });
86
+ }
87
+ return this.decision({
88
+ acceptedCatalog: true,
89
+ modeChanged,
90
+ fallbackMode,
91
+ persistModeState: modeChanged,
92
+ notifications,
93
+ });
94
+ }
95
+ case "tool_call":
96
+ return this.decision({
97
+ toolCallVerdict: { allow: true },
98
+ persistModeState: false,
99
+ modeChanged: false,
100
+ });
101
+ case "turn_end":
102
+ return this.decision({ modeChanged: false, persistModeState: true });
103
+ }
104
+ }
105
+ restore(input) {
106
+ return this.effectsFromDecision(this.transition({
107
+ type: "session_start",
108
+ cliMode: input.cliMode,
109
+ sessionMode: input.sessionMode,
110
+ }));
111
+ }
112
+ setMode(mode) {
113
+ const decision = this.transition({ type: "mode_select", requestedMode: mode });
114
+ if (decision.error) {
115
+ return { ok: false, error: decision.error };
116
+ }
117
+ return {
118
+ ok: true,
119
+ mode: this.currentMode,
120
+ effects: this.effectsFromDecision(decision),
121
+ };
122
+ }
123
+ cycleMode() {
124
+ const decision = this.transition({ type: "mode_cycle" });
125
+ return this.effectsFromDecision(decision);
126
+ }
127
+ acceptCatalog(catalog) {
128
+ const decision = this.transition({ type: "mode_reload_result", catalog });
129
+ return {
130
+ accepted: decision.acceptedCatalog ?? true,
131
+ modeChanged: decision.modeChanged,
132
+ fallbackMode: decision.fallbackMode,
133
+ effects: this.effectsFromDecision(decision),
134
+ };
135
+ }
136
+ keepCatalog() {
137
+ return { accepted: false, modeChanged: false };
138
+ }
139
+ currentPromptSuffix() {
140
+ return this.definition()?.prompt_suffix;
141
+ }
142
+ activeTools() {
143
+ const enabled = this.definition()?.enabled_tools;
144
+ return enabled && enabled.length > 0 ? [...enabled] : [...this.baselineTools];
145
+ }
146
+ pickRestoreMode(cliMode, sessionMode) {
147
+ const cli = normalizeMode(cliMode);
148
+ if (cli && this.catalog.definitions.has(cli))
149
+ return cli;
150
+ const session = normalizeMode(sessionMode);
151
+ if (session && this.catalog.definitions.has(session))
152
+ return session;
153
+ if (this.catalog.definitions.has(this.currentMode))
154
+ return this.currentMode;
155
+ return this.safeFallbackMode();
156
+ }
157
+ safeFallbackMode() {
158
+ for (const mode of this.safeFallbackModes) {
159
+ if (this.catalog.definitions.has(mode))
160
+ return mode;
161
+ }
162
+ return this.firstAvailableMode();
163
+ }
164
+ firstAvailableMode() {
165
+ return this.modes()[0] ?? this.defaultMode;
166
+ }
167
+ effectsFromDecision(decision) {
168
+ return {
169
+ modeChanged: decision.modeChanged,
170
+ persist: decision.persistModeState,
171
+ activeTools: decision.activeTools,
172
+ };
173
+ }
174
+ decision({ modeChanged = false, persistModeState = false, notifications = [], toolCallVerdict, acceptedCatalog, fallbackMode, error, }) {
175
+ const status = {
176
+ mode: this.currentMode,
177
+ borderStyle: this.definition()?.border_style ?? "muted",
178
+ };
179
+ return {
180
+ nextState: this.snapshot(),
181
+ modeChanged,
182
+ activeTools: this.activeTools(),
183
+ status,
184
+ persistModeState,
185
+ notifications,
186
+ toolCallVerdict,
187
+ acceptedCatalog,
188
+ fallbackMode,
189
+ error,
190
+ };
191
+ }
192
+ }
193
+ function normalizeMode(mode) {
194
+ const normalized = mode?.trim().toLowerCase();
195
+ return normalized || undefined;
196
+ }
197
+ //# sourceMappingURL=mode-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-runtime.js","sourceRoot":"","sources":["../src/mode-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ModeDefinition } from "./types.js";
2
+ export interface ModeToolPolicyInput {
3
+ mode: string;
4
+ definition?: ModeDefinition;
5
+ toolName: string;
6
+ input?: unknown;
7
+ }
8
+ export interface ModeToolPolicyDecision {
9
+ block: boolean;
10
+ reason?: string;
11
+ }
12
+ export declare function evaluateToolCall({ mode, definition, toolName, input }: ModeToolPolicyInput): ModeToolPolicyDecision;
13
+ //# sourceMappingURL=mode-tool-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-tool-policy.d.ts","sourceRoot":"","sources":["../src/mode-tool-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAqGD,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,mBAAmB,GAAG,sBAAsB,CAkDnH"}