@vitos-pizza/vitos-pizza 0.1.0 → 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/AGENTS.md +158 -158
- package/CHANGELOG.md +42 -24
- package/LICENSE +21 -21
- package/README.md +237 -234
- package/assets/logo.svg +28 -28
- package/node_modules/@vitos-pizza/agent-mode/extensions/index.ts +138 -117
- package/node_modules/@vitos-pizza/agent-mode/package.json +3 -3
- package/node_modules/@vitos-pizza/agent-mode/src/apply-mode.ts +60 -60
- package/node_modules/@vitos-pizza/agent-mode/src/mode-events.ts +102 -102
- package/node_modules/@vitos-pizza/agent-mode/src/modes.ts +43 -43
- package/node_modules/@vitos-pizza/agent-mode/src/plan-instructions.ts +85 -44
- package/node_modules/@vitos-pizza/agent-mode/tests/apply-mode.test.ts +36 -36
- package/node_modules/@vitos-pizza/agent-mode/tests/mode-events.test.ts +22 -22
- package/node_modules/@vitos-pizza/agent-mode/tests/modes.test.ts +38 -38
- package/node_modules/@vitos-pizza/agent-mode/tests/plan-instructions.test.ts +68 -45
- package/node_modules/@vitos-pizza/agent-mode/tsconfig.json +13 -13
- package/node_modules/@vitos-pizza/agent-mode/vitest.config.ts +8 -8
- package/node_modules/@vitos-pizza/keybindings/extensions/index.ts +104 -104
- package/node_modules/@vitos-pizza/keybindings/package.json +1 -1
- package/node_modules/@vitos-pizza/keybindings/presets/shortcuts.json +3 -3
- package/node_modules/@vitos-pizza/keybindings/src/bind.ts +57 -57
- package/node_modules/@vitos-pizza/keybindings/src/config.ts +84 -84
- package/node_modules/@vitos-pizza/keybindings/src/registry.ts +43 -43
- package/node_modules/@vitos-pizza/keybindings/src/types.ts +54 -54
- package/node_modules/@vitos-pizza/keybindings/tests/config.test.ts +83 -83
- package/node_modules/@vitos-pizza/keybindings/tests/registry.test.ts +142 -142
- package/node_modules/@vitos-pizza/keybindings/tsconfig.json +13 -13
- package/node_modules/@vitos-pizza/keybindings/vitest.config.ts +8 -8
- package/node_modules/@vitos-pizza/permission-system/extensions/index.ts +162 -162
- package/node_modules/@vitos-pizza/permission-system/package.json +2 -2
- package/node_modules/@vitos-pizza/permission-system/src/bash/matcher.ts +54 -51
- package/node_modules/@vitos-pizza/permission-system/src/bash/parser.ts +40 -40
- package/node_modules/@vitos-pizza/permission-system/src/config-paths.ts +23 -23
- package/node_modules/@vitos-pizza/permission-system/src/detect-preset-mode.ts +61 -61
- package/node_modules/@vitos-pizza/permission-system/src/expand-home.ts +12 -12
- package/node_modules/@vitos-pizza/permission-system/src/forwarding/forwarder.ts +224 -224
- package/node_modules/@vitos-pizza/permission-system/src/forwarding/subagent-registry.ts +61 -61
- package/node_modules/@vitos-pizza/permission-system/src/gates/path-utils.ts +66 -66
- package/node_modules/@vitos-pizza/permission-system/src/gates/pipeline.ts +151 -155
- package/node_modules/@vitos-pizza/permission-system/src/handlers/before-agent-start.ts +86 -65
- package/node_modules/@vitos-pizza/permission-system/src/handlers/skill-input.ts +1 -1
- package/node_modules/@vitos-pizza/permission-system/src/handlers/tool-call-gate.ts +204 -199
- package/node_modules/@vitos-pizza/permission-system/src/mode-api.ts +44 -44
- package/node_modules/@vitos-pizza/permission-system/src/permission-evaluator.ts +233 -216
- package/node_modules/@vitos-pizza/permission-system/src/permission-session.ts +62 -62
- package/node_modules/@vitos-pizza/permission-system/src/policy-loader.ts +211 -211
- package/node_modules/@vitos-pizza/permission-system/src/sanitizers/skill-prompt.ts +99 -99
- package/node_modules/@vitos-pizza/permission-system/src/sanitizers/system-prompt.ts +221 -221
- package/node_modules/@vitos-pizza/permission-system/src/service.ts +66 -66
- package/node_modules/@vitos-pizza/permission-system/src/session-approvals.ts +4 -1
- package/node_modules/@vitos-pizza/permission-system/src/types.ts +80 -80
- package/node_modules/@vitos-pizza/permission-system/src/ui/approval-summary.ts +43 -43
- package/node_modules/@vitos-pizza/permission-system/src/ui/config-modal.ts +36 -36
- package/node_modules/@vitos-pizza/permission-system/src/ui/permission-dialog.ts +52 -52
- package/node_modules/@vitos-pizza/permission-system/src/wildcard-matcher.ts +81 -81
- package/node_modules/@vitos-pizza/permission-system/src/yaml-frontmatter.ts +84 -84
- package/node_modules/@vitos-pizza/permission-system/src/yolo/runtime-api.ts +49 -49
- package/node_modules/@vitos-pizza/permission-system/tests/bash-parser.test.ts +32 -32
- package/node_modules/@vitos-pizza/permission-system/tests/before-agent-start.test.ts +61 -0
- package/node_modules/@vitos-pizza/permission-system/tests/detect-preset-mode.test.ts +68 -68
- package/node_modules/@vitos-pizza/permission-system/tests/forwarder.test.ts +55 -55
- package/node_modules/@vitos-pizza/permission-system/tests/gates.test.ts +170 -61
- package/node_modules/@vitos-pizza/permission-system/tests/path-utils.test.ts +68 -68
- package/node_modules/@vitos-pizza/permission-system/tests/permission-evaluator.test.ts +82 -55
- package/node_modules/@vitos-pizza/permission-system/tests/policy-loader.test.ts +25 -25
- package/node_modules/@vitos-pizza/permission-system/tests/system-prompt-sanitizer.test.ts +22 -22
- package/node_modules/@vitos-pizza/permission-system/tests/wildcard-matcher.test.ts +27 -27
- package/node_modules/@vitos-pizza/permission-system/tsconfig.json +13 -13
- package/node_modules/@vitos-pizza/permission-system/vitest.config.ts +8 -8
- package/node_modules/@vitos-pizza/question/package.json +1 -1
- package/node_modules/@vitos-pizza/question/src/question-ui.ts +5 -1
- package/node_modules/@vitos-pizza/question/src/register-tool.ts +1 -4
- package/node_modules/@vitos-pizza/question/tests/question-ui-width-cache.test.ts +45 -0
- package/node_modules/@vitos-pizza/question/tests/register-tool-render.test.ts +48 -45
- package/node_modules/@vitos-pizza/session-title/extensions/index.ts +137 -137
- package/node_modules/@vitos-pizza/session-title/package.json +3 -3
- package/node_modules/@vitos-pizza/session-title/src/build-title-prompt.ts +16 -16
- package/node_modules/@vitos-pizza/session-title/src/extract-title-context.ts +55 -55
- package/node_modules/@vitos-pizza/session-title/src/fast-rules.ts +48 -48
- package/node_modules/@vitos-pizza/session-title/src/load-settings.ts +70 -70
- package/node_modules/@vitos-pizza/session-title/src/normalize-title.ts +20 -20
- package/node_modules/@vitos-pizza/session-title/src/parse-title-response.ts +6 -6
- package/node_modules/@vitos-pizza/session-title/src/resolve-title-model.ts +33 -33
- package/node_modules/@vitos-pizza/session-title/src/schedule-title-job.ts +53 -53
- package/node_modules/@vitos-pizza/session-title/src/should-schedule.ts +30 -30
- package/node_modules/@vitos-pizza/session-title/src/title-agent.ts +60 -60
- package/node_modules/@vitos-pizza/session-title/src/truncate-input.ts +10 -10
- package/node_modules/@vitos-pizza/session-title/src/types.ts +29 -29
- package/node_modules/@vitos-pizza/session-title/tests/build-title-prompt.test.ts +34 -34
- package/node_modules/@vitos-pizza/session-title/tests/extension.test.ts +198 -198
- package/node_modules/@vitos-pizza/session-title/tests/extract-title-context.test.ts +48 -48
- package/node_modules/@vitos-pizza/session-title/tests/fast-rules.test.ts +43 -43
- package/node_modules/@vitos-pizza/session-title/tests/parse-title-response.test.ts +34 -34
- package/node_modules/@vitos-pizza/session-title/tests/should-schedule.test.ts +30 -30
- package/node_modules/@vitos-pizza/session-title/tests/title-agent.test.ts +154 -154
- package/node_modules/@vitos-pizza/session-title/tests/truncate-input.test.ts +15 -15
- package/node_modules/@vitos-pizza/session-title/tsconfig.json +13 -13
- package/node_modules/@vitos-pizza/session-title/vitest.config.ts +8 -8
- package/node_modules/@vitos-pizza/subagents/agents/planner.md +46 -43
- package/node_modules/@vitos-pizza/subagents/agents/scout.md +40 -40
- package/node_modules/@vitos-pizza/subagents/agents/title.md +13 -13
- package/node_modules/@vitos-pizza/subagents/agents/worker.md +36 -36
- package/node_modules/@vitos-pizza/subagents/extensions/index.ts +164 -164
- package/node_modules/@vitos-pizza/subagents/package.json +1 -1
- package/node_modules/@vitos-pizza/subagents/skills/subagents/SKILL.md +86 -80
- package/node_modules/@vitos-pizza/subagents/src/agents.ts +166 -166
- package/node_modules/@vitos-pizza/subagents/src/async/job-tracker.ts +71 -71
- package/node_modules/@vitos-pizza/subagents/src/async/spawn-async.ts +220 -220
- package/node_modules/@vitos-pizza/subagents/src/async/storage.ts +57 -57
- package/node_modules/@vitos-pizza/subagents/src/env.ts +4 -4
- package/node_modules/@vitos-pizza/subagents/src/execute-subagent.ts +285 -285
- package/node_modules/@vitos-pizza/subagents/src/progress.ts +187 -187
- package/node_modules/@vitos-pizza/subagents/src/render-animation.ts +40 -40
- package/node_modules/@vitos-pizza/subagents/src/render.ts +428 -428
- package/node_modules/@vitos-pizza/subagents/src/rpc/channels.ts +21 -21
- package/node_modules/@vitos-pizza/subagents/src/rpc/client.ts +144 -144
- package/node_modules/@vitos-pizza/subagents/src/rpc/server.ts +11 -11
- package/node_modules/@vitos-pizza/subagents/src/run-agent.ts +313 -313
- package/node_modules/@vitos-pizza/subagents/src/runtime.ts +102 -102
- package/node_modules/@vitos-pizza/subagents/src/schema.ts +62 -62
- package/node_modules/@vitos-pizza/subagents/src/spawn.ts +104 -104
- package/node_modules/@vitos-pizza/subagents/src/types.ts +92 -92
- package/node_modules/@vitos-pizza/subagents/src/utils.ts +100 -100
- package/node_modules/@vitos-pizza/subagents/src/wait.ts +159 -159
- package/node_modules/@vitos-pizza/subagents/tests/agents.test.ts +19 -19
- package/node_modules/@vitos-pizza/subagents/tests/execute-subagent.test.ts +96 -96
- package/node_modules/@vitos-pizza/subagents/tests/extension.test.ts +42 -42
- package/node_modules/@vitos-pizza/subagents/tests/progress.test.ts +206 -206
- package/node_modules/@vitos-pizza/subagents/tests/rpc.test.ts +74 -74
- package/node_modules/@vitos-pizza/subagents/tsconfig.json +13 -13
- package/node_modules/@vitos-pizza/subagents/vitest.config.ts +8 -8
- package/node_modules/@vitos-pizza/ui-enhancements/package.json +1 -1
- package/node_modules/@vitos-pizza/ui-enhancements/src/chrome/agent-mode-badge.ts +60 -60
- package/node_modules/@vitos-pizza/ui-enhancements/src/chrome/border-status.ts +14 -1
- package/node_modules/@vitos-pizza/ui-enhancements/src/chrome/resize-recovery.ts +63 -0
- package/node_modules/@vitos-pizza/ui-enhancements/tests/agent-mode-badge.test.ts +35 -35
- package/node_modules/@vitos-pizza/ui-enhancements/tests/resize-recovery.test.ts +135 -0
- package/node_modules/@vitos-pizza/websearch/package.json +1 -1
- package/node_modules/node-addon-api/tools/conversion.js +0 -0
- package/node_modules/node-gyp-build/bin.js +0 -0
- package/node_modules/node-gyp-build/build-test.js +0 -0
- package/node_modules/node-gyp-build/optional.js +0 -0
- package/package.json +11 -9
- package/packages/agent-mode/extensions/index.ts +138 -117
- package/packages/agent-mode/package.json +3 -3
- package/packages/agent-mode/src/apply-mode.ts +60 -60
- package/packages/agent-mode/src/mode-events.ts +102 -102
- package/packages/agent-mode/src/modes.ts +43 -43
- package/packages/agent-mode/src/plan-instructions.ts +85 -44
- package/packages/agent-mode/tsconfig.json +13 -13
- package/packages/agent-mode/vitest.config.ts +8 -8
- package/packages/keybindings/extensions/index.ts +104 -104
- package/packages/keybindings/package.json +1 -1
- package/packages/keybindings/presets/shortcuts.json +3 -3
- package/packages/keybindings/src/bind.ts +57 -57
- package/packages/keybindings/src/config.ts +84 -84
- package/packages/keybindings/src/registry.ts +43 -43
- package/packages/keybindings/src/types.ts +54 -54
- package/packages/keybindings/tsconfig.json +13 -13
- package/packages/keybindings/vitest.config.ts +8 -8
- package/packages/permission-system/extensions/index.ts +162 -162
- package/packages/permission-system/node_modules/web-tree-sitter/debug/tree-sitter.wasm +0 -0
- package/packages/permission-system/node_modules/web-tree-sitter/tree-sitter.wasm +0 -0
- package/packages/permission-system/package.json +2 -2
- package/packages/permission-system/src/bash/matcher.ts +54 -51
- package/packages/permission-system/src/bash/parser.ts +40 -40
- package/packages/permission-system/src/config-paths.ts +23 -23
- package/packages/permission-system/src/detect-preset-mode.ts +61 -61
- package/packages/permission-system/src/expand-home.ts +12 -12
- package/packages/permission-system/src/forwarding/forwarder.ts +224 -224
- package/packages/permission-system/src/forwarding/subagent-registry.ts +61 -61
- package/packages/permission-system/src/gates/path-utils.ts +66 -66
- package/packages/permission-system/src/gates/pipeline.ts +151 -155
- package/packages/permission-system/src/handlers/before-agent-start.ts +86 -65
- package/packages/permission-system/src/handlers/skill-input.ts +1 -1
- package/packages/permission-system/src/handlers/tool-call-gate.ts +204 -199
- package/packages/permission-system/src/mode-api.ts +44 -44
- package/packages/permission-system/src/permission-evaluator.ts +233 -216
- package/packages/permission-system/src/permission-session.ts +62 -62
- package/packages/permission-system/src/policy-loader.ts +211 -211
- package/packages/permission-system/src/sanitizers/skill-prompt.ts +99 -99
- package/packages/permission-system/src/sanitizers/system-prompt.ts +221 -221
- package/packages/permission-system/src/service.ts +66 -66
- package/packages/permission-system/src/session-approvals.ts +4 -1
- package/packages/permission-system/src/types.ts +80 -80
- package/packages/permission-system/src/ui/approval-summary.ts +43 -43
- package/packages/permission-system/src/ui/config-modal.ts +36 -36
- package/packages/permission-system/src/ui/permission-dialog.ts +52 -52
- package/packages/permission-system/src/wildcard-matcher.ts +81 -81
- package/packages/permission-system/src/yaml-frontmatter.ts +84 -84
- package/packages/permission-system/src/yolo/runtime-api.ts +49 -49
- package/packages/permission-system/tsconfig.json +13 -13
- package/packages/permission-system/vitest.config.ts +8 -8
- package/packages/question/package.json +1 -1
- package/packages/question/src/question-ui.ts +5 -1
- package/packages/question/src/register-tool.ts +1 -4
- package/packages/session-title/extensions/index.ts +137 -137
- package/packages/session-title/package.json +3 -3
- package/packages/session-title/src/build-title-prompt.ts +16 -16
- package/packages/session-title/src/extract-title-context.ts +55 -55
- package/packages/session-title/src/fast-rules.ts +48 -48
- package/packages/session-title/src/load-settings.ts +70 -70
- package/packages/session-title/src/normalize-title.ts +20 -20
- package/packages/session-title/src/parse-title-response.ts +6 -6
- package/packages/session-title/src/resolve-title-model.ts +33 -33
- package/packages/session-title/src/schedule-title-job.ts +53 -53
- package/packages/session-title/src/should-schedule.ts +30 -30
- package/packages/session-title/src/title-agent.ts +60 -60
- package/packages/session-title/src/truncate-input.ts +10 -10
- package/packages/session-title/src/types.ts +29 -29
- package/packages/session-title/tsconfig.json +13 -13
- package/packages/session-title/vitest.config.ts +8 -8
- package/packages/subagents/agents/planner.md +46 -43
- package/packages/subagents/agents/scout.md +40 -40
- package/packages/subagents/agents/title.md +13 -13
- package/packages/subagents/agents/worker.md +36 -36
- package/packages/subagents/extensions/index.ts +164 -164
- package/packages/subagents/package.json +1 -1
- package/packages/subagents/skills/subagents/SKILL.md +86 -80
- package/packages/subagents/src/agents.ts +166 -166
- package/packages/subagents/src/async/job-tracker.ts +71 -71
- package/packages/subagents/src/async/spawn-async.ts +220 -220
- package/packages/subagents/src/async/storage.ts +57 -57
- package/packages/subagents/src/env.ts +4 -4
- package/packages/subagents/src/execute-subagent.ts +285 -285
- package/packages/subagents/src/progress.ts +187 -187
- package/packages/subagents/src/render-animation.ts +40 -40
- package/packages/subagents/src/render.ts +428 -428
- package/packages/subagents/src/rpc/channels.ts +21 -21
- package/packages/subagents/src/rpc/client.ts +144 -144
- package/packages/subagents/src/rpc/server.ts +11 -11
- package/packages/subagents/src/run-agent.ts +313 -313
- package/packages/subagents/src/runtime.ts +102 -102
- package/packages/subagents/src/schema.ts +62 -62
- package/packages/subagents/src/spawn.ts +104 -104
- package/packages/subagents/src/types.ts +92 -92
- package/packages/subagents/src/utils.ts +100 -100
- package/packages/subagents/src/wait.ts +159 -159
- package/packages/subagents/tsconfig.json +13 -13
- package/packages/subagents/vitest.config.ts +8 -8
- package/packages/todoist/extensions/index.ts +163 -0
- package/packages/todoist/package.json +34 -0
- package/packages/todoist/src/events.ts +7 -0
- package/packages/todoist/src/silent-render.ts +8 -0
- package/packages/todoist/src/state.ts +147 -0
- package/packages/todoist/src/tools.ts +175 -0
- package/packages/todoist/src/types.ts +34 -0
- package/packages/todoist/src/widget.ts +109 -0
- package/packages/todoist/tsconfig.json +13 -0
- package/packages/todoist/vitest.config.ts +8 -0
- package/packages/ui-enhancements/package.json +1 -1
- package/packages/ui-enhancements/src/chrome/agent-mode-badge.ts +60 -60
- package/packages/ui-enhancements/src/chrome/border-status.ts +14 -1
- package/packages/ui-enhancements/src/chrome/resize-recovery.ts +63 -0
- package/packages/websearch/package.json +1 -1
- package/scripts/sync-pi-manifest.mjs +1 -1
- package/packages/permission-system/node_modules/web-tree-sitter/lib/tree-sitter.cjs +0 -2988
- package/packages/permission-system/node_modules/web-tree-sitter/lib/tree-sitter.wasm +0 -0
- package/packages/permission-system/node_modules/web-tree-sitter/lib/tree-sitter.wasm.map +0 -1
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
import type { PermissionPresetName } from "@vitos-pizza/permission-system/mode-api";
|
|
2
|
-
import {
|
|
3
|
-
PRESETS_DIR,
|
|
4
|
-
} from "@vitos-pizza/permission-system/mode-api";
|
|
5
|
-
import { detectPresetMode } from "@vitos-pizza/permission-system/detect-preset-mode";
|
|
6
|
-
import type { ExtensionConfig } from "@vitos-pizza/permission-system/types";
|
|
7
|
-
|
|
8
|
-
export type AgentMode = "agent" | "plan" | "execute";
|
|
9
|
-
|
|
10
|
-
export const AGENT_MODES: readonly AgentMode[] = [
|
|
11
|
-
"agent",
|
|
12
|
-
"plan",
|
|
13
|
-
"execute",
|
|
14
|
-
] as const;
|
|
15
|
-
|
|
16
|
-
export const PRESET_BY_MODE: Record<AgentMode, PermissionPresetName> = {
|
|
17
|
-
agent: "default",
|
|
18
|
-
plan: "plan",
|
|
19
|
-
execute: "yolo",
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export const MODE_LABELS: Record<AgentMode, string> = {
|
|
23
|
-
agent: "Agent mode — balanced permissions",
|
|
24
|
-
plan: "Plan mode — read-only exploration",
|
|
25
|
-
execute: "Execute mode — minimal gates",
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export function isAgentMode(value: string): value is AgentMode {
|
|
29
|
-
return (AGENT_MODES as readonly string[]).includes(value);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function cycleAgentMode(current: AgentMode): AgentMode {
|
|
33
|
-
const index = AGENT_MODES.indexOf(current);
|
|
34
|
-
return AGENT_MODES[(index + 1) % AGENT_MODES.length];
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function inferAgentMode(config: ExtensionConfig): AgentMode {
|
|
38
|
-
if (config.agentMode) return config.agentMode;
|
|
39
|
-
const detected = detectPresetMode(config.permission, PRESETS_DIR);
|
|
40
|
-
if (detected === "plan") return "plan";
|
|
41
|
-
if (detected === "yolo") return "execute";
|
|
42
|
-
return "agent";
|
|
43
|
-
}
|
|
1
|
+
import type { PermissionPresetName } from "@vitos-pizza/permission-system/mode-api";
|
|
2
|
+
import {
|
|
3
|
+
PRESETS_DIR,
|
|
4
|
+
} from "@vitos-pizza/permission-system/mode-api";
|
|
5
|
+
import { detectPresetMode } from "@vitos-pizza/permission-system/detect-preset-mode";
|
|
6
|
+
import type { ExtensionConfig } from "@vitos-pizza/permission-system/types";
|
|
7
|
+
|
|
8
|
+
export type AgentMode = "agent" | "plan" | "execute";
|
|
9
|
+
|
|
10
|
+
export const AGENT_MODES: readonly AgentMode[] = [
|
|
11
|
+
"agent",
|
|
12
|
+
"plan",
|
|
13
|
+
"execute",
|
|
14
|
+
] as const;
|
|
15
|
+
|
|
16
|
+
export const PRESET_BY_MODE: Record<AgentMode, PermissionPresetName> = {
|
|
17
|
+
agent: "default",
|
|
18
|
+
plan: "plan",
|
|
19
|
+
execute: "yolo",
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const MODE_LABELS: Record<AgentMode, string> = {
|
|
23
|
+
agent: "Agent mode — balanced permissions",
|
|
24
|
+
plan: "Plan mode — read-only exploration",
|
|
25
|
+
execute: "Execute mode — minimal gates",
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export function isAgentMode(value: string): value is AgentMode {
|
|
29
|
+
return (AGENT_MODES as readonly string[]).includes(value);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function cycleAgentMode(current: AgentMode): AgentMode {
|
|
33
|
+
const index = AGENT_MODES.indexOf(current);
|
|
34
|
+
return AGENT_MODES[(index + 1) % AGENT_MODES.length];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function inferAgentMode(config: ExtensionConfig): AgentMode {
|
|
38
|
+
if (config.agentMode) return config.agentMode;
|
|
39
|
+
const detected = detectPresetMode(config.permission, PRESETS_DIR);
|
|
40
|
+
if (detected === "plan") return "plan";
|
|
41
|
+
if (detected === "yolo") return "execute";
|
|
42
|
+
return "agent";
|
|
43
|
+
}
|
|
@@ -1,44 +1,85 @@
|
|
|
1
|
-
export const PLAN_MODE_TOOLS = [
|
|
2
|
-
"read",
|
|
3
|
-
"grep",
|
|
4
|
-
"find",
|
|
5
|
-
"ls",
|
|
6
|
-
"question",
|
|
7
|
-
"subagent",
|
|
8
|
-
"wait",
|
|
9
|
-
"web_search",
|
|
10
|
-
"web_read",
|
|
11
|
-
] as const;
|
|
12
|
-
|
|
13
|
-
export const PLAN_INSTRUCTIONS = `## PLAN MODE
|
|
14
|
-
|
|
15
|
-
You are in **plan** mode. Do not call write, edit, or bash on the main agent.
|
|
16
|
-
|
|
17
|
-
**Planning workflow**
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
**
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
1
|
+
export const PLAN_MODE_TOOLS = [
|
|
2
|
+
"read",
|
|
3
|
+
"grep",
|
|
4
|
+
"find",
|
|
5
|
+
"ls",
|
|
6
|
+
"question",
|
|
7
|
+
"subagent",
|
|
8
|
+
"wait",
|
|
9
|
+
"web_search",
|
|
10
|
+
"web_read",
|
|
11
|
+
] as const;
|
|
12
|
+
|
|
13
|
+
export const PLAN_INSTRUCTIONS = `## PLAN MODE
|
|
14
|
+
|
|
15
|
+
You are in **plan** mode. Do not call write, edit, or bash on the main agent.
|
|
16
|
+
|
|
17
|
+
**Planning workflow**
|
|
18
|
+
- Mutually exclusive design choices (2–5 options) → always use the \`question\` tool; do not ask in free text
|
|
19
|
+
- Produce an Implementation Plan and wait for user confirmation
|
|
20
|
+
- Do **not** call worker or edit code directly in this mode
|
|
21
|
+
|
|
22
|
+
**When to explore**
|
|
23
|
+
- Scout is **optional**. Skip it when the task is clear, scoped to known files, or the user already provided enough context
|
|
24
|
+
- Call scout only when you need codebase recon (unfamiliar area, many files, unclear entry points)
|
|
25
|
+
- Independent areas → parallel scouts via \`subagent({ tasks: [...] })\` to finish recon faster; then planner
|
|
26
|
+
- For light lookups, the main agent may use read/grep/find/ls directly — no scout required
|
|
27
|
+
|
|
28
|
+
**Delegation**
|
|
29
|
+
- Enough context already → \`subagent({ agent: "planner", task: "..." })\`
|
|
30
|
+
- Need recon first → \`subagent({ chain: [{ agent: "scout", task: "..." }, { agent: "planner", task: "..." }] })\`
|
|
31
|
+
- Multi-area recon → parallel scouts, then planner with the combined findings
|
|
32
|
+
|
|
33
|
+
**After the plan (optional)**
|
|
34
|
+
When helpful, add a short **Next** footer — Cursor-style suggested actions. Skip it if the next step is already obvious.
|
|
35
|
+
- 2–3 bullets max; each one line
|
|
36
|
+
- Concrete verbs the user can reply with (e.g. confirm → \`/mode execute\`, tweak scope)
|
|
37
|
+
- No essays, no restating the whole plan
|
|
38
|
+
|
|
39
|
+
Example:
|
|
40
|
+
\`\`\`
|
|
41
|
+
**Next**
|
|
42
|
+
- Confirm → \`/mode execute\` (or F6) to implement
|
|
43
|
+
- Say what to change if the scope is off
|
|
44
|
+
\`\`\`
|
|
45
|
+
|
|
46
|
+
**To implement**, the user must switch to execute or agent mode (\`/mode execute\` or \`/mode agent\`).`;
|
|
47
|
+
|
|
48
|
+
export const PLAN_MODE_MESSAGE = `[PLAN MODE ACTIVE]
|
|
49
|
+
|
|
50
|
+
You are in plan mode. The main agent must NOT write, edit, or run bash.
|
|
51
|
+
|
|
52
|
+
1. Mutually exclusive choices → \`question\` tool (not free-text "which do you prefer?")
|
|
53
|
+
2. Scout only if needed; parallel scouts (\`tasks: [...]\`) when exploring independent areas; otherwise go straight to planner
|
|
54
|
+
3. Return the plan and wait; optionally a short **Next** footer (2–3 one-line actions) when helpful
|
|
55
|
+
4. Do NOT call worker or make code changes
|
|
56
|
+
|
|
57
|
+
Planner only (no scout):
|
|
58
|
+
\`\`\`json
|
|
59
|
+
{ "agent": "planner", "task": "Create an implementation plan for ..." }
|
|
60
|
+
\`\`\`
|
|
61
|
+
|
|
62
|
+
Scout → planner (when recon is needed):
|
|
63
|
+
\`\`\`json
|
|
64
|
+
{
|
|
65
|
+
"chain": [
|
|
66
|
+
{ "agent": "scout", "task": "Map relevant code for this task" },
|
|
67
|
+
{ "agent": "planner", "task": "Create an implementation plan from {previous}" }
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
\`\`\`
|
|
71
|
+
|
|
72
|
+
Parallel scouts (independent areas), then planner:
|
|
73
|
+
\`\`\`json
|
|
74
|
+
{
|
|
75
|
+
"tasks": [
|
|
76
|
+
{ "agent": "scout", "task": "Map area A" },
|
|
77
|
+
{ "agent": "scout", "task": "Map area B" }
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
\`\`\`
|
|
81
|
+
Then \`subagent({ agent: "planner", task: "Plan from the scout findings above" })\`.`;
|
|
82
|
+
|
|
83
|
+
export const PLAN_MODE_ENDED_MESSAGE = `[PLAN MODE ENDED]
|
|
84
|
+
|
|
85
|
+
You left plan mode. write, edit, and bash are available again according to the current mode (agent or execute). Do not treat earlier [PLAN MODE ACTIVE] messages as still in effect.`;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../tsconfig.base.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"allowImportingTsExtensions": true
|
|
5
|
-
},
|
|
6
|
-
"include": [
|
|
7
|
-
"extensions/**/*.ts",
|
|
8
|
-
"src/**/*.ts",
|
|
9
|
-
"tests/**/*.ts",
|
|
10
|
-
"vitest.config.ts"
|
|
11
|
-
],
|
|
12
|
-
"exclude": ["node_modules"]
|
|
13
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"allowImportingTsExtensions": true
|
|
5
|
+
},
|
|
6
|
+
"include": [
|
|
7
|
+
"extensions/**/*.ts",
|
|
8
|
+
"src/**/*.ts",
|
|
9
|
+
"tests/**/*.ts",
|
|
10
|
+
"vitest.config.ts"
|
|
11
|
+
],
|
|
12
|
+
"exclude": ["node_modules"]
|
|
13
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { defineConfig } from "vitest/config";
|
|
2
|
-
|
|
3
|
-
export default defineConfig({
|
|
4
|
-
test: {
|
|
5
|
-
environment: "node",
|
|
6
|
-
include: ["tests/**/*.test.ts"],
|
|
7
|
-
},
|
|
8
|
-
});
|
|
1
|
+
import { defineConfig } from "vitest/config";
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
test: {
|
|
5
|
+
environment: "node",
|
|
6
|
+
include: ["tests/**/*.test.ts"],
|
|
7
|
+
},
|
|
8
|
+
});
|
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
import { dirname, join } from "node:path";
|
|
2
|
-
import { fileURLToPath } from "node:url";
|
|
3
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
4
|
-
import { getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
5
|
-
import { type BindResult, bindShortcuts } from "../src/bind.ts";
|
|
6
|
-
import {
|
|
7
|
-
loadShortcutConfigFiles,
|
|
8
|
-
resolveShortcutConfigPaths,
|
|
9
|
-
} from "../src/config.ts";
|
|
10
|
-
import { ActionRegistry } from "../src/registry.ts";
|
|
11
|
-
import {
|
|
12
|
-
isShortcutAction,
|
|
13
|
-
SHORTCUTS_REGISTER,
|
|
14
|
-
type ShortcutActionEntry,
|
|
15
|
-
} from "../src/types.ts";
|
|
16
|
-
|
|
17
|
-
const moduleDir = dirname(fileURLToPath(import.meta.url));
|
|
18
|
-
const presetPath = join(moduleDir, "..", "presets", "shortcuts.json");
|
|
19
|
-
|
|
20
|
-
export interface KeybindingsState {
|
|
21
|
-
entries: ShortcutActionEntry[];
|
|
22
|
-
bindResult: BindResult;
|
|
23
|
-
configPaths: ReturnType<typeof resolveShortcutConfigPaths>;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function formatEntriesMessage(state: KeybindingsState): string {
|
|
27
|
-
if (state.entries.length === 0) {
|
|
28
|
-
return "No vitos shortcut actions registered yet.\n\nModules can register actions via vitos:shortcuts:register during session_start.";
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const lines = ["**Action** | **Keys** | **Source**", "--- | --- | ---"];
|
|
32
|
-
|
|
33
|
-
for (const entry of state.entries) {
|
|
34
|
-
const keys =
|
|
35
|
-
entry.keys.length > 0
|
|
36
|
-
? entry.keys.map((key) => `\`${key}\``).join(", ")
|
|
37
|
-
: "_(unbound)_";
|
|
38
|
-
const source = entry.source ?? "—";
|
|
39
|
-
lines.push(`\`${entry.id}\` — ${entry.description} | ${keys} | ${source}`);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (state.bindResult.skipped.length > 0) {
|
|
43
|
-
lines.push("");
|
|
44
|
-
lines.push("**Skipped bindings:**");
|
|
45
|
-
for (const skipped of state.bindResult.skipped) {
|
|
46
|
-
lines.push(
|
|
47
|
-
`- \`${skipped.actionId}\` \`${skipped.key}\`: ${skipped.reason}`,
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
lines.push("");
|
|
53
|
-
lines.push("Config files (project overrides global overrides preset):");
|
|
54
|
-
lines.push(`- preset: \`${state.configPaths.presetPath}\``);
|
|
55
|
-
lines.push(`- global: \`${state.configPaths.globalPath}\``);
|
|
56
|
-
lines.push(`- project: \`${state.configPaths.projectPath}\``);
|
|
57
|
-
|
|
58
|
-
return lines.join("\n");
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export function registerKeybindings(pi: ExtensionAPI): {
|
|
62
|
-
registry: ActionRegistry;
|
|
63
|
-
getState: () => KeybindingsState | null;
|
|
64
|
-
} {
|
|
65
|
-
const registry = new ActionRegistry();
|
|
66
|
-
let state: KeybindingsState | null = null;
|
|
67
|
-
|
|
68
|
-
const unsubRegister = pi.events.on(SHORTCUTS_REGISTER, (payload) => {
|
|
69
|
-
if (!isShortcutAction(payload)) return;
|
|
70
|
-
registry.register(payload);
|
|
71
|
-
});
|
|
72
|
-
void unsubRegister;
|
|
73
|
-
|
|
74
|
-
const rebind = (cwd: string) => {
|
|
75
|
-
const agentDir = getAgentDir();
|
|
76
|
-
const configPaths = resolveShortcutConfigPaths(presetPath, agentDir, cwd);
|
|
77
|
-
const config = loadShortcutConfigFiles(configPaths);
|
|
78
|
-
const bindResult = bindShortcuts(pi, registry, config);
|
|
79
|
-
const entries = registry.buildEntries(config.bindings);
|
|
80
|
-
state = { entries, bindResult, configPaths };
|
|
81
|
-
return state;
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
pi.on("session_start", async (_event, ctx) => {
|
|
85
|
-
rebind(ctx.cwd);
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
pi.registerCommand("vitos-shortcuts", {
|
|
89
|
-
description: "List vitos-pizza shortcut actions and key bindings",
|
|
90
|
-
handler: async (_args, ctx) => {
|
|
91
|
-
const current = rebind(ctx.cwd);
|
|
92
|
-
ctx.ui.notify(formatEntriesMessage(current), "info");
|
|
93
|
-
},
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
return {
|
|
97
|
-
registry,
|
|
98
|
-
getState: () => state,
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export default function (pi: ExtensionAPI): void {
|
|
103
|
-
registerKeybindings(pi);
|
|
104
|
-
}
|
|
1
|
+
import { dirname, join } from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
import { getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
5
|
+
import { type BindResult, bindShortcuts } from "../src/bind.ts";
|
|
6
|
+
import {
|
|
7
|
+
loadShortcutConfigFiles,
|
|
8
|
+
resolveShortcutConfigPaths,
|
|
9
|
+
} from "../src/config.ts";
|
|
10
|
+
import { ActionRegistry } from "../src/registry.ts";
|
|
11
|
+
import {
|
|
12
|
+
isShortcutAction,
|
|
13
|
+
SHORTCUTS_REGISTER,
|
|
14
|
+
type ShortcutActionEntry,
|
|
15
|
+
} from "../src/types.ts";
|
|
16
|
+
|
|
17
|
+
const moduleDir = dirname(fileURLToPath(import.meta.url));
|
|
18
|
+
const presetPath = join(moduleDir, "..", "presets", "shortcuts.json");
|
|
19
|
+
|
|
20
|
+
export interface KeybindingsState {
|
|
21
|
+
entries: ShortcutActionEntry[];
|
|
22
|
+
bindResult: BindResult;
|
|
23
|
+
configPaths: ReturnType<typeof resolveShortcutConfigPaths>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function formatEntriesMessage(state: KeybindingsState): string {
|
|
27
|
+
if (state.entries.length === 0) {
|
|
28
|
+
return "No vitos shortcut actions registered yet.\n\nModules can register actions via vitos:shortcuts:register during session_start.";
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const lines = ["**Action** | **Keys** | **Source**", "--- | --- | ---"];
|
|
32
|
+
|
|
33
|
+
for (const entry of state.entries) {
|
|
34
|
+
const keys =
|
|
35
|
+
entry.keys.length > 0
|
|
36
|
+
? entry.keys.map((key) => `\`${key}\``).join(", ")
|
|
37
|
+
: "_(unbound)_";
|
|
38
|
+
const source = entry.source ?? "—";
|
|
39
|
+
lines.push(`\`${entry.id}\` — ${entry.description} | ${keys} | ${source}`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (state.bindResult.skipped.length > 0) {
|
|
43
|
+
lines.push("");
|
|
44
|
+
lines.push("**Skipped bindings:**");
|
|
45
|
+
for (const skipped of state.bindResult.skipped) {
|
|
46
|
+
lines.push(
|
|
47
|
+
`- \`${skipped.actionId}\` \`${skipped.key}\`: ${skipped.reason}`,
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
lines.push("");
|
|
53
|
+
lines.push("Config files (project overrides global overrides preset):");
|
|
54
|
+
lines.push(`- preset: \`${state.configPaths.presetPath}\``);
|
|
55
|
+
lines.push(`- global: \`${state.configPaths.globalPath}\``);
|
|
56
|
+
lines.push(`- project: \`${state.configPaths.projectPath}\``);
|
|
57
|
+
|
|
58
|
+
return lines.join("\n");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function registerKeybindings(pi: ExtensionAPI): {
|
|
62
|
+
registry: ActionRegistry;
|
|
63
|
+
getState: () => KeybindingsState | null;
|
|
64
|
+
} {
|
|
65
|
+
const registry = new ActionRegistry();
|
|
66
|
+
let state: KeybindingsState | null = null;
|
|
67
|
+
|
|
68
|
+
const unsubRegister = pi.events.on(SHORTCUTS_REGISTER, (payload) => {
|
|
69
|
+
if (!isShortcutAction(payload)) return;
|
|
70
|
+
registry.register(payload);
|
|
71
|
+
});
|
|
72
|
+
void unsubRegister;
|
|
73
|
+
|
|
74
|
+
const rebind = (cwd: string) => {
|
|
75
|
+
const agentDir = getAgentDir();
|
|
76
|
+
const configPaths = resolveShortcutConfigPaths(presetPath, agentDir, cwd);
|
|
77
|
+
const config = loadShortcutConfigFiles(configPaths);
|
|
78
|
+
const bindResult = bindShortcuts(pi, registry, config);
|
|
79
|
+
const entries = registry.buildEntries(config.bindings);
|
|
80
|
+
state = { entries, bindResult, configPaths };
|
|
81
|
+
return state;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
85
|
+
rebind(ctx.cwd);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
pi.registerCommand("vitos-shortcuts", {
|
|
89
|
+
description: "List vitos-pizza shortcut actions and key bindings",
|
|
90
|
+
handler: async (_args, ctx) => {
|
|
91
|
+
const current = rebind(ctx.cwd);
|
|
92
|
+
ctx.ui.notify(formatEntriesMessage(current), "info");
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
registry,
|
|
98
|
+
getState: () => state,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export default function (pi: ExtensionAPI): void {
|
|
103
|
+
registerKeybindings(pi);
|
|
104
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
{
|
|
2
|
-
"agent-mode.cycle": "f6"
|
|
3
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"agent-mode.cycle": "f6"
|
|
3
|
+
}
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import type { KeyId } from "@earendil-works/pi-tui";
|
|
3
|
-
import type { ActionRegistry } from "./registry.ts";
|
|
4
|
-
import type { MergedShortcutConfig } from "./types.ts";
|
|
5
|
-
|
|
6
|
-
export interface BindResult {
|
|
7
|
-
bound: Array<{ actionId: string; key: KeyId; description: string }>;
|
|
8
|
-
skipped: Array<{ actionId: string; key: KeyId; reason: string }>;
|
|
9
|
-
unboundActions: string[];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function bindShortcuts(
|
|
13
|
-
pi: Pick<ExtensionAPI, "registerShortcut">,
|
|
14
|
-
registry: ActionRegistry,
|
|
15
|
-
config: MergedShortcutConfig,
|
|
16
|
-
): BindResult {
|
|
17
|
-
const result: BindResult = {
|
|
18
|
-
bound: [],
|
|
19
|
-
skipped: [],
|
|
20
|
-
unboundActions: [],
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const boundKeys = new Set<string>();
|
|
24
|
-
|
|
25
|
-
for (const action of registry.list()) {
|
|
26
|
-
const binding = config.bindings.get(action.id);
|
|
27
|
-
if (!binding || binding.keys.length === 0) {
|
|
28
|
-
result.unboundActions.push(action.id);
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
for (const key of binding.keys) {
|
|
33
|
-
const normalizedKey = key.toLowerCase();
|
|
34
|
-
if (boundKeys.has(normalizedKey)) {
|
|
35
|
-
result.skipped.push({
|
|
36
|
-
actionId: action.id,
|
|
37
|
-
key,
|
|
38
|
-
reason: "duplicate key in vitos-shortcuts config",
|
|
39
|
-
});
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
pi.registerShortcut(key, {
|
|
44
|
-
description: action.description,
|
|
45
|
-
handler: action.handler,
|
|
46
|
-
});
|
|
47
|
-
boundKeys.add(normalizedKey);
|
|
48
|
-
result.bound.push({
|
|
49
|
-
actionId: action.id,
|
|
50
|
-
key,
|
|
51
|
-
description: action.description,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return result;
|
|
57
|
-
}
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { KeyId } from "@earendil-works/pi-tui";
|
|
3
|
+
import type { ActionRegistry } from "./registry.ts";
|
|
4
|
+
import type { MergedShortcutConfig } from "./types.ts";
|
|
5
|
+
|
|
6
|
+
export interface BindResult {
|
|
7
|
+
bound: Array<{ actionId: string; key: KeyId; description: string }>;
|
|
8
|
+
skipped: Array<{ actionId: string; key: KeyId; reason: string }>;
|
|
9
|
+
unboundActions: string[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function bindShortcuts(
|
|
13
|
+
pi: Pick<ExtensionAPI, "registerShortcut">,
|
|
14
|
+
registry: ActionRegistry,
|
|
15
|
+
config: MergedShortcutConfig,
|
|
16
|
+
): BindResult {
|
|
17
|
+
const result: BindResult = {
|
|
18
|
+
bound: [],
|
|
19
|
+
skipped: [],
|
|
20
|
+
unboundActions: [],
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const boundKeys = new Set<string>();
|
|
24
|
+
|
|
25
|
+
for (const action of registry.list()) {
|
|
26
|
+
const binding = config.bindings.get(action.id);
|
|
27
|
+
if (!binding || binding.keys.length === 0) {
|
|
28
|
+
result.unboundActions.push(action.id);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
for (const key of binding.keys) {
|
|
33
|
+
const normalizedKey = key.toLowerCase();
|
|
34
|
+
if (boundKeys.has(normalizedKey)) {
|
|
35
|
+
result.skipped.push({
|
|
36
|
+
actionId: action.id,
|
|
37
|
+
key,
|
|
38
|
+
reason: "duplicate key in vitos-shortcuts config",
|
|
39
|
+
});
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
pi.registerShortcut(key, {
|
|
44
|
+
description: action.description,
|
|
45
|
+
handler: action.handler,
|
|
46
|
+
});
|
|
47
|
+
boundKeys.add(normalizedKey);
|
|
48
|
+
result.bound.push({
|
|
49
|
+
actionId: action.id,
|
|
50
|
+
key,
|
|
51
|
+
description: action.description,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return result;
|
|
57
|
+
}
|