@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,80 +1,80 @@
|
|
|
1
|
-
export type PermissionState = "allow" | "ask" | "deny";
|
|
2
|
-
|
|
3
|
-
export type DenyWithReason = {
|
|
4
|
-
action: "deny";
|
|
5
|
-
reason?: string;
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export type ScalarPermissionValue = PermissionState | DenyWithReason;
|
|
9
|
-
|
|
10
|
-
export interface PatternMap {
|
|
11
|
-
[key: string]: ScalarPermissionValue | PatternMap;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export type PatternValue = ScalarPermissionValue | PatternMap;
|
|
15
|
-
|
|
16
|
-
export type FlatPermissionConfig = Record<string, PatternValue>;
|
|
17
|
-
|
|
18
|
-
export interface ExtensionConfig {
|
|
19
|
-
yoloMode?: boolean;
|
|
20
|
-
debug?: boolean;
|
|
21
|
-
agentMode?: "agent" | "plan" | "execute";
|
|
22
|
-
permission?: FlatPermissionConfig;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export type RuleOrigin =
|
|
26
|
-
| "global"
|
|
27
|
-
| "project"
|
|
28
|
-
| "agent"
|
|
29
|
-
| "project-agent"
|
|
30
|
-
| "session"
|
|
31
|
-
| "builtin"
|
|
32
|
-
| "yolo";
|
|
33
|
-
|
|
34
|
-
export interface PermissionCheckResult {
|
|
35
|
-
state: PermissionState;
|
|
36
|
-
reason?: string;
|
|
37
|
-
matchedPattern?: string;
|
|
38
|
-
surface: string;
|
|
39
|
-
value: string;
|
|
40
|
-
origin: RuleOrigin;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export interface GateContext {
|
|
44
|
-
toolName: string;
|
|
45
|
-
input: Record<string, unknown>;
|
|
46
|
-
cwd: string;
|
|
47
|
-
agentName?: string;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function isPermissionState(value: unknown): value is PermissionState {
|
|
51
|
-
return value === "allow" || value === "ask" || value === "deny";
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function isDenyWithReason(value: unknown): value is DenyWithReason {
|
|
55
|
-
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
const record = value as Record<string, unknown>;
|
|
59
|
-
return (
|
|
60
|
-
record.action === "deny" &&
|
|
61
|
-
(record.reason === undefined || typeof record.reason === "string")
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export function permissionStateRank(state: PermissionState): number {
|
|
66
|
-
if (state === "deny") return 3;
|
|
67
|
-
if (state === "ask") return 2;
|
|
68
|
-
return 1;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export function pickMostRestrictive(
|
|
72
|
-
results: readonly PermissionCheckResult[],
|
|
73
|
-
): PermissionCheckResult | null {
|
|
74
|
-
if (results.length === 0) return null;
|
|
75
|
-
return results.reduce((best, current) =>
|
|
76
|
-
permissionStateRank(current.state) > permissionStateRank(best.state)
|
|
77
|
-
? current
|
|
78
|
-
: best,
|
|
79
|
-
);
|
|
80
|
-
}
|
|
1
|
+
export type PermissionState = "allow" | "ask" | "deny";
|
|
2
|
+
|
|
3
|
+
export type DenyWithReason = {
|
|
4
|
+
action: "deny";
|
|
5
|
+
reason?: string;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export type ScalarPermissionValue = PermissionState | DenyWithReason;
|
|
9
|
+
|
|
10
|
+
export interface PatternMap {
|
|
11
|
+
[key: string]: ScalarPermissionValue | PatternMap;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type PatternValue = ScalarPermissionValue | PatternMap;
|
|
15
|
+
|
|
16
|
+
export type FlatPermissionConfig = Record<string, PatternValue>;
|
|
17
|
+
|
|
18
|
+
export interface ExtensionConfig {
|
|
19
|
+
yoloMode?: boolean;
|
|
20
|
+
debug?: boolean;
|
|
21
|
+
agentMode?: "agent" | "plan" | "execute";
|
|
22
|
+
permission?: FlatPermissionConfig;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type RuleOrigin =
|
|
26
|
+
| "global"
|
|
27
|
+
| "project"
|
|
28
|
+
| "agent"
|
|
29
|
+
| "project-agent"
|
|
30
|
+
| "session"
|
|
31
|
+
| "builtin"
|
|
32
|
+
| "yolo";
|
|
33
|
+
|
|
34
|
+
export interface PermissionCheckResult {
|
|
35
|
+
state: PermissionState;
|
|
36
|
+
reason?: string;
|
|
37
|
+
matchedPattern?: string;
|
|
38
|
+
surface: string;
|
|
39
|
+
value: string;
|
|
40
|
+
origin: RuleOrigin;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface GateContext {
|
|
44
|
+
toolName: string;
|
|
45
|
+
input: Record<string, unknown>;
|
|
46
|
+
cwd: string;
|
|
47
|
+
agentName?: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function isPermissionState(value: unknown): value is PermissionState {
|
|
51
|
+
return value === "allow" || value === "ask" || value === "deny";
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function isDenyWithReason(value: unknown): value is DenyWithReason {
|
|
55
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const record = value as Record<string, unknown>;
|
|
59
|
+
return (
|
|
60
|
+
record.action === "deny" &&
|
|
61
|
+
(record.reason === undefined || typeof record.reason === "string")
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function permissionStateRank(state: PermissionState): number {
|
|
66
|
+
if (state === "deny") return 3;
|
|
67
|
+
if (state === "ask") return 2;
|
|
68
|
+
return 1;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function pickMostRestrictive(
|
|
72
|
+
results: readonly PermissionCheckResult[],
|
|
73
|
+
): PermissionCheckResult | null {
|
|
74
|
+
if (results.length === 0) return null;
|
|
75
|
+
return results.reduce((best, current) =>
|
|
76
|
+
permissionStateRank(current.state) > permissionStateRank(best.state)
|
|
77
|
+
? current
|
|
78
|
+
: best,
|
|
79
|
+
);
|
|
80
|
+
}
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
import type { GateContext } from "../types.ts";
|
|
2
|
-
|
|
3
|
-
export function buildApprovalSummary(ctx: GateContext): string {
|
|
4
|
-
const { toolName, input } = ctx;
|
|
5
|
-
|
|
6
|
-
if (toolName === "bash" && typeof input.command === "string") {
|
|
7
|
-
return `Run bash command:\n${input.command}`;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
if (
|
|
11
|
-
(toolName === "read" ||
|
|
12
|
-
toolName === "write" ||
|
|
13
|
-
toolName === "edit" ||
|
|
14
|
-
toolName === "grep" ||
|
|
15
|
-
toolName === "find" ||
|
|
16
|
-
toolName === "ls") &&
|
|
17
|
-
typeof input.path === "string"
|
|
18
|
-
) {
|
|
19
|
-
return `${toolName} ${input.path}`;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
if (toolName === "mcp") {
|
|
23
|
-
const server =
|
|
24
|
-
typeof input.server === "string" ? input.server : "unknown-server";
|
|
25
|
-
const tool = typeof input.tool === "string" ? input.tool : "unknown-tool";
|
|
26
|
-
return `MCP ${server}/${tool}`;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if (toolName === "edit" && typeof input.old_string === "string") {
|
|
30
|
-
const lines = input.old_string.split("\n").length;
|
|
31
|
-
return `edit (${lines} line${lines === 1 ? "" : "s"})`;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const preview = JSON.stringify(input, null, 2);
|
|
35
|
-
if (preview.length > 400) {
|
|
36
|
-
return `${toolName}: ${preview.slice(0, 400)}…`;
|
|
37
|
-
}
|
|
38
|
-
return `${toolName}: ${preview}`;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function buildApprovalTitle(toolName: string): string {
|
|
42
|
-
return `Allow ${toolName}?`;
|
|
43
|
-
}
|
|
1
|
+
import type { GateContext } from "../types.ts";
|
|
2
|
+
|
|
3
|
+
export function buildApprovalSummary(ctx: GateContext): string {
|
|
4
|
+
const { toolName, input } = ctx;
|
|
5
|
+
|
|
6
|
+
if (toolName === "bash" && typeof input.command === "string") {
|
|
7
|
+
return `Run bash command:\n${input.command}`;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
if (
|
|
11
|
+
(toolName === "read" ||
|
|
12
|
+
toolName === "write" ||
|
|
13
|
+
toolName === "edit" ||
|
|
14
|
+
toolName === "grep" ||
|
|
15
|
+
toolName === "find" ||
|
|
16
|
+
toolName === "ls") &&
|
|
17
|
+
typeof input.path === "string"
|
|
18
|
+
) {
|
|
19
|
+
return `${toolName} ${input.path}`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (toolName === "mcp") {
|
|
23
|
+
const server =
|
|
24
|
+
typeof input.server === "string" ? input.server : "unknown-server";
|
|
25
|
+
const tool = typeof input.tool === "string" ? input.tool : "unknown-tool";
|
|
26
|
+
return `MCP ${server}/${tool}`;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (toolName === "edit" && typeof input.old_string === "string") {
|
|
30
|
+
const lines = input.old_string.split("\n").length;
|
|
31
|
+
return `edit (${lines} line${lines === 1 ? "" : "s"})`;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const preview = JSON.stringify(input, null, 2);
|
|
35
|
+
if (preview.length > 400) {
|
|
36
|
+
return `${toolName}: ${preview.slice(0, 400)}…`;
|
|
37
|
+
}
|
|
38
|
+
return `${toolName}: ${preview}`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function buildApprovalTitle(toolName: string): string {
|
|
42
|
+
return `Allow ${toolName}?`;
|
|
43
|
+
}
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import type { ExtensionConfig } from "../types.ts";
|
|
3
|
-
|
|
4
|
-
export async function showPermissionSystemModal(
|
|
5
|
-
ctx: ExtensionContext,
|
|
6
|
-
config: ExtensionConfig,
|
|
7
|
-
onSave: (next: ExtensionConfig) => void,
|
|
8
|
-
): Promise<void> {
|
|
9
|
-
if (!ctx.hasUI) {
|
|
10
|
-
ctx.ui.notify(
|
|
11
|
-
"Permission system settings require an interactive UI.",
|
|
12
|
-
"info",
|
|
13
|
-
);
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const yoloLabel = config.yoloMode
|
|
18
|
-
? "YOLO mode: ON (auto-approve ask)"
|
|
19
|
-
: "YOLO mode: OFF";
|
|
20
|
-
const debugLabel = config.debug ? "Debug logging: ON" : "Debug logging: OFF";
|
|
21
|
-
const selected = await ctx.ui.select("Permission system", [
|
|
22
|
-
yoloLabel,
|
|
23
|
-
debugLabel,
|
|
24
|
-
"Close",
|
|
25
|
-
]);
|
|
26
|
-
if (!selected || selected === "Close") return;
|
|
27
|
-
|
|
28
|
-
const next = { ...config };
|
|
29
|
-
if (selected === yoloLabel) next.yoloMode = !config.yoloMode;
|
|
30
|
-
if (selected === debugLabel) next.debug = !config.debug;
|
|
31
|
-
onSave(next);
|
|
32
|
-
ctx.ui.notify(
|
|
33
|
-
"Permission settings updated. Run /reload to apply runtime changes.",
|
|
34
|
-
"info",
|
|
35
|
-
);
|
|
36
|
-
}
|
|
1
|
+
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { ExtensionConfig } from "../types.ts";
|
|
3
|
+
|
|
4
|
+
export async function showPermissionSystemModal(
|
|
5
|
+
ctx: ExtensionContext,
|
|
6
|
+
config: ExtensionConfig,
|
|
7
|
+
onSave: (next: ExtensionConfig) => void,
|
|
8
|
+
): Promise<void> {
|
|
9
|
+
if (!ctx.hasUI) {
|
|
10
|
+
ctx.ui.notify(
|
|
11
|
+
"Permission system settings require an interactive UI.",
|
|
12
|
+
"info",
|
|
13
|
+
);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const yoloLabel = config.yoloMode
|
|
18
|
+
? "YOLO mode: ON (auto-approve ask)"
|
|
19
|
+
: "YOLO mode: OFF";
|
|
20
|
+
const debugLabel = config.debug ? "Debug logging: ON" : "Debug logging: OFF";
|
|
21
|
+
const selected = await ctx.ui.select("Permission system", [
|
|
22
|
+
yoloLabel,
|
|
23
|
+
debugLabel,
|
|
24
|
+
"Close",
|
|
25
|
+
]);
|
|
26
|
+
if (!selected || selected === "Close") return;
|
|
27
|
+
|
|
28
|
+
const next = { ...config };
|
|
29
|
+
if (selected === yoloLabel) next.yoloMode = !config.yoloMode;
|
|
30
|
+
if (selected === debugLabel) next.debug = !config.debug;
|
|
31
|
+
onSave(next);
|
|
32
|
+
ctx.ui.notify(
|
|
33
|
+
"Permission settings updated. Run /reload to apply runtime changes.",
|
|
34
|
+
"info",
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
export type PermissionDecisionState =
|
|
2
|
-
| "approved"
|
|
3
|
-
| "approved_for_session"
|
|
4
|
-
| "denied"
|
|
5
|
-
| "denied_with_reason";
|
|
6
|
-
|
|
7
|
-
export interface PermissionPromptDecision {
|
|
8
|
-
approved: boolean;
|
|
9
|
-
state: PermissionDecisionState;
|
|
10
|
-
denialReason?: string;
|
|
11
|
-
autoApproved?: true;
|
|
12
|
-
confirmationUnavailable?: true;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface PermissionDecisionUi {
|
|
16
|
-
select(title: string, options: string[]): Promise<string | undefined>;
|
|
17
|
-
input(title: string, placeholder?: string): Promise<string | undefined>;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const APPROVE_OPTION = "Yes";
|
|
21
|
-
const APPROVE_FOR_SESSION_OPTION = "Yes, for this session";
|
|
22
|
-
const DENY_OPTION = "No";
|
|
23
|
-
const DENY_WITH_REASON_OPTION = "No, provide reason";
|
|
24
|
-
|
|
25
|
-
export async function requestPermissionDecisionFromUi(
|
|
26
|
-
ui: PermissionDecisionUi,
|
|
27
|
-
title: string,
|
|
28
|
-
_message: string,
|
|
29
|
-
options?: { sessionLabel?: string },
|
|
30
|
-
): Promise<PermissionPromptDecision> {
|
|
31
|
-
const sessionOption = options?.sessionLabel ?? APPROVE_FOR_SESSION_OPTION;
|
|
32
|
-
const decisionOptions = [
|
|
33
|
-
APPROVE_OPTION,
|
|
34
|
-
sessionOption,
|
|
35
|
-
DENY_OPTION,
|
|
36
|
-
DENY_WITH_REASON_OPTION,
|
|
37
|
-
];
|
|
38
|
-
const selected = await ui.select(title, decisionOptions);
|
|
39
|
-
if (!selected || selected === DENY_OPTION) {
|
|
40
|
-
return { approved: false, state: "denied" };
|
|
41
|
-
}
|
|
42
|
-
if (selected === DENY_WITH_REASON_OPTION) {
|
|
43
|
-
const reason = await ui.input("Reason for denial", "optional");
|
|
44
|
-
return reason
|
|
45
|
-
? { approved: false, state: "denied_with_reason", denialReason: reason }
|
|
46
|
-
: { approved: false, state: "denied" };
|
|
47
|
-
}
|
|
48
|
-
if (selected === sessionOption) {
|
|
49
|
-
return { approved: true, state: "approved_for_session" };
|
|
50
|
-
}
|
|
51
|
-
return { approved: true, state: "approved" };
|
|
52
|
-
}
|
|
1
|
+
export type PermissionDecisionState =
|
|
2
|
+
| "approved"
|
|
3
|
+
| "approved_for_session"
|
|
4
|
+
| "denied"
|
|
5
|
+
| "denied_with_reason";
|
|
6
|
+
|
|
7
|
+
export interface PermissionPromptDecision {
|
|
8
|
+
approved: boolean;
|
|
9
|
+
state: PermissionDecisionState;
|
|
10
|
+
denialReason?: string;
|
|
11
|
+
autoApproved?: true;
|
|
12
|
+
confirmationUnavailable?: true;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface PermissionDecisionUi {
|
|
16
|
+
select(title: string, options: string[]): Promise<string | undefined>;
|
|
17
|
+
input(title: string, placeholder?: string): Promise<string | undefined>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const APPROVE_OPTION = "Yes";
|
|
21
|
+
const APPROVE_FOR_SESSION_OPTION = "Yes, for this session";
|
|
22
|
+
const DENY_OPTION = "No";
|
|
23
|
+
const DENY_WITH_REASON_OPTION = "No, provide reason";
|
|
24
|
+
|
|
25
|
+
export async function requestPermissionDecisionFromUi(
|
|
26
|
+
ui: PermissionDecisionUi,
|
|
27
|
+
title: string,
|
|
28
|
+
_message: string,
|
|
29
|
+
options?: { sessionLabel?: string },
|
|
30
|
+
): Promise<PermissionPromptDecision> {
|
|
31
|
+
const sessionOption = options?.sessionLabel ?? APPROVE_FOR_SESSION_OPTION;
|
|
32
|
+
const decisionOptions = [
|
|
33
|
+
APPROVE_OPTION,
|
|
34
|
+
sessionOption,
|
|
35
|
+
DENY_OPTION,
|
|
36
|
+
DENY_WITH_REASON_OPTION,
|
|
37
|
+
];
|
|
38
|
+
const selected = await ui.select(title, decisionOptions);
|
|
39
|
+
if (!selected || selected === DENY_OPTION) {
|
|
40
|
+
return { approved: false, state: "denied" };
|
|
41
|
+
}
|
|
42
|
+
if (selected === DENY_WITH_REASON_OPTION) {
|
|
43
|
+
const reason = await ui.input("Reason for denial", "optional");
|
|
44
|
+
return reason
|
|
45
|
+
? { approved: false, state: "denied_with_reason", denialReason: reason }
|
|
46
|
+
: { approved: false, state: "denied" };
|
|
47
|
+
}
|
|
48
|
+
if (selected === sessionOption) {
|
|
49
|
+
return { approved: true, state: "approved_for_session" };
|
|
50
|
+
}
|
|
51
|
+
return { approved: true, state: "approved" };
|
|
52
|
+
}
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
import { expandHomePath } from "./expand-home.ts";
|
|
2
|
-
|
|
3
|
-
export type CompiledWildcardPattern<TState> = {
|
|
4
|
-
pattern: string;
|
|
5
|
-
state: TState;
|
|
6
|
-
regex: RegExp;
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
export type WildcardPatternMatch<TState> = {
|
|
10
|
-
state: TState;
|
|
11
|
-
matchedPattern: string;
|
|
12
|
-
matchedName: string;
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export interface WildcardMatchOptions {
|
|
16
|
-
caseInsensitive?: boolean;
|
|
17
|
-
windowsSeparators?: boolean;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function escapeRegExp(value: string): string {
|
|
21
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function compileWildcardPattern<TState>(
|
|
25
|
-
pattern: string,
|
|
26
|
-
state: TState,
|
|
27
|
-
options?: WildcardMatchOptions,
|
|
28
|
-
): CompiledWildcardPattern<TState> {
|
|
29
|
-
let expanded = expandHomePath(pattern);
|
|
30
|
-
if (options?.windowsSeparators) {
|
|
31
|
-
expanded = expanded.replaceAll("/", "\\");
|
|
32
|
-
}
|
|
33
|
-
let escaped = expanded
|
|
34
|
-
.split("*")
|
|
35
|
-
.map((part) => escapeRegExp(part).replaceAll("\\?", "."))
|
|
36
|
-
.join(".*");
|
|
37
|
-
|
|
38
|
-
if (escaped.endsWith(" .*")) {
|
|
39
|
-
escaped = `${escaped.slice(0, -3)}( .*)?`;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return {
|
|
43
|
-
pattern,
|
|
44
|
-
state,
|
|
45
|
-
regex: new RegExp(`^${escaped}$`, options?.caseInsensitive ? "si" : "s"),
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function compileWildcardPatternEntries<TState>(
|
|
50
|
-
entries: Iterable<readonly [string, TState]>,
|
|
51
|
-
options?: WildcardMatchOptions,
|
|
52
|
-
): CompiledWildcardPattern<TState>[] {
|
|
53
|
-
return Array.from(entries, ([pattern, state]) =>
|
|
54
|
-
compileWildcardPattern(pattern, state, options),
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export function findCompiledWildcardMatch<TState>(
|
|
59
|
-
patterns: readonly CompiledWildcardPattern<TState>[],
|
|
60
|
-
name: string,
|
|
61
|
-
): WildcardPatternMatch<TState> | null {
|
|
62
|
-
for (let index = patterns.length - 1; index >= 0; index -= 1) {
|
|
63
|
-
const pattern = patterns[index];
|
|
64
|
-
if (pattern.regex.test(name)) {
|
|
65
|
-
return {
|
|
66
|
-
state: pattern.state,
|
|
67
|
-
matchedPattern: pattern.pattern,
|
|
68
|
-
matchedName: name,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export function wildcardMatch(
|
|
76
|
-
pattern: string,
|
|
77
|
-
value: string,
|
|
78
|
-
options?: WildcardMatchOptions,
|
|
79
|
-
): boolean {
|
|
80
|
-
return compileWildcardPattern(pattern, null, options).regex.test(value);
|
|
81
|
-
}
|
|
1
|
+
import { expandHomePath } from "./expand-home.ts";
|
|
2
|
+
|
|
3
|
+
export type CompiledWildcardPattern<TState> = {
|
|
4
|
+
pattern: string;
|
|
5
|
+
state: TState;
|
|
6
|
+
regex: RegExp;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export type WildcardPatternMatch<TState> = {
|
|
10
|
+
state: TState;
|
|
11
|
+
matchedPattern: string;
|
|
12
|
+
matchedName: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export interface WildcardMatchOptions {
|
|
16
|
+
caseInsensitive?: boolean;
|
|
17
|
+
windowsSeparators?: boolean;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function escapeRegExp(value: string): string {
|
|
21
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function compileWildcardPattern<TState>(
|
|
25
|
+
pattern: string,
|
|
26
|
+
state: TState,
|
|
27
|
+
options?: WildcardMatchOptions,
|
|
28
|
+
): CompiledWildcardPattern<TState> {
|
|
29
|
+
let expanded = expandHomePath(pattern);
|
|
30
|
+
if (options?.windowsSeparators) {
|
|
31
|
+
expanded = expanded.replaceAll("/", "\\");
|
|
32
|
+
}
|
|
33
|
+
let escaped = expanded
|
|
34
|
+
.split("*")
|
|
35
|
+
.map((part) => escapeRegExp(part).replaceAll("\\?", "."))
|
|
36
|
+
.join(".*");
|
|
37
|
+
|
|
38
|
+
if (escaped.endsWith(" .*")) {
|
|
39
|
+
escaped = `${escaped.slice(0, -3)}( .*)?`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
pattern,
|
|
44
|
+
state,
|
|
45
|
+
regex: new RegExp(`^${escaped}$`, options?.caseInsensitive ? "si" : "s"),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function compileWildcardPatternEntries<TState>(
|
|
50
|
+
entries: Iterable<readonly [string, TState]>,
|
|
51
|
+
options?: WildcardMatchOptions,
|
|
52
|
+
): CompiledWildcardPattern<TState>[] {
|
|
53
|
+
return Array.from(entries, ([pattern, state]) =>
|
|
54
|
+
compileWildcardPattern(pattern, state, options),
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function findCompiledWildcardMatch<TState>(
|
|
59
|
+
patterns: readonly CompiledWildcardPattern<TState>[],
|
|
60
|
+
name: string,
|
|
61
|
+
): WildcardPatternMatch<TState> | null {
|
|
62
|
+
for (let index = patterns.length - 1; index >= 0; index -= 1) {
|
|
63
|
+
const pattern = patterns[index];
|
|
64
|
+
if (pattern.regex.test(name)) {
|
|
65
|
+
return {
|
|
66
|
+
state: pattern.state,
|
|
67
|
+
matchedPattern: pattern.pattern,
|
|
68
|
+
matchedName: name,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function wildcardMatch(
|
|
76
|
+
pattern: string,
|
|
77
|
+
value: string,
|
|
78
|
+
options?: WildcardMatchOptions,
|
|
79
|
+
): boolean {
|
|
80
|
+
return compileWildcardPattern(pattern, null, options).regex.test(value);
|
|
81
|
+
}
|