@pushary/agent-hooks 0.21.1 → 0.22.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/data/cursor-plugin/scripts/pushary-gate.mjs +28 -2
- package/dist/bin/pushary-codex-hook.js +29 -19
- package/dist/bin/pushary-codex.js +3 -5
- package/dist/bin/pushary-gemini-hook.js +25 -14
- package/dist/bin/pushary-hook.js +4 -4
- package/dist/bin/pushary-post-hook.js +2 -3
- package/dist/bin/pushary-prompt-hook.js +2 -3
- package/dist/bin/pushary-setup.js +1 -1
- package/dist/bin/pushary-stop-hook.js +2 -3
- package/dist/chunk-3LC4YUMA.js +194 -0
- package/dist/chunk-5LTQNC7R.js +824 -0
- package/dist/chunk-FGZZRCOG.js +194 -0
- package/dist/chunk-KQYIHZ5E.js +8 -0
- package/dist/chunk-M4GDBGXF.js +824 -0
- package/dist/chunk-WPVL6VIT.js +160 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +8 -10
- package/package.json +1 -1
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// ../contracts/src/index.ts
|
|
2
|
+
var APPROVAL_MODES = ["push_only", "terminal_only", "push_first", "notify_only"];
|
|
3
|
+
var isApprovalMode = (value) => typeof value === "string" && APPROVAL_MODES.includes(value);
|
|
4
|
+
var MATCH_RANKS = ["none", "tool", "prefix", "exact"];
|
|
5
|
+
var matchRankWeight = (rank) => MATCH_RANKS.indexOf(rank);
|
|
6
|
+
var matchToolPattern = (pattern, toolName, arg) => {
|
|
7
|
+
const open = pattern.indexOf("(");
|
|
8
|
+
if (open === -1 || !pattern.endsWith(")")) {
|
|
9
|
+
return pattern === toolName ? "tool" : "none";
|
|
10
|
+
}
|
|
11
|
+
if (pattern.slice(0, open) !== toolName || arg === void 0) return "none";
|
|
12
|
+
const inner = pattern.slice(open + 1, -1);
|
|
13
|
+
if (inner.endsWith(":*")) {
|
|
14
|
+
return arg.startsWith(inner.slice(0, -2)) ? "prefix" : "none";
|
|
15
|
+
}
|
|
16
|
+
return arg === inner ? "exact" : "none";
|
|
17
|
+
};
|
|
18
|
+
var POLICY_ARG_KEYS = {
|
|
19
|
+
Bash: "command",
|
|
20
|
+
Edit: "file_path",
|
|
21
|
+
Write: "file_path"
|
|
22
|
+
};
|
|
23
|
+
var extractPolicyArg = (toolName, toolInput) => {
|
|
24
|
+
const key = POLICY_ARG_KEYS[toolName];
|
|
25
|
+
if (!key) return void 0;
|
|
26
|
+
const value = toolInput[key];
|
|
27
|
+
return typeof value === "string" ? value : void 0;
|
|
28
|
+
};
|
|
29
|
+
var SAFE_SHELL_COMMANDS = /* @__PURE__ */ new Set([
|
|
30
|
+
"ls",
|
|
31
|
+
"pwd",
|
|
32
|
+
"cd",
|
|
33
|
+
"cat",
|
|
34
|
+
"head",
|
|
35
|
+
"tail",
|
|
36
|
+
"wc",
|
|
37
|
+
"echo",
|
|
38
|
+
"printf",
|
|
39
|
+
"which",
|
|
40
|
+
"type",
|
|
41
|
+
"whoami",
|
|
42
|
+
"id",
|
|
43
|
+
"uname",
|
|
44
|
+
"arch",
|
|
45
|
+
"printenv",
|
|
46
|
+
"locale",
|
|
47
|
+
"tty",
|
|
48
|
+
"dirname",
|
|
49
|
+
"basename",
|
|
50
|
+
"realpath",
|
|
51
|
+
"readlink",
|
|
52
|
+
"stat",
|
|
53
|
+
"cut",
|
|
54
|
+
"nl",
|
|
55
|
+
"tr",
|
|
56
|
+
"comm",
|
|
57
|
+
"diff",
|
|
58
|
+
"cmp",
|
|
59
|
+
"grep",
|
|
60
|
+
"egrep",
|
|
61
|
+
"fgrep",
|
|
62
|
+
"jq",
|
|
63
|
+
"cksum",
|
|
64
|
+
"md5sum",
|
|
65
|
+
"sha1sum",
|
|
66
|
+
"sha256sum",
|
|
67
|
+
"du",
|
|
68
|
+
"df",
|
|
69
|
+
"ps",
|
|
70
|
+
"true"
|
|
71
|
+
]);
|
|
72
|
+
var SAFE_GIT_SUBCOMMANDS = /* @__PURE__ */ new Set([
|
|
73
|
+
"status",
|
|
74
|
+
"log",
|
|
75
|
+
"diff",
|
|
76
|
+
"show",
|
|
77
|
+
"rev-parse",
|
|
78
|
+
"describe",
|
|
79
|
+
"blame",
|
|
80
|
+
"shortlog",
|
|
81
|
+
"ls-files",
|
|
82
|
+
"ls-tree",
|
|
83
|
+
"cat-file",
|
|
84
|
+
"whatchanged",
|
|
85
|
+
"rev-list",
|
|
86
|
+
"name-rev",
|
|
87
|
+
"for-each-ref",
|
|
88
|
+
"var",
|
|
89
|
+
"count-objects"
|
|
90
|
+
]);
|
|
91
|
+
var GIT_WRITE_FLAGS = (token) => token === "--output" || token.startsWith("--output=");
|
|
92
|
+
var UNSAFE_SHELL_CHARS = /[;&|<>(){}`\\\n\r]/;
|
|
93
|
+
var basenameOf = (token) => {
|
|
94
|
+
const slash = Math.max(token.lastIndexOf("/"), token.lastIndexOf("\\"));
|
|
95
|
+
return slash === -1 ? token : token.slice(slash + 1);
|
|
96
|
+
};
|
|
97
|
+
var tokenizeShellCommand = (command) => {
|
|
98
|
+
const tokens = [];
|
|
99
|
+
let current = "";
|
|
100
|
+
let quote = null;
|
|
101
|
+
let started = false;
|
|
102
|
+
for (const ch of command) {
|
|
103
|
+
if (quote) {
|
|
104
|
+
if (ch === quote) quote = null;
|
|
105
|
+
else current += ch;
|
|
106
|
+
started = true;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (ch === '"' || ch === "'") {
|
|
110
|
+
quote = ch;
|
|
111
|
+
started = true;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (ch === " " || ch === " ") {
|
|
115
|
+
if (started) {
|
|
116
|
+
tokens.push(current);
|
|
117
|
+
current = "";
|
|
118
|
+
started = false;
|
|
119
|
+
}
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
current += ch;
|
|
123
|
+
started = true;
|
|
124
|
+
}
|
|
125
|
+
if (quote) return null;
|
|
126
|
+
if (started) tokens.push(current);
|
|
127
|
+
return tokens;
|
|
128
|
+
};
|
|
129
|
+
var isSafeReadOnlyCommand = (command) => {
|
|
130
|
+
const trimmed = command.trim();
|
|
131
|
+
if (!trimmed || trimmed.length > 2e3) return false;
|
|
132
|
+
if (UNSAFE_SHELL_CHARS.test(trimmed)) return false;
|
|
133
|
+
const tokens = tokenizeShellCommand(trimmed);
|
|
134
|
+
if (!tokens || tokens.length === 0) return false;
|
|
135
|
+
const first = tokens[0];
|
|
136
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*=/.test(first) || first.includes("$")) return false;
|
|
137
|
+
const exe = basenameOf(first);
|
|
138
|
+
if (exe === "git") {
|
|
139
|
+
const sub = tokens[1];
|
|
140
|
+
if (!sub || sub.startsWith("-")) return false;
|
|
141
|
+
if (!SAFE_GIT_SUBCOMMANDS.has(sub)) return false;
|
|
142
|
+
return !tokens.some(GIT_WRITE_FLAGS);
|
|
143
|
+
}
|
|
144
|
+
return SAFE_SHELL_COMMANDS.has(exe);
|
|
145
|
+
};
|
|
146
|
+
var API_KEY_PATTERN = /^pk_[a-f0-9]+\.[a-f0-9]+$/;
|
|
147
|
+
var isValidApiKey = (value) => API_KEY_PATTERN.test(value);
|
|
148
|
+
var ACTION_BODY_MAX = 4e3;
|
|
149
|
+
var DECISION_LINE_MAX = 500;
|
|
150
|
+
|
|
151
|
+
export {
|
|
152
|
+
isApprovalMode,
|
|
153
|
+
matchRankWeight,
|
|
154
|
+
matchToolPattern,
|
|
155
|
+
extractPolicyArg,
|
|
156
|
+
isSafeReadOnlyCommand,
|
|
157
|
+
isValidApiKey,
|
|
158
|
+
ACTION_BODY_MAX,
|
|
159
|
+
DECISION_LINE_MAX
|
|
160
|
+
};
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.js
CHANGED
|
@@ -1,23 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
handlePreToolUse
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import {
|
|
6
|
-
handleNotification,
|
|
7
|
-
handlePostToolUse,
|
|
8
|
-
handleStop,
|
|
9
|
-
reportEvent
|
|
10
|
-
} from "../chunk-BYNYYZWW.js";
|
|
3
|
+
} from "../chunk-FGZZRCOG.js";
|
|
4
|
+
import "../chunk-KQYIHZ5E.js";
|
|
11
5
|
import {
|
|
12
6
|
askUser,
|
|
13
7
|
cancelQuestion,
|
|
14
8
|
fetchModeOverride,
|
|
15
9
|
fetchModeState,
|
|
16
10
|
getPolicy,
|
|
11
|
+
handleNotification,
|
|
12
|
+
handlePostToolUse,
|
|
13
|
+
handleStop,
|
|
14
|
+
reportEvent,
|
|
17
15
|
resolvePolicy,
|
|
18
16
|
waitForAnswer
|
|
19
|
-
} from "../chunk-
|
|
20
|
-
import "../chunk-
|
|
17
|
+
} from "../chunk-M4GDBGXF.js";
|
|
18
|
+
import "../chunk-WPVL6VIT.js";
|
|
21
19
|
import "../chunk-DWED7BS3.js";
|
|
22
20
|
import {
|
|
23
21
|
getApiKey,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pushary/agent-hooks",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "Permission hooks for AI coding agents: route tool approvals through Pushary push notifications",
|
|
5
5
|
"author": "Pushary <business@pushary.com>",
|
|
6
6
|
"homepage": "https://pushary.com",
|