koneck 2.32.0 → 2.34.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/dist/aside.d.ts +35 -0
- package/dist/aside.d.ts.map +1 -0
- package/dist/aside.js +69 -0
- package/dist/aside.js.map +1 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +48 -0
- package/dist/engine.js.map +1 -1
- package/dist/hooks.d.ts +110 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +258 -0
- package/dist/hooks.js.map +1 -0
- package/dist/ink-chat.d.ts +1 -1
- package/dist/ink-chat.d.ts.map +1 -1
- package/dist/ink-chat.js +4 -12
- package/dist/ink-chat.js.map +1 -1
- package/dist/lsp.d.ts +110 -0
- package/dist/lsp.d.ts.map +1 -0
- package/dist/lsp.js +473 -0
- package/dist/lsp.js.map +1 -0
- package/dist/tools.d.ts +5 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +71 -0
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/web/api.d.ts.map +1 -1
- package/dist/web/api.js +29 -0
- package/dist/web/api.js.map +1 -1
- package/dist/web/mark.d.ts +15 -9
- package/dist/web/mark.d.ts.map +1 -1
- package/dist/web/mark.js +72 -9
- package/dist/web/mark.js.map +1 -1
- package/dist/web/ui-client.d.ts.map +1 -1
- package/dist/web/ui-client.js +37 -0
- package/dist/web/ui-client.js.map +1 -1
- package/dist/web/ui-css.d.ts.map +1 -1
- package/dist/web/ui-css.js +12 -0
- package/dist/web/ui-css.js.map +1 -1
- package/package.json +1 -1
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hooks: commands KONECK runs at the moments that matter, declared rather than coded.
|
|
3
|
+
*
|
|
4
|
+
* The point is extending KONECK without touching KONECK. A team that must run `prettier` after
|
|
5
|
+
* every write, or log every shell command to an audit trail, or refuse edits to `entitymodel.xml`
|
|
6
|
+
* outside a review window, should not have to fork an agent to get it — those are policies about
|
|
7
|
+
* their workspace, and they change more often than an agent does.
|
|
8
|
+
*
|
|
9
|
+
* Two kinds, and the difference is the whole design:
|
|
10
|
+
*
|
|
11
|
+
* - A `pre-tool` hook is asked, and may REFUSE. A non-zero exit blocks the tool and its stderr
|
|
12
|
+
* becomes the reason the model is given. This is the one that makes hooks worth having: it is
|
|
13
|
+
* an enforcement point, not a notification.
|
|
14
|
+
* - Every other hook is told. It runs, its output is collected, and a failure is reported but
|
|
15
|
+
* changes nothing — a broken notifier must not be able to stop work.
|
|
16
|
+
*
|
|
17
|
+
* Declared in `.koneck/hooks.json` in the project, and `~/.koneck/hooks.json` for every project.
|
|
18
|
+
* Project first, because a repository's own rules should win over a personal default.
|
|
19
|
+
*
|
|
20
|
+
* {
|
|
21
|
+
* "hooks": [
|
|
22
|
+
* { "on": "pre-tool", "match": "execute_command", "run": "scripts/audit.sh" },
|
|
23
|
+
* { "on": "post-tool", "match": "write_file|edit_file", "run": "npx prettier --write \"$KONECK_PATH\"" },
|
|
24
|
+
* { "on": "session-end", "run": "notify-send 'KONECK finished'" }
|
|
25
|
+
* ]
|
|
26
|
+
* }
|
|
27
|
+
*
|
|
28
|
+
* `match` is a regular expression against the tool name, absent meaning every tool. The command is
|
|
29
|
+
* run through the shell, in the workspace, with the event in the environment rather than on the
|
|
30
|
+
* command line — an argument list is a quoting bug waiting to happen, and a path from a model is
|
|
31
|
+
* exactly the kind of string that finds it.
|
|
32
|
+
*/
|
|
33
|
+
export type HookEvent = 'session-start' | 'session-end' | 'user-prompt' | 'pre-tool' | 'post-tool' | 'turn-end';
|
|
34
|
+
export declare const HOOK_EVENTS: readonly HookEvent[];
|
|
35
|
+
export interface Hook {
|
|
36
|
+
on: HookEvent;
|
|
37
|
+
/** A regular expression against the tool name. Absent matches every tool. */
|
|
38
|
+
match?: string;
|
|
39
|
+
run: string;
|
|
40
|
+
/** Seconds before the hook is killed. A hook must never be able to hang a run. */
|
|
41
|
+
timeout?: number;
|
|
42
|
+
/** Shown instead of the command when a hook blocks something. */
|
|
43
|
+
name?: string;
|
|
44
|
+
/** Where it was declared, for reporting. Filled in by the loader. */
|
|
45
|
+
source?: 'project' | 'user';
|
|
46
|
+
}
|
|
47
|
+
/** What a hook is told about, in its environment. */
|
|
48
|
+
export interface HookContext {
|
|
49
|
+
event: HookEvent;
|
|
50
|
+
cwd: string;
|
|
51
|
+
tool?: string;
|
|
52
|
+
args?: string;
|
|
53
|
+
/** The file a tool is acting on, when there is one. */
|
|
54
|
+
filePath?: string;
|
|
55
|
+
sessionId?: string;
|
|
56
|
+
ok?: boolean;
|
|
57
|
+
/** The prompt, for user-prompt. */
|
|
58
|
+
text?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface HookOutcome {
|
|
61
|
+
hook: Hook;
|
|
62
|
+
ok: boolean;
|
|
63
|
+
/** Set when a pre-tool hook refused, and given to the model as the reason. */
|
|
64
|
+
refusal?: string;
|
|
65
|
+
stdout: string;
|
|
66
|
+
stderr: string;
|
|
67
|
+
ms: number;
|
|
68
|
+
timedOut: boolean;
|
|
69
|
+
}
|
|
70
|
+
/** A hook gets ten seconds unless it says otherwise. Long enough to format a file. */
|
|
71
|
+
export declare const DEFAULT_TIMEOUT_S = 10;
|
|
72
|
+
/** Nothing above this, or "timeout" stops meaning anything. */
|
|
73
|
+
export declare const MAX_TIMEOUT_S = 120;
|
|
74
|
+
export declare function projectHooksPath(cwd: string): string;
|
|
75
|
+
export declare function userHooksPath(home: string): string;
|
|
76
|
+
/** Project hooks first: a repository's own rules outrank a personal default. */
|
|
77
|
+
export declare function loadHooks(cwd: string, home: string): Promise<Hook[]>;
|
|
78
|
+
/** The hooks that apply to an event, in declaration order. */
|
|
79
|
+
export declare function hooksFor(hooks: readonly Hook[], event: HookEvent, tool?: string): Hook[];
|
|
80
|
+
/** The file a tool is acting on, from its arguments — what a formatter or a linter needs. */
|
|
81
|
+
export declare function filePathFrom(args: string | undefined): string | undefined;
|
|
82
|
+
/** The event, as environment. Not as arguments: a path from a model is a quoting bug waiting. */
|
|
83
|
+
export declare function envFor(ctx: HookContext): Record<string, string>;
|
|
84
|
+
/**
|
|
85
|
+
* Runs one hook.
|
|
86
|
+
*
|
|
87
|
+
* Never throws. A hook that fails to launch at all is an ordinary failure with the reason in
|
|
88
|
+
* stderr, because the alternative is that a typo in a config file takes down a session.
|
|
89
|
+
*/
|
|
90
|
+
export declare function runHook(hook: Hook, ctx: HookContext): Promise<HookOutcome>;
|
|
91
|
+
/**
|
|
92
|
+
* Asks every pre-tool hook, and stops at the first refusal.
|
|
93
|
+
*
|
|
94
|
+
* Sequential on purpose: hooks at this point are policy, and policy that runs in a race is policy
|
|
95
|
+
* you cannot reason about. The first refusal is the answer, and the rest are not consulted —
|
|
96
|
+
* exactly as a chain of guards should behave.
|
|
97
|
+
*/
|
|
98
|
+
export declare function askHooks(hooks: readonly Hook[], ctx: HookContext): Promise<{
|
|
99
|
+
allowed: boolean;
|
|
100
|
+
reason?: string;
|
|
101
|
+
ran: HookOutcome[];
|
|
102
|
+
}>;
|
|
103
|
+
/**
|
|
104
|
+
* Runs the hooks that are merely told, and reports how it went.
|
|
105
|
+
*
|
|
106
|
+
* Concurrent, because none of them can change the outcome and a formatter should not have to wait
|
|
107
|
+
* for a notifier. Failures are collected rather than thrown.
|
|
108
|
+
*/
|
|
109
|
+
export declare function notifyHooks(hooks: readonly Hook[], ctx: HookContext): Promise<HookOutcome[]>;
|
|
110
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAMH,MAAM,MAAM,SAAS,GACjB,eAAe,GACf,aAAa,GACb,aAAa,GACb,UAAU,GACV,WAAW,GACX,UAAU,CAAC;AAEf,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAE3C,CAAC;AAEF,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,SAAS,CAAC;IACd,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC7B;AAED,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;IACZ,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,sFAAsF;AACtF,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,+DAA+D;AAC/D,eAAO,MAAM,aAAa,MAAM,CAAC;AAwCjC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,gFAAgF;AAChF,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAQ1E;AAED,8DAA8D;AAC9D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAOxF;AAED,6FAA6F;AAC7F,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAYzE;AAED,iGAAiG;AACjG,wBAAgB,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAW/D;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CA0DhF;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC,CAQpE;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,WAAW,EAAE,CAAC,CAIxB"}
|
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hooks: commands KONECK runs at the moments that matter, declared rather than coded.
|
|
3
|
+
*
|
|
4
|
+
* The point is extending KONECK without touching KONECK. A team that must run `prettier` after
|
|
5
|
+
* every write, or log every shell command to an audit trail, or refuse edits to `entitymodel.xml`
|
|
6
|
+
* outside a review window, should not have to fork an agent to get it — those are policies about
|
|
7
|
+
* their workspace, and they change more often than an agent does.
|
|
8
|
+
*
|
|
9
|
+
* Two kinds, and the difference is the whole design:
|
|
10
|
+
*
|
|
11
|
+
* - A `pre-tool` hook is asked, and may REFUSE. A non-zero exit blocks the tool and its stderr
|
|
12
|
+
* becomes the reason the model is given. This is the one that makes hooks worth having: it is
|
|
13
|
+
* an enforcement point, not a notification.
|
|
14
|
+
* - Every other hook is told. It runs, its output is collected, and a failure is reported but
|
|
15
|
+
* changes nothing — a broken notifier must not be able to stop work.
|
|
16
|
+
*
|
|
17
|
+
* Declared in `.koneck/hooks.json` in the project, and `~/.koneck/hooks.json` for every project.
|
|
18
|
+
* Project first, because a repository's own rules should win over a personal default.
|
|
19
|
+
*
|
|
20
|
+
* {
|
|
21
|
+
* "hooks": [
|
|
22
|
+
* { "on": "pre-tool", "match": "execute_command", "run": "scripts/audit.sh" },
|
|
23
|
+
* { "on": "post-tool", "match": "write_file|edit_file", "run": "npx prettier --write \"$KONECK_PATH\"" },
|
|
24
|
+
* { "on": "session-end", "run": "notify-send 'KONECK finished'" }
|
|
25
|
+
* ]
|
|
26
|
+
* }
|
|
27
|
+
*
|
|
28
|
+
* `match` is a regular expression against the tool name, absent meaning every tool. The command is
|
|
29
|
+
* run through the shell, in the workspace, with the event in the environment rather than on the
|
|
30
|
+
* command line — an argument list is a quoting bug waiting to happen, and a path from a model is
|
|
31
|
+
* exactly the kind of string that finds it.
|
|
32
|
+
*/
|
|
33
|
+
import { readFile } from 'fs/promises';
|
|
34
|
+
import path from 'path';
|
|
35
|
+
import { execa } from 'execa';
|
|
36
|
+
export const HOOK_EVENTS = [
|
|
37
|
+
'session-start', 'session-end', 'user-prompt', 'pre-tool', 'post-tool', 'turn-end',
|
|
38
|
+
];
|
|
39
|
+
/** A hook gets ten seconds unless it says otherwise. Long enough to format a file. */
|
|
40
|
+
export const DEFAULT_TIMEOUT_S = 10;
|
|
41
|
+
/** Nothing above this, or "timeout" stops meaning anything. */
|
|
42
|
+
export const MAX_TIMEOUT_S = 120;
|
|
43
|
+
/** Output kept per hook. A hook that prints a megabyte is not trying to tell you something. */
|
|
44
|
+
const MAX_OUTPUT = 8_000;
|
|
45
|
+
function validate(raw, source) {
|
|
46
|
+
if (raw == null || typeof raw !== 'object')
|
|
47
|
+
return [];
|
|
48
|
+
const list = raw.hooks;
|
|
49
|
+
if (!Array.isArray(list))
|
|
50
|
+
return [];
|
|
51
|
+
const out = [];
|
|
52
|
+
for (const item of list) {
|
|
53
|
+
if (item == null || typeof item !== 'object')
|
|
54
|
+
continue;
|
|
55
|
+
const h = item;
|
|
56
|
+
if (typeof h.on !== 'string' || !HOOK_EVENTS.includes(h.on))
|
|
57
|
+
continue;
|
|
58
|
+
if (typeof h.run !== 'string' || h.run.trim() === '')
|
|
59
|
+
continue;
|
|
60
|
+
// A match that does not compile is dropped rather than silently matching everything, which is
|
|
61
|
+
// the failure that would quietly disable a policy.
|
|
62
|
+
if (typeof h.match === 'string') {
|
|
63
|
+
try {
|
|
64
|
+
new RegExp(h.match);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
out.push({
|
|
71
|
+
on: h.on,
|
|
72
|
+
run: h.run.trim(),
|
|
73
|
+
...(typeof h.match === 'string' ? { match: h.match } : {}),
|
|
74
|
+
...(typeof h.name === 'string' && h.name ? { name: h.name } : {}),
|
|
75
|
+
timeout: Math.min(MAX_TIMEOUT_S, Math.max(1, typeof h.timeout === 'number' && h.timeout > 0 ? h.timeout : DEFAULT_TIMEOUT_S)),
|
|
76
|
+
source,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
async function readHookFile(file, source) {
|
|
82
|
+
try {
|
|
83
|
+
return validate(JSON.parse(await readFile(file, 'utf-8')), source);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return []; // absent or malformed: no hooks, never a failed run
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export function projectHooksPath(cwd) {
|
|
90
|
+
return path.join(cwd, '.koneck', 'hooks.json');
|
|
91
|
+
}
|
|
92
|
+
export function userHooksPath(home) {
|
|
93
|
+
return path.join(home, '.koneck', 'hooks.json');
|
|
94
|
+
}
|
|
95
|
+
/** Project hooks first: a repository's own rules outrank a personal default. */
|
|
96
|
+
export async function loadHooks(cwd, home) {
|
|
97
|
+
const projectFile = projectHooksPath(cwd);
|
|
98
|
+
const userFile = userHooksPath(home);
|
|
99
|
+
const project = await readHookFile(projectFile, 'project');
|
|
100
|
+
// Running KONECK in the home directory itself makes both paths the same file, and reading it
|
|
101
|
+
// twice would run every hook twice — including a formatter, and including an audit entry.
|
|
102
|
+
if (path.resolve(projectFile) === path.resolve(userFile))
|
|
103
|
+
return project;
|
|
104
|
+
return [...project, ...await readHookFile(userFile, 'user')];
|
|
105
|
+
}
|
|
106
|
+
/** The hooks that apply to an event, in declaration order. */
|
|
107
|
+
export function hooksFor(hooks, event, tool) {
|
|
108
|
+
return hooks.filter(h => {
|
|
109
|
+
if (h.on !== event)
|
|
110
|
+
return false;
|
|
111
|
+
if (h.match === undefined)
|
|
112
|
+
return true;
|
|
113
|
+
if (tool === undefined)
|
|
114
|
+
return false;
|
|
115
|
+
try {
|
|
116
|
+
return new RegExp(h.match).test(tool);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/** The file a tool is acting on, from its arguments — what a formatter or a linter needs. */
|
|
124
|
+
export function filePathFrom(args) {
|
|
125
|
+
if (!args)
|
|
126
|
+
return undefined;
|
|
127
|
+
try {
|
|
128
|
+
const parsed = JSON.parse(args);
|
|
129
|
+
for (const key of ['path', 'file', 'file_path', 'filename']) {
|
|
130
|
+
const value = parsed[key];
|
|
131
|
+
if (typeof value === 'string' && value.trim())
|
|
132
|
+
return value.trim();
|
|
133
|
+
}
|
|
134
|
+
const many = parsed['paths'];
|
|
135
|
+
if (Array.isArray(many) && typeof many[0] === 'string')
|
|
136
|
+
return many[0];
|
|
137
|
+
}
|
|
138
|
+
catch { /* not JSON */ }
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
/** The event, as environment. Not as arguments: a path from a model is a quoting bug waiting. */
|
|
142
|
+
export function envFor(ctx) {
|
|
143
|
+
return {
|
|
144
|
+
KONECK_EVENT: ctx.event,
|
|
145
|
+
KONECK_CWD: ctx.cwd,
|
|
146
|
+
...(ctx.tool ? { KONECK_TOOL: ctx.tool } : {}),
|
|
147
|
+
...(ctx.args ? { KONECK_TOOL_ARGS: ctx.args.slice(0, 16_000) } : {}),
|
|
148
|
+
...(ctx.filePath ? { KONECK_PATH: ctx.filePath } : {}),
|
|
149
|
+
...(ctx.sessionId ? { KONECK_SESSION: ctx.sessionId } : {}),
|
|
150
|
+
...(ctx.ok !== undefined ? { KONECK_OK: ctx.ok ? '1' : '0' } : {}),
|
|
151
|
+
...(ctx.text ? { KONECK_TEXT: ctx.text.slice(0, 16_000) } : {}),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Runs one hook.
|
|
156
|
+
*
|
|
157
|
+
* Never throws. A hook that fails to launch at all is an ordinary failure with the reason in
|
|
158
|
+
* stderr, because the alternative is that a typo in a config file takes down a session.
|
|
159
|
+
*/
|
|
160
|
+
export async function runHook(hook, ctx) {
|
|
161
|
+
const started = Date.now();
|
|
162
|
+
const limitMs = (hook.timeout ?? DEFAULT_TIMEOUT_S) * 1000;
|
|
163
|
+
let killed = false;
|
|
164
|
+
try {
|
|
165
|
+
/*
|
|
166
|
+
* Detached, so the hook gets its own process group, and killed as a group on timeout.
|
|
167
|
+
*
|
|
168
|
+
* execa's own `timeout` is not enough here. It signals the process it started, then waits for
|
|
169
|
+
* that process's pipes to close — and a hook runs through a shell, so `sh -c "sleep 30"` hands
|
|
170
|
+
* its stdio to a grandchild that execa never learns about. Measured: a 1-second timeout on
|
|
171
|
+
* `sleep 30` settled after 30 seconds, having correctly reported `timedOut: true` thirty
|
|
172
|
+
* seconds too late. Killing the group takes the grandchild with it: the same case settles in
|
|
173
|
+
* 1.02 seconds.
|
|
174
|
+
*/
|
|
175
|
+
const child = execa(hook.run, {
|
|
176
|
+
shell: true,
|
|
177
|
+
cwd: ctx.cwd,
|
|
178
|
+
env: { ...process.env, ...envFor(ctx) },
|
|
179
|
+
reject: false,
|
|
180
|
+
all: false,
|
|
181
|
+
detached: true,
|
|
182
|
+
});
|
|
183
|
+
const timer = setTimeout(() => {
|
|
184
|
+
killed = true;
|
|
185
|
+
try {
|
|
186
|
+
if (child.pid !== undefined)
|
|
187
|
+
process.kill(-child.pid, 'SIGKILL');
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// The group may already be gone, or this platform may not have process groups; falling
|
|
191
|
+
// back to the process itself is better than leaving the hook running.
|
|
192
|
+
try {
|
|
193
|
+
child.kill('SIGKILL');
|
|
194
|
+
}
|
|
195
|
+
catch { /* already dead */ }
|
|
196
|
+
}
|
|
197
|
+
}, limitMs);
|
|
198
|
+
let result;
|
|
199
|
+
try {
|
|
200
|
+
result = await child;
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
clearTimeout(timer);
|
|
204
|
+
}
|
|
205
|
+
const stdout = (result.stdout ?? '').slice(0, MAX_OUTPUT);
|
|
206
|
+
const stderr = (result.stderr ?? '').slice(0, MAX_OUTPUT);
|
|
207
|
+
const timedOut = killed || result.timedOut === true;
|
|
208
|
+
const ok = result.exitCode === 0 && !timedOut;
|
|
209
|
+
return {
|
|
210
|
+
hook, ok, stdout, stderr, timedOut, ms: Date.now() - started,
|
|
211
|
+
// Only a pre-tool hook can refuse; elsewhere a non-zero exit is reported, not obeyed.
|
|
212
|
+
...(hook.on === 'pre-tool' && !ok
|
|
213
|
+
? {
|
|
214
|
+
refusal: timedOut
|
|
215
|
+
? `${hook.name ?? hook.run} did not answer within ${hook.timeout}s`
|
|
216
|
+
: (stderr.trim() || stdout.trim() || `${hook.name ?? hook.run} refused it`),
|
|
217
|
+
}
|
|
218
|
+
: {}),
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
catch (e) {
|
|
222
|
+
const why = e instanceof Error ? e.message : String(e);
|
|
223
|
+
return {
|
|
224
|
+
hook, ok: false, stdout: '', stderr: why, timedOut: false, ms: Date.now() - started,
|
|
225
|
+
...(hook.on === 'pre-tool' ? { refusal: `${hook.name ?? hook.run} could not run: ${why}` } : {}),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Asks every pre-tool hook, and stops at the first refusal.
|
|
231
|
+
*
|
|
232
|
+
* Sequential on purpose: hooks at this point are policy, and policy that runs in a race is policy
|
|
233
|
+
* you cannot reason about. The first refusal is the answer, and the rest are not consulted —
|
|
234
|
+
* exactly as a chain of guards should behave.
|
|
235
|
+
*/
|
|
236
|
+
export async function askHooks(hooks, ctx) {
|
|
237
|
+
const ran = [];
|
|
238
|
+
for (const hook of hooksFor(hooks, 'pre-tool', ctx.tool)) {
|
|
239
|
+
const outcome = await runHook(hook, { ...ctx, event: 'pre-tool' });
|
|
240
|
+
ran.push(outcome);
|
|
241
|
+
if (outcome.refusal)
|
|
242
|
+
return { allowed: false, reason: outcome.refusal, ran };
|
|
243
|
+
}
|
|
244
|
+
return { allowed: true, ran };
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Runs the hooks that are merely told, and reports how it went.
|
|
248
|
+
*
|
|
249
|
+
* Concurrent, because none of them can change the outcome and a formatter should not have to wait
|
|
250
|
+
* for a notifier. Failures are collected rather than thrown.
|
|
251
|
+
*/
|
|
252
|
+
export async function notifyHooks(hooks, ctx) {
|
|
253
|
+
const applicable = hooksFor(hooks, ctx.event, ctx.tool);
|
|
254
|
+
if (applicable.length === 0)
|
|
255
|
+
return [];
|
|
256
|
+
return Promise.all(applicable.map(h => runHook(h, ctx)));
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/ink-chat.d.ts
CHANGED
|
@@ -195,7 +195,7 @@ export declare function reviewTask(kind: 'code' | 'security', fix?: boolean): st
|
|
|
195
195
|
export declare function taskTranscriptLabel(task: string, generatedLabel?: string): string;
|
|
196
196
|
/** The summary model gets useful context, never an accidental credential from the transcript. */
|
|
197
197
|
export declare function handoffSummaryInput(transcript: string): string;
|
|
198
|
-
export
|
|
198
|
+
export { asideAllowsTool } from './aside.js';
|
|
199
199
|
export declare function readOnlyReviewAllows(tool: string, args: string): boolean;
|
|
200
200
|
/** A goal is compact enough to preserve context room, but rich enough to guide a long session. */
|
|
201
201
|
export declare function normalizeSessionGoal(value: string): string;
|
package/dist/ink-chat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ink-chat.d.ts","sourceRoot":"","sources":["../src/ink-chat.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ink-chat.d.ts","sourceRoot":"","sources":["../src/ink-chat.tsx"],"names":[],"mappings":"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"}
|
package/dist/ink-chat.js
CHANGED
|
@@ -726,18 +726,10 @@ export function taskTranscriptLabel(task, generatedLabel) {
|
|
|
726
726
|
export function handoffSummaryInput(transcript) {
|
|
727
727
|
return redactSecrets(transcript);
|
|
728
728
|
}
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
*/
|
|
734
|
-
const ASIDE_READ_TOOLS = new Set([
|
|
735
|
-
'read_files', 'list_dir', 'glob_search', 'grep_search', 'fetch_url', 'web_search',
|
|
736
|
-
'git_status', 'git_diff', 'git_log',
|
|
737
|
-
]);
|
|
738
|
-
export function asideAllowsTool(tool) {
|
|
739
|
-
return ASIDE_READ_TOOLS.has(tool);
|
|
740
|
-
}
|
|
729
|
+
// The allowlist and the runner moved to aside.ts so the browser can ask a side question too.
|
|
730
|
+
// Still exported from here, because the tests and the rest of this file reach for it by this name.
|
|
731
|
+
export { asideAllowsTool } from './aside.js';
|
|
732
|
+
import { asideAllowsTool } from './aside.js';
|
|
741
733
|
/**
|
|
742
734
|
* Reviews are promises of observation, not a request that the model happens to obey. Keep that
|
|
743
735
|
* promise at the approval boundary. This intentionally does not reuse `toolRisk(tool) ===
|