@visorcraft/idlehands 1.1.6 → 1.1.8
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/README.md +32 -0
- package/dist/agent/formatting.js +251 -0
- package/dist/agent/formatting.js.map +1 -0
- package/dist/agent/review-artifact.js +147 -0
- package/dist/agent/review-artifact.js.map +1 -0
- package/dist/agent/tool-calls.js +226 -0
- package/dist/agent/tool-calls.js.map +1 -0
- package/dist/agent.js +314 -695
- package/dist/agent.js.map +1 -1
- package/dist/anton/controller.js +1 -1
- package/dist/anton/controller.js.map +1 -1
- package/dist/anton/lock.js +0 -3
- package/dist/anton/lock.js.map +1 -1
- package/dist/anton/parser.js +0 -1
- package/dist/anton/parser.js.map +1 -1
- package/dist/anton/reporter.js +1 -1
- package/dist/anton/reporter.js.map +1 -1
- package/dist/bot/commands.js +3 -2
- package/dist/bot/commands.js.map +1 -1
- package/dist/bot/confirm-telegram.js +2 -1
- package/dist/bot/confirm-telegram.js.map +1 -1
- package/dist/bot/discord-routing.js +179 -0
- package/dist/bot/discord-routing.js.map +1 -0
- package/dist/bot/discord-streaming.js +171 -0
- package/dist/bot/discord-streaming.js.map +1 -0
- package/dist/bot/discord.js +25 -221
- package/dist/bot/discord.js.map +1 -1
- package/dist/bot/format.js +2 -25
- package/dist/bot/format.js.map +1 -1
- package/dist/bot/telegram.js +56 -12
- package/dist/bot/telegram.js.map +1 -1
- package/dist/cli/args.js +4 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/build-repl-context.js.map +1 -1
- package/dist/cli/command-registry.js +2 -1
- package/dist/cli/command-registry.js.map +1 -1
- package/dist/cli/command-utils.js +27 -0
- package/dist/cli/command-utils.js.map +1 -0
- package/dist/cli/commands/anton.js +3 -2
- package/dist/cli/commands/anton.js.map +1 -1
- package/dist/cli/commands/model.js +8 -7
- package/dist/cli/commands/model.js.map +1 -1
- package/dist/cli/commands/project.js +5 -4
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/session.js +118 -8
- package/dist/cli/commands/session.js.map +1 -1
- package/dist/cli/commands/tools.js +4 -3
- package/dist/cli/commands/tools.js.map +1 -1
- package/dist/cli/input.js +2 -1
- package/dist/cli/input.js.map +1 -1
- package/dist/cli/repl-dispatch.js +85 -0
- package/dist/cli/repl-dispatch.js.map +1 -0
- package/dist/cli/runtime-cmds.js +7 -7
- package/dist/cli/runtime-cmds.js.map +1 -1
- package/dist/cli/service.js +0 -14
- package/dist/cli/service.js.map +1 -1
- package/dist/cli/setup.js +25 -5
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/watch.js +2 -1
- package/dist/cli/watch.js.map +1 -1
- package/dist/client.js +51 -4
- package/dist/client.js.map +1 -1
- package/dist/config.js +79 -0
- package/dist/config.js.map +1 -1
- package/dist/context.js +101 -10
- package/dist/context.js.map +1 -1
- package/dist/harnesses.js +1 -1
- package/dist/harnesses.js.map +1 -1
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/loader.js +58 -0
- package/dist/hooks/loader.js.map +1 -0
- package/dist/hooks/manager.js +180 -0
- package/dist/hooks/manager.js.map +1 -0
- package/dist/hooks/plugins/example-console.js +24 -0
- package/dist/hooks/plugins/example-console.js.map +1 -0
- package/dist/hooks/scaffold.js +53 -0
- package/dist/hooks/scaffold.js.map +1 -0
- package/dist/hooks/types.js +8 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.js +16 -64
- package/dist/index.js.map +1 -1
- package/dist/progress/agent-hooks.js +37 -0
- package/dist/progress/agent-hooks.js.map +1 -0
- package/dist/progress/ir.js +7 -0
- package/dist/progress/ir.js.map +1 -0
- package/dist/progress/progress-message-renderer.js +63 -0
- package/dist/progress/progress-message-renderer.js.map +1 -0
- package/dist/progress/serialize-discord.js +60 -0
- package/dist/progress/serialize-discord.js.map +1 -0
- package/dist/progress/serialize-telegram.js +55 -0
- package/dist/progress/serialize-telegram.js.map +1 -0
- package/dist/progress/serialize-tui.js +39 -0
- package/dist/progress/serialize-tui.js.map +1 -0
- package/dist/progress/tool-summary.js +58 -0
- package/dist/progress/tool-summary.js.map +1 -0
- package/dist/progress/tool-tail.js +48 -0
- package/dist/progress/tool-tail.js.map +1 -0
- package/dist/progress/turn-progress.js +215 -0
- package/dist/progress/turn-progress.js.map +1 -0
- package/dist/replay.js +2 -5
- package/dist/replay.js.map +1 -1
- package/dist/safety.js +0 -1
- package/dist/safety.js.map +1 -1
- package/dist/spinner.js +8 -0
- package/dist/spinner.js.map +1 -1
- package/dist/tools.js +422 -29
- package/dist/tools.js.map +1 -1
- package/dist/tui/branch-picker.js.map +1 -1
- package/dist/tui/command-handler.js.map +1 -1
- package/dist/tui/controller.js +417 -33
- package/dist/tui/controller.js.map +1 -1
- package/dist/tui/keymap.js +15 -0
- package/dist/tui/keymap.js.map +1 -1
- package/dist/tui/render.js +115 -3
- package/dist/tui/render.js.map +1 -1
- package/dist/tui/state.js +82 -1
- package/dist/tui/state.js.map +1 -1
- package/dist/upgrade.js.map +1 -1
- package/dist/utils.js +17 -0
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,KAAK,UAAU,YAAY,CAAC,CAAS;IACnC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAoB;IAC3D,IAAI,GAAG,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAE9B,MAAM,SAAS,GAAG,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC;IACjD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAE5D,yEAAyE;IACzE,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QAChD,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE1C,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/harnesses.js
CHANGED
|
@@ -15,7 +15,7 @@ const HARNESS = [
|
|
|
15
15
|
thinking: { format: 'xml', openTag: '<think>', closeTag: '</think>', strip: true },
|
|
16
16
|
toolCalls: { reliableToolCallsArray: false, contentFallbackLikely: true, parallelCalls: true, retryOnMalformed: 3 },
|
|
17
17
|
quirks: DEFAULT_QUIRKS,
|
|
18
|
-
systemPromptSuffix: 'Prefer
|
|
18
|
+
systemPromptSuffix: 'Prefer apply_patch or edit_range for most edits. Use write_file for full rewrites, and use edit_file only for exact old_text replacement when necessary.\nWhen answering questions about code, search first (search_files or grep), then read only the relevant files. Never scan an entire directory by reading files one by one.'
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
id: 'qwen3-moe',
|
package/dist/harnesses.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../src/harnesses.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA4DvC,oGAAoG;AACpG,MAAM,gBAAgB,GAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACnH,MAAM,kBAAkB,GAAqB,EAAE,sBAAsB,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;AACtJ,MAAM,cAAc,GAAkB,EAAE,mBAAmB,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,uBAAuB,EAAE,KAAK,EAAE,mCAAmC,EAAE,KAAK,EAAE,CAAC;AAC1K,MAAM,qBAAqB,GAAkB,EAAE,GAAG,cAAc,EAAE,mCAAmC,EAAE,IAAI,EAAE,CAAC;AAE9G,MAAM,OAAO,GAAc;IACzB;QACE,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,CAAC,cAAc,CAAC;QACvB,WAAW,EAAE,sCAAsC;QACnD,QAAQ,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;QACjG,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE;QAClF,SAAS,EAAE,EAAE,sBAAsB,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,EAAE;QACnH,MAAM,EAAE,cAAc;QACtB,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../src/harnesses.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAyB,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAiC,MAAM,eAAe,CAAC;AACvG,OAAO,EACL,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
function isHookPlugin(value) {
|
|
4
|
+
if (!value || typeof value !== 'object')
|
|
5
|
+
return false;
|
|
6
|
+
if (value.hooks && typeof value.hooks !== 'object')
|
|
7
|
+
return false;
|
|
8
|
+
if (value.setup && typeof value.setup !== 'function')
|
|
9
|
+
return false;
|
|
10
|
+
return Boolean(value.hooks || value.setup);
|
|
11
|
+
}
|
|
12
|
+
async function pluginFromModule(mod) {
|
|
13
|
+
const candidates = [
|
|
14
|
+
mod?.default,
|
|
15
|
+
mod?.plugin,
|
|
16
|
+
typeof mod?.createPlugin === 'function' ? await mod.createPlugin() : null,
|
|
17
|
+
];
|
|
18
|
+
for (const candidate of candidates) {
|
|
19
|
+
if (isHookPlugin(candidate))
|
|
20
|
+
return candidate;
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
export async function loadHookPlugins(opts) {
|
|
25
|
+
const strict = opts.strict === true;
|
|
26
|
+
const logger = opts.logger ?? ((message) => {
|
|
27
|
+
if (!process.env.IDLEHANDS_QUIET_WARNINGS) {
|
|
28
|
+
console.warn(message);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
const loaded = [];
|
|
32
|
+
for (const entry of opts.pluginPaths) {
|
|
33
|
+
const trimmed = String(entry ?? '').trim();
|
|
34
|
+
if (!trimmed)
|
|
35
|
+
continue;
|
|
36
|
+
const abs = path.isAbsolute(trimmed) ? trimmed : path.resolve(opts.cwd, trimmed);
|
|
37
|
+
try {
|
|
38
|
+
const mod = await import(pathToFileURL(abs).href);
|
|
39
|
+
const plugin = await pluginFromModule(mod);
|
|
40
|
+
if (!plugin) {
|
|
41
|
+
const msg = `[hooks] plugin ${abs} did not export a valid hook plugin`;
|
|
42
|
+
if (strict)
|
|
43
|
+
throw new Error(msg);
|
|
44
|
+
logger(msg);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
loaded.push({ path: abs, plugin });
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const msg = `[hooks] failed to load plugin ${abs}: ${error?.message ?? String(error)}`;
|
|
51
|
+
if (strict)
|
|
52
|
+
throw new Error(msg);
|
|
53
|
+
logger(msg);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return loaded;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/hooks/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { HOOK_CAPABILITIES, } from './types.js';
|
|
2
|
+
const defaultLogger = (message) => {
|
|
3
|
+
if (!process.env.IDLEHANDS_QUIET_WARNINGS) {
|
|
4
|
+
console.warn(message);
|
|
5
|
+
}
|
|
6
|
+
};
|
|
7
|
+
function clampCapabilities(caps) {
|
|
8
|
+
const raw = Array.isArray(caps) && caps.length ? caps : ['observe'];
|
|
9
|
+
const allowed = new Set(HOOK_CAPABILITIES);
|
|
10
|
+
const uniq = new Set();
|
|
11
|
+
for (const cap of raw) {
|
|
12
|
+
if (allowed.has(cap))
|
|
13
|
+
uniq.add(cap);
|
|
14
|
+
}
|
|
15
|
+
if (uniq.size === 0)
|
|
16
|
+
uniq.add('observe');
|
|
17
|
+
return [...uniq];
|
|
18
|
+
}
|
|
19
|
+
function pushLimited(list, value, max = 25) {
|
|
20
|
+
list.push(value);
|
|
21
|
+
if (list.length > max)
|
|
22
|
+
list.splice(0, list.length - max);
|
|
23
|
+
}
|
|
24
|
+
function redactPayload(event, payload, caps) {
|
|
25
|
+
const out = JSON.parse(JSON.stringify(payload));
|
|
26
|
+
if (event === 'ask_start' && !caps.has('read_prompts')) {
|
|
27
|
+
out.instruction = '[redacted: missing read_prompts capability]';
|
|
28
|
+
}
|
|
29
|
+
if (event === 'ask_end' && !caps.has('read_responses')) {
|
|
30
|
+
out.text = '[redacted: missing read_responses capability]';
|
|
31
|
+
}
|
|
32
|
+
if (event === 'tool_call' && !caps.has('read_tool_args')) {
|
|
33
|
+
if (out.call && typeof out.call === 'object') {
|
|
34
|
+
out.call.args = {};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (event === 'tool_result' && !caps.has('read_tool_results')) {
|
|
38
|
+
if (out.result && typeof out.result === 'object') {
|
|
39
|
+
out.result.result = '[redacted: missing read_tool_results capability]';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (event === 'tool_stream' && !caps.has('read_tool_results')) {
|
|
43
|
+
if (out.stream && typeof out.stream === 'object') {
|
|
44
|
+
out.stream.chunk = '[redacted: missing read_tool_results capability]';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
export class HookManager {
|
|
50
|
+
handlers = new Map();
|
|
51
|
+
enabled;
|
|
52
|
+
strict;
|
|
53
|
+
warnMs;
|
|
54
|
+
logger;
|
|
55
|
+
getContext;
|
|
56
|
+
allowedCapabilities;
|
|
57
|
+
eventCounts = new Map();
|
|
58
|
+
recentErrors = [];
|
|
59
|
+
recentSlowHandlers = [];
|
|
60
|
+
plugins = [];
|
|
61
|
+
constructor(opts) {
|
|
62
|
+
this.enabled = opts.enabled !== false;
|
|
63
|
+
this.strict = opts.strict === true;
|
|
64
|
+
this.warnMs = Math.max(0, Math.floor(opts.warnMs ?? 250));
|
|
65
|
+
this.logger = opts.logger ?? defaultLogger;
|
|
66
|
+
this.getContext = opts.context;
|
|
67
|
+
const allowed = clampCapabilities(opts.allowedCapabilities);
|
|
68
|
+
this.allowedCapabilities = new Set(allowed);
|
|
69
|
+
if (!this.allowedCapabilities.has('observe')) {
|
|
70
|
+
this.allowedCapabilities.add('observe');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
isEnabled() {
|
|
74
|
+
return this.enabled;
|
|
75
|
+
}
|
|
76
|
+
getSnapshot() {
|
|
77
|
+
const handlers = [];
|
|
78
|
+
for (const [event, list] of this.handlers) {
|
|
79
|
+
for (const item of list) {
|
|
80
|
+
handlers.push({ source: item.source, event });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const counts = {};
|
|
84
|
+
for (const [event, count] of this.eventCounts) {
|
|
85
|
+
counts[event] = count;
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
enabled: this.enabled,
|
|
89
|
+
strict: this.strict,
|
|
90
|
+
allowedCapabilities: [...this.allowedCapabilities],
|
|
91
|
+
plugins: [...this.plugins],
|
|
92
|
+
handlers,
|
|
93
|
+
eventCounts: counts,
|
|
94
|
+
recentErrors: [...this.recentErrors],
|
|
95
|
+
recentSlowHandlers: [...this.recentSlowHandlers],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
on(event, handler, source = 'runtime', capabilities) {
|
|
99
|
+
if (!this.enabled)
|
|
100
|
+
return;
|
|
101
|
+
const list = this.handlers.get(event) ?? [];
|
|
102
|
+
list.push({
|
|
103
|
+
source,
|
|
104
|
+
fn: handler,
|
|
105
|
+
capabilities: new Set(clampCapabilities(capabilities)),
|
|
106
|
+
});
|
|
107
|
+
this.handlers.set(event, list);
|
|
108
|
+
}
|
|
109
|
+
async registerPlugin(plugin, source) {
|
|
110
|
+
if (!this.enabled)
|
|
111
|
+
return;
|
|
112
|
+
const requested = clampCapabilities(plugin.capabilities);
|
|
113
|
+
const granted = requested.filter((c) => this.allowedCapabilities.has(c));
|
|
114
|
+
const denied = requested.filter((c) => !this.allowedCapabilities.has(c));
|
|
115
|
+
if (granted.length === 0) {
|
|
116
|
+
granted.push('observe');
|
|
117
|
+
}
|
|
118
|
+
if (denied.length > 0) {
|
|
119
|
+
const msg = `[hooks] plugin ${source} requested denied capabilities: ${denied.join(', ')}`;
|
|
120
|
+
if (this.strict)
|
|
121
|
+
throw new Error(msg);
|
|
122
|
+
this.logger(msg);
|
|
123
|
+
}
|
|
124
|
+
this.plugins.push({
|
|
125
|
+
source,
|
|
126
|
+
name: plugin.name || source,
|
|
127
|
+
requestedCapabilities: requested,
|
|
128
|
+
grantedCapabilities: granted,
|
|
129
|
+
deniedCapabilities: denied,
|
|
130
|
+
});
|
|
131
|
+
if (plugin.hooks && typeof plugin.hooks === 'object') {
|
|
132
|
+
for (const [event, value] of Object.entries(plugin.hooks)) {
|
|
133
|
+
const list = Array.isArray(value) ? value : [value];
|
|
134
|
+
for (const fn of list) {
|
|
135
|
+
if (typeof fn === 'function') {
|
|
136
|
+
this.on(event, fn, source, granted);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (typeof plugin.setup === 'function') {
|
|
142
|
+
await plugin.setup({
|
|
143
|
+
on: (event, handler) => this.on(event, handler, source, granted),
|
|
144
|
+
context: this.getContext(),
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async emit(event, payload) {
|
|
149
|
+
if (!this.enabled)
|
|
150
|
+
return;
|
|
151
|
+
const list = this.handlers.get(event);
|
|
152
|
+
if (!list || list.length === 0)
|
|
153
|
+
return;
|
|
154
|
+
this.eventCounts.set(event, (this.eventCounts.get(event) ?? 0) + 1);
|
|
155
|
+
const ctx = this.getContext();
|
|
156
|
+
for (const handler of list) {
|
|
157
|
+
const started = Date.now();
|
|
158
|
+
try {
|
|
159
|
+
const safePayload = redactPayload(event, payload, handler.capabilities);
|
|
160
|
+
await handler.fn(safePayload, ctx);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
const msg = `[hooks] ${event} handler failed (${handler.source}): ${error?.message ?? String(error)}`;
|
|
164
|
+
pushLimited(this.recentErrors, msg);
|
|
165
|
+
if (this.strict)
|
|
166
|
+
throw new Error(msg);
|
|
167
|
+
this.logger(msg);
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
const elapsed = Date.now() - started;
|
|
171
|
+
if (this.warnMs > 0 && elapsed >= this.warnMs) {
|
|
172
|
+
const slow = `[hooks] ${event} handler slow (${handler.source}): ${elapsed}ms`;
|
|
173
|
+
pushLimited(this.recentSlowHandlers, slow);
|
|
174
|
+
this.logger(slow);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/hooks/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example hook plugin.
|
|
3
|
+
*
|
|
4
|
+
* Configure in config.json:
|
|
5
|
+
* {
|
|
6
|
+
* "hooks": {
|
|
7
|
+
* "plugin_paths": ["./dist/hooks/plugins/example-console.js"]
|
|
8
|
+
* }
|
|
9
|
+
* }
|
|
10
|
+
*/
|
|
11
|
+
const plugin = {
|
|
12
|
+
name: 'example-console',
|
|
13
|
+
hooks: {
|
|
14
|
+
ask_start: ({ askId, instruction }, ctx) => {
|
|
15
|
+
const preview = instruction.length > 120 ? `${instruction.slice(0, 120)}…` : instruction;
|
|
16
|
+
console.error(`[hook:example-console] ask_start ${askId} model=${ctx.model} prompt=${preview}`);
|
|
17
|
+
},
|
|
18
|
+
ask_end: ({ askId, turns, toolCalls }) => {
|
|
19
|
+
console.error(`[hook:example-console] ask_end ${askId} turns=${turns} toolCalls=${toolCalls}`);
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
export default plugin;
|
|
24
|
+
//# sourceMappingURL=example-console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example-console.js","sourceRoot":"","sources":["../../../src/hooks/plugins/example-console.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,MAAM,GAAe;IACzB,IAAI,EAAE,iBAAiB;IACvB,KAAK,EAAE;QACL,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE;YACzC,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;YACzF,OAAO,CAAC,KAAK,CAAC,oCAAoC,KAAK,UAAU,GAAG,CAAC,KAAK,WAAW,OAAO,EAAE,CAAC,CAAC;QAClG,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE;YACvC,OAAO,CAAC,KAAK,CAAC,kCAAkC,KAAK,UAAU,KAAK,cAAc,SAAS,EAAE,CAAC,CAAC;QACjG,CAAC;KACF;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export function normalizePluginName(raw) {
|
|
4
|
+
const cleaned = String(raw ?? '').trim().toLowerCase();
|
|
5
|
+
if (!cleaned)
|
|
6
|
+
return '';
|
|
7
|
+
if (!/^[a-z0-9][a-z0-9._-]*$/.test(cleaned))
|
|
8
|
+
return '';
|
|
9
|
+
return cleaned;
|
|
10
|
+
}
|
|
11
|
+
function templateIndex(pluginName) {
|
|
12
|
+
return `import type { HookPlugin } from 'idlehands/dist/hooks/index.js';
|
|
13
|
+
|
|
14
|
+
const plugin: HookPlugin = {
|
|
15
|
+
name: '${pluginName}',
|
|
16
|
+
capabilities: ['observe'],
|
|
17
|
+
hooks: {
|
|
18
|
+
ask_start: ({ askId }, ctx) => {
|
|
19
|
+
console.error(\`[${pluginName}] ask_start \${askId} model=\${ctx.model}\`);
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export default plugin;
|
|
25
|
+
`;
|
|
26
|
+
}
|
|
27
|
+
function templateReadme(pluginName) {
|
|
28
|
+
return `# ${pluginName}\n\nGenerated hook plugin scaffold for Idle Hands.\n\n## Files\n\n- \`index.ts\` — plugin entry (default export)\n\n## Configure Idle Hands\n\nAdd this plugin path to your config:\n\n\`\`\`json\n{\n "hooks": {\n "plugin_paths": ["./plugins/${pluginName}/dist/index.js"]\n }\n}\n\`\`\`\n\nThen build your plugin and restart Idle Hands.\n`;
|
|
29
|
+
}
|
|
30
|
+
export async function scaffoldHookPlugin(opts) {
|
|
31
|
+
const pluginName = normalizePluginName(opts.pluginName);
|
|
32
|
+
if (!pluginName) {
|
|
33
|
+
throw new Error('Invalid plugin name. Use lowercase letters/numbers plus . _ -');
|
|
34
|
+
}
|
|
35
|
+
const targetDir = path.resolve(opts.baseDir, pluginName);
|
|
36
|
+
const exists = await fs.stat(targetDir).then(() => true).catch(() => false);
|
|
37
|
+
if (exists && !opts.force) {
|
|
38
|
+
throw new Error(`Target already exists: ${targetDir}`);
|
|
39
|
+
}
|
|
40
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
41
|
+
const files = [
|
|
42
|
+
path.join(targetDir, 'index.ts'),
|
|
43
|
+
path.join(targetDir, 'README.md'),
|
|
44
|
+
];
|
|
45
|
+
await fs.writeFile(files[0], templateIndex(pluginName), 'utf8');
|
|
46
|
+
await fs.writeFile(files[1], templateReadme(pluginName), 'utf8');
|
|
47
|
+
return {
|
|
48
|
+
pluginName,
|
|
49
|
+
targetDir,
|
|
50
|
+
files,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/hooks/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB;IACvC,OAAO;;;WAGE,UAAU;;;;yBAII,UAAU;;;;;;CAMlC,CAAC;AACF,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB;IACxC,OAAO,KAAK,UAAU,uPAAuP,UAAU,sFAAsF,CAAC;AAChX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAIxC;IACC,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5E,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG;QACZ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;KAClC,CAAC;IAEF,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAEjE,OAAO;QACL,UAAU;QACV,SAAS;QACT,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/hooks/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,SAAS;IACT,cAAc;IACd,gBAAgB;IAChB,gBAAgB;IAChB,mBAAmB;CACX,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ import { unifiedDiffFromBuffers } from './replay_cli.js';
|
|
|
14
14
|
import { makeStyler, resolveColorMode, colorizeUnifiedDiff, warn as warnFmt, err as errFmt } from './term.js';
|
|
15
15
|
import { resolveTheme } from './themes.js';
|
|
16
16
|
import { createVimState, handleVimKeypress } from './vim.js';
|
|
17
|
-
import { loadCustomCommands
|
|
17
|
+
import { loadCustomCommands } from './commands.js';
|
|
18
18
|
import { performUpgrade, performRollback, dailyUpdateCheck, detectInstallSource } from './upgrade.js';
|
|
19
19
|
import { setLockdown, setSafetyLogging, loadSafetyConfig } from './safety.js';
|
|
20
20
|
import { loadGitStartupSummary } from './git.js';
|
|
@@ -22,7 +22,7 @@ import { loadGitStartupSummary } from './git.js';
|
|
|
22
22
|
import { parseArgs, asNum, asBool, friendlyError, loadMcpServerConfigFile, printHelp, } from './cli/args.js';
|
|
23
23
|
import { readUserInput, readStdinIfPiped, reverseSearchHistory, isPathCompletionContext, expandAtFileRefs, expandPromptImages, } from './cli/input.js';
|
|
24
24
|
import { lastSessionPath, namedSessionPath, projectSessionPath, loadPromptTemplates, loadHistory, appendHistoryLine, rotateHistoryIfNeeded, } from './cli/session-state.js';
|
|
25
|
-
import {
|
|
25
|
+
import { runReplPreTurn } from './cli/repl-dispatch.js';
|
|
26
26
|
import { replayCaptureFile, formatStatusLine, renderStartupBanner, formatCount, endpointLooksLocal, } from './cli/status.js';
|
|
27
27
|
import { generateInitContext, formatInitSummary, } from './cli/init.js';
|
|
28
28
|
import { buildReplContext } from './cli/build-repl-context.js';
|
|
@@ -30,7 +30,7 @@ import { runAgentTurnWithSpinner } from './cli/agent-turn.js';
|
|
|
30
30
|
import { printBotHelp, runBotSubcommand } from './cli/bot.js';
|
|
31
31
|
import { runHostsSubcommand, runBackendsSubcommand, runModelsSubcommand, runSelectSubcommand, runHealthSubcommand } from './cli/runtime-cmds.js';
|
|
32
32
|
import { runOneShot } from './cli/oneshot.js';
|
|
33
|
-
import { registerAll,
|
|
33
|
+
import { registerAll, allCommandNames } from './cli/command-registry.js';
|
|
34
34
|
import { sessionCommands } from './cli/commands/session.js';
|
|
35
35
|
import { runtimeCommands } from './cli/commands/runtime.js';
|
|
36
36
|
import { modelCommands } from './cli/commands/model.js';
|
|
@@ -198,6 +198,9 @@ async function main() {
|
|
|
198
198
|
top_p: asNum(args['top-p'] ?? args.top_p),
|
|
199
199
|
timeout: asNum(args.timeout),
|
|
200
200
|
response_timeout: asNum(args['response-timeout'] ?? args.response_timeout),
|
|
201
|
+
connection_timeout: asNum(args['connection-timeout'] ?? args.connection_timeout),
|
|
202
|
+
initial_connection_check: asBool(args['initial-connection-check'] ?? args.initial_connection_check),
|
|
203
|
+
initial_connection_timeout: asNum(args['initial-connection-timeout'] ?? args.initial_connection_timeout),
|
|
201
204
|
max_iterations: asNum(args['max-iterations'] ?? args.max_iterations),
|
|
202
205
|
context_window: asNum(args['context-window'] ?? args.context_window),
|
|
203
206
|
approval_mode: typeof args['approval-mode'] === 'string'
|
|
@@ -682,68 +685,17 @@ async function main() {
|
|
|
682
685
|
console.log('⚠️ Anton is running. File changes may conflict. Use /anton stop first, or proceed at your own risk.');
|
|
683
686
|
}
|
|
684
687
|
}
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
console.log(S.dim(`[shell] $ ${command}`));
|
|
696
|
-
const result = await runDirectShellCommand({
|
|
697
|
-
command, cwd: projectDir(config), timeoutSec,
|
|
698
|
-
onStart: (proc) => { ctx.activeShellProc = proc; },
|
|
699
|
-
onStop: () => { ctx.activeShellProc = null; },
|
|
700
|
-
});
|
|
701
|
-
if (result.timedOut)
|
|
702
|
-
console.log(warnFmt(`[shell] killed after ${timeoutSec}s timeout`, S));
|
|
703
|
-
if (!result.timedOut && result.rc !== 0)
|
|
704
|
-
console.log(warnFmt(`[shell] exited with rc=${result.rc}`, S));
|
|
705
|
-
if (injectOutput) {
|
|
706
|
-
const merged = `${result.out}${result.err}`.slice(-4000);
|
|
707
|
-
session.messages.push({ role: 'user', content: `[Shell output]\n$ ${command}\n${merged}` });
|
|
708
|
-
console.log(S.dim('[shell] output injected into conversation context.'));
|
|
709
|
-
}
|
|
710
|
-
continue;
|
|
711
|
-
}
|
|
712
|
-
// Slash command dispatch via registry
|
|
713
|
-
const [slashHeadRaw, ...slashRest] = line.split(/\s+/);
|
|
714
|
-
const slashHead = slashHeadRaw.toLowerCase();
|
|
715
|
-
const registeredCmd = findCommand(line);
|
|
716
|
-
if (registeredCmd) {
|
|
717
|
-
const cmdArgs = line.replace(/^\S+\s*/, '').trim();
|
|
718
|
-
try {
|
|
719
|
-
const handled = await registeredCmd.execute(ctx, cmdArgs, line);
|
|
720
|
-
S = ctx.S; // sync in case command changed styler (e.g. /theme)
|
|
721
|
-
if (handled)
|
|
722
|
-
continue;
|
|
723
|
-
}
|
|
724
|
-
catch (e) {
|
|
725
|
-
console.error(errFmt(`${registeredCmd.name}: ${e?.message ?? String(e)}`, S));
|
|
726
|
-
continue;
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
// Template expansion (fall through to agent turn)
|
|
730
|
-
if (line.startsWith('/') && Object.prototype.hasOwnProperty.call(promptTemplates, slashHead)) {
|
|
731
|
-
const template = promptTemplates[slashHead];
|
|
732
|
-
ctx.pendingTemplate = template;
|
|
733
|
-
console.log(S.dim(`[template] queued from ${slashHead}. Your next prompt will be prefixed.`));
|
|
688
|
+
const preTurn = await runReplPreTurn({
|
|
689
|
+
line,
|
|
690
|
+
ctx,
|
|
691
|
+
session: session,
|
|
692
|
+
config: config,
|
|
693
|
+
promptTemplates,
|
|
694
|
+
});
|
|
695
|
+
S = ctx.S;
|
|
696
|
+
line = preTurn.line;
|
|
697
|
+
if (preTurn.handled)
|
|
734
698
|
continue;
|
|
735
|
-
}
|
|
736
|
-
// Custom command expansion (modifies line, falls through to agent turn)
|
|
737
|
-
if (line.startsWith('/') && ctx.customCommands.has(slashHead)) {
|
|
738
|
-
const cmd = ctx.customCommands.get(slashHead);
|
|
739
|
-
const expanded = expandArgs(cmd.template, slashRest).trim();
|
|
740
|
-
if (!expanded) {
|
|
741
|
-
console.log(warnFmt(`[command] ${slashHead} expanded to empty prompt.`, S));
|
|
742
|
-
continue;
|
|
743
|
-
}
|
|
744
|
-
line = expanded;
|
|
745
|
-
console.log(S.dim(`[command] ${slashHead} → prompt injected (${cmd.source})`));
|
|
746
|
-
}
|
|
747
699
|
// ── Agent turn ──
|
|
748
700
|
try {
|
|
749
701
|
const expandedRes = await expandAtFileRefs(line, projectDir(config), config.context_max_tokens ?? 8192);
|