@greppleai/grip 0.1.6 → 0.1.7
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/CHANGELOG.md +19 -0
- package/README.md +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +11 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +172 -2
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +9 -2
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +22 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +21 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/instruction-resource-loader.d.ts +1 -0
- package/dist/core/instruction-resource-loader.d.ts.map +1 -1
- package/dist/core/instruction-resource-loader.js +2 -1
- package/dist/core/instruction-resource-loader.js.map +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +30 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +3 -2
- package/dist/core/skills.js.map +1 -1
- package/dist/core/system-prompt.d.ts +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +3 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts +1 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +26 -23
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/operations.d.ts +6 -0
- package/dist/core/tools/operations.d.ts.map +1 -1
- package/dist/core/tools/operations.js +28 -4
- package/dist/core/tools/operations.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +8 -3
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +7 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +0 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +25 -23
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +33 -2
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/binary-self-update.d.ts +25 -0
- package/dist/utils/binary-self-update.d.ts.map +1 -0
- package/dist/utils/binary-self-update.js +159 -0
- package/dist/utils/binary-self-update.js.map +1 -0
- package/dist/utils/directory-completions.d.ts +8 -0
- package/dist/utils/directory-completions.d.ts.map +1 -1
- package/dist/utils/directory-completions.js +42 -1
- package/dist/utils/directory-completions.js.map +1 -1
- package/docs/extensions.md +31 -1
- package/docs/sandbox.md +2 -2
- package/docs/sessions.md +1 -1
- package/docs/skills.md +4 -4
- package/docs/usage.md +1 -1
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager-cli.d.ts","sourceRoot":"","sources":["../src/package-manager-cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package-manager-cli.d.ts","sourceRoot":"","sources":["../src/package-manager-cli.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAyftE,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAoB1E;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAuB3E"}
|
|
@@ -4,7 +4,9 @@ import { selectConfig } from "./cli/config-selector.js";
|
|
|
4
4
|
import { APP_NAME, detectInstallMethod, getAgentDir, getPackageDir, getSelfUpdateCommand, getSelfUpdateUnavailableInstruction, PACKAGE_NAME, VERSION, } from "./config.js";
|
|
5
5
|
import { DefaultPackageManager } from "./core/package-manager.js";
|
|
6
6
|
import { SettingsManager } from "./core/settings-manager.js";
|
|
7
|
+
import { updateBinaryExecutable } from "./utils/binary-self-update.js";
|
|
7
8
|
import { spawnProcess } from "./utils/child-process.js";
|
|
9
|
+
import { getGripUserAgent } from "./utils/grip-user-agent.js";
|
|
8
10
|
import { getLatestGripRelease, isNewerPackageVersion } from "./utils/version-check.js";
|
|
9
11
|
import { cleanupWindowsSelfUpdateQuarantine, quarantineWindowsNativeDependencies, } from "./utils/windows-self-update.js";
|
|
10
12
|
const SELF_UPDATE_NOTE_MARKDOWN_THEME = {
|
|
@@ -279,8 +281,14 @@ async function getSelfUpdatePlan(force) {
|
|
|
279
281
|
return { shouldRun: true };
|
|
280
282
|
try {
|
|
281
283
|
const latestRelease = await getLatestGripRelease(VERSION);
|
|
282
|
-
if (!latestRelease
|
|
283
|
-
return { shouldRun: true
|
|
284
|
+
if (!latestRelease)
|
|
285
|
+
return { shouldRun: true };
|
|
286
|
+
if (isNewerPackageVersion(latestRelease.version, VERSION)) {
|
|
287
|
+
return {
|
|
288
|
+
shouldRun: true,
|
|
289
|
+
version: latestRelease.version,
|
|
290
|
+
...(latestRelease.note ? { note: latestRelease.note } : {}),
|
|
291
|
+
};
|
|
284
292
|
}
|
|
285
293
|
}
|
|
286
294
|
catch {
|
|
@@ -289,6 +297,25 @@ async function getSelfUpdatePlan(force) {
|
|
|
289
297
|
console.log(chalk.green(`${APP_NAME} is already up to date (v${VERSION})`));
|
|
290
298
|
return { shouldRun: false };
|
|
291
299
|
}
|
|
300
|
+
async function updateBinarySelf(plan) {
|
|
301
|
+
if (plan.note)
|
|
302
|
+
printSelfUpdateNote(plan.note);
|
|
303
|
+
const target = plan.version ? `v${plan.version}` : "the latest release";
|
|
304
|
+
console.log(chalk.dim(`Updating ${APP_NAME} executable ${process.execPath} to ${target}...`));
|
|
305
|
+
try {
|
|
306
|
+
const result = await updateBinaryExecutable({
|
|
307
|
+
...(plan.version ? { version: plan.version } : {}),
|
|
308
|
+
userAgent: getGripUserAgent(VERSION),
|
|
309
|
+
});
|
|
310
|
+
console.log(chalk.green(`Updated ${APP_NAME} (${result.executablePath})`));
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
const message = error instanceof Error ? error.message : "Unknown binary update error";
|
|
314
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
315
|
+
console.error(chalk.dim(getSelfUpdateUnavailableInstruction(PACKAGE_NAME)));
|
|
316
|
+
process.exitCode = 1;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
292
319
|
async function runSelfUpdate(command) {
|
|
293
320
|
console.log(chalk.dim(`Updating ${APP_NAME} with ${command.display}...`));
|
|
294
321
|
await new Promise((resolve, reject) => {
|
|
@@ -382,6 +409,10 @@ async function updateSelf(force, npmCommand) {
|
|
|
382
409
|
if (!selfUpdatePlan.shouldRun)
|
|
383
410
|
return;
|
|
384
411
|
const installMethod = detectInstallMethod();
|
|
412
|
+
if (installMethod === "bun-binary") {
|
|
413
|
+
await updateBinarySelf(selfUpdatePlan);
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
385
416
|
if (process.platform === "win32" && installMethod !== "npm" && installMethod !== "pnpm") {
|
|
386
417
|
console.error(chalk.red(`${APP_NAME} self-update on Windows is only supported for npm and pnpm installs.`));
|
|
387
418
|
console.error(chalk.dim(`Detected install method: ${installMethod}. Update ${APP_NAME} manually.`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager-cli.js","sourceRoot":"","sources":["../src/package-manager-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAsB,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EACN,QAAQ,EACR,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,mCAAmC,EACnC,YAAY,EAEZ,OAAO,GACP,MAAM,aAAa,CAAC;AACrB,OAAO,EAA0B,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EACN,kCAAkC,EAClC,mCAAmC,GACnC,MAAM,gCAAgC,CAAC;AAMxC,MAAM,+BAA+B,GAAkB;IACtD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAChC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;IAClC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACpC,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1C,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACtC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAChC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;IACpC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;IAClD,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;CAC1C,CAAC;AA8BF,MAAM,mBAAmB,GAAoC,IAAI,GAAG,CAAC;IACpE,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,cAAc,EAAE,YAAY,CAAC;IAC9B,CAAC,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC,CAAC;AAEH,SAAS,oBAAoB,CAAC,eAAgC,EAAE,OAAe;IAC9E,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;IAC7C,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,OAAO,KAAK,KAAK,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzF,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAuB;IACtD,QAAQ,OAAO,EAAE,CAAC;QACjB,KAAK,SAAS;YACb,OAAO,GAAG,QAAQ,wBAAwB,CAAC;QAC5C,KAAK,QAAQ;YACZ,OAAO,GAAG,QAAQ,uBAAuB,CAAC;QAC3C,KAAK,QAAQ;YACZ,OAAO,GAAG,QAAQ,qFAAqF,CAAC;QACzG,KAAK,MAAM;YACV,OAAO,GAAG,QAAQ,OAAO,CAAC;IAC5B,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAuB;IACvD,QAAQ,OAAO,EAAE,CAAC;QACjB,KAAK,SAAS;YACb,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClC,sBAAsB,CAAC,SAAS,CAAC;;;;;;;;IAQjC,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;CACX,CAAC,CAAC;YACA,OAAO;QAER,KAAK,QAAQ;YACZ,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClC,sBAAsB,CAAC,QAAQ,CAAC;;;SAG3B,QAAQ;;;;;;IAMb,QAAQ;IACR,QAAQ;CACX,CAAC,CAAC;YACA,OAAO;QAER,KAAK,QAAQ;YACZ,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClC,sBAAsB,CAAC,QAAQ,CAAC;;;;;;;;;;;IAWhC,QAAQ;IACR,QAAQ;IACR,QAAQ;CACX,CAAC,CAAC;YACA,OAAO;QAER,KAAK,MAAM;YACV,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClC,sBAAsB,CAAC,MAAM,CAAC;;;CAGjC,CAAC,CAAC;YACA,OAAO;IACT,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAAC,UAA8B;IAC9D,IAAI,UAAU,KAAK,WAAW;QAAE,OAAO,QAAQ,CAAC;IAChD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC7G,OAAO,UAAU,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAc,EAAE,KAAa,EAAE,KAA+B;IAC7F,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,KAAK,CAAC,aAAa,KAAK,aAAa,CAAC;QACtC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,kBAAkB,KAAK,aAAa,CAAC;QAC3C,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC/B,KAAK,CAAC,kBAAkB,KAAK,uCAAuC,CAAC;QACrE,OAAO,KAAK,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,CAAC,mBAAmB,GAAG,KAAK,CAAC;IAClC,OAAO,KAAK,GAAG,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,iCAAiC,CAAC,GAAW,EAAE,KAA+B;IACtF,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,aAAa,KAAK,GAAG,CAAC;QAC5B,OAAO;IACR,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;;QACjC,KAAK,CAAC,eAAe,KAAK,GAAG,CAAC;AACpC,CAAC;AAED,SAAS,6BAA6B,CAAC,IAAc,EAAE,KAAa,EAAE,KAA+B;IACpG,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ;YAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;;YAC7E,KAAK,CAAC,aAAa,KAAK,GAAG,CAAC;QACjC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,UAAU,EAAE,CAAC;QAChB,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ;YAAE,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;;YAChE,KAAK,CAAC,aAAa,KAAK,GAAG,CAAC;QACjC,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,GAAG,KAAK,aAAa;QAAE,OAAO,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7E,iCAAiC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,gCAAgC,CAAC,KAA+B;IACxE,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QAC5D,KAAK,CAAC,kBAAkB,KAAK,4DAA4D,CAAC;IAC3F,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,kBAAkB,KAAK,yDAAyD,CAAC;IACxF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,mBAAmB,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,6BAA6B,CAAC,KAA+B;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAO,CAAC;IAC7B,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1E,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC5D,KAAK,CAAC,kBAAkB,KAAK,0EAA0E,CAAC;IACzG,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA+B;IAC3D,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACjD,IAAI,KAAK,CAAC,mBAAmB;QAAE,OAAO,gCAAgC,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,6BAA6B,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnF,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACpD,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAChE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAc;IAC1C,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACnC,MAAM,OAAO,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,MAAM,KAAK,GAA6B;QACvC,OAAO;QACP,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;KAC7D,CAAC;IACF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,KAAK,GAAG,6BAA6B,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACN,OAAO;QACP,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,YAAY,EAAE,mBAAmB,CAAC,KAAK,CAAC;QACxC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK;QAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;KAC5C,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAoB;IACrD,OAAO,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;AACxD,CAAC;AAED,SAAS,8BAA8B,CAAC,MAAoB;IAC3D,OAAO,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC;AAC9D,CAAC;AAED,SAAS,0BAA0B,CAAC,UAAqB;IACxD,OAAO,CAAC,KAAK,CAAC,UAAU,QAAQ,wCAAwC,CAAC,CAAC;IAC1E,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IAE7E,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;IAC7D,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAAC,OAA0B;IAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,SAAS,+BAA+B;IACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,sFAAsF,CAAC,CAAC,CAAC;IACpH,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,wCAAwC,QAAQ,mBAAmB,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACxC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,OAAO;IACR,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,+BAA+B,CAAC;aACpF,MAAM,CAAC,KAAK,CAAC;aACb,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AACf,CAAC;AAOD,KAAK,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,KAAK;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAEtC,IAAI,CAAC;QACJ,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,aAAa,IAAI,qBAAqB,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;YAC7E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1F,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,4BAA4B,OAAO,GAAG,CAAC,CAAC,CAAC;IAC5E,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AACD,KAAK,UAAU,aAAa,CAAC,OAA0B;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,QAAQ,SAAS,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC;IAC1E,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAChF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAClC,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;iBACrB,IAAI,MAAM;gBAAE,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,yBAAyB,MAAM,EAAE,CAAC,CAAC,CAAC;;gBACnF,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,qBAAqB,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B;IACnC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClC,OAAO;IACR,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,kCAAkC,CAAC,UAAU,CAAC,CAAC;IAC/C,mCAAmC,CAAC,UAAU,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,6BAA6B,CAAC,OAA8B;IACpE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,aAAa,SAAS,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,QAAQ,gBAAgB,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACvG,CAAC;SAAM,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;SAAM,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;SAAM,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;SAAM,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC/F,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;SAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAsB;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IAC5B,IAAI,GAAG,CAAC,aAAa;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,sBAAsB,CAAC,cAAqC;IACpE,MAAM,kBAAkB,GAAG,cAAc,CAAC,sBAAsB,EAAE,CAAC;IACnE,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;IAC9E,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IACpF,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACjD,OAAO;IACR,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC1C,KAAK,MAAM,GAAG,IAAI,YAAY;YAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,eAAe;YAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAChE,CAAC;AACF,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,cAAqC,EAAE,MAAoB;IAClG,IAAI,CAAC,8BAA8B,CAAC,MAAM,CAAC;QAAE,OAAO;IACpD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,YAAY,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,KAAc,EAAE,UAAqB;IAC9D,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,cAAc,CAAC,SAAS;QAAE,OAAO;IACtC,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;IAC5C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,aAAa,KAAK,KAAK,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QACzF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,sEAAsE,CAAC,CAAC,CAAC;QAC5G,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,aAAa,YAAY,QAAQ,YAAY,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IACD,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACzE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACxB,0BAA0B,CAAC,UAAU,CAAC,CAAC;QACvC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IACD,IAAI,cAAc,CAAC,IAAI;QAAE,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,CAAC;QACJ,IAAI,aAAa,KAAK,KAAK;YAAE,2BAA2B,EAAE,CAAC;QAC3D,MAAM,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC;QACzF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,aAAa,KAAK,MAAM;YAAE,+BAA+B,EAAE,CAAC;QAChE,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;QAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,qBAAqB,CACnC,OAA8B,EAC9B,cAAqC,EACrC,oBAA0C;IAE1C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC;QACzB,KAAK,SAAS;YACb,MAAM,cAAc,CAAC,iBAAiB,CAAC,MAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC;QACb,KAAK,QAAQ,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,gBAAgB,CAAC,MAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACzF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACpE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO,IAAI,CAAC;YACb,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;QACb,CAAC;QACD,KAAK,MAAM;YACV,sBAAsB,CAAC,cAAc,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC;QACb,KAAK,QAAQ,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACvD,MAAM,wBAAwB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YACvD,IAAI,wBAAwB,CAAC,MAAM,CAAC;gBAAE,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;YAC5F,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAc;IACvD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9D,oBAAoB,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;IACrF,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC;IAErD,MAAM,YAAY,CAAC;QAClB,aAAa;QACb,eAAe;QACf,GAAG;QACH,QAAQ;KACR,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAc;IACxD,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,6BAA6B,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9D,oBAAoB,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;IACzD,MAAM,oBAAoB,GAAG,eAAe,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC;IAC5E,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;IACrF,cAAc,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACJ,OAAO,MAAM,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,oBAAoB,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC;QACzF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC","sourcesContent":["import { Markdown, type MarkdownTheme } from \"@greppleai/grip-tui\";\nimport chalk from \"chalk\";\nimport { selectConfig } from \"./cli/config-selector.ts\";\nimport {\n\tAPP_NAME,\n\tdetectInstallMethod,\n\tgetAgentDir,\n\tgetPackageDir,\n\tgetSelfUpdateCommand,\n\tgetSelfUpdateUnavailableInstruction,\n\tPACKAGE_NAME,\n\ttype SelfUpdateCommand,\n\tVERSION,\n} from \"./config.ts\";\nimport { type ConfiguredPackage, DefaultPackageManager } from \"./core/package-manager.ts\";\nimport { SettingsManager } from \"./core/settings-manager.ts\";\nimport { spawnProcess } from \"./utils/child-process.ts\";\nimport { getLatestGripRelease, isNewerPackageVersion } from \"./utils/version-check.ts\";\nimport {\n\tcleanupWindowsSelfUpdateQuarantine,\n\tquarantineWindowsNativeDependencies,\n} from \"./utils/windows-self-update.ts\";\n\nexport type PackageCommand = \"install\" | \"remove\" | \"update\" | \"list\";\n\ntype UpdateTarget = { type: \"all\" } | { type: \"self\" } | { type: \"extensions\"; source?: string };\n\nconst SELF_UPDATE_NOTE_MARKDOWN_THEME: MarkdownTheme = {\n\theading: (text) => chalk.bold(chalk.yellow(text)),\n\tlink: (text) => chalk.cyan(text),\n\tlinkUrl: (text) => chalk.dim(text),\n\tcode: (text) => chalk.yellow(text),\n\tcodeBlock: (text) => chalk.dim(text),\n\tcodeBlockBorder: (text) => chalk.dim(text),\n\tquote: (text) => chalk.dim(text),\n\tquoteBorder: (text) => chalk.dim(text),\n\thr: (text) => chalk.dim(text),\n\tlistBullet: (text) => chalk.yellow(text),\n\tbold: (text) => chalk.bold(text),\n\titalic: (text) => chalk.italic(text),\n\tstrikethrough: (text) => chalk.strikethrough(text),\n\tunderline: (text) => chalk.underline(text),\n};\n\ninterface PackageCommandOptions {\n\tcommand: PackageCommand;\n\tsource?: string;\n\tupdateTarget?: UpdateTarget;\n\tlocal: boolean;\n\tforce: boolean;\n\thelp: boolean;\n\tinvalidOption?: string;\n\tinvalidArgument?: string;\n\tmissingOptionValue?: string;\n\tconflictingOptions?: string;\n}\n\ntype UpdateFlag = \"self\" | \"extensions\" | \"force\";\n\ninterface PackageCommandParseState {\n\tcommand: PackageCommand;\n\tlocal: boolean;\n\thelp: boolean;\n\tinvalidOption?: string;\n\tinvalidArgument?: string;\n\tmissingOptionValue?: string;\n\tconflictingOptions?: string;\n\tsource?: string;\n\tupdateFlags: Record<UpdateFlag, boolean>;\n\textensionFlagSource?: string;\n}\n\nconst UPDATE_FLAG_OPTIONS: ReadonlyMap<string, UpdateFlag> = new Map([\n\t[\"--self\", \"self\"],\n\t[\"--extensions\", \"extensions\"],\n\t[\"--force\", \"force\"],\n]);\n\nfunction reportSettingsErrors(settingsManager: SettingsManager, context: string): void {\n\tconst errors = settingsManager.drainErrors();\n\tfor (const { scope, error } of errors) {\n\t\tconsole.error(chalk.yellow(`Warning (${context}, ${scope} settings): ${error.message}`));\n\t\tif (error.stack) {\n\t\t\tconsole.error(chalk.dim(error.stack));\n\t\t}\n\t}\n}\n\nfunction getPackageCommandUsage(command: PackageCommand): string {\n\tswitch (command) {\n\t\tcase \"install\":\n\t\t\treturn `${APP_NAME} install <source> [-l]`;\n\t\tcase \"remove\":\n\t\t\treturn `${APP_NAME} remove <source> [-l]`;\n\t\tcase \"update\":\n\t\t\treturn `${APP_NAME} update [source|self|grip] [--self] [--extensions] [--extension <source>] [--force]`;\n\t\tcase \"list\":\n\t\t\treturn `${APP_NAME} list`;\n\t}\n}\n\nfunction printPackageCommandHelp(command: PackageCommand): void {\n\tswitch (command) {\n\t\tcase \"install\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"install\")}\n\nInstall a package and add it to settings.\n\nOptions:\n -l, --local Install project-locally (.grip/settings.json)\n\nExamples:\n ${APP_NAME} install npm:@foo/bar\n ${APP_NAME} install git:github.com/user/repo\n ${APP_NAME} install git:git@github.com:user/repo\n ${APP_NAME} install https://github.com/user/repo\n ${APP_NAME} install ssh://git@github.com/user/repo\n ${APP_NAME} install ./local/path\n`);\n\t\t\treturn;\n\n\t\tcase \"remove\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"remove\")}\n\nRemove a package and its source from settings.\nAlias: ${APP_NAME} uninstall <source> [-l]\n\nOptions:\n -l, --local Remove from project settings (.grip/settings.json)\n\nExamples:\n ${APP_NAME} remove npm:@foo/bar\n ${APP_NAME} uninstall npm:@foo/bar\n`);\n\t\t\treturn;\n\n\t\tcase \"update\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"update\")}\n\nUpdate grip and installed packages.\n\nOptions:\n --self Update grip only\n --extensions Update installed packages only\n --extension <source> Update one package only\n --force Reinstall grip even if the current version is latest\n\nShort forms:\n ${APP_NAME} update Update grip and all extensions\n ${APP_NAME} update <source> Update one package\n ${APP_NAME} update grip Update grip only (self works as alias to grip)\n`);\n\t\t\treturn;\n\n\t\tcase \"list\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"list\")}\n\nList installed packages from user and project settings.\n`);\n\t\t\treturn;\n\t}\n}\n\nfunction parsePackageCommandName(rawCommand: string | undefined): PackageCommand | undefined {\n\tif (rawCommand === \"uninstall\") return \"remove\";\n\tif (rawCommand === \"install\" || rawCommand === \"remove\" || rawCommand === \"update\" || rawCommand === \"list\") {\n\t\treturn rawCommand;\n\t}\n\treturn undefined;\n}\n\nfunction consumeExtensionOption(rest: string[], index: number, state: PackageCommandParseState): number {\n\tif (state.command !== \"update\") {\n\t\tstate.invalidOption ??= \"--extension\";\n\t\treturn index;\n\t}\n\n\tconst value = rest[index + 1];\n\tif (!value || value.startsWith(\"-\")) {\n\t\tstate.missingOptionValue ??= \"--extension\";\n\t\treturn index;\n\t}\n\tif (state.extensionFlagSource) {\n\t\tstate.conflictingOptions ??= \"--extension can only be provided once\";\n\t\treturn index + 1;\n\t}\n\tstate.extensionFlagSource = value;\n\treturn index + 1;\n}\n\nfunction recordUnrecognizedPackageArgument(arg: string, state: PackageCommandParseState): void {\n\tif (arg.startsWith(\"-\")) {\n\t\tstate.invalidOption ??= arg;\n\t\treturn;\n\t}\n\tif (!state.source) state.source = arg;\n\telse state.invalidArgument ??= arg;\n}\n\nfunction consumePackageCommandArgument(rest: string[], index: number, state: PackageCommandParseState): number {\n\tconst arg = rest[index];\n\tif (arg === \"-h\" || arg === \"--help\") {\n\t\tstate.help = true;\n\t\treturn index;\n\t}\n\tif (arg === \"-l\" || arg === \"--local\") {\n\t\tif (state.command === \"install\" || state.command === \"remove\") state.local = true;\n\t\telse state.invalidOption ??= arg;\n\t\treturn index;\n\t}\n\n\tconst updateFlag = UPDATE_FLAG_OPTIONS.get(arg);\n\tif (updateFlag) {\n\t\tif (state.command === \"update\") state.updateFlags[updateFlag] = true;\n\t\telse state.invalidOption ??= arg;\n\t\treturn index;\n\t}\n\tif (arg === \"--extension\") return consumeExtensionOption(rest, index, state);\n\trecordUnrecognizedPackageArgument(arg, state);\n\treturn index;\n}\n\nfunction resolveExtensionFlagUpdateTarget(state: PackageCommandParseState): UpdateTarget {\n\tif (state.updateFlags.self || state.updateFlags.extensions) {\n\t\tstate.conflictingOptions ??= \"--extension cannot be combined with --self or --extensions\";\n\t}\n\tif (state.source) {\n\t\tstate.conflictingOptions ??= \"--extension cannot be combined with a positional source\";\n\t}\n\treturn { type: \"extensions\", source: state.extensionFlagSource };\n}\n\nfunction resolvePositionalUpdateTarget(state: PackageCommandParseState): UpdateTarget {\n\tconst source = state.source!;\n\tif (source === \"self\" || source === \"grip\") {\n\t\treturn state.updateFlags.extensions ? { type: \"all\" } : { type: \"self\" };\n\t}\n\tif (state.updateFlags.extensions || state.updateFlags.self) {\n\t\tstate.conflictingOptions ??= \"positional update targets cannot be combined with --self or --extensions\";\n\t}\n\treturn { type: \"extensions\", source };\n}\n\nfunction resolveUpdateTarget(state: PackageCommandParseState): UpdateTarget | undefined {\n\tif (state.command !== \"update\") return undefined;\n\tif (state.extensionFlagSource) return resolveExtensionFlagUpdateTarget(state);\n\tif (state.source) return resolvePositionalUpdateTarget(state);\n\tif (state.updateFlags.self && state.updateFlags.extensions) return { type: \"all\" };\n\tif (state.updateFlags.self) return { type: \"self\" };\n\tif (state.updateFlags.extensions) return { type: \"extensions\" };\n\treturn { type: \"all\" };\n}\n\nfunction parsePackageCommand(args: string[]): PackageCommandOptions | undefined {\n\tconst [rawCommand, ...rest] = args;\n\tconst command = parsePackageCommandName(rawCommand);\n\tif (!command) return undefined;\n\n\tconst state: PackageCommandParseState = {\n\t\tcommand,\n\t\tlocal: false,\n\t\thelp: false,\n\t\tupdateFlags: { self: false, extensions: false, force: false },\n\t};\n\tfor (let index = 0; index < rest.length; index++) {\n\t\tindex = consumePackageCommandArgument(rest, index, state);\n\t}\n\n\treturn {\n\t\tcommand,\n\t\tsource: state.source,\n\t\tupdateTarget: resolveUpdateTarget(state),\n\t\tlocal: state.local,\n\t\tforce: state.updateFlags.force,\n\t\thelp: state.help,\n\t\tinvalidOption: state.invalidOption,\n\t\tinvalidArgument: state.invalidArgument,\n\t\tmissingOptionValue: state.missingOptionValue,\n\t\tconflictingOptions: state.conflictingOptions,\n\t};\n}\n\nfunction updateTargetIncludesSelf(target: UpdateTarget): boolean {\n\treturn target.type === \"all\" || target.type === \"self\";\n}\n\nfunction updateTargetIncludesExtensions(target: UpdateTarget): boolean {\n\treturn target.type === \"all\" || target.type === \"extensions\";\n}\n\nfunction printSelfUpdateUnavailable(npmCommand?: string[]): void {\n\tconsole.error(`error: ${APP_NAME} cannot self-update this installation.`);\n\tconsole.error(getSelfUpdateUnavailableInstruction(PACKAGE_NAME, npmCommand));\n\n\tconst entrypoint = process.argv[1];\n\tif (entrypoint) {\n\t\tconsole.error(\"\");\n\t\tconsole.error(`Location of grip executable: ${entrypoint}`);\n\t}\n}\n\nfunction printSelfUpdateFallback(command: SelfUpdateCommand): void {\n\tconsole.error(chalk.dim(`If this keeps failing, run this command yourself: ${command.display}`));\n}\n\nfunction printPnpmSelfUpdateMetadataHint(): void {\n\tconsole.error(chalk.yellow(\"If pnpm reports missing package versions, its cached registry metadata may be stale.\"));\n\tconsole.error(chalk.yellow(`Run \\`pnpm store prune\\` and retry \\`${APP_NAME} update --self\\`.`));\n}\n\nfunction printSelfUpdateNote(note: string): void {\n\tconst trimmedNote = note.trim();\n\tif (!trimmedNote) {\n\t\treturn;\n\t}\n\n\tconsole.log();\n\tconsole.log(chalk.bold(chalk.yellow(\"Update note\")));\n\ttry {\n\t\tconst width = Math.max(20, process.stdout.columns ?? 80);\n\t\tconst renderedLines = new Markdown(trimmedNote, 0, 0, SELF_UPDATE_NOTE_MARKDOWN_THEME)\n\t\t\t.render(width)\n\t\t\t.map((line) => line.trimEnd());\n\t\tconsole.log(renderedLines.join(\"\\n\"));\n\t} catch {\n\t\tconsole.log(trimmedNote);\n\t}\n\tconsole.log();\n}\n\ninterface SelfUpdatePlan {\n\tshouldRun: boolean;\n\tnote?: string;\n}\n\nasync function getSelfUpdatePlan(force: boolean): Promise<SelfUpdatePlan> {\n\tif (force) return { shouldRun: true };\n\n\ttry {\n\t\tconst latestRelease = await getLatestGripRelease(VERSION);\n\t\tif (!latestRelease || isNewerPackageVersion(latestRelease.version, VERSION)) {\n\t\t\treturn { shouldRun: true, ...(latestRelease?.note ? { note: latestRelease.note } : {}) };\n\t\t}\n\t} catch {\n\t\treturn { shouldRun: true };\n\t}\n\n\tconsole.log(chalk.green(`${APP_NAME} is already up to date (v${VERSION})`));\n\treturn { shouldRun: false };\n}\nasync function runSelfUpdate(command: SelfUpdateCommand): Promise<void> {\n\tconsole.log(chalk.dim(`Updating ${APP_NAME} with ${command.display}...`));\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst child = spawnProcess(command.command, command.args, { stdio: \"inherit\" });\n\t\tchild.on(\"error\", reject);\n\t\tchild.on(\"close\", (code, signal) => {\n\t\t\tif (code === 0) resolve();\n\t\t\telse if (signal) reject(new Error(`${command.display} terminated by signal ${signal}`));\n\t\t\telse reject(new Error(`${command.display} exited with code ${code ?? \"unknown\"}`));\n\t\t});\n\t});\n}\n\nfunction prepareWindowsNpmSelfUpdate(): void {\n\tif (process.platform !== \"win32\") {\n\t\treturn;\n\t}\n\n\tconst packageDir = getPackageDir();\n\tcleanupWindowsSelfUpdateQuarantine(packageDir);\n\tquarantineWindowsNativeDependencies(packageDir);\n}\n\nfunction handlePackageCommandPreflight(options: PackageCommandOptions): boolean {\n\tif (options.help) {\n\t\tprintPackageCommandHelp(options.command);\n\t\treturn true;\n\t}\n\tif (options.invalidOption) {\n\t\tconsole.error(chalk.red(`Unknown option ${options.invalidOption} for \"${options.command}\".`));\n\t\tconsole.error(chalk.dim(`Use \"${APP_NAME} --help\" or \"${getPackageCommandUsage(options.command)}\".`));\n\t} else if (options.missingOptionValue) {\n\t\tconsole.error(chalk.red(`Missing value for ${options.missingOptionValue}.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if (options.invalidArgument) {\n\t\tconsole.error(chalk.red(`Unexpected argument ${options.invalidArgument}.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if (options.conflictingOptions) {\n\t\tconsole.error(chalk.red(options.conflictingOptions));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if ((options.command === \"install\" || options.command === \"remove\") && !options.source) {\n\t\tconsole.error(chalk.red(`Missing ${options.command} source.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else {\n\t\treturn false;\n\t}\n\tprocess.exitCode = 1;\n\treturn true;\n}\n\nfunction printConfiguredPackage(pkg: ConfiguredPackage): void {\n\tconst display = pkg.filtered ? `${pkg.source} (filtered)` : pkg.source;\n\tconsole.log(` ${display}`);\n\tif (pkg.installedPath) console.log(chalk.dim(` ${pkg.installedPath}`));\n}\n\nfunction listConfiguredPackages(packageManager: DefaultPackageManager): void {\n\tconst configuredPackages = packageManager.listConfiguredPackages();\n\tconst userPackages = configuredPackages.filter((pkg) => pkg.scope === \"user\");\n\tconst projectPackages = configuredPackages.filter((pkg) => pkg.scope === \"project\");\n\tif (configuredPackages.length === 0) {\n\t\tconsole.log(chalk.dim(\"No packages installed.\"));\n\t\treturn;\n\t}\n\tif (userPackages.length > 0) {\n\t\tconsole.log(chalk.bold(\"User packages:\"));\n\t\tfor (const pkg of userPackages) printConfiguredPackage(pkg);\n\t}\n\tif (projectPackages.length > 0) {\n\t\tif (userPackages.length > 0) console.log();\n\t\tconsole.log(chalk.bold(\"Project packages:\"));\n\t\tfor (const pkg of projectPackages) printConfiguredPackage(pkg);\n\t}\n}\n\nasync function updateConfiguredPackages(packageManager: DefaultPackageManager, target: UpdateTarget): Promise<void> {\n\tif (!updateTargetIncludesExtensions(target)) return;\n\tconst updateSource = target.type === \"extensions\" ? target.source : undefined;\n\tawait packageManager.update(updateSource);\n\tconsole.log(chalk.green(updateSource ? `Updated ${updateSource}` : \"Updated packages\"));\n}\n\nasync function updateSelf(force: boolean, npmCommand?: string[]): Promise<void> {\n\tconst selfUpdatePlan = await getSelfUpdatePlan(force);\n\tif (!selfUpdatePlan.shouldRun) return;\n\tconst installMethod = detectInstallMethod();\n\tif (process.platform === \"win32\" && installMethod !== \"npm\" && installMethod !== \"pnpm\") {\n\t\tconsole.error(chalk.red(`${APP_NAME} self-update on Windows is only supported for npm and pnpm installs.`));\n\t\tconsole.error(chalk.dim(`Detected install method: ${installMethod}. Update ${APP_NAME} manually.`));\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconst selfUpdateCommand = getSelfUpdateCommand(PACKAGE_NAME, npmCommand);\n\tif (!selfUpdateCommand) {\n\t\tprintSelfUpdateUnavailable(npmCommand);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tif (selfUpdatePlan.note) printSelfUpdateNote(selfUpdatePlan.note);\n\ttry {\n\t\tif (installMethod === \"npm\") prepareWindowsNpmSelfUpdate();\n\t\tawait runSelfUpdate(selfUpdateCommand);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown package command error\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tif (installMethod === \"pnpm\") printPnpmSelfUpdateMetadataHint();\n\t\tprintSelfUpdateFallback(selfUpdateCommand);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconsole.log(chalk.green(`Updated ${APP_NAME}`));\n}\n\nasync function executePackageCommand(\n\toptions: PackageCommandOptions,\n\tpackageManager: DefaultPackageManager,\n\tselfUpdateNpmCommand: string[] | undefined,\n): Promise<boolean> {\n\tconst source = options.source;\n\tswitch (options.command) {\n\t\tcase \"install\":\n\t\t\tawait packageManager.installAndPersist(source!, { local: options.local });\n\t\t\tconsole.log(chalk.green(`Installed ${source}`));\n\t\t\treturn true;\n\t\tcase \"remove\": {\n\t\t\tconst removed = await packageManager.removeAndPersist(source!, { local: options.local });\n\t\t\tif (!removed) {\n\t\t\t\tconsole.error(chalk.red(`No matching package found for ${source}`));\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconsole.log(chalk.green(`Removed ${source}`));\n\t\t\treturn true;\n\t\t}\n\t\tcase \"list\":\n\t\t\tlistConfiguredPackages(packageManager);\n\t\t\treturn true;\n\t\tcase \"update\": {\n\t\t\tconst target = options.updateTarget ?? { type: \"all\" };\n\t\t\tawait updateConfiguredPackages(packageManager, target);\n\t\t\tif (updateTargetIncludesSelf(target)) await updateSelf(options.force, selfUpdateNpmCommand);\n\t\t\treturn true;\n\t\t}\n\t}\n}\n\nexport async function handleConfigCommand(args: string[]): Promise<boolean> {\n\tif (args[0] !== \"config\") {\n\t\treturn false;\n\t}\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\n\treportSettingsErrors(settingsManager, \"config command\");\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\n\tconst resolvedPaths = await packageManager.resolve();\n\n\tawait selectConfig({\n\t\tresolvedPaths,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tagentDir,\n\t});\n\n\tprocess.exit(0);\n}\n\nexport async function handlePackageCommand(args: string[]): Promise<boolean> {\n\tconst options = parsePackageCommand(args);\n\tif (!options) return false;\n\tif (handlePackageCommandPreflight(options)) return true;\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\n\treportSettingsErrors(settingsManager, \"package command\");\n\tconst selfUpdateNpmCommand = settingsManager.getGlobalSettings().npmCommand;\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\n\tpackageManager.setProgressCallback((event) => {\n\t\tif (event.type === \"start\") process.stdout.write(chalk.dim(`${event.message}\\n`));\n\t});\n\n\ttry {\n\t\treturn await executePackageCommand(options, packageManager, selfUpdateNpmCommand);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown package command error\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exitCode = 1;\n\t\treturn true;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"package-manager-cli.js","sourceRoot":"","sources":["../src/package-manager-cli.ts"],"names":[],"mappings":"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","sourcesContent":["import { Markdown, type MarkdownTheme } from \"@greppleai/grip-tui\";\nimport chalk from \"chalk\";\nimport { selectConfig } from \"./cli/config-selector.ts\";\nimport {\n\tAPP_NAME,\n\tdetectInstallMethod,\n\tgetAgentDir,\n\tgetPackageDir,\n\tgetSelfUpdateCommand,\n\tgetSelfUpdateUnavailableInstruction,\n\tPACKAGE_NAME,\n\ttype SelfUpdateCommand,\n\tVERSION,\n} from \"./config.ts\";\nimport { type ConfiguredPackage, DefaultPackageManager } from \"./core/package-manager.ts\";\nimport { SettingsManager } from \"./core/settings-manager.ts\";\nimport { updateBinaryExecutable } from \"./utils/binary-self-update.ts\";\nimport { spawnProcess } from \"./utils/child-process.ts\";\nimport { getGripUserAgent } from \"./utils/grip-user-agent.ts\";\nimport { getLatestGripRelease, isNewerPackageVersion } from \"./utils/version-check.ts\";\nimport {\n\tcleanupWindowsSelfUpdateQuarantine,\n\tquarantineWindowsNativeDependencies,\n} from \"./utils/windows-self-update.ts\";\n\nexport type PackageCommand = \"install\" | \"remove\" | \"update\" | \"list\";\n\ntype UpdateTarget = { type: \"all\" } | { type: \"self\" } | { type: \"extensions\"; source?: string };\n\nconst SELF_UPDATE_NOTE_MARKDOWN_THEME: MarkdownTheme = {\n\theading: (text) => chalk.bold(chalk.yellow(text)),\n\tlink: (text) => chalk.cyan(text),\n\tlinkUrl: (text) => chalk.dim(text),\n\tcode: (text) => chalk.yellow(text),\n\tcodeBlock: (text) => chalk.dim(text),\n\tcodeBlockBorder: (text) => chalk.dim(text),\n\tquote: (text) => chalk.dim(text),\n\tquoteBorder: (text) => chalk.dim(text),\n\thr: (text) => chalk.dim(text),\n\tlistBullet: (text) => chalk.yellow(text),\n\tbold: (text) => chalk.bold(text),\n\titalic: (text) => chalk.italic(text),\n\tstrikethrough: (text) => chalk.strikethrough(text),\n\tunderline: (text) => chalk.underline(text),\n};\n\ninterface PackageCommandOptions {\n\tcommand: PackageCommand;\n\tsource?: string;\n\tupdateTarget?: UpdateTarget;\n\tlocal: boolean;\n\tforce: boolean;\n\thelp: boolean;\n\tinvalidOption?: string;\n\tinvalidArgument?: string;\n\tmissingOptionValue?: string;\n\tconflictingOptions?: string;\n}\n\ntype UpdateFlag = \"self\" | \"extensions\" | \"force\";\n\ninterface PackageCommandParseState {\n\tcommand: PackageCommand;\n\tlocal: boolean;\n\thelp: boolean;\n\tinvalidOption?: string;\n\tinvalidArgument?: string;\n\tmissingOptionValue?: string;\n\tconflictingOptions?: string;\n\tsource?: string;\n\tupdateFlags: Record<UpdateFlag, boolean>;\n\textensionFlagSource?: string;\n}\n\nconst UPDATE_FLAG_OPTIONS: ReadonlyMap<string, UpdateFlag> = new Map([\n\t[\"--self\", \"self\"],\n\t[\"--extensions\", \"extensions\"],\n\t[\"--force\", \"force\"],\n]);\n\nfunction reportSettingsErrors(settingsManager: SettingsManager, context: string): void {\n\tconst errors = settingsManager.drainErrors();\n\tfor (const { scope, error } of errors) {\n\t\tconsole.error(chalk.yellow(`Warning (${context}, ${scope} settings): ${error.message}`));\n\t\tif (error.stack) {\n\t\t\tconsole.error(chalk.dim(error.stack));\n\t\t}\n\t}\n}\n\nfunction getPackageCommandUsage(command: PackageCommand): string {\n\tswitch (command) {\n\t\tcase \"install\":\n\t\t\treturn `${APP_NAME} install <source> [-l]`;\n\t\tcase \"remove\":\n\t\t\treturn `${APP_NAME} remove <source> [-l]`;\n\t\tcase \"update\":\n\t\t\treturn `${APP_NAME} update [source|self|grip] [--self] [--extensions] [--extension <source>] [--force]`;\n\t\tcase \"list\":\n\t\t\treturn `${APP_NAME} list`;\n\t}\n}\n\nfunction printPackageCommandHelp(command: PackageCommand): void {\n\tswitch (command) {\n\t\tcase \"install\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"install\")}\n\nInstall a package and add it to settings.\n\nOptions:\n -l, --local Install project-locally (.grip/settings.json)\n\nExamples:\n ${APP_NAME} install npm:@foo/bar\n ${APP_NAME} install git:github.com/user/repo\n ${APP_NAME} install git:git@github.com:user/repo\n ${APP_NAME} install https://github.com/user/repo\n ${APP_NAME} install ssh://git@github.com/user/repo\n ${APP_NAME} install ./local/path\n`);\n\t\t\treturn;\n\n\t\tcase \"remove\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"remove\")}\n\nRemove a package and its source from settings.\nAlias: ${APP_NAME} uninstall <source> [-l]\n\nOptions:\n -l, --local Remove from project settings (.grip/settings.json)\n\nExamples:\n ${APP_NAME} remove npm:@foo/bar\n ${APP_NAME} uninstall npm:@foo/bar\n`);\n\t\t\treturn;\n\n\t\tcase \"update\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"update\")}\n\nUpdate grip and installed packages.\n\nOptions:\n --self Update grip only\n --extensions Update installed packages only\n --extension <source> Update one package only\n --force Reinstall grip even if the current version is latest\n\nShort forms:\n ${APP_NAME} update Update grip and all extensions\n ${APP_NAME} update <source> Update one package\n ${APP_NAME} update grip Update grip only (self works as alias to grip)\n`);\n\t\t\treturn;\n\n\t\tcase \"list\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"list\")}\n\nList installed packages from user and project settings.\n`);\n\t\t\treturn;\n\t}\n}\n\nfunction parsePackageCommandName(rawCommand: string | undefined): PackageCommand | undefined {\n\tif (rawCommand === \"uninstall\") return \"remove\";\n\tif (rawCommand === \"install\" || rawCommand === \"remove\" || rawCommand === \"update\" || rawCommand === \"list\") {\n\t\treturn rawCommand;\n\t}\n\treturn undefined;\n}\n\nfunction consumeExtensionOption(rest: string[], index: number, state: PackageCommandParseState): number {\n\tif (state.command !== \"update\") {\n\t\tstate.invalidOption ??= \"--extension\";\n\t\treturn index;\n\t}\n\n\tconst value = rest[index + 1];\n\tif (!value || value.startsWith(\"-\")) {\n\t\tstate.missingOptionValue ??= \"--extension\";\n\t\treturn index;\n\t}\n\tif (state.extensionFlagSource) {\n\t\tstate.conflictingOptions ??= \"--extension can only be provided once\";\n\t\treturn index + 1;\n\t}\n\tstate.extensionFlagSource = value;\n\treturn index + 1;\n}\n\nfunction recordUnrecognizedPackageArgument(arg: string, state: PackageCommandParseState): void {\n\tif (arg.startsWith(\"-\")) {\n\t\tstate.invalidOption ??= arg;\n\t\treturn;\n\t}\n\tif (!state.source) state.source = arg;\n\telse state.invalidArgument ??= arg;\n}\n\nfunction consumePackageCommandArgument(rest: string[], index: number, state: PackageCommandParseState): number {\n\tconst arg = rest[index];\n\tif (arg === \"-h\" || arg === \"--help\") {\n\t\tstate.help = true;\n\t\treturn index;\n\t}\n\tif (arg === \"-l\" || arg === \"--local\") {\n\t\tif (state.command === \"install\" || state.command === \"remove\") state.local = true;\n\t\telse state.invalidOption ??= arg;\n\t\treturn index;\n\t}\n\n\tconst updateFlag = UPDATE_FLAG_OPTIONS.get(arg);\n\tif (updateFlag) {\n\t\tif (state.command === \"update\") state.updateFlags[updateFlag] = true;\n\t\telse state.invalidOption ??= arg;\n\t\treturn index;\n\t}\n\tif (arg === \"--extension\") return consumeExtensionOption(rest, index, state);\n\trecordUnrecognizedPackageArgument(arg, state);\n\treturn index;\n}\n\nfunction resolveExtensionFlagUpdateTarget(state: PackageCommandParseState): UpdateTarget {\n\tif (state.updateFlags.self || state.updateFlags.extensions) {\n\t\tstate.conflictingOptions ??= \"--extension cannot be combined with --self or --extensions\";\n\t}\n\tif (state.source) {\n\t\tstate.conflictingOptions ??= \"--extension cannot be combined with a positional source\";\n\t}\n\treturn { type: \"extensions\", source: state.extensionFlagSource };\n}\n\nfunction resolvePositionalUpdateTarget(state: PackageCommandParseState): UpdateTarget {\n\tconst source = state.source!;\n\tif (source === \"self\" || source === \"grip\") {\n\t\treturn state.updateFlags.extensions ? { type: \"all\" } : { type: \"self\" };\n\t}\n\tif (state.updateFlags.extensions || state.updateFlags.self) {\n\t\tstate.conflictingOptions ??= \"positional update targets cannot be combined with --self or --extensions\";\n\t}\n\treturn { type: \"extensions\", source };\n}\n\nfunction resolveUpdateTarget(state: PackageCommandParseState): UpdateTarget | undefined {\n\tif (state.command !== \"update\") return undefined;\n\tif (state.extensionFlagSource) return resolveExtensionFlagUpdateTarget(state);\n\tif (state.source) return resolvePositionalUpdateTarget(state);\n\tif (state.updateFlags.self && state.updateFlags.extensions) return { type: \"all\" };\n\tif (state.updateFlags.self) return { type: \"self\" };\n\tif (state.updateFlags.extensions) return { type: \"extensions\" };\n\treturn { type: \"all\" };\n}\n\nfunction parsePackageCommand(args: string[]): PackageCommandOptions | undefined {\n\tconst [rawCommand, ...rest] = args;\n\tconst command = parsePackageCommandName(rawCommand);\n\tif (!command) return undefined;\n\n\tconst state: PackageCommandParseState = {\n\t\tcommand,\n\t\tlocal: false,\n\t\thelp: false,\n\t\tupdateFlags: { self: false, extensions: false, force: false },\n\t};\n\tfor (let index = 0; index < rest.length; index++) {\n\t\tindex = consumePackageCommandArgument(rest, index, state);\n\t}\n\n\treturn {\n\t\tcommand,\n\t\tsource: state.source,\n\t\tupdateTarget: resolveUpdateTarget(state),\n\t\tlocal: state.local,\n\t\tforce: state.updateFlags.force,\n\t\thelp: state.help,\n\t\tinvalidOption: state.invalidOption,\n\t\tinvalidArgument: state.invalidArgument,\n\t\tmissingOptionValue: state.missingOptionValue,\n\t\tconflictingOptions: state.conflictingOptions,\n\t};\n}\n\nfunction updateTargetIncludesSelf(target: UpdateTarget): boolean {\n\treturn target.type === \"all\" || target.type === \"self\";\n}\n\nfunction updateTargetIncludesExtensions(target: UpdateTarget): boolean {\n\treturn target.type === \"all\" || target.type === \"extensions\";\n}\n\nfunction printSelfUpdateUnavailable(npmCommand?: string[]): void {\n\tconsole.error(`error: ${APP_NAME} cannot self-update this installation.`);\n\tconsole.error(getSelfUpdateUnavailableInstruction(PACKAGE_NAME, npmCommand));\n\n\tconst entrypoint = process.argv[1];\n\tif (entrypoint) {\n\t\tconsole.error(\"\");\n\t\tconsole.error(`Location of grip executable: ${entrypoint}`);\n\t}\n}\n\nfunction printSelfUpdateFallback(command: SelfUpdateCommand): void {\n\tconsole.error(chalk.dim(`If this keeps failing, run this command yourself: ${command.display}`));\n}\n\nfunction printPnpmSelfUpdateMetadataHint(): void {\n\tconsole.error(chalk.yellow(\"If pnpm reports missing package versions, its cached registry metadata may be stale.\"));\n\tconsole.error(chalk.yellow(`Run \\`pnpm store prune\\` and retry \\`${APP_NAME} update --self\\`.`));\n}\n\nfunction printSelfUpdateNote(note: string): void {\n\tconst trimmedNote = note.trim();\n\tif (!trimmedNote) {\n\t\treturn;\n\t}\n\n\tconsole.log();\n\tconsole.log(chalk.bold(chalk.yellow(\"Update note\")));\n\ttry {\n\t\tconst width = Math.max(20, process.stdout.columns ?? 80);\n\t\tconst renderedLines = new Markdown(trimmedNote, 0, 0, SELF_UPDATE_NOTE_MARKDOWN_THEME)\n\t\t\t.render(width)\n\t\t\t.map((line) => line.trimEnd());\n\t\tconsole.log(renderedLines.join(\"\\n\"));\n\t} catch {\n\t\tconsole.log(trimmedNote);\n\t}\n\tconsole.log();\n}\n\ninterface SelfUpdatePlan {\n\tshouldRun: boolean;\n\tversion?: string;\n\tnote?: string;\n}\n\nasync function getSelfUpdatePlan(force: boolean): Promise<SelfUpdatePlan> {\n\tif (force) return { shouldRun: true };\n\n\ttry {\n\t\tconst latestRelease = await getLatestGripRelease(VERSION);\n\t\tif (!latestRelease) return { shouldRun: true };\n\t\tif (isNewerPackageVersion(latestRelease.version, VERSION)) {\n\t\t\treturn {\n\t\t\t\tshouldRun: true,\n\t\t\t\tversion: latestRelease.version,\n\t\t\t\t...(latestRelease.note ? { note: latestRelease.note } : {}),\n\t\t\t};\n\t\t}\n\t} catch {\n\t\treturn { shouldRun: true };\n\t}\n\n\tconsole.log(chalk.green(`${APP_NAME} is already up to date (v${VERSION})`));\n\treturn { shouldRun: false };\n}\n\nasync function updateBinarySelf(plan: SelfUpdatePlan): Promise<void> {\n\tif (plan.note) printSelfUpdateNote(plan.note);\n\tconst target = plan.version ? `v${plan.version}` : \"the latest release\";\n\tconsole.log(chalk.dim(`Updating ${APP_NAME} executable ${process.execPath} to ${target}...`));\n\ttry {\n\t\tconst result = await updateBinaryExecutable({\n\t\t\t...(plan.version ? { version: plan.version } : {}),\n\t\t\tuserAgent: getGripUserAgent(VERSION),\n\t\t});\n\t\tconsole.log(chalk.green(`Updated ${APP_NAME} (${result.executablePath})`));\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown binary update error\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tconsole.error(chalk.dim(getSelfUpdateUnavailableInstruction(PACKAGE_NAME)));\n\t\tprocess.exitCode = 1;\n\t}\n}\nasync function runSelfUpdate(command: SelfUpdateCommand): Promise<void> {\n\tconsole.log(chalk.dim(`Updating ${APP_NAME} with ${command.display}...`));\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst child = spawnProcess(command.command, command.args, { stdio: \"inherit\" });\n\t\tchild.on(\"error\", reject);\n\t\tchild.on(\"close\", (code, signal) => {\n\t\t\tif (code === 0) resolve();\n\t\t\telse if (signal) reject(new Error(`${command.display} terminated by signal ${signal}`));\n\t\t\telse reject(new Error(`${command.display} exited with code ${code ?? \"unknown\"}`));\n\t\t});\n\t});\n}\n\nfunction prepareWindowsNpmSelfUpdate(): void {\n\tif (process.platform !== \"win32\") {\n\t\treturn;\n\t}\n\n\tconst packageDir = getPackageDir();\n\tcleanupWindowsSelfUpdateQuarantine(packageDir);\n\tquarantineWindowsNativeDependencies(packageDir);\n}\n\nfunction handlePackageCommandPreflight(options: PackageCommandOptions): boolean {\n\tif (options.help) {\n\t\tprintPackageCommandHelp(options.command);\n\t\treturn true;\n\t}\n\tif (options.invalidOption) {\n\t\tconsole.error(chalk.red(`Unknown option ${options.invalidOption} for \"${options.command}\".`));\n\t\tconsole.error(chalk.dim(`Use \"${APP_NAME} --help\" or \"${getPackageCommandUsage(options.command)}\".`));\n\t} else if (options.missingOptionValue) {\n\t\tconsole.error(chalk.red(`Missing value for ${options.missingOptionValue}.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if (options.invalidArgument) {\n\t\tconsole.error(chalk.red(`Unexpected argument ${options.invalidArgument}.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if (options.conflictingOptions) {\n\t\tconsole.error(chalk.red(options.conflictingOptions));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if ((options.command === \"install\" || options.command === \"remove\") && !options.source) {\n\t\tconsole.error(chalk.red(`Missing ${options.command} source.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else {\n\t\treturn false;\n\t}\n\tprocess.exitCode = 1;\n\treturn true;\n}\n\nfunction printConfiguredPackage(pkg: ConfiguredPackage): void {\n\tconst display = pkg.filtered ? `${pkg.source} (filtered)` : pkg.source;\n\tconsole.log(` ${display}`);\n\tif (pkg.installedPath) console.log(chalk.dim(` ${pkg.installedPath}`));\n}\n\nfunction listConfiguredPackages(packageManager: DefaultPackageManager): void {\n\tconst configuredPackages = packageManager.listConfiguredPackages();\n\tconst userPackages = configuredPackages.filter((pkg) => pkg.scope === \"user\");\n\tconst projectPackages = configuredPackages.filter((pkg) => pkg.scope === \"project\");\n\tif (configuredPackages.length === 0) {\n\t\tconsole.log(chalk.dim(\"No packages installed.\"));\n\t\treturn;\n\t}\n\tif (userPackages.length > 0) {\n\t\tconsole.log(chalk.bold(\"User packages:\"));\n\t\tfor (const pkg of userPackages) printConfiguredPackage(pkg);\n\t}\n\tif (projectPackages.length > 0) {\n\t\tif (userPackages.length > 0) console.log();\n\t\tconsole.log(chalk.bold(\"Project packages:\"));\n\t\tfor (const pkg of projectPackages) printConfiguredPackage(pkg);\n\t}\n}\n\nasync function updateConfiguredPackages(packageManager: DefaultPackageManager, target: UpdateTarget): Promise<void> {\n\tif (!updateTargetIncludesExtensions(target)) return;\n\tconst updateSource = target.type === \"extensions\" ? target.source : undefined;\n\tawait packageManager.update(updateSource);\n\tconsole.log(chalk.green(updateSource ? `Updated ${updateSource}` : \"Updated packages\"));\n}\n\nasync function updateSelf(force: boolean, npmCommand?: string[]): Promise<void> {\n\tconst selfUpdatePlan = await getSelfUpdatePlan(force);\n\tif (!selfUpdatePlan.shouldRun) return;\n\tconst installMethod = detectInstallMethod();\n\tif (installMethod === \"bun-binary\") {\n\t\tawait updateBinarySelf(selfUpdatePlan);\n\t\treturn;\n\t}\n\tif (process.platform === \"win32\" && installMethod !== \"npm\" && installMethod !== \"pnpm\") {\n\t\tconsole.error(chalk.red(`${APP_NAME} self-update on Windows is only supported for npm and pnpm installs.`));\n\t\tconsole.error(chalk.dim(`Detected install method: ${installMethod}. Update ${APP_NAME} manually.`));\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconst selfUpdateCommand = getSelfUpdateCommand(PACKAGE_NAME, npmCommand);\n\tif (!selfUpdateCommand) {\n\t\tprintSelfUpdateUnavailable(npmCommand);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tif (selfUpdatePlan.note) printSelfUpdateNote(selfUpdatePlan.note);\n\ttry {\n\t\tif (installMethod === \"npm\") prepareWindowsNpmSelfUpdate();\n\t\tawait runSelfUpdate(selfUpdateCommand);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown package command error\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tif (installMethod === \"pnpm\") printPnpmSelfUpdateMetadataHint();\n\t\tprintSelfUpdateFallback(selfUpdateCommand);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconsole.log(chalk.green(`Updated ${APP_NAME}`));\n}\n\nasync function executePackageCommand(\n\toptions: PackageCommandOptions,\n\tpackageManager: DefaultPackageManager,\n\tselfUpdateNpmCommand: string[] | undefined,\n): Promise<boolean> {\n\tconst source = options.source;\n\tswitch (options.command) {\n\t\tcase \"install\":\n\t\t\tawait packageManager.installAndPersist(source!, { local: options.local });\n\t\t\tconsole.log(chalk.green(`Installed ${source}`));\n\t\t\treturn true;\n\t\tcase \"remove\": {\n\t\t\tconst removed = await packageManager.removeAndPersist(source!, { local: options.local });\n\t\t\tif (!removed) {\n\t\t\t\tconsole.error(chalk.red(`No matching package found for ${source}`));\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconsole.log(chalk.green(`Removed ${source}`));\n\t\t\treturn true;\n\t\t}\n\t\tcase \"list\":\n\t\t\tlistConfiguredPackages(packageManager);\n\t\t\treturn true;\n\t\tcase \"update\": {\n\t\t\tconst target = options.updateTarget ?? { type: \"all\" };\n\t\t\tawait updateConfiguredPackages(packageManager, target);\n\t\t\tif (updateTargetIncludesSelf(target)) await updateSelf(options.force, selfUpdateNpmCommand);\n\t\t\treturn true;\n\t\t}\n\t}\n}\n\nexport async function handleConfigCommand(args: string[]): Promise<boolean> {\n\tif (args[0] !== \"config\") {\n\t\treturn false;\n\t}\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\n\treportSettingsErrors(settingsManager, \"config command\");\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\n\tconst resolvedPaths = await packageManager.resolve();\n\n\tawait selectConfig({\n\t\tresolvedPaths,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tagentDir,\n\t});\n\n\tprocess.exit(0);\n}\n\nexport async function handlePackageCommand(args: string[]): Promise<boolean> {\n\tconst options = parsePackageCommand(args);\n\tif (!options) return false;\n\tif (handlePackageCommandPreflight(options)) return true;\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\n\treportSettingsErrors(settingsManager, \"package command\");\n\tconst selfUpdateNpmCommand = settingsManager.getGlobalSettings().npmCommand;\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\n\tpackageManager.setProgressCallback((event) => {\n\t\tif (event.type === \"start\") process.stdout.write(chalk.dim(`${event.message}\\n`));\n\t});\n\n\ttry {\n\t\treturn await executePackageCommand(options, packageManager, selfUpdateNpmCommand);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown package command error\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exitCode = 1;\n\t\treturn true;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface BinarySelfUpdateOptions {
|
|
2
|
+
/** Release version without the `v` prefix. Uses the latest release when omitted. */
|
|
3
|
+
version?: string;
|
|
4
|
+
/** Executable to replace. Defaults to `process.execPath`. */
|
|
5
|
+
executablePath?: string;
|
|
6
|
+
platform?: NodeJS.Platform;
|
|
7
|
+
arch?: string;
|
|
8
|
+
/** Release base URL. Defaults to `GRIP_RELEASE_BASE_URL` or the GitHub releases URL. */
|
|
9
|
+
releaseBaseUrl?: string;
|
|
10
|
+
userAgent?: string;
|
|
11
|
+
fetch?: typeof fetch;
|
|
12
|
+
}
|
|
13
|
+
export interface BinarySelfUpdateResult {
|
|
14
|
+
executablePath: string;
|
|
15
|
+
assetUrl: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function getBinaryReleaseAssetName(platform: NodeJS.Platform, arch: string): string | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Download the release executable for this platform, verify its SHA-256 checksum, and atomically
|
|
20
|
+
* replace the running executable. Mirrors install.sh / install.ps1.
|
|
21
|
+
*/
|
|
22
|
+
export declare function updateBinaryExecutable(options?: BinarySelfUpdateOptions): Promise<BinarySelfUpdateResult>;
|
|
23
|
+
/** Remove executables that a Windows binary update moved aside while they were still running. */
|
|
24
|
+
export declare function cleanupWindowsBinarySelfUpdateLeftovers(executablePath?: string): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=binary-self-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary-self-update.d.ts","sourceRoot":"","sources":["../../src/utils/binary-self-update.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,uBAAuB;IACvC,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKrG;AA+FD;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA0BnH;AAED,iGAAiG;AACjG,wBAAsB,uCAAuC,CAC5D,cAAc,GAAE,MAAyB,GACvC,OAAO,CAAC,IAAI,CAAC,CAcf"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { createWriteStream } from "node:fs";
|
|
3
|
+
import { access, chmod, constants, lstat, mkdtemp, readdir, realpath, rename, rm, stat } from "node:fs/promises";
|
|
4
|
+
import { basename, dirname, join } from "node:path";
|
|
5
|
+
import { Readable, Transform } from "node:stream";
|
|
6
|
+
import { pipeline } from "node:stream/promises";
|
|
7
|
+
const DEFAULT_RELEASE_BASE_URL = "https://github.com/greppleai/grip/releases";
|
|
8
|
+
const TEMP_DIR_PREFIX = ".grip-update.";
|
|
9
|
+
const WINDOWS_PREVIOUS_SUFFIX = ".grip-previous-";
|
|
10
|
+
const CHECKSUM_TIMEOUT_MS = 30_000;
|
|
11
|
+
const BINARY_TIMEOUT_MS = 10 * 60_000;
|
|
12
|
+
export function getBinaryReleaseAssetName(platform, arch) {
|
|
13
|
+
const os = platform === "darwin" ? "darwin" : platform === "linux" ? "linux" : platform === "win32" ? "windows" : "";
|
|
14
|
+
const cpu = arch === "x64" ? "x64" : arch === "arm64" ? "arm64" : "";
|
|
15
|
+
if (!os || !cpu)
|
|
16
|
+
return undefined;
|
|
17
|
+
return `grip-${os}-${cpu}${os === "windows" ? ".exe" : ""}`;
|
|
18
|
+
}
|
|
19
|
+
function resolveReleaseBaseUrl(override) {
|
|
20
|
+
const base = (override ?? process.env.GRIP_RELEASE_BASE_URL ?? DEFAULT_RELEASE_BASE_URL).replace(/\/+$/, "");
|
|
21
|
+
let url;
|
|
22
|
+
try {
|
|
23
|
+
url = new URL(base);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
throw new Error(`Invalid release URL: ${base}`);
|
|
27
|
+
}
|
|
28
|
+
const loopback = url.protocol === "http:" && (url.hostname === "127.0.0.1" || url.hostname === "localhost");
|
|
29
|
+
if (url.protocol !== "https:" && !loopback) {
|
|
30
|
+
throw new Error("Release URL must be HTTPS (or loopback for tests)");
|
|
31
|
+
}
|
|
32
|
+
if (url.search || url.hash || base.includes(".."))
|
|
33
|
+
throw new Error(`Invalid release URL: ${base}`);
|
|
34
|
+
return base;
|
|
35
|
+
}
|
|
36
|
+
function getReleaseDownloadUrl(base, version) {
|
|
37
|
+
if (!version)
|
|
38
|
+
return `${base}/latest/download`;
|
|
39
|
+
const tag = version.startsWith("v") ? version : `v${version}`;
|
|
40
|
+
if (!/^v\d[0-9A-Za-z.+-]*$/.test(tag))
|
|
41
|
+
throw new Error(`Invalid release version: ${version}`);
|
|
42
|
+
return `${base}/download/${tag}`;
|
|
43
|
+
}
|
|
44
|
+
function parseChecksum(content, asset) {
|
|
45
|
+
for (const line of content.split(/\r?\n/)) {
|
|
46
|
+
const match = line.trim().match(/^([a-fA-F0-9]{64})\s+\*?(.+)$/);
|
|
47
|
+
if (match && match[2] === asset)
|
|
48
|
+
return match[1].toLowerCase();
|
|
49
|
+
}
|
|
50
|
+
throw new Error(`Missing or invalid SHA-256 checksum for ${asset}`);
|
|
51
|
+
}
|
|
52
|
+
async function fetchOk(fetchImpl, url, userAgent, timeoutMs) {
|
|
53
|
+
const response = await fetchImpl(url, {
|
|
54
|
+
headers: { "User-Agent": userAgent },
|
|
55
|
+
redirect: "follow",
|
|
56
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
const hint = response.status === 404 ? " (is this release published for your platform yet?)" : "";
|
|
60
|
+
throw new Error(`Download failed: ${url} returned HTTP ${response.status}${hint}`);
|
|
61
|
+
}
|
|
62
|
+
return response;
|
|
63
|
+
}
|
|
64
|
+
async function downloadToFile(response, path) {
|
|
65
|
+
if (!response.body)
|
|
66
|
+
throw new Error(`Download returned an empty body: ${response.url}`);
|
|
67
|
+
const hash = createHash("sha256");
|
|
68
|
+
const hasher = new Transform({
|
|
69
|
+
transform(chunk, _encoding, callback) {
|
|
70
|
+
hash.update(chunk);
|
|
71
|
+
callback(null, chunk);
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
await pipeline(Readable.fromWeb(response.body), hasher, createWriteStream(path, { mode: 0o700 }));
|
|
75
|
+
return hash.digest("hex");
|
|
76
|
+
}
|
|
77
|
+
async function resolveExecutableTarget(executablePath) {
|
|
78
|
+
const target = await realpath(executablePath);
|
|
79
|
+
const info = await stat(target);
|
|
80
|
+
if (!info.isFile())
|
|
81
|
+
throw new Error(`Refusing to replace non-file executable: ${target}`);
|
|
82
|
+
try {
|
|
83
|
+
await access(dirname(target), constants.W_OK);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
throw new Error(`Cannot write to ${dirname(target)}. Rerun the Grip installer with a writable GRIP_INSTALL_DIR or update with elevated permissions.`);
|
|
87
|
+
}
|
|
88
|
+
return target;
|
|
89
|
+
}
|
|
90
|
+
async function replaceExecutable(source, target, platform) {
|
|
91
|
+
if (platform !== "win32") {
|
|
92
|
+
await rename(source, target);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Windows cannot overwrite a running executable, but it can rename it. Move the current
|
|
96
|
+
// binary aside, then move the verified one into place; cleanup happens on a later start.
|
|
97
|
+
const previous = `${target}${WINDOWS_PREVIOUS_SUFFIX}${randomUUID()}`;
|
|
98
|
+
await rename(target, previous);
|
|
99
|
+
try {
|
|
100
|
+
await rename(source, target);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
await rename(previous, target);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
await rm(previous, { force: true }).catch(() => { });
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Download the release executable for this platform, verify its SHA-256 checksum, and atomically
|
|
110
|
+
* replace the running executable. Mirrors install.sh / install.ps1.
|
|
111
|
+
*/
|
|
112
|
+
export async function updateBinaryExecutable(options = {}) {
|
|
113
|
+
const platform = options.platform ?? process.platform;
|
|
114
|
+
const arch = options.arch ?? process.arch;
|
|
115
|
+
const asset = getBinaryReleaseAssetName(platform, arch);
|
|
116
|
+
if (!asset)
|
|
117
|
+
throw new Error(`No Grip binary release is available for ${platform}-${arch}`);
|
|
118
|
+
const fetchImpl = options.fetch ?? fetch;
|
|
119
|
+
const userAgent = options.userAgent ?? "grip-self-update";
|
|
120
|
+
const downloadUrl = getReleaseDownloadUrl(resolveReleaseBaseUrl(options.releaseBaseUrl), options.version);
|
|
121
|
+
const assetUrl = `${downloadUrl}/${asset}`;
|
|
122
|
+
const target = await resolveExecutableTarget(options.executablePath ?? process.execPath);
|
|
123
|
+
// Download next to the target so the final rename stays on one filesystem.
|
|
124
|
+
const work = await mkdtemp(join(dirname(target), TEMP_DIR_PREFIX));
|
|
125
|
+
try {
|
|
126
|
+
const checksumResponse = await fetchOk(fetchImpl, `${assetUrl}.sha256`, userAgent, CHECKSUM_TIMEOUT_MS);
|
|
127
|
+
const expected = parseChecksum(await checksumResponse.text(), asset);
|
|
128
|
+
const downloaded = join(work, asset);
|
|
129
|
+
const actual = await downloadToFile(await fetchOk(fetchImpl, assetUrl, userAgent, BINARY_TIMEOUT_MS), downloaded);
|
|
130
|
+
if (actual !== expected)
|
|
131
|
+
throw new Error(`SHA-256 mismatch for ${asset}; update aborted`);
|
|
132
|
+
await chmod(downloaded, 0o755);
|
|
133
|
+
await replaceExecutable(downloaded, target, platform);
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
await rm(work, { recursive: true, force: true }).catch(() => { });
|
|
137
|
+
}
|
|
138
|
+
return { executablePath: target, assetUrl };
|
|
139
|
+
}
|
|
140
|
+
/** Remove executables that a Windows binary update moved aside while they were still running. */
|
|
141
|
+
export async function cleanupWindowsBinarySelfUpdateLeftovers(executablePath = process.execPath) {
|
|
142
|
+
try {
|
|
143
|
+
const target = await realpath(executablePath);
|
|
144
|
+
const dir = dirname(target);
|
|
145
|
+
const previousPrefix = `${basename(target)}${WINDOWS_PREVIOUS_SUFFIX}`;
|
|
146
|
+
for (const entry of await readdir(dir)) {
|
|
147
|
+
if (!entry.startsWith(previousPrefix))
|
|
148
|
+
continue;
|
|
149
|
+
const path = join(dir, entry);
|
|
150
|
+
if (!(await lstat(path)).isFile())
|
|
151
|
+
continue;
|
|
152
|
+
await rm(path, { force: true }).catch(() => { });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Best effort: the directory may be read-only or another process may still be running the old file.
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=binary-self-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary-self-update.js","sourceRoot":"","sources":["../../src/utils/binary-self-update.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { createWriteStream } from \"node:fs\";\nimport { access, chmod, constants, lstat, mkdtemp, readdir, realpath, rename, rm, stat } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { Readable, Transform } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { ReadableStream as NodeReadableStream } from \"node:stream/web\";\n\nconst DEFAULT_RELEASE_BASE_URL = \"https://github.com/greppleai/grip/releases\";\nconst TEMP_DIR_PREFIX = \".grip-update.\";\nconst WINDOWS_PREVIOUS_SUFFIX = \".grip-previous-\";\nconst CHECKSUM_TIMEOUT_MS = 30_000;\nconst BINARY_TIMEOUT_MS = 10 * 60_000;\n\nexport interface BinarySelfUpdateOptions {\n\t/** Release version without the `v` prefix. Uses the latest release when omitted. */\n\tversion?: string;\n\t/** Executable to replace. Defaults to `process.execPath`. */\n\texecutablePath?: string;\n\tplatform?: NodeJS.Platform;\n\tarch?: string;\n\t/** Release base URL. Defaults to `GRIP_RELEASE_BASE_URL` or the GitHub releases URL. */\n\treleaseBaseUrl?: string;\n\tuserAgent?: string;\n\tfetch?: typeof fetch;\n}\n\nexport interface BinarySelfUpdateResult {\n\texecutablePath: string;\n\tassetUrl: string;\n}\n\nexport function getBinaryReleaseAssetName(platform: NodeJS.Platform, arch: string): string | undefined {\n\tconst os = platform === \"darwin\" ? \"darwin\" : platform === \"linux\" ? \"linux\" : platform === \"win32\" ? \"windows\" : \"\";\n\tconst cpu = arch === \"x64\" ? \"x64\" : arch === \"arm64\" ? \"arm64\" : \"\";\n\tif (!os || !cpu) return undefined;\n\treturn `grip-${os}-${cpu}${os === \"windows\" ? \".exe\" : \"\"}`;\n}\n\nfunction resolveReleaseBaseUrl(override: string | undefined): string {\n\tconst base = (override ?? process.env.GRIP_RELEASE_BASE_URL ?? DEFAULT_RELEASE_BASE_URL).replace(/\\/+$/, \"\");\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(base);\n\t} catch {\n\t\tthrow new Error(`Invalid release URL: ${base}`);\n\t}\n\tconst loopback = url.protocol === \"http:\" && (url.hostname === \"127.0.0.1\" || url.hostname === \"localhost\");\n\tif (url.protocol !== \"https:\" && !loopback) {\n\t\tthrow new Error(\"Release URL must be HTTPS (or loopback for tests)\");\n\t}\n\tif (url.search || url.hash || base.includes(\"..\")) throw new Error(`Invalid release URL: ${base}`);\n\treturn base;\n}\n\nfunction getReleaseDownloadUrl(base: string, version: string | undefined): string {\n\tif (!version) return `${base}/latest/download`;\n\tconst tag = version.startsWith(\"v\") ? version : `v${version}`;\n\tif (!/^v\\d[0-9A-Za-z.+-]*$/.test(tag)) throw new Error(`Invalid release version: ${version}`);\n\treturn `${base}/download/${tag}`;\n}\n\nfunction parseChecksum(content: string, asset: string): string {\n\tfor (const line of content.split(/\\r?\\n/)) {\n\t\tconst match = line.trim().match(/^([a-fA-F0-9]{64})\\s+\\*?(.+)$/);\n\t\tif (match && match[2] === asset) return match[1].toLowerCase();\n\t}\n\tthrow new Error(`Missing or invalid SHA-256 checksum for ${asset}`);\n}\n\nasync function fetchOk(fetchImpl: typeof fetch, url: string, userAgent: string, timeoutMs: number): Promise<Response> {\n\tconst response = await fetchImpl(url, {\n\t\theaders: { \"User-Agent\": userAgent },\n\t\tredirect: \"follow\",\n\t\tsignal: AbortSignal.timeout(timeoutMs),\n\t});\n\tif (!response.ok) {\n\t\tconst hint = response.status === 404 ? \" (is this release published for your platform yet?)\" : \"\";\n\t\tthrow new Error(`Download failed: ${url} returned HTTP ${response.status}${hint}`);\n\t}\n\treturn response;\n}\n\nasync function downloadToFile(response: Response, path: string): Promise<string> {\n\tif (!response.body) throw new Error(`Download returned an empty body: ${response.url}`);\n\tconst hash = createHash(\"sha256\");\n\tconst hasher = new Transform({\n\t\ttransform(chunk: Buffer, _encoding, callback) {\n\t\t\thash.update(chunk);\n\t\t\tcallback(null, chunk);\n\t\t},\n\t});\n\tawait pipeline(\n\t\tReadable.fromWeb(response.body as NodeReadableStream<Uint8Array>),\n\t\thasher,\n\t\tcreateWriteStream(path, { mode: 0o700 }),\n\t);\n\treturn hash.digest(\"hex\");\n}\n\nasync function resolveExecutableTarget(executablePath: string): Promise<string> {\n\tconst target = await realpath(executablePath);\n\tconst info = await stat(target);\n\tif (!info.isFile()) throw new Error(`Refusing to replace non-file executable: ${target}`);\n\ttry {\n\t\tawait access(dirname(target), constants.W_OK);\n\t} catch {\n\t\tthrow new Error(\n\t\t\t`Cannot write to ${dirname(target)}. Rerun the Grip installer with a writable GRIP_INSTALL_DIR or update with elevated permissions.`,\n\t\t);\n\t}\n\treturn target;\n}\n\nasync function replaceExecutable(source: string, target: string, platform: NodeJS.Platform): Promise<void> {\n\tif (platform !== \"win32\") {\n\t\tawait rename(source, target);\n\t\treturn;\n\t}\n\t// Windows cannot overwrite a running executable, but it can rename it. Move the current\n\t// binary aside, then move the verified one into place; cleanup happens on a later start.\n\tconst previous = `${target}${WINDOWS_PREVIOUS_SUFFIX}${randomUUID()}`;\n\tawait rename(target, previous);\n\ttry {\n\t\tawait rename(source, target);\n\t} catch (error) {\n\t\tawait rename(previous, target);\n\t\tthrow error;\n\t}\n\tawait rm(previous, { force: true }).catch(() => {});\n}\n\n/**\n * Download the release executable for this platform, verify its SHA-256 checksum, and atomically\n * replace the running executable. Mirrors install.sh / install.ps1.\n */\nexport async function updateBinaryExecutable(options: BinarySelfUpdateOptions = {}): Promise<BinarySelfUpdateResult> {\n\tconst platform = options.platform ?? process.platform;\n\tconst arch = options.arch ?? process.arch;\n\tconst asset = getBinaryReleaseAssetName(platform, arch);\n\tif (!asset) throw new Error(`No Grip binary release is available for ${platform}-${arch}`);\n\n\tconst fetchImpl = options.fetch ?? fetch;\n\tconst userAgent = options.userAgent ?? \"grip-self-update\";\n\tconst downloadUrl = getReleaseDownloadUrl(resolveReleaseBaseUrl(options.releaseBaseUrl), options.version);\n\tconst assetUrl = `${downloadUrl}/${asset}`;\n\tconst target = await resolveExecutableTarget(options.executablePath ?? process.execPath);\n\n\t// Download next to the target so the final rename stays on one filesystem.\n\tconst work = await mkdtemp(join(dirname(target), TEMP_DIR_PREFIX));\n\ttry {\n\t\tconst checksumResponse = await fetchOk(fetchImpl, `${assetUrl}.sha256`, userAgent, CHECKSUM_TIMEOUT_MS);\n\t\tconst expected = parseChecksum(await checksumResponse.text(), asset);\n\t\tconst downloaded = join(work, asset);\n\t\tconst actual = await downloadToFile(await fetchOk(fetchImpl, assetUrl, userAgent, BINARY_TIMEOUT_MS), downloaded);\n\t\tif (actual !== expected) throw new Error(`SHA-256 mismatch for ${asset}; update aborted`);\n\t\tawait chmod(downloaded, 0o755);\n\t\tawait replaceExecutable(downloaded, target, platform);\n\t} finally {\n\t\tawait rm(work, { recursive: true, force: true }).catch(() => {});\n\t}\n\treturn { executablePath: target, assetUrl };\n}\n\n/** Remove executables that a Windows binary update moved aside while they were still running. */\nexport async function cleanupWindowsBinarySelfUpdateLeftovers(\n\texecutablePath: string = process.execPath,\n): Promise<void> {\n\ttry {\n\t\tconst target = await realpath(executablePath);\n\t\tconst dir = dirname(target);\n\t\tconst previousPrefix = `${basename(target)}${WINDOWS_PREVIOUS_SUFFIX}`;\n\t\tfor (const entry of await readdir(dir)) {\n\t\t\tif (!entry.startsWith(previousPrefix)) continue;\n\t\t\tconst path = join(dir, entry);\n\t\t\tif (!(await lstat(path)).isFile()) continue;\n\t\t\tawait rm(path, { force: true }).catch(() => {});\n\t\t}\n\t} catch {\n\t\t// Best effort: the directory may be read-only or another process may still be running the old file.\n\t}\n}\n"]}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import type { AutocompleteItem } from "@greppleai/grip-tui";
|
|
2
|
+
import type { PortablePathFlavor } from "../core/lsp/portable-path.ts";
|
|
2
3
|
export declare function resolveDirectoryPath(value: string, cwd: string): string | undefined;
|
|
3
4
|
/** Build immediate child-directory completions for a path relative to cwd. */
|
|
4
5
|
export declare function getDirectoryCompletions(argumentPrefix: string, cwd: string): AutocompleteItem[];
|
|
6
|
+
interface SandboxDirectoryOperations {
|
|
7
|
+
readdir(path: string): Promise<string[]>;
|
|
8
|
+
resolveWorkspaceDirectory(path: string): Promise<string>;
|
|
9
|
+
}
|
|
10
|
+
/** Complete guest paths through the active sandbox, never through the host filesystem. */
|
|
11
|
+
export declare function getSandboxDirectoryCompletions(argumentPrefix: string, cwd: string, pathFlavor: PortablePathFlavor, operations: SandboxDirectoryOperations): Promise<AutocompleteItem[]>;
|
|
12
|
+
export {};
|
|
5
13
|
//# sourceMappingURL=directory-completions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directory-completions.d.ts","sourceRoot":"","sources":["../../src/utils/directory-completions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"directory-completions.d.ts","sourceRoot":"","sources":["../../src/utils/directory-completions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAQvE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOnF;AAUD,8EAA8E;AAC9E,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAkC/F;AAED,UAAU,0BAA0B;IACnC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACzD;AAED,0FAA0F;AAC1F,wBAAsB,8BAA8B,CACnD,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,0BAA0B,GACpC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAuC7B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readdirSync, realpathSync, statSync } from "node:fs";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
|
-
import { basename, dirname, join, resolve } from "node:path";
|
|
3
|
+
import { basename, dirname, join, posix, resolve, win32 } from "node:path";
|
|
4
4
|
function expandHome(value) {
|
|
5
5
|
if (value === "~")
|
|
6
6
|
return homedir();
|
|
@@ -61,4 +61,45 @@ export function getDirectoryCompletions(argumentPrefix, cwd) {
|
|
|
61
61
|
return [];
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
+
/** Complete guest paths through the active sandbox, never through the host filesystem. */
|
|
65
|
+
export async function getSandboxDirectoryCompletions(argumentPrefix, cwd, pathFlavor, operations) {
|
|
66
|
+
const paths = pathFlavor === "windows" ? win32 : posix;
|
|
67
|
+
const quoted = argumentPrefix.startsWith('"');
|
|
68
|
+
const rawPrefix = (quoted ? argumentPrefix.slice(1) : argumentPrefix).replaceAll("\\", "/");
|
|
69
|
+
const hasTrailingSeparator = rawPrefix.endsWith("/");
|
|
70
|
+
const parent = hasTrailingSeparator ? rawPrefix : paths.dirname(rawPrefix);
|
|
71
|
+
const namePrefix = hasTrailingSeparator ? "" : paths.basename(rawPrefix);
|
|
72
|
+
const displayDirectory = hasTrailingSeparator
|
|
73
|
+
? rawPrefix
|
|
74
|
+
: rawPrefix.includes("/")
|
|
75
|
+
? rawPrefix.slice(0, rawPrefix.lastIndexOf("/") + 1)
|
|
76
|
+
: "";
|
|
77
|
+
try {
|
|
78
|
+
const searchDirectory = await operations.resolveWorkspaceDirectory(paths.resolve(cwd, parent));
|
|
79
|
+
const names = await operations.readdir(searchDirectory);
|
|
80
|
+
const matches = names.filter((name) => name.toLowerCase().startsWith(namePrefix.toLowerCase()));
|
|
81
|
+
const items = [];
|
|
82
|
+
// Bound concurrent daemon requests for large directories such as node_modules.
|
|
83
|
+
for (let index = 0; index < matches.length; index += 16) {
|
|
84
|
+
const batch = await Promise.all(matches.slice(index, index + 16).map(async (name) => {
|
|
85
|
+
try {
|
|
86
|
+
await operations.resolveWorkspaceDirectory(paths.join(searchDirectory, name));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
const directoryPath = `${displayDirectory}${name}/`;
|
|
92
|
+
return {
|
|
93
|
+
value: quoted || directoryPath.includes(" ") ? `"${directoryPath}"` : directoryPath,
|
|
94
|
+
label: `${name}/`,
|
|
95
|
+
};
|
|
96
|
+
}));
|
|
97
|
+
items.push(...batch.filter((item) => item !== undefined));
|
|
98
|
+
}
|
|
99
|
+
return items.sort((a, b) => a.label.localeCompare(b.label));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
64
105
|
//# sourceMappingURL=directory-completions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directory-completions.js","sourceRoot":"","sources":["../../src/utils/directory-completions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"directory-completions.js","sourceRoot":"","sources":["../../src/utils/directory-completions.ts"],"names":[],"mappings":"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","sourcesContent":["import { readdirSync, realpathSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join, posix, resolve, win32 } from \"node:path\";\nimport type { AutocompleteItem } from \"@greppleai/grip-tui\";\nimport type { PortablePathFlavor } from \"../core/lsp/portable-path.ts\";\n\nfunction expandHome(value: string): string {\n\tif (value === \"~\") return homedir();\n\tif (value.startsWith(\"~/\") || value.startsWith(\"~\\\\\")) return join(homedir(), value.slice(2));\n\treturn value;\n}\n\nexport function resolveDirectoryPath(value: string, cwd: string): string | undefined {\n\ttry {\n\t\tconst directory = realpathSync(resolve(cwd, expandHome(value)));\n\t\treturn statSync(directory).isDirectory() ? directory : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction isDirectory(directory: string, name: string): boolean {\n\ttry {\n\t\treturn statSync(join(directory, name)).isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/** Build immediate child-directory completions for a path relative to cwd. */\nexport function getDirectoryCompletions(argumentPrefix: string, cwd: string): AutocompleteItem[] {\n\tconst quoted = argumentPrefix.startsWith('\"');\n\tconst rawPrefix = (quoted ? argumentPrefix.slice(1) : argumentPrefix).replaceAll(\"\\\\\", \"/\");\n\tif (rawPrefix === \"~\") {\n\t\treturn [{ value: \"~/\", label: \"~/\" }];\n\t}\n\n\tconst expandedPrefix = expandHome(rawPrefix);\n\tconst hasTrailingSeparator = rawPrefix.endsWith(\"/\");\n\tconst searchDirectory = resolveDirectoryPath(hasTrailingSeparator ? rawPrefix : dirname(rawPrefix), cwd);\n\tif (!searchDirectory) return [];\n\tconst namePrefix = hasTrailingSeparator ? \"\" : basename(expandedPrefix);\n\tconst displayDirectory = hasTrailingSeparator\n\t\t? rawPrefix\n\t\t: rawPrefix.includes(\"/\")\n\t\t\t? rawPrefix.slice(0, rawPrefix.lastIndexOf(\"/\") + 1)\n\t\t\t: \"\";\n\n\ttry {\n\t\treturn readdirSync(searchDirectory, { withFileTypes: true })\n\t\t\t.filter((entry) => entry.name.toLowerCase().startsWith(namePrefix.toLowerCase()))\n\t\t\t.filter((entry) => entry.isDirectory() || (entry.isSymbolicLink() && isDirectory(searchDirectory, entry.name)))\n\t\t\t.map((entry) => {\n\t\t\t\tconst directoryPath = `${displayDirectory}${entry.name}/`;\n\t\t\t\tconst needsQuotes = quoted || directoryPath.includes(\" \");\n\t\t\t\treturn {\n\t\t\t\t\tvalue: needsQuotes ? `\"${directoryPath}\"` : directoryPath,\n\t\t\t\t\tlabel: `${entry.name}/`,\n\t\t\t\t};\n\t\t\t})\n\t\t\t.sort((left, right) => left.label.localeCompare(right.label));\n\t} catch {\n\t\treturn [];\n\t}\n}\n\ninterface SandboxDirectoryOperations {\n\treaddir(path: string): Promise<string[]>;\n\tresolveWorkspaceDirectory(path: string): Promise<string>;\n}\n\n/** Complete guest paths through the active sandbox, never through the host filesystem. */\nexport async function getSandboxDirectoryCompletions(\n\targumentPrefix: string,\n\tcwd: string,\n\tpathFlavor: PortablePathFlavor,\n\toperations: SandboxDirectoryOperations,\n): Promise<AutocompleteItem[]> {\n\tconst paths = pathFlavor === \"windows\" ? win32 : posix;\n\tconst quoted = argumentPrefix.startsWith('\"');\n\tconst rawPrefix = (quoted ? argumentPrefix.slice(1) : argumentPrefix).replaceAll(\"\\\\\", \"/\");\n\tconst hasTrailingSeparator = rawPrefix.endsWith(\"/\");\n\tconst parent = hasTrailingSeparator ? rawPrefix : paths.dirname(rawPrefix);\n\tconst namePrefix = hasTrailingSeparator ? \"\" : paths.basename(rawPrefix);\n\tconst displayDirectory = hasTrailingSeparator\n\t\t? rawPrefix\n\t\t: rawPrefix.includes(\"/\")\n\t\t\t? rawPrefix.slice(0, rawPrefix.lastIndexOf(\"/\") + 1)\n\t\t\t: \"\";\n\ttry {\n\t\tconst searchDirectory = await operations.resolveWorkspaceDirectory(paths.resolve(cwd, parent));\n\t\tconst names = await operations.readdir(searchDirectory);\n\t\tconst matches = names.filter((name) => name.toLowerCase().startsWith(namePrefix.toLowerCase()));\n\t\tconst items: AutocompleteItem[] = [];\n\t\t// Bound concurrent daemon requests for large directories such as node_modules.\n\t\tfor (let index = 0; index < matches.length; index += 16) {\n\t\t\tconst batch = await Promise.all(\n\t\t\t\tmatches.slice(index, index + 16).map(async (name): Promise<AutocompleteItem | undefined> => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait operations.resolveWorkspaceDirectory(paths.join(searchDirectory, name));\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tconst directoryPath = `${displayDirectory}${name}/`;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalue: quoted || directoryPath.includes(\" \") ? `\"${directoryPath}\"` : directoryPath,\n\t\t\t\t\t\tlabel: `${name}/`,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t);\n\t\t\titems.push(...batch.filter((item): item is AutocompleteItem => item !== undefined));\n\t\t}\n\t\treturn items.sort((a, b) => a.label.localeCompare(b.label));\n\t} catch {\n\t\treturn [];\n\t}\n}\n"]}
|