@lore-co/cli 0.1.14 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -2
- package/dist/api.d.ts +8 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +52 -0
- package/dist/api.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +67 -4
- package/dist/cli.js.map +1 -1
- package/dist/devin-client.d.ts +1 -1
- package/dist/generated-assets.d.ts +4 -4
- package/dist/generated-assets.js +4 -4
- package/dist/generated-assets.js.map +1 -1
- package/dist/guard.d.ts +3 -0
- package/dist/guard.d.ts.map +1 -0
- package/dist/guard.js +170 -0
- package/dist/guard.js.map +1 -0
- package/dist/handoff.d.ts +4 -0
- package/dist/handoff.d.ts.map +1 -0
- package/dist/handoff.js +227 -0
- package/dist/handoff.js.map +1 -0
- package/dist/live.d.ts +28 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +597 -0
- package/dist/live.js.map +1 -0
- package/dist/machine.d.ts +19 -0
- package/dist/machine.d.ts.map +1 -0
- package/dist/machine.js +102 -0
- package/dist/machine.js.map +1 -0
- package/dist/pty.d.ts +22 -0
- package/dist/pty.d.ts.map +1 -0
- package/dist/pty.js +148 -0
- package/dist/pty.js.map +1 -0
- package/dist/runtime.d.ts +37 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +364 -8
- package/dist/runtime.js.map +1 -1
- package/dist/self-host.d.ts +1 -1
- package/dist/self-host.js +2 -2
- package/dist/update.js +5 -5
- package/dist/update.js.map +1 -1
- package/package.json +7 -3
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ConnectorConfig, LorePaths } from "./cli.js";
|
|
2
|
+
export interface MachineIdentity {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function machineIdentityPath(paths: LorePaths): string;
|
|
7
|
+
/**
|
|
8
|
+
* Derives a stable, human-meaningful default machine name from the hostname
|
|
9
|
+
* ("Dantes-MacBook-Pro.local" → "dantes-macbook-pro").
|
|
10
|
+
*/
|
|
11
|
+
export declare function defaultMachineName(): string;
|
|
12
|
+
export declare function readMachineIdentity(paths: LorePaths): Promise<MachineIdentity | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Registers this machine with the workspace (idempotent upsert by name) and
|
|
15
|
+
* records the identity locally so hooks can attribute sessions to it.
|
|
16
|
+
*/
|
|
17
|
+
export declare function ensureMachineRegistered(config: ConnectorConfig, paths: LorePaths, name?: string): Promise<MachineIdentity>;
|
|
18
|
+
export declare function runMachinesCommand(args: readonly string[], config: ConnectorConfig | null, paths: LorePaths): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine.d.ts","sourceRoot":"","sources":["../src/machine.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAc3D,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAQ3C;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAmBjC;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CA2B1B;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,eAAe,GAAG,IAAI,EAC9B,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,IAAI,CAAC,CAqCf"}
|
package/dist/machine.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { arch, hostname, platform } from "node:os";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
import { ListMachinesResponseSchema, MachineNameSchema, MachineSchema, } from "@lore-co/core";
|
|
5
|
+
import { loreApiRequest } from "./api.js";
|
|
6
|
+
import { LORE_VERSION } from "./version.js";
|
|
7
|
+
const MACHINES_HELP = `lore machines
|
|
8
|
+
List the machines registered to this workspace and their live sessions.
|
|
9
|
+
|
|
10
|
+
Usage:
|
|
11
|
+
lore machines [--json]
|
|
12
|
+
|
|
13
|
+
Examples:
|
|
14
|
+
lore machines
|
|
15
|
+
lore attach --from macbook
|
|
16
|
+
`;
|
|
17
|
+
export function machineIdentityPath(paths) {
|
|
18
|
+
return resolve(paths.loreDirectory, "machine.json");
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Derives a stable, human-meaningful default machine name from the hostname
|
|
22
|
+
* ("Dantes-MacBook-Pro.local" → "dantes-macbook-pro").
|
|
23
|
+
*/
|
|
24
|
+
export function defaultMachineName() {
|
|
25
|
+
const base = hostname()
|
|
26
|
+
.toLowerCase()
|
|
27
|
+
.replace(/\.(?:local|lan|home|localdomain)$/u, "")
|
|
28
|
+
.replaceAll(/[^a-z0-9._-]+/gu, "-")
|
|
29
|
+
.replaceAll(/^[._-]+|[._-]+$/gu, "")
|
|
30
|
+
.slice(0, 100);
|
|
31
|
+
return base === "" ? "machine" : base;
|
|
32
|
+
}
|
|
33
|
+
export async function readMachineIdentity(paths) {
|
|
34
|
+
try {
|
|
35
|
+
const raw = await readFile(machineIdentityPath(paths), "utf8");
|
|
36
|
+
const parsed = JSON.parse(raw);
|
|
37
|
+
if (typeof parsed === "object" &&
|
|
38
|
+
parsed !== null &&
|
|
39
|
+
typeof parsed.id === "string" &&
|
|
40
|
+
typeof parsed.name === "string") {
|
|
41
|
+
return {
|
|
42
|
+
id: parsed.id,
|
|
43
|
+
name: parsed.name,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Not registered yet.
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Registers this machine with the workspace (idempotent upsert by name) and
|
|
54
|
+
* records the identity locally so hooks can attribute sessions to it.
|
|
55
|
+
*/
|
|
56
|
+
export async function ensureMachineRegistered(config, paths, name) {
|
|
57
|
+
const existing = await readMachineIdentity(paths);
|
|
58
|
+
if (existing !== null && name === undefined) {
|
|
59
|
+
return existing;
|
|
60
|
+
}
|
|
61
|
+
const machineName = MachineNameSchema.parse(name ?? existing?.name ?? defaultMachineName());
|
|
62
|
+
const machine = await loreApiRequest(config, "POST", "/v1/machines/register", MachineSchema, {
|
|
63
|
+
name: machineName,
|
|
64
|
+
os: platform(),
|
|
65
|
+
arch: arch(),
|
|
66
|
+
cliVersion: LORE_VERSION,
|
|
67
|
+
});
|
|
68
|
+
const identity = { id: machine.id, name: machine.name };
|
|
69
|
+
const path = machineIdentityPath(paths);
|
|
70
|
+
await mkdir(dirname(path), { recursive: true });
|
|
71
|
+
await writeFile(path, `${JSON.stringify(identity, null, 2)}\n`, {
|
|
72
|
+
mode: 0o600,
|
|
73
|
+
});
|
|
74
|
+
return identity;
|
|
75
|
+
}
|
|
76
|
+
export async function runMachinesCommand(args, config, paths) {
|
|
77
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
78
|
+
process.stdout.write(MACHINES_HELP);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (config === null) {
|
|
82
|
+
throw new Error("Lore is not connected. Run: lore connect --token <workspace-token>");
|
|
83
|
+
}
|
|
84
|
+
const local = await readMachineIdentity(paths);
|
|
85
|
+
const response = await loreApiRequest(config, "GET", "/v1/machines", ListMachinesResponseSchema);
|
|
86
|
+
if (args.includes("--json")) {
|
|
87
|
+
process.stdout.write(`${JSON.stringify(response, null, 2)}\n`);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (response.machines.length === 0) {
|
|
91
|
+
process.stdout.write("No machines registered. Machines register when they connect or host a live session.\n");
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
for (const machine of response.machines) {
|
|
95
|
+
const marker = machine.id === local?.id ? " (this machine)" : "";
|
|
96
|
+
const live = machine.runningRuntimes === 0
|
|
97
|
+
? ""
|
|
98
|
+
: ` · ${machine.runningRuntimes} live session(s)`;
|
|
99
|
+
process.stdout.write(`${machine.name}${marker} · last seen ${machine.lastSeenAt.slice(0, 16).replace("T", " ")}${live}\n`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine.js","sourceRoot":"","sources":["../src/machine.ts"],"names":[],"mappings":"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"}
|
package/dist/pty.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface PtyProcess {
|
|
2
|
+
pid: number;
|
|
3
|
+
/** False when the backing implementation cannot propagate resizes. */
|
|
4
|
+
canResize: boolean;
|
|
5
|
+
write(data: Buffer): void;
|
|
6
|
+
resize(cols: number, rows: number): void;
|
|
7
|
+
onData(callback: (chunk: Buffer) => void): void;
|
|
8
|
+
onExit(callback: (code: number | null) => void): void;
|
|
9
|
+
kill(signal?: NodeJS.Signals): void;
|
|
10
|
+
}
|
|
11
|
+
export interface OpenPtyOptions {
|
|
12
|
+
cwd?: string | undefined;
|
|
13
|
+
env?: NodeJS.ProcessEnv | undefined;
|
|
14
|
+
cols?: number | undefined;
|
|
15
|
+
rows?: number | undefined;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Opens the command inside a pseudo-terminal. Prefers node-pty when it is
|
|
19
|
+
* installed (full resize support); otherwise falls back to the python3 shim.
|
|
20
|
+
*/
|
|
21
|
+
export declare function openPty(command: string, args: string[], options?: OpenPtyOptions): Promise<PtyProcess>;
|
|
22
|
+
//# sourceMappingURL=pty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAChD,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAuID;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAyCrB"}
|
package/dist/pty.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* The Function-constructor import keeps TypeScript and bundlers (including
|
|
4
|
+
* `bun build --compile`) from resolving node-pty statically: it is not a
|
|
5
|
+
* dependency of the CLI, only an optional enhancement when present.
|
|
6
|
+
*/
|
|
7
|
+
async function loadNodePty() {
|
|
8
|
+
try {
|
|
9
|
+
const dynamicImport = new Function("specifier", "return import(specifier)");
|
|
10
|
+
const module = (await dynamicImport("node-pty"));
|
|
11
|
+
return typeof module.spawn === "function"
|
|
12
|
+
? module
|
|
13
|
+
: null;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* PTY bridge implemented with Python's stdlib: fork a PTY, exec the command
|
|
21
|
+
* inside it, and pump bytes between our pipes and the PTY master. Python 3
|
|
22
|
+
* ships with macOS developer tooling and virtually every Linux distro, and
|
|
23
|
+
* unlike BSD `script(1)` it does not require its own stdio to be a terminal.
|
|
24
|
+
*/
|
|
25
|
+
const PYTHON_PTY_SHIM = `import os, pty, select, sys, struct, fcntl, termios
|
|
26
|
+
cmd = sys.argv[1:]
|
|
27
|
+
pid, fd = pty.fork()
|
|
28
|
+
if pid == 0:
|
|
29
|
+
os.execvp(cmd[0], cmd)
|
|
30
|
+
cols = int(os.environ.get('LORE_PTY_COLS', '80'))
|
|
31
|
+
rows = int(os.environ.get('LORE_PTY_ROWS', '24'))
|
|
32
|
+
fcntl.ioctl(fd, termios.TIOCSWINSZ, struct.pack('HHHH', rows, cols, 0, 0))
|
|
33
|
+
stdin_open = True
|
|
34
|
+
while True:
|
|
35
|
+
try:
|
|
36
|
+
ready, _, _ = select.select([0, fd] if stdin_open else [fd], [], [])
|
|
37
|
+
except OSError:
|
|
38
|
+
break
|
|
39
|
+
if 0 in ready:
|
|
40
|
+
data = os.read(0, 65536)
|
|
41
|
+
if data == b'':
|
|
42
|
+
stdin_open = False
|
|
43
|
+
else:
|
|
44
|
+
os.write(fd, data)
|
|
45
|
+
if fd in ready:
|
|
46
|
+
try:
|
|
47
|
+
data = os.read(fd, 65536)
|
|
48
|
+
except OSError:
|
|
49
|
+
break
|
|
50
|
+
if data == b'':
|
|
51
|
+
break
|
|
52
|
+
os.write(1, data)
|
|
53
|
+
_, status = os.waitpid(pid, 0)
|
|
54
|
+
sys.exit(os.waitstatus_to_exitcode(status))
|
|
55
|
+
`;
|
|
56
|
+
/**
|
|
57
|
+
* PTY fallback for environments where node-pty is unavailable (including the
|
|
58
|
+
* Bun-compiled standalone binary, which cannot load native modules). Cannot
|
|
59
|
+
* propagate terminal resizes: the inner terminal keeps its initial size.
|
|
60
|
+
*/
|
|
61
|
+
function pythonFallback(command, args, options) {
|
|
62
|
+
const child = spawn("python3", ["-c", PYTHON_PTY_SHIM, command, ...args], {
|
|
63
|
+
cwd: options.cwd,
|
|
64
|
+
env: {
|
|
65
|
+
...(options.env ?? process.env),
|
|
66
|
+
LORE_PTY_COLS: String(options.cols ?? 80),
|
|
67
|
+
LORE_PTY_ROWS: String(options.rows ?? 24),
|
|
68
|
+
},
|
|
69
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
70
|
+
});
|
|
71
|
+
const dataCallbacks = [];
|
|
72
|
+
const emit = (chunk) => {
|
|
73
|
+
for (const callback of dataCallbacks) {
|
|
74
|
+
callback(chunk);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
child.stdout?.on("data", emit);
|
|
78
|
+
child.stderr?.on("data", emit);
|
|
79
|
+
return {
|
|
80
|
+
pid: child.pid ?? -1,
|
|
81
|
+
canResize: false,
|
|
82
|
+
write(data) {
|
|
83
|
+
child.stdin?.write(data);
|
|
84
|
+
},
|
|
85
|
+
resize() {
|
|
86
|
+
// The shim provides no resize channel after startup.
|
|
87
|
+
},
|
|
88
|
+
onData(callback) {
|
|
89
|
+
dataCallbacks.push(callback);
|
|
90
|
+
},
|
|
91
|
+
onExit(callback) {
|
|
92
|
+
child.on("exit", (code) => {
|
|
93
|
+
callback(code);
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
kill(signal) {
|
|
97
|
+
child.kill(signal ?? "SIGTERM");
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Opens the command inside a pseudo-terminal. Prefers node-pty when it is
|
|
103
|
+
* installed (full resize support); otherwise falls back to the python3 shim.
|
|
104
|
+
*/
|
|
105
|
+
export async function openPty(command, args, options = {}) {
|
|
106
|
+
const cols = options.cols ?? 80;
|
|
107
|
+
const rows = options.rows ?? 24;
|
|
108
|
+
const nodePty = await loadNodePty();
|
|
109
|
+
if (nodePty === null) {
|
|
110
|
+
return pythonFallback(command, args, options);
|
|
111
|
+
}
|
|
112
|
+
const pty = nodePty.spawn(command, args, {
|
|
113
|
+
name: "xterm-256color",
|
|
114
|
+
cols,
|
|
115
|
+
rows,
|
|
116
|
+
...(options.cwd === undefined ? {} : { cwd: options.cwd }),
|
|
117
|
+
env: options.env ?? process.env,
|
|
118
|
+
});
|
|
119
|
+
return {
|
|
120
|
+
pid: pty.pid,
|
|
121
|
+
canResize: true,
|
|
122
|
+
write(data) {
|
|
123
|
+
pty.write(data.toString("utf8"));
|
|
124
|
+
},
|
|
125
|
+
resize(nextCols, nextRows) {
|
|
126
|
+
try {
|
|
127
|
+
pty.resize(nextCols, nextRows);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Resizing a just-exited PTY throws; safe to ignore.
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
onData(callback) {
|
|
134
|
+
pty.onData((data) => {
|
|
135
|
+
callback(Buffer.from(data, "utf8"));
|
|
136
|
+
});
|
|
137
|
+
},
|
|
138
|
+
onExit(callback) {
|
|
139
|
+
pty.onExit(({ exitCode }) => {
|
|
140
|
+
callback(exitCode);
|
|
141
|
+
});
|
|
142
|
+
},
|
|
143
|
+
kill(signal) {
|
|
144
|
+
pty.kill(signal);
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=pty.js.map
|
package/dist/pty.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.js","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -41,6 +41,8 @@ export interface TurnRequest {
|
|
|
41
41
|
cwd?: string;
|
|
42
42
|
previousTurnId?: string;
|
|
43
43
|
promptId?: string;
|
|
44
|
+
parentWorkSessionId?: string;
|
|
45
|
+
machineId?: string;
|
|
44
46
|
};
|
|
45
47
|
}
|
|
46
48
|
interface HookInput {
|
|
@@ -60,6 +62,9 @@ interface HookInput {
|
|
|
60
62
|
response?: unknown;
|
|
61
63
|
message?: unknown;
|
|
62
64
|
text?: unknown;
|
|
65
|
+
tool_name?: unknown;
|
|
66
|
+
tool_input?: unknown;
|
|
67
|
+
command?: unknown;
|
|
63
68
|
}
|
|
64
69
|
export interface HookRuntimeOptions {
|
|
65
70
|
home?: string;
|
|
@@ -72,13 +77,42 @@ export interface HookResult {
|
|
|
72
77
|
systemMessage?: string;
|
|
73
78
|
outcome?: "accept";
|
|
74
79
|
additional_context?: string;
|
|
80
|
+
/** Cursor beforeShellExecution verdict ("ask" is unenforced upstream). */
|
|
81
|
+
permission?: "deny";
|
|
82
|
+
userMessage?: string;
|
|
83
|
+
agentMessage?: string;
|
|
75
84
|
hookSpecificOutput?: {
|
|
76
|
-
hookEventName: "UserPromptSubmit";
|
|
77
|
-
additionalContext
|
|
85
|
+
hookEventName: "UserPromptSubmit" | "PreToolUse";
|
|
86
|
+
additionalContext?: string;
|
|
87
|
+
permissionDecision?: "ask";
|
|
88
|
+
permissionDecisionReason?: string;
|
|
78
89
|
};
|
|
79
90
|
}
|
|
91
|
+
export interface LineageMetadata {
|
|
92
|
+
parentWorkSessionId?: string;
|
|
93
|
+
machineId?: string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Session lineage travels launcher → agent → hook via the environment:
|
|
97
|
+
* `lore resume` / `lore continue` set LORE_PARENT_SESSION_ID when launching
|
|
98
|
+
* the target tool, and hooks running inside that tool inherit it. The local
|
|
99
|
+
* machine identity (written by `lore connect`) rides along so sessions can
|
|
100
|
+
* be attributed to the machine that produced them.
|
|
101
|
+
*/
|
|
102
|
+
export declare function readLineageMetadata(home?: string, environment?: NodeJS.ProcessEnv): Promise<LineageMetadata>;
|
|
80
103
|
export declare function redactSecrets(text: string): string;
|
|
81
|
-
export declare function createTurnRequest(input: HookInput, agent: CommandHookAgentName, pending: PendingAssistantMessage, now: Date): Promise<TurnRequest | null>;
|
|
104
|
+
export declare function createTurnRequest(input: HookInput, agent: CommandHookAgentName, pending: PendingAssistantMessage, now: Date, lineage?: LineageMetadata): Promise<TurnRequest | null>;
|
|
105
|
+
interface GuardTrigger {
|
|
106
|
+
action: "edit" | "commit" | "deploy" | "command";
|
|
107
|
+
files?: string[];
|
|
108
|
+
command?: string;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Decides whether a tool call is a meaningful action boundary. File edits
|
|
112
|
+
* always qualify; shell commands qualify only when they look high-impact
|
|
113
|
+
* (commit, push, deploy, publish, destructive) to keep the guard quiet.
|
|
114
|
+
*/
|
|
115
|
+
export declare function guardTrigger(toolName: string, toolInput: Record<string, unknown>): GuardTrigger | null;
|
|
82
116
|
export declare function handleHookEvent(value: unknown, agent: CommandHookAgentName, options?: HookRuntimeOptions): Promise<HookResult | undefined>;
|
|
83
117
|
export declare function runHook(args?: readonly string[]): Promise<void>;
|
|
84
118
|
export {};
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAiCA,eAAO,MAAM,wBAAwB,qDAK3B,CAAC;AACX,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7E,iFAAiF;AACjF,MAAM,MAAM,SAAS,GAAG,oBAAoB,CAAC;AAgB7C,UAAU,uBAAuB;IAC/B,KAAK,EAAE,oBAAoB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,UAAU,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,oBAAoB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,WAAW,EAAE;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,aAAa,EAAE;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|