@asterxsk/kiln 0.4.0 → 0.4.2
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 +155 -155
- package/agent/AGENTS.md +67 -67
- package/agent/README.md +5 -5
- package/agent/extensions/ask-user/index.ts +418 -418
- package/agent/extensions/ask-user/install.ps1 +27 -27
- package/agent/extensions/ask-user/install.sh +24 -24
- package/agent/extensions/ask-user/package-lock.json +769 -769
- package/agent/extensions/ask-user/package.json +19 -19
- package/agent/extensions/ask-user/prompt.ts +45 -45
- package/agent/extensions/ask-user/tsconfig.json +7 -7
- package/agent/extensions/background-terminals/docs/implementation-guide.md +942 -942
- package/agent/extensions/background-terminals/index.ts +627 -627
- package/agent/extensions/background-terminals/install.ps1 +27 -27
- package/agent/extensions/background-terminals/install.sh +24 -24
- package/agent/extensions/background-terminals/manager.test.ts +735 -735
- package/agent/extensions/background-terminals/output.test.ts +109 -109
- package/agent/extensions/background-terminals/package-lock.json +769 -769
- package/agent/extensions/background-terminals/package.json +17 -17
- package/agent/extensions/background-terminals/prompt.test.ts +125 -125
- package/agent/extensions/background-terminals/ps.test.ts +82 -82
- package/agent/extensions/background-terminals/result-delivery.test.ts +44 -44
- package/agent/extensions/background-terminals/src/domain.ts +87 -87
- package/agent/extensions/background-terminals/src/manager.ts +907 -907
- package/agent/extensions/background-terminals/src/output.ts +84 -84
- package/agent/extensions/background-terminals/src/prompt.ts +142 -142
- package/agent/extensions/background-terminals/src/result-delivery.ts +27 -27
- package/agent/extensions/background-terminals/src/runtime.ts +36 -36
- package/agent/extensions/background-terminals/src/ui/output-view.ts +79 -79
- package/agent/extensions/background-terminals/src/ui/ps.ts +621 -621
- package/agent/extensions/background-terminals/tsconfig.json +7 -7
- package/agent/extensions/destructive/README.md +31 -31
- package/agent/extensions/destructive/index.ts +88 -88
- package/agent/extensions/destructive/install.ps1 +27 -27
- package/agent/extensions/destructive/install.sh +24 -24
- package/agent/extensions/file-search/index.spec.ts +443 -443
- package/agent/extensions/file-search/index.ts +459 -459
- package/agent/extensions/file-search/install.ps1 +27 -27
- package/agent/extensions/file-search/install.sh +24 -24
- package/agent/extensions/file-search/package-lock.json +2253 -2253
- package/agent/extensions/file-search/package.json +23 -23
- package/agent/extensions/file-search/src/args.ts +122 -122
- package/agent/extensions/file-search/src/binaries.ts +422 -422
- package/agent/extensions/file-search/src/output.ts +126 -126
- package/agent/extensions/file-search/src/process.ts +146 -146
- package/agent/extensions/file-search/src/prompt.ts +52 -52
- package/agent/extensions/file-search/tsconfig.json +7 -7
- package/agent/extensions/goal/README.md +50 -50
- package/agent/extensions/goal/index.ts +155 -155
- package/agent/extensions/goal/install.ps1 +27 -27
- package/agent/extensions/goal/install.sh +24 -24
- package/agent/extensions/kiln-update/README.md +38 -25
- package/agent/extensions/kiln-update/index.ts +177 -99
- package/agent/extensions/modelconf/PLAN.md +915 -915
- package/agent/extensions/modelconf/README.md +66 -66
- package/agent/extensions/modelconf/index.ts +296 -296
- package/agent/extensions/modelconf/install.ps1 +27 -27
- package/agent/extensions/modelconf/install.sh +24 -24
- package/agent/extensions/modelconf/package-lock.json +1809 -1809
- package/agent/extensions/modelconf/package.json +13 -13
- package/agent/extensions/modelconf/src/fuzzy.ts +26 -26
- package/agent/extensions/modelconf/src/glob.ts +13 -13
- package/agent/extensions/modelconf/src/persistence.test.ts +46 -46
- package/agent/extensions/modelconf/src/persistence.ts +164 -164
- package/agent/extensions/modelconf/src/ui/ModelConfView.test.ts +75 -75
- package/agent/extensions/modelconf/src/ui/ModelConfView.ts +1101 -1101
- package/agent/extensions/modelconf/tsconfig.json +15 -15
- package/agent/extensions/pi-web-access/CHANGELOG.md +690 -690
- package/agent/extensions/pi-web-access/LICENSE +21 -21
- package/agent/extensions/pi-web-access/README.md +470 -470
- package/agent/extensions/pi-web-access/SECURITY.md +5 -5
- package/agent/extensions/pi-web-access/activity.ts +101 -101
- package/agent/extensions/pi-web-access/auth-fetch.ts +148 -148
- package/agent/extensions/pi-web-access/brightdata-unlocker.ts +272 -272
- package/agent/extensions/pi-web-access/chrome-cookies.ts +669 -669
- package/agent/extensions/pi-web-access/content-find.ts +139 -139
- package/agent/extensions/pi-web-access/credential-source.ts +191 -191
- package/agent/extensions/pi-web-access/data-uri-sanitize.ts +406 -406
- package/agent/extensions/pi-web-access/datalab-pdf-extract.ts +568 -568
- package/agent/extensions/pi-web-access/declared-web-links.ts +173 -173
- package/agent/extensions/pi-web-access/evidence/CONTRACT-EVIDENCE.md +496 -496
- package/agent/extensions/pi-web-access/evidence/contract-probe.mjs +140 -140
- package/agent/extensions/pi-web-access/exa.ts +526 -526
- package/agent/extensions/pi-web-access/extract.ts +1196 -1196
- package/agent/extensions/pi-web-access/feature-config.ts +29 -29
- package/agent/extensions/pi-web-access/fetch-params.ts +111 -111
- package/agent/extensions/pi-web-access/gemini-adc.ts +298 -298
- package/agent/extensions/pi-web-access/gemini-api.ts +353 -353
- package/agent/extensions/pi-web-access/gemini-pdf-extract.ts +108 -108
- package/agent/extensions/pi-web-access/gemini-search.ts +21 -21
- package/agent/extensions/pi-web-access/gemini-url-context.ts +128 -128
- package/agent/extensions/pi-web-access/gemini-web-config.ts +101 -101
- package/agent/extensions/pi-web-access/gemini-web.ts +487 -487
- package/agent/extensions/pi-web-access/github-api.ts +197 -197
- package/agent/extensions/pi-web-access/github-extract.ts +746 -746
- package/agent/extensions/pi-web-access/github-issue-pr.ts +700 -700
- package/agent/extensions/pi-web-access/index.ts +1737 -1737
- package/agent/extensions/pi-web-access/package-lock.json +5808 -5808
- package/agent/extensions/pi-web-access/package.json +64 -64
- package/agent/extensions/pi-web-access/page-query.ts +96 -96
- package/agent/extensions/pi-web-access/pdf-extract.ts +409 -409
- package/agent/extensions/pi-web-access/promise-try.d.ts +7 -7
- package/agent/extensions/pi-web-access/query-rewrite.ts +51 -51
- package/agent/extensions/pi-web-access/render-search-error.ts +170 -170
- package/agent/extensions/pi-web-access/rsc-extract.ts +338 -338
- package/agent/extensions/pi-web-access/search-types.ts +20 -20
- package/agent/extensions/pi-web-access/source-check.ts +282 -282
- package/agent/extensions/pi-web-access/ssrf-protection.ts +526 -526
- package/agent/extensions/pi-web-access/storage.ts +521 -521
- package/agent/extensions/pi-web-access/summary-model-scope.ts +125 -125
- package/agent/extensions/pi-web-access/test/auth-fetch.test.mjs +208 -208
- package/agent/extensions/pi-web-access/test/brightdata-unlocker.test.mjs +840 -840
- package/agent/extensions/pi-web-access/test/chrome-cookie-extraction.test.mjs +441 -441
- package/agent/extensions/pi-web-access/test/config-path.test.mjs +283 -283
- package/agent/extensions/pi-web-access/test/content-find.test.mjs +25 -25
- package/agent/extensions/pi-web-access/test/credential-source.test.mjs +118 -118
- package/agent/extensions/pi-web-access/test/data-uri-sanitize.test.mjs +210 -210
- package/agent/extensions/pi-web-access/test/datalab-pdf-extract.test.mjs +552 -552
- package/agent/extensions/pi-web-access/test/declared-web-links.test.mjs +212 -212
- package/agent/extensions/pi-web-access/test/fetch-answer-storage.test.mjs +40 -40
- package/agent/extensions/pi-web-access/test/fetch-cache-storage.test.mjs +334 -334
- package/agent/extensions/pi-web-access/test/fetch-content-domain-policy.test.mjs +95 -95
- package/agent/extensions/pi-web-access/test/fetch-modes.test.mjs +53 -53
- package/agent/extensions/pi-web-access/test/fetch-not-found-guidance.test.mjs +92 -92
- package/agent/extensions/pi-web-access/test/fetch-params.test.mjs +86 -86
- package/agent/extensions/pi-web-access/test/fetch-render-call.test.mjs +34 -34
- package/agent/extensions/pi-web-access/test/fetch-routing.test.mjs +173 -173
- package/agent/extensions/pi-web-access/test/gemini-adc-auth.test.mjs +257 -257
- package/agent/extensions/pi-web-access/test/gemini-api-transport.test.mjs +170 -170
- package/agent/extensions/pi-web-access/test/gemini-pdf-extract.test.mjs +133 -133
- package/agent/extensions/pi-web-access/test/gemini-web-cookie-opt-in.test.mjs +178 -178
- package/agent/extensions/pi-web-access/test/gemini-web-header-overflow.test.mjs +148 -148
- package/agent/extensions/pi-web-access/test/get-search-content.test.mjs +223 -223
- package/agent/extensions/pi-web-access/test/github-extract.test.mjs +378 -378
- package/agent/extensions/pi-web-access/test/github-issue-pr.test.mjs +565 -565
- package/agent/extensions/pi-web-access/test/inline-content-config.test.mjs +99 -99
- package/agent/extensions/pi-web-access/test/lazy-extract-load.test.mjs +118 -118
- package/agent/extensions/pi-web-access/test/local-video-oversize.test.mjs +52 -52
- package/agent/extensions/pi-web-access/test/package-typebox-dependency.test.mjs +50 -50
- package/agent/extensions/pi-web-access/test/page-query.test.mjs +51 -51
- package/agent/extensions/pi-web-access/test/pdf-config.test.mjs +140 -140
- package/agent/extensions/pi-web-access/test/pdf-extract.test.mjs +500 -500
- package/agent/extensions/pi-web-access/test/proxy-transport.test.mjs +286 -286
- package/agent/extensions/pi-web-access/test/query-rewrite.test.mjs +52 -52
- package/agent/extensions/pi-web-access/test/rsc-fallback.test.mjs +102 -102
- package/agent/extensions/pi-web-access/test/search-error-render.test.mjs +152 -152
- package/agent/extensions/pi-web-access/test/search-providers.test.mjs +274 -274
- package/agent/extensions/pi-web-access/test/source-check.test.mjs +179 -179
- package/agent/extensions/pi-web-access/test/ssrf-allow-ranges-config.test.mjs +205 -205
- package/agent/extensions/pi-web-access/test/ssrf-protection.test.mjs +456 -456
- package/agent/extensions/pi-web-access/test/summary-model-scope.test.mjs +106 -106
- package/agent/extensions/pi-web-access/test/tool-registration-config.test.mjs +182 -182
- package/agent/extensions/pi-web-access/test/web-search-answer-render.test.mjs +66 -66
- package/agent/extensions/pi-web-access/test/youtube-extract-errors.test.mjs +64 -64
- package/agent/extensions/pi-web-access/tsconfig.json +11 -11
- package/agent/extensions/pi-web-access/utils.ts +451 -451
- package/agent/extensions/pi-web-access/video-extract.ts +392 -392
- package/agent/extensions/pi-web-access/youtube-extract.ts +328 -328
- package/agent/extensions/shared/activity-status.ts +31 -31
- package/agent/extensions/shared/child-session.test.ts +270 -270
- package/agent/extensions/shared/child-session.ts +148 -148
- package/agent/extensions/shared/context-utilization.test.ts +48 -48
- package/agent/extensions/shared/context-utilization.ts +47 -47
- package/agent/extensions/shared/dashboard-state.ts +99 -99
- package/agent/extensions/shared/install.ps1 +27 -27
- package/agent/extensions/shared/install.sh +24 -24
- package/agent/extensions/shared/tool-call-timeout.test.ts +117 -117
- package/agent/extensions/shared/tool-call-timeout.ts +104 -104
- package/agent/extensions/skillsconf/README.md +74 -74
- package/agent/extensions/skillsconf/index.ts +92 -92
- package/agent/extensions/skillsconf/install.ps1 +27 -27
- package/agent/extensions/skillsconf/install.sh +24 -24
- package/agent/extensions/skillsconf/package-lock.json +1809 -1809
- package/agent/extensions/skillsconf/package.json +18 -18
- package/agent/extensions/skillsconf/src/delete-skill.test.ts +64 -64
- package/agent/extensions/skillsconf/src/delete-skill.ts +45 -45
- package/agent/extensions/skillsconf/src/filter.test.ts +80 -80
- package/agent/extensions/skillsconf/src/filter.ts +74 -74
- package/agent/extensions/skillsconf/src/fuzzy.ts +26 -26
- package/agent/extensions/skillsconf/src/persistence.test.ts +72 -72
- package/agent/extensions/skillsconf/src/persistence.ts +169 -169
- package/agent/extensions/skillsconf/src/ui/SkillConfView.test.ts +337 -337
- package/agent/extensions/skillsconf/src/ui/SkillConfView.ts +758 -758
- package/agent/extensions/skillsconf/src/ui/text-input.ts +91 -91
- package/agent/extensions/skillsconf/src/ui/tui-helpers.ts +144 -144
- package/agent/extensions/skillsconf/tsconfig.json +15 -15
- package/agent/extensions/statusline/index.ts +273 -282
- package/agent/extensions/statusline/install.ps1 +27 -27
- package/agent/extensions/statusline/install.sh +24 -24
- package/agent/extensions/subagents/by-the-way.test.ts +29 -29
- package/agent/extensions/subagents/claude.test.ts +119 -119
- package/agent/extensions/subagents/codex.test.ts +102 -102
- package/agent/extensions/subagents/context-usage.test.ts +107 -107
- package/agent/extensions/subagents/docs/design-plan.md +568 -568
- package/agent/extensions/subagents/docs/effect-v4-extension-guide.md +354 -354
- package/agent/extensions/subagents/docs/effect-v4-notes.md +571 -571
- package/agent/extensions/subagents/index.ts +779 -779
- package/agent/extensions/subagents/install.ps1 +27 -27
- package/agent/extensions/subagents/install.sh +24 -24
- package/agent/extensions/subagents/manager.test.ts +276 -276
- package/agent/extensions/subagents/package-lock.json +2244 -2244
- package/agent/extensions/subagents/package.json +19 -19
- package/agent/extensions/subagents/result-delivery.test.ts +27 -27
- package/agent/extensions/subagents/src/backend.ts +73 -73
- package/agent/extensions/subagents/src/backends/claude.ts +701 -701
- package/agent/extensions/subagents/src/backends/codex.ts +1060 -1060
- package/agent/extensions/subagents/src/backends/pi.ts +575 -575
- package/agent/extensions/subagents/src/backends/stub.ts +300 -300
- package/agent/extensions/subagents/src/by-the-way.ts +21 -21
- package/agent/extensions/subagents/src/domain.ts +253 -253
- package/agent/extensions/subagents/src/format.ts +74 -74
- package/agent/extensions/subagents/src/manager.ts +736 -736
- package/agent/extensions/subagents/src/prompt.ts +92 -92
- package/agent/extensions/subagents/src/result-delivery.ts +20 -20
- package/agent/extensions/subagents/src/runtime.ts +53 -53
- package/agent/extensions/subagents/src/ui/takeover.ts +583 -583
- package/agent/extensions/subagents/src/ui/transcript.ts +201 -201
- package/agent/extensions/subagents/takeover.test.ts +29 -29
- package/agent/extensions/subagents/tsconfig.json +7 -7
- package/agent/extensions/todo/AGENTS.md +38 -38
- package/agent/extensions/todo/LICENSE +21 -21
- package/agent/extensions/todo/config.ts +55 -55
- package/agent/extensions/todo/index.ts +151 -151
- package/agent/extensions/todo/install.ps1 +27 -27
- package/agent/extensions/todo/install.sh +24 -24
- package/agent/extensions/todo/locales/de.json +17 -17
- package/agent/extensions/todo/locales/en.json +15 -15
- package/agent/extensions/todo/locales/es.json +17 -17
- package/agent/extensions/todo/locales/fr.json +17 -17
- package/agent/extensions/todo/locales/pt-BR.json +17 -17
- package/agent/extensions/todo/locales/pt.json +17 -17
- package/agent/extensions/todo/locales/ru.json +17 -17
- package/agent/extensions/todo/locales/uk.json +17 -17
- package/agent/extensions/todo/locales/zh.json +17 -17
- package/agent/extensions/todo/package-lock.json +3358 -3358
- package/agent/extensions/todo/package.json +67 -67
- package/agent/extensions/todo/state/i18n-bridge.ts +64 -64
- package/agent/extensions/todo/state/invariants.ts +20 -20
- package/agent/extensions/todo/state/replay.ts +38 -38
- package/agent/extensions/todo/state/selectors.ts +107 -107
- package/agent/extensions/todo/state/state-reducer.ts +326 -326
- package/agent/extensions/todo/state/state.ts +18 -18
- package/agent/extensions/todo/state/store.ts +82 -82
- package/agent/extensions/todo/state/task-graph.ts +57 -57
- package/agent/extensions/todo/todo-overlay.ts +200 -200
- package/agent/extensions/todo/todo.ts +155 -155
- package/agent/extensions/todo/tool/response-envelope.ts +109 -109
- package/agent/extensions/todo/tool/types.ts +206 -206
- package/agent/extensions/todo/view/format.ts +177 -177
- package/agent/extensions/trim-context/README.md +54 -54
- package/agent/extensions/trim-context/index.ts +487 -487
- package/agent/extensions/trim-context/install.ps1 +27 -27
- package/agent/extensions/trim-context/install.sh +24 -24
- package/agent/keybindings.json +7 -7
- package/agent/version.txt +1 -1
- package/bin/kiln.js +20 -13
- package/package.json +1 -1
- package/agent/extensions/taste/index.ts +0 -443
- package/agent/extensions/taste/install.ps1 +0 -27
- package/agent/extensions/taste/install.sh +0 -24
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
import type { ToolDefinition } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
|
|
3
|
-
export const CHILD_TOOL_CALL_TIMEOUT_MS = 3 * 60 * 1_000;
|
|
4
|
-
|
|
5
|
-
interface ToolRegistry {
|
|
6
|
-
getAllTools(): Array<{ name: string }>;
|
|
7
|
-
getToolDefinition(name: string): ToolDefinition | undefined;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
function formatTimeout(timeoutMs: number) {
|
|
11
|
-
if (timeoutMs % 60_000 === 0) {
|
|
12
|
-
const minutes = timeoutMs / 60_000;
|
|
13
|
-
return `${minutes} minute${minutes === 1 ? "" : "s"}`;
|
|
14
|
-
}
|
|
15
|
-
if (timeoutMs % 1_000 === 0) {
|
|
16
|
-
const seconds = timeoutMs / 1_000;
|
|
17
|
-
return `${seconds} second${seconds === 1 ? "" : "s"}`;
|
|
18
|
-
}
|
|
19
|
-
return `${timeoutMs} ms`;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export class ToolCallTimeoutError extends Error {
|
|
23
|
-
constructor(toolName: string, timeoutMs: number) {
|
|
24
|
-
super(
|
|
25
|
-
`Tool call "${toolName}" timed out after ${formatTimeout(timeoutMs)}.`,
|
|
26
|
-
);
|
|
27
|
-
this.name = "ToolCallTimeoutError";
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export async function runWithToolCallTimeout<T>(
|
|
32
|
-
toolName: string,
|
|
33
|
-
timeoutMs: number,
|
|
34
|
-
signal: AbortSignal | undefined,
|
|
35
|
-
execute: (signal: AbortSignal) => Promise<T>,
|
|
36
|
-
) {
|
|
37
|
-
const timeoutController = new AbortController();
|
|
38
|
-
const executionSignal = signal
|
|
39
|
-
? AbortSignal.any([signal, timeoutController.signal])
|
|
40
|
-
: timeoutController.signal;
|
|
41
|
-
const timeoutError = new ToolCallTimeoutError(toolName, timeoutMs);
|
|
42
|
-
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
43
|
-
const timeout = new Promise<never>((_resolve, reject) => {
|
|
44
|
-
timer = setTimeout(() => {
|
|
45
|
-
reject(timeoutError);
|
|
46
|
-
timeoutController.abort(timeoutError);
|
|
47
|
-
}, timeoutMs);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
let removeAbortListener: (() => void) | undefined;
|
|
51
|
-
const aborted = new Promise<never>((_resolve, reject) => {
|
|
52
|
-
if (!signal) return;
|
|
53
|
-
const onAbort = () => {
|
|
54
|
-
reject(
|
|
55
|
-
signal.reason instanceof Error
|
|
56
|
-
? signal.reason
|
|
57
|
-
: new Error(`Tool call "${toolName}" was aborted.`),
|
|
58
|
-
);
|
|
59
|
-
};
|
|
60
|
-
if (signal.aborted) {
|
|
61
|
-
onAbort();
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
signal.addEventListener("abort", onAbort, { once: true });
|
|
65
|
-
removeAbortListener = () => signal.removeEventListener("abort", onAbort);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
try {
|
|
69
|
-
return await Promise.race([execute(executionSignal), timeout, aborted]);
|
|
70
|
-
} finally {
|
|
71
|
-
if (timer) clearTimeout(timer);
|
|
72
|
-
removeAbortListener?.();
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Wrap every currently registered child tool with an independent execution
|
|
78
|
-
* timeout. Calling apply() again is safe and picks up tools registered later.
|
|
79
|
-
*/
|
|
80
|
-
export function createToolCallTimeoutGuard(
|
|
81
|
-
timeoutMs = CHILD_TOOL_CALL_TIMEOUT_MS,
|
|
82
|
-
) {
|
|
83
|
-
const wrapped = new WeakSet<ToolDefinition>();
|
|
84
|
-
|
|
85
|
-
const wrap = (definition: ToolDefinition) => {
|
|
86
|
-
if (wrapped.has(definition)) return;
|
|
87
|
-
wrapped.add(definition);
|
|
88
|
-
|
|
89
|
-
const execute = definition.execute;
|
|
90
|
-
definition.execute = async (toolCallId, params, signal, onUpdate, ctx) =>
|
|
91
|
-
runWithToolCallTimeout(definition.name, timeoutMs, signal, (signal) =>
|
|
92
|
-
execute.call(definition, toolCallId, params, signal, onUpdate, ctx),
|
|
93
|
-
);
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
return {
|
|
97
|
-
apply(session: ToolRegistry) {
|
|
98
|
-
for (const { name } of session.getAllTools()) {
|
|
99
|
-
const definition = session.getToolDefinition(name);
|
|
100
|
-
if (definition) wrap(definition);
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
};
|
|
104
|
-
}
|
|
1
|
+
import type { ToolDefinition } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
export const CHILD_TOOL_CALL_TIMEOUT_MS = 3 * 60 * 1_000;
|
|
4
|
+
|
|
5
|
+
interface ToolRegistry {
|
|
6
|
+
getAllTools(): Array<{ name: string }>;
|
|
7
|
+
getToolDefinition(name: string): ToolDefinition | undefined;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function formatTimeout(timeoutMs: number) {
|
|
11
|
+
if (timeoutMs % 60_000 === 0) {
|
|
12
|
+
const minutes = timeoutMs / 60_000;
|
|
13
|
+
return `${minutes} minute${minutes === 1 ? "" : "s"}`;
|
|
14
|
+
}
|
|
15
|
+
if (timeoutMs % 1_000 === 0) {
|
|
16
|
+
const seconds = timeoutMs / 1_000;
|
|
17
|
+
return `${seconds} second${seconds === 1 ? "" : "s"}`;
|
|
18
|
+
}
|
|
19
|
+
return `${timeoutMs} ms`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class ToolCallTimeoutError extends Error {
|
|
23
|
+
constructor(toolName: string, timeoutMs: number) {
|
|
24
|
+
super(
|
|
25
|
+
`Tool call "${toolName}" timed out after ${formatTimeout(timeoutMs)}.`,
|
|
26
|
+
);
|
|
27
|
+
this.name = "ToolCallTimeoutError";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export async function runWithToolCallTimeout<T>(
|
|
32
|
+
toolName: string,
|
|
33
|
+
timeoutMs: number,
|
|
34
|
+
signal: AbortSignal | undefined,
|
|
35
|
+
execute: (signal: AbortSignal) => Promise<T>,
|
|
36
|
+
) {
|
|
37
|
+
const timeoutController = new AbortController();
|
|
38
|
+
const executionSignal = signal
|
|
39
|
+
? AbortSignal.any([signal, timeoutController.signal])
|
|
40
|
+
: timeoutController.signal;
|
|
41
|
+
const timeoutError = new ToolCallTimeoutError(toolName, timeoutMs);
|
|
42
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
43
|
+
const timeout = new Promise<never>((_resolve, reject) => {
|
|
44
|
+
timer = setTimeout(() => {
|
|
45
|
+
reject(timeoutError);
|
|
46
|
+
timeoutController.abort(timeoutError);
|
|
47
|
+
}, timeoutMs);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
let removeAbortListener: (() => void) | undefined;
|
|
51
|
+
const aborted = new Promise<never>((_resolve, reject) => {
|
|
52
|
+
if (!signal) return;
|
|
53
|
+
const onAbort = () => {
|
|
54
|
+
reject(
|
|
55
|
+
signal.reason instanceof Error
|
|
56
|
+
? signal.reason
|
|
57
|
+
: new Error(`Tool call "${toolName}" was aborted.`),
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
if (signal.aborted) {
|
|
61
|
+
onAbort();
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
65
|
+
removeAbortListener = () => signal.removeEventListener("abort", onAbort);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
return await Promise.race([execute(executionSignal), timeout, aborted]);
|
|
70
|
+
} finally {
|
|
71
|
+
if (timer) clearTimeout(timer);
|
|
72
|
+
removeAbortListener?.();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Wrap every currently registered child tool with an independent execution
|
|
78
|
+
* timeout. Calling apply() again is safe and picks up tools registered later.
|
|
79
|
+
*/
|
|
80
|
+
export function createToolCallTimeoutGuard(
|
|
81
|
+
timeoutMs = CHILD_TOOL_CALL_TIMEOUT_MS,
|
|
82
|
+
) {
|
|
83
|
+
const wrapped = new WeakSet<ToolDefinition>();
|
|
84
|
+
|
|
85
|
+
const wrap = (definition: ToolDefinition) => {
|
|
86
|
+
if (wrapped.has(definition)) return;
|
|
87
|
+
wrapped.add(definition);
|
|
88
|
+
|
|
89
|
+
const execute = definition.execute;
|
|
90
|
+
definition.execute = async (toolCallId, params, signal, onUpdate, ctx) =>
|
|
91
|
+
runWithToolCallTimeout(definition.name, timeoutMs, signal, (signal) =>
|
|
92
|
+
execute.call(definition, toolCallId, params, signal, onUpdate, ctx),
|
|
93
|
+
);
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
apply(session: ToolRegistry) {
|
|
98
|
+
for (const { name } of session.getAllTools()) {
|
|
99
|
+
const definition = session.getToolDefinition(name);
|
|
100
|
+
if (definition) wrap(definition);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
@@ -1,74 +1,74 @@
|
|
|
1
|
-
# skillsconf
|
|
2
|
-
|
|
3
|
-
Per-skill visibility manager for pi, with **packages** (named groups) for mass enable/disable.
|
|
4
|
-
|
|
5
|
-
Disabled skills are stripped from the system prompt every turn (via `before_agent_start`),
|
|
6
|
-
so they cost zero context. Nothing is moved on disk — packages are just named lists
|
|
7
|
-
stored in settings.
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
/skillsconf
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Keybindings
|
|
14
|
-
|
|
15
|
-
- `↑` / `↓` or `j` / `k` — navigate; `Home`/`End` (`g`/`G`) jump
|
|
16
|
-
- `Space` — toggle the selected skill **or** the selected package (whole group on/off)
|
|
17
|
-
- `/` — fuzzy filter by name/description; `↑`/`↓` exit typing (filter kept) and
|
|
18
|
-
move; `←`/`→` edit the query; `Esc` clears, `Enter` keeps filter
|
|
19
|
-
- `e` — toggle grouped view (packages + ungrouped skills) vs flat list of all skills
|
|
20
|
-
- `n` — new package (type a name, `Enter` creates, `Esc` cancels)
|
|
21
|
-
- `a` — on a package: enter assign mode (cursor jumps to skills, `Space` toggles
|
|
22
|
-
membership, `Enter` done, `Esc` cancel without changing the package)
|
|
23
|
-
- `d` — delete what's under the cursor (package group, or skill files from disk)
|
|
24
|
-
with a `y`/`n` confirm (`Esc` cancels)
|
|
25
|
-
- `s` — save to settings, stay open (`● unsaved — press s to save` clears; takes
|
|
26
|
-
effect next turn)
|
|
27
|
-
- `Esc` / `q` — quit (`s` first if you want to keep changes); quitting with pending
|
|
28
|
-
changes shows `changes discarded (not saved)`
|
|
29
|
-
Package rows show `(enabled/total)`: `◉` all on, `◍` partial, `○` all off / empty.
|
|
30
|
-
Each package row leads with an accent `▸` marker and bold name so it stands out
|
|
31
|
-
from skills.
|
|
32
|
-
|
|
33
|
-
Skills that belong to a package are hidden from the main list and managed via
|
|
34
|
-
their package row (grouped view). `e` switches to a flat list showing every
|
|
35
|
-
skill; `/` search and assign mode always see every skill, with a `⟨package⟩`
|
|
36
|
-
tag showing membership.
|
|
37
|
-
|
|
38
|
-
## Persistence
|
|
39
|
-
|
|
40
|
-
Writes `disabledSkills` and `skillPackages` in `~/.pi/agent/settings.json`:
|
|
41
|
-
|
|
42
|
-
- Nothing disabled + no packages → both keys removed to keep settings clean
|
|
43
|
-
- `skillPackages` maps package name → sorted member skill names (empty packages kept)
|
|
44
|
-
- Stale names (skills no longer on disk) are filtered on the next save
|
|
45
|
-
|
|
46
|
-
No reload happens on save — the prompt filter re-reads settings from disk every
|
|
47
|
-
turn, so changes apply from the next agent turn on. Physically deleted skills
|
|
48
|
-
vanish from the loaded list after `/reload`.
|
|
49
|
-
|
|
50
|
-
## Keyboard shortcut
|
|
51
|
-
|
|
52
|
-
`Ctrl+Alt+S` opens skillsconf when supported by the host.
|
|
53
|
-
|
|
54
|
-
## How filtering works
|
|
55
|
-
|
|
56
|
-
pi renders loaded skills as `<skill><name>…` blocks inside `<available_skills>`.
|
|
57
|
-
The extension removes the blocks whose `<name>` is in `disabledSkills` (verbatim block
|
|
58
|
-
surgery — kept blocks are byte-identical). When all skills are disabled, the whole
|
|
59
|
-
section including its intro is removed.
|
|
60
|
-
|
|
61
|
-
## Development
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
npx tsc --noEmit --project ./tsconfig.json
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
Tests are plain `node:assert` files (same style as `modelconf`):
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
npx tsc --project ./tsconfig.json --outDir /tmp/skillsconf-test
|
|
71
|
-
node --test /tmp/skillsconf-test/src/filter.test.js \
|
|
72
|
-
/tmp/skillsconf-test/src/persistence.test.js \
|
|
73
|
-
/tmp/skillsconf-test/src/ui/SkillConfView.test.js
|
|
74
|
-
```
|
|
1
|
+
# skillsconf
|
|
2
|
+
|
|
3
|
+
Per-skill visibility manager for pi, with **packages** (named groups) for mass enable/disable.
|
|
4
|
+
|
|
5
|
+
Disabled skills are stripped from the system prompt every turn (via `before_agent_start`),
|
|
6
|
+
so they cost zero context. Nothing is moved on disk — packages are just named lists
|
|
7
|
+
stored in settings.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
/skillsconf
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Keybindings
|
|
14
|
+
|
|
15
|
+
- `↑` / `↓` or `j` / `k` — navigate; `Home`/`End` (`g`/`G`) jump
|
|
16
|
+
- `Space` — toggle the selected skill **or** the selected package (whole group on/off)
|
|
17
|
+
- `/` — fuzzy filter by name/description; `↑`/`↓` exit typing (filter kept) and
|
|
18
|
+
move; `←`/`→` edit the query; `Esc` clears, `Enter` keeps filter
|
|
19
|
+
- `e` — toggle grouped view (packages + ungrouped skills) vs flat list of all skills
|
|
20
|
+
- `n` — new package (type a name, `Enter` creates, `Esc` cancels)
|
|
21
|
+
- `a` — on a package: enter assign mode (cursor jumps to skills, `Space` toggles
|
|
22
|
+
membership, `Enter` done, `Esc` cancel without changing the package)
|
|
23
|
+
- `d` — delete what's under the cursor (package group, or skill files from disk)
|
|
24
|
+
with a `y`/`n` confirm (`Esc` cancels)
|
|
25
|
+
- `s` — save to settings, stay open (`● unsaved — press s to save` clears; takes
|
|
26
|
+
effect next turn)
|
|
27
|
+
- `Esc` / `q` — quit (`s` first if you want to keep changes); quitting with pending
|
|
28
|
+
changes shows `changes discarded (not saved)`
|
|
29
|
+
Package rows show `(enabled/total)`: `◉` all on, `◍` partial, `○` all off / empty.
|
|
30
|
+
Each package row leads with an accent `▸` marker and bold name so it stands out
|
|
31
|
+
from skills.
|
|
32
|
+
|
|
33
|
+
Skills that belong to a package are hidden from the main list and managed via
|
|
34
|
+
their package row (grouped view). `e` switches to a flat list showing every
|
|
35
|
+
skill; `/` search and assign mode always see every skill, with a `⟨package⟩`
|
|
36
|
+
tag showing membership.
|
|
37
|
+
|
|
38
|
+
## Persistence
|
|
39
|
+
|
|
40
|
+
Writes `disabledSkills` and `skillPackages` in `~/.pi/agent/settings.json`:
|
|
41
|
+
|
|
42
|
+
- Nothing disabled + no packages → both keys removed to keep settings clean
|
|
43
|
+
- `skillPackages` maps package name → sorted member skill names (empty packages kept)
|
|
44
|
+
- Stale names (skills no longer on disk) are filtered on the next save
|
|
45
|
+
|
|
46
|
+
No reload happens on save — the prompt filter re-reads settings from disk every
|
|
47
|
+
turn, so changes apply from the next agent turn on. Physically deleted skills
|
|
48
|
+
vanish from the loaded list after `/reload`.
|
|
49
|
+
|
|
50
|
+
## Keyboard shortcut
|
|
51
|
+
|
|
52
|
+
`Ctrl+Alt+S` opens skillsconf when supported by the host.
|
|
53
|
+
|
|
54
|
+
## How filtering works
|
|
55
|
+
|
|
56
|
+
pi renders loaded skills as `<skill><name>…` blocks inside `<available_skills>`.
|
|
57
|
+
The extension removes the blocks whose `<name>` is in `disabledSkills` (verbatim block
|
|
58
|
+
surgery — kept blocks are byte-identical). When all skills are disabled, the whole
|
|
59
|
+
section including its intro is removed.
|
|
60
|
+
|
|
61
|
+
## Development
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
npx tsc --noEmit --project ./tsconfig.json
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Tests are plain `node:assert` files (same style as `modelconf`):
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npx tsc --project ./tsconfig.json --outDir /tmp/skillsconf-test
|
|
71
|
+
node --test /tmp/skillsconf-test/src/filter.test.js \
|
|
72
|
+
/tmp/skillsconf-test/src/persistence.test.js \
|
|
73
|
+
/tmp/skillsconf-test/src/ui/SkillConfView.test.js
|
|
74
|
+
```
|
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import { filterSkillsPrompt } from "./src/filter.js";
|
|
3
|
-
import { loadSkillState, loadSkillStateSync, saveSkillState } from "./src/persistence.js";
|
|
4
|
-
import { SkillConfView } from "./src/ui/SkillConfView.js";
|
|
5
|
-
|
|
6
|
-
export default function (pi: ExtensionAPI) {
|
|
7
|
-
// Strip disabled skills from the system prompt every turn so they cost
|
|
8
|
-
// zero context. Skills are keyed by Skill.name, matching the <name> block
|
|
9
|
-
// pi renders into <available_skills>.
|
|
10
|
-
pi.on("before_agent_start", async (event, _ctx) => {
|
|
11
|
-
try {
|
|
12
|
-
const state = loadSkillStateSync();
|
|
13
|
-
if (!state.disabled || state.disabled.length === 0) return;
|
|
14
|
-
const systemPrompt = (event as unknown as { systemPrompt?: string }).systemPrompt;
|
|
15
|
-
if (typeof systemPrompt !== "string" || systemPrompt.length === 0) return;
|
|
16
|
-
const next = filterSkillsPrompt(systemPrompt, state.disabled);
|
|
17
|
-
if (next !== systemPrompt) return { systemPrompt: next };
|
|
18
|
-
} catch {}
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
async function openSkillConf(ctx: any) {
|
|
22
|
-
if (ctx.mode !== "tui") {
|
|
23
|
-
ctx.ui.notify("/skillsconf requires TUI mode", "error");
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
let skills: Array<{ name: string; description: string; filePath: string }> = [];
|
|
27
|
-
try {
|
|
28
|
-
const opts = ctx.getSystemPromptOptions?.() as
|
|
29
|
-
| { skills?: Array<{ name: string; description?: string; filePath?: string }> }
|
|
30
|
-
| undefined;
|
|
31
|
-
skills = (opts?.skills ?? []).map((s) => ({
|
|
32
|
-
name: s.name,
|
|
33
|
-
description: s.description ?? "",
|
|
34
|
-
filePath: s.filePath ?? "",
|
|
35
|
-
}));
|
|
36
|
-
} catch {}
|
|
37
|
-
const state = await loadSkillState();
|
|
38
|
-
|
|
39
|
-
await ctx.ui.custom((tui: any, theme: any, kb: any, done: any) => {
|
|
40
|
-
const view = new SkillConfView({
|
|
41
|
-
tui,
|
|
42
|
-
theme,
|
|
43
|
-
keybindings: kb,
|
|
44
|
-
skills,
|
|
45
|
-
disabledRaw: state.disabled,
|
|
46
|
-
packagesRaw: state.packages,
|
|
47
|
-
onDone: (saved: boolean, discarded?: boolean) => {
|
|
48
|
-
done(saved);
|
|
49
|
-
try {
|
|
50
|
-
tui?.requestRender?.();
|
|
51
|
-
} catch {}
|
|
52
|
-
if (!saved && discarded) {
|
|
53
|
-
try {
|
|
54
|
-
ctx.ui.notify("skillsconf: changes discarded (not saved)", "warning");
|
|
55
|
-
} catch {}
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
onPersist: async (disabled, packages) => {
|
|
59
|
-
await saveSkillState(disabled, packages, skills.map((s) => s.name));
|
|
60
|
-
const enabledCount = skills.length - (disabled?.length ?? 0);
|
|
61
|
-
try {
|
|
62
|
-
ctx.ui.notify(
|
|
63
|
-
`skillsconf: saved ${enabledCount}/${skills.length} skills enabled, ${Object.keys(packages).length} packages`,
|
|
64
|
-
"info",
|
|
65
|
-
);
|
|
66
|
-
} catch {}
|
|
67
|
-
// No reload: saves are in-place and the UI stays open. The
|
|
68
|
-
// before_agent_start hook re-reads settings from disk every turn.
|
|
69
|
-
},
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
return {
|
|
73
|
-
render: view.render.bind(view),
|
|
74
|
-
handleInput: view.handleInput.bind(view),
|
|
75
|
-
invalidate: view.invalidate.bind(view),
|
|
76
|
-
};
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
pi.registerCommand("skillsconf", {
|
|
81
|
-
description:
|
|
82
|
-
"Enable/disable skills and manage skill packages (space toggle, s save, n package, a assign, d delete)",
|
|
83
|
-
handler: async (_args, ctx) => openSkillConf(ctx),
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
try {
|
|
87
|
-
(pi as any).registerShortcut?.("ctrl+alt+s" as any, {
|
|
88
|
-
description: "Open skillsconf",
|
|
89
|
-
handler: async (ctx: any) => openSkillConf(ctx),
|
|
90
|
-
});
|
|
91
|
-
} catch {}
|
|
92
|
-
}
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { filterSkillsPrompt } from "./src/filter.js";
|
|
3
|
+
import { loadSkillState, loadSkillStateSync, saveSkillState } from "./src/persistence.js";
|
|
4
|
+
import { SkillConfView } from "./src/ui/SkillConfView.js";
|
|
5
|
+
|
|
6
|
+
export default function (pi: ExtensionAPI) {
|
|
7
|
+
// Strip disabled skills from the system prompt every turn so they cost
|
|
8
|
+
// zero context. Skills are keyed by Skill.name, matching the <name> block
|
|
9
|
+
// pi renders into <available_skills>.
|
|
10
|
+
pi.on("before_agent_start", async (event, _ctx) => {
|
|
11
|
+
try {
|
|
12
|
+
const state = loadSkillStateSync();
|
|
13
|
+
if (!state.disabled || state.disabled.length === 0) return;
|
|
14
|
+
const systemPrompt = (event as unknown as { systemPrompt?: string }).systemPrompt;
|
|
15
|
+
if (typeof systemPrompt !== "string" || systemPrompt.length === 0) return;
|
|
16
|
+
const next = filterSkillsPrompt(systemPrompt, state.disabled);
|
|
17
|
+
if (next !== systemPrompt) return { systemPrompt: next };
|
|
18
|
+
} catch {}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
async function openSkillConf(ctx: any) {
|
|
22
|
+
if (ctx.mode !== "tui") {
|
|
23
|
+
ctx.ui.notify("/skillsconf requires TUI mode", "error");
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
let skills: Array<{ name: string; description: string; filePath: string }> = [];
|
|
27
|
+
try {
|
|
28
|
+
const opts = ctx.getSystemPromptOptions?.() as
|
|
29
|
+
| { skills?: Array<{ name: string; description?: string; filePath?: string }> }
|
|
30
|
+
| undefined;
|
|
31
|
+
skills = (opts?.skills ?? []).map((s) => ({
|
|
32
|
+
name: s.name,
|
|
33
|
+
description: s.description ?? "",
|
|
34
|
+
filePath: s.filePath ?? "",
|
|
35
|
+
}));
|
|
36
|
+
} catch {}
|
|
37
|
+
const state = await loadSkillState();
|
|
38
|
+
|
|
39
|
+
await ctx.ui.custom((tui: any, theme: any, kb: any, done: any) => {
|
|
40
|
+
const view = new SkillConfView({
|
|
41
|
+
tui,
|
|
42
|
+
theme,
|
|
43
|
+
keybindings: kb,
|
|
44
|
+
skills,
|
|
45
|
+
disabledRaw: state.disabled,
|
|
46
|
+
packagesRaw: state.packages,
|
|
47
|
+
onDone: (saved: boolean, discarded?: boolean) => {
|
|
48
|
+
done(saved);
|
|
49
|
+
try {
|
|
50
|
+
tui?.requestRender?.();
|
|
51
|
+
} catch {}
|
|
52
|
+
if (!saved && discarded) {
|
|
53
|
+
try {
|
|
54
|
+
ctx.ui.notify("skillsconf: changes discarded (not saved)", "warning");
|
|
55
|
+
} catch {}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
onPersist: async (disabled, packages) => {
|
|
59
|
+
await saveSkillState(disabled, packages, skills.map((s) => s.name));
|
|
60
|
+
const enabledCount = skills.length - (disabled?.length ?? 0);
|
|
61
|
+
try {
|
|
62
|
+
ctx.ui.notify(
|
|
63
|
+
`skillsconf: saved ${enabledCount}/${skills.length} skills enabled, ${Object.keys(packages).length} packages`,
|
|
64
|
+
"info",
|
|
65
|
+
);
|
|
66
|
+
} catch {}
|
|
67
|
+
// No reload: saves are in-place and the UI stays open. The
|
|
68
|
+
// before_agent_start hook re-reads settings from disk every turn.
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
render: view.render.bind(view),
|
|
74
|
+
handleInput: view.handleInput.bind(view),
|
|
75
|
+
invalidate: view.invalidate.bind(view),
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
pi.registerCommand("skillsconf", {
|
|
81
|
+
description:
|
|
82
|
+
"Enable/disable skills and manage skill packages (space toggle, s save, n package, a assign, d delete)",
|
|
83
|
+
handler: async (_args, ctx) => openSkillConf(ctx),
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
(pi as any).registerShortcut?.("ctrl+alt+s" as any, {
|
|
88
|
+
description: "Open skillsconf",
|
|
89
|
+
handler: async (ctx: any) => openSkillConf(ctx),
|
|
90
|
+
});
|
|
91
|
+
} catch {}
|
|
92
|
+
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
#!/usr/bin/env pwsh
|
|
2
|
-
# Per-extension installer — Windows / PowerShell
|
|
3
|
-
# Installs npm dependencies for this extension. No-op if no package.json.
|
|
4
|
-
$ErrorActionPreference = "Stop"
|
|
5
|
-
# Drop npm_config_allow_scripts inherited from a parent npm/npx process:
|
|
6
|
-
# npm >=11 rejects it for project installs (EALLOWSCRIPTS). File config still applies.
|
|
7
|
-
Remove-Item Env:\npm_config_allow_scripts -ErrorAction SilentlyContinue
|
|
8
|
-
Remove-Item Env:\NPM_CONFIG_ALLOW_SCRIPTS -ErrorAction SilentlyContinue
|
|
9
|
-
$extDir = $PSScriptRoot
|
|
10
|
-
if (-not $extDir) { $extDir = Split-Path -Parent $MyInvocation.MyCommand.Path }
|
|
11
|
-
if (-not (Test-Path "$extDir/package.json")) {
|
|
12
|
-
Write-Host " - no package.json — skipping" -ForegroundColor DarkGray
|
|
13
|
-
exit 0
|
|
14
|
-
}
|
|
15
|
-
if (-not (Get-Command npm -ErrorAction SilentlyContinue)) {
|
|
16
|
-
Write-Host " x npm not found — install Node.js 22+" -ForegroundColor Red
|
|
17
|
-
exit 1
|
|
18
|
-
}
|
|
19
|
-
if (Test-Path "$extDir/package-lock.json") {
|
|
20
|
-
Write-Host " - npm ci" -ForegroundColor DarkGray
|
|
21
|
-
npm --prefix $extDir ci --no-audit --no-fund
|
|
22
|
-
} else {
|
|
23
|
-
Write-Host " - npm install" -ForegroundColor DarkGray
|
|
24
|
-
npm --prefix $extDir install --no-audit --no-fund
|
|
25
|
-
}
|
|
26
|
-
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
27
|
-
Write-Host " + done" -ForegroundColor Green
|
|
1
|
+
#!/usr/bin/env pwsh
|
|
2
|
+
# Per-extension installer — Windows / PowerShell
|
|
3
|
+
# Installs npm dependencies for this extension. No-op if no package.json.
|
|
4
|
+
$ErrorActionPreference = "Stop"
|
|
5
|
+
# Drop npm_config_allow_scripts inherited from a parent npm/npx process:
|
|
6
|
+
# npm >=11 rejects it for project installs (EALLOWSCRIPTS). File config still applies.
|
|
7
|
+
Remove-Item Env:\npm_config_allow_scripts -ErrorAction SilentlyContinue
|
|
8
|
+
Remove-Item Env:\NPM_CONFIG_ALLOW_SCRIPTS -ErrorAction SilentlyContinue
|
|
9
|
+
$extDir = $PSScriptRoot
|
|
10
|
+
if (-not $extDir) { $extDir = Split-Path -Parent $MyInvocation.MyCommand.Path }
|
|
11
|
+
if (-not (Test-Path "$extDir/package.json")) {
|
|
12
|
+
Write-Host " - no package.json — skipping" -ForegroundColor DarkGray
|
|
13
|
+
exit 0
|
|
14
|
+
}
|
|
15
|
+
if (-not (Get-Command npm -ErrorAction SilentlyContinue)) {
|
|
16
|
+
Write-Host " x npm not found — install Node.js 22+" -ForegroundColor Red
|
|
17
|
+
exit 1
|
|
18
|
+
}
|
|
19
|
+
if (Test-Path "$extDir/package-lock.json") {
|
|
20
|
+
Write-Host " - npm ci" -ForegroundColor DarkGray
|
|
21
|
+
npm --prefix $extDir ci --no-audit --no-fund
|
|
22
|
+
} else {
|
|
23
|
+
Write-Host " - npm install" -ForegroundColor DarkGray
|
|
24
|
+
npm --prefix $extDir install --no-audit --no-fund
|
|
25
|
+
}
|
|
26
|
+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
27
|
+
Write-Host " + done" -ForegroundColor Green
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
#!/bin/sh
|
|
2
|
-
# Per-extension installer — macOS / Linux
|
|
3
|
-
# Installs npm dependencies for this extension. No-op if no package.json.
|
|
4
|
-
set -eu
|
|
5
|
-
# Drop npm_config_allow_scripts inherited from a parent npm/npx process:
|
|
6
|
-
# npm >=11 rejects it for project installs (EALLOWSCRIPTS). File config still applies.
|
|
7
|
-
unset npm_config_allow_scripts NPM_CONFIG_ALLOW_SCRIPTS 2>/dev/null || true
|
|
8
|
-
EXT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
9
|
-
if [ ! -f "$EXT_DIR/package.json" ]; then
|
|
10
|
-
echo " · no package.json — skipping"
|
|
11
|
-
exit 0
|
|
12
|
-
fi
|
|
13
|
-
if ! command -v npm >/dev/null 2>&1; then
|
|
14
|
-
echo " ✖ npm not found — install Node.js 22+" >&2
|
|
15
|
-
exit 1
|
|
16
|
-
fi
|
|
17
|
-
if [ -f "$EXT_DIR/package-lock.json" ]; then
|
|
18
|
-
echo " · npm ci"
|
|
19
|
-
npm --prefix "$EXT_DIR" ci --no-audit --no-fund
|
|
20
|
-
else
|
|
21
|
-
echo " · npm install"
|
|
22
|
-
npm --prefix "$EXT_DIR" install --no-audit --no-fund
|
|
23
|
-
fi
|
|
24
|
-
echo " ✓ done"
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Per-extension installer — macOS / Linux
|
|
3
|
+
# Installs npm dependencies for this extension. No-op if no package.json.
|
|
4
|
+
set -eu
|
|
5
|
+
# Drop npm_config_allow_scripts inherited from a parent npm/npx process:
|
|
6
|
+
# npm >=11 rejects it for project installs (EALLOWSCRIPTS). File config still applies.
|
|
7
|
+
unset npm_config_allow_scripts NPM_CONFIG_ALLOW_SCRIPTS 2>/dev/null || true
|
|
8
|
+
EXT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
9
|
+
if [ ! -f "$EXT_DIR/package.json" ]; then
|
|
10
|
+
echo " · no package.json — skipping"
|
|
11
|
+
exit 0
|
|
12
|
+
fi
|
|
13
|
+
if ! command -v npm >/dev/null 2>&1; then
|
|
14
|
+
echo " ✖ npm not found — install Node.js 22+" >&2
|
|
15
|
+
exit 1
|
|
16
|
+
fi
|
|
17
|
+
if [ -f "$EXT_DIR/package-lock.json" ]; then
|
|
18
|
+
echo " · npm ci"
|
|
19
|
+
npm --prefix "$EXT_DIR" ci --no-audit --no-fund
|
|
20
|
+
else
|
|
21
|
+
echo " · npm install"
|
|
22
|
+
npm --prefix "$EXT_DIR" install --no-audit --no-fund
|
|
23
|
+
fi
|
|
24
|
+
echo " ✓ done"
|