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.
@@ -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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"}
@@ -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 declare function asideAllowsTool(tool: string): boolean;
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;
@@ -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":"AAqDA,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAY5D,OAAO,EAA6C,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3F,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,YAAY,CAAC;AA+B7D,KAAK,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAGhD,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI9D;AAsCD,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAM7C;AA0BD,gGAAgG;AAChG,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA+BpE;AAED,qFAAqF;AACrF,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAiB,GAAG,MAAM,CAM9E;AA6CD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGnE;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAyBD,OAAO,EACL,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EACzC,KAAK,QAAQ,EAAE,KAAK,UAAU,GAC/B,MAAM,iBAAiB,CAAC;AA8EzB,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CASpD;AAYD,8CAA8C;AAC9C,KAAK,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAClF,UAAU,UAAU;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;AAEtG,qGAAqG;AACrG,wBAAgB,mBAAmB,CACjC,QAAQ,GAAE,SAAS;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAa,GAC5D,UAAU,EAAE,CAId;AAUD,qDAAqD;AACrD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAK7E;AAeD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CAYR;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAElF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAWlF;AAyBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,WAAiC,GAAG,MAAM,GAAG,SAAS,CAgBhH;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAM/F;AAED,mGAAmG;AACnG,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,MAAM,EAAE,CAInG;AAGD,iGAAiG;AACjG,UAAU,SAAS;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,CAiBpE;AAQD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAMjF;AAGD;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC;AAE7D,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACtD,GAAG,WAAW,CAMd;AAGD,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAKvF;AAGD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,GACZ,MAAM,CAMR;AAiCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,UAAQ,GAAG,MAAM,CAEvD;AAED,KAAK,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC;AAElG,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAa1G;AAED,kGAAkG;AAClG,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,GAAG,UAAQ,GAAG,MAAM,CAOzE;AAED,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,iGAAiG;AACjG,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D;AAID,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAa7C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQxE;AAED,kGAAkG;AAClG,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,6EAA6E;AAC7E,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAO9E;AAED,8FAA8F;AAC9F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,MAAM,CAGjF;AAED,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAsBpE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CASrF;AAED,iGAAiG;AACjG,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrF,GAAG,OAAO,CAEV;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,OAAO,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,sBAAsB,UAAQ,GAC7B,OAAO,GAAG,MAAM,GAAG,KAAK,CAc1B;AAED,MAAM,MAAM,iBAAiB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,sGAAsG;AACtG,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,MAAM,EAC3B,eAAe,CAAC,EAAE,MAAM,EACxB,QAAQ,CAAC,EAAE,iBAAiB,GAAG,IAAI,GAClC,MAAM,CAcR;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,OAAO,CAMnE;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEzD;AA0ED;;;;;GAKG;AACH;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAU3D;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAmB,EAC7E,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAQT;AAqwID,wBAAsB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvE"}
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
- * `/aside` is a concurrent read-only investigation. Keep this allowlist deliberately smaller
731
- * than the general read-risk class: `remember` mutates KONECK memory, and any unknown/MCP tool
732
- * must be treated as consequential until its effect has been explicitly classified.
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) ===