mirror of
https://github.com/atuinsh/atuin.git
synced 2026-06-01 18:47:18 +02:00
fix: ensure we can publish to crates (#3403)
include_str won't work outside of the crate boundary. Crates is so frustrating sometimes. <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
This commit is contained in:
@@ -1,87 +0,0 @@
|
||||
/**
|
||||
* Atuin extension for pi.
|
||||
*
|
||||
* Tracks bash commands executed by pi in Atuin history with author `pi`.
|
||||
*
|
||||
* Install with:
|
||||
* atuin hook install pi
|
||||
*
|
||||
* Then restart pi or run /reload.
|
||||
*/
|
||||
|
||||
import type { BashOperations, ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
||||
import { createBashTool, createLocalBashOperations } from "@mariozechner/pi-coding-agent";
|
||||
|
||||
const ATUIN_AUTHOR = "pi";
|
||||
const ATUIN_TIMEOUT_MS = 10_000;
|
||||
|
||||
async function startHistory(
|
||||
pi: ExtensionAPI,
|
||||
cwd: string,
|
||||
command: string,
|
||||
): Promise<string | undefined> {
|
||||
try {
|
||||
const result = await pi.exec(
|
||||
"atuin",
|
||||
["history", "start", "--author", ATUIN_AUTHOR, "--", command],
|
||||
{ cwd, timeout: ATUIN_TIMEOUT_MS },
|
||||
);
|
||||
|
||||
if (result.code !== 0) return undefined;
|
||||
|
||||
const id = result.stdout.trim();
|
||||
return id.length > 0 ? id : undefined;
|
||||
} catch {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
async function endHistory(
|
||||
pi: ExtensionAPI,
|
||||
cwd: string,
|
||||
historyId: string,
|
||||
exitCode: number,
|
||||
): Promise<void> {
|
||||
try {
|
||||
await pi.exec(
|
||||
"atuin",
|
||||
["history", "end", historyId, "--exit", String(exitCode)],
|
||||
{ cwd, timeout: ATUIN_TIMEOUT_MS },
|
||||
);
|
||||
} catch {
|
||||
// Ignore Atuin failures so command execution is never blocked.
|
||||
}
|
||||
}
|
||||
|
||||
export default function atuinPiExtension(pi: ExtensionAPI) {
|
||||
const cwd = process.cwd();
|
||||
const local = createLocalBashOperations();
|
||||
|
||||
const trackedOperations: BashOperations = {
|
||||
async exec(command, commandCwd, options) {
|
||||
const historyId = await startHistory(pi, commandCwd, command);
|
||||
let exitCode: number | null = null;
|
||||
|
||||
try {
|
||||
const result = await local.exec(command, commandCwd, options);
|
||||
exitCode = result.exitCode;
|
||||
return result;
|
||||
} finally {
|
||||
if (historyId) {
|
||||
await endHistory(
|
||||
pi,
|
||||
commandCwd,
|
||||
historyId,
|
||||
exitCode ?? (options.signal?.aborted ? 130 : 1),
|
||||
);
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
pi.registerTool(
|
||||
createBashTool(cwd, {
|
||||
operations: trackedOperations,
|
||||
}),
|
||||
);
|
||||
}
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../../crates/atuin/contrib/pi/atuin.ts
|
||||
@@ -0,0 +1,87 @@
|
||||
/**
|
||||
* Atuin extension for pi.
|
||||
*
|
||||
* Tracks bash commands executed by pi in Atuin history with author `pi`.
|
||||
*
|
||||
* Install with:
|
||||
* atuin hook install pi
|
||||
*
|
||||
* Then restart pi or run /reload.
|
||||
*/
|
||||
|
||||
import type { BashOperations, ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
||||
import { createBashTool, createLocalBashOperations } from "@mariozechner/pi-coding-agent";
|
||||
|
||||
const ATUIN_AUTHOR = "pi";
|
||||
const ATUIN_TIMEOUT_MS = 10_000;
|
||||
|
||||
async function startHistory(
|
||||
pi: ExtensionAPI,
|
||||
cwd: string,
|
||||
command: string,
|
||||
): Promise<string | undefined> {
|
||||
try {
|
||||
const result = await pi.exec(
|
||||
"atuin",
|
||||
["history", "start", "--author", ATUIN_AUTHOR, "--", command],
|
||||
{ cwd, timeout: ATUIN_TIMEOUT_MS },
|
||||
);
|
||||
|
||||
if (result.code !== 0) return undefined;
|
||||
|
||||
const id = result.stdout.trim();
|
||||
return id.length > 0 ? id : undefined;
|
||||
} catch {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
async function endHistory(
|
||||
pi: ExtensionAPI,
|
||||
cwd: string,
|
||||
historyId: string,
|
||||
exitCode: number,
|
||||
): Promise<void> {
|
||||
try {
|
||||
await pi.exec(
|
||||
"atuin",
|
||||
["history", "end", historyId, "--exit", String(exitCode)],
|
||||
{ cwd, timeout: ATUIN_TIMEOUT_MS },
|
||||
);
|
||||
} catch {
|
||||
// Ignore Atuin failures so command execution is never blocked.
|
||||
}
|
||||
}
|
||||
|
||||
export default function atuinPiExtension(pi: ExtensionAPI) {
|
||||
const cwd = process.cwd();
|
||||
const local = createLocalBashOperations();
|
||||
|
||||
const trackedOperations: BashOperations = {
|
||||
async exec(command, commandCwd, options) {
|
||||
const historyId = await startHistory(pi, commandCwd, command);
|
||||
let exitCode: number | null = null;
|
||||
|
||||
try {
|
||||
const result = await local.exec(command, commandCwd, options);
|
||||
exitCode = result.exitCode;
|
||||
return result;
|
||||
} finally {
|
||||
if (historyId) {
|
||||
await endHistory(
|
||||
pi,
|
||||
commandCwd,
|
||||
historyId,
|
||||
exitCode ?? (options.signal?.aborted ? 130 : 1),
|
||||
);
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
pi.registerTool(
|
||||
createBashTool(cwd, {
|
||||
operations: trackedOperations,
|
||||
}),
|
||||
);
|
||||
}
|
||||
@@ -10,7 +10,7 @@ use serde_json::Value;
|
||||
use super::history;
|
||||
|
||||
const HOOK_EVENT_TYPES: &[&str] = &["PreToolUse", "PostToolUse", "PostToolUseFailure"];
|
||||
const PI_EXTENSION_SOURCE: &str = include_str!("../../../../../contrib/pi/atuin.ts");
|
||||
const PI_EXTENSION_SOURCE: &str = include_str!("../../../contrib/pi/atuin.ts");
|
||||
|
||||
enum InstallKind {
|
||||
JsonHooks {
|
||||
|
||||
Reference in New Issue
Block a user