@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.
@@ -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"}
@@ -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
@@ -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: string;
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 {};
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}