@lore-co/cli 0.2.23 → 0.2.25

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.
Files changed (59) hide show
  1. package/README.md +57 -9
  2. package/dist/ask.d.ts +2 -6
  3. package/dist/ask.d.ts.map +1 -1
  4. package/dist/ask.js +4 -21
  5. package/dist/ask.js.map +1 -1
  6. package/dist/chat.d.ts +15 -0
  7. package/dist/chat.d.ts.map +1 -0
  8. package/dist/chat.js +286 -0
  9. package/dist/chat.js.map +1 -0
  10. package/dist/cli.d.ts +59 -10
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +419 -97
  13. package/dist/cli.js.map +1 -1
  14. package/dist/command-help.d.ts +3 -1
  15. package/dist/command-help.d.ts.map +1 -1
  16. package/dist/command-help.js +5 -0
  17. package/dist/command-help.js.map +1 -1
  18. package/dist/devin-capture.d.ts +6 -0
  19. package/dist/devin-capture.d.ts.map +1 -1
  20. package/dist/devin-capture.js +34 -3
  21. package/dist/devin-capture.js.map +1 -1
  22. package/dist/devin-cli.d.ts +7 -2
  23. package/dist/devin-cli.d.ts.map +1 -1
  24. package/dist/devin-cli.js +81 -8
  25. package/dist/devin-cli.js.map +1 -1
  26. package/dist/generated-assets.d.ts +8 -6
  27. package/dist/generated-assets.d.ts.map +1 -1
  28. package/dist/generated-assets.js +8 -6
  29. package/dist/generated-assets.js.map +1 -1
  30. package/dist/generic-mcp.d.ts +35 -0
  31. package/dist/generic-mcp.d.ts.map +1 -0
  32. package/dist/generic-mcp.js +83 -0
  33. package/dist/generic-mcp.js.map +1 -0
  34. package/dist/lore-agent.d.ts +50 -0
  35. package/dist/lore-agent.d.ts.map +1 -0
  36. package/dist/lore-agent.js +299 -0
  37. package/dist/lore-agent.js.map +1 -0
  38. package/dist/mcp-config.d.ts +21 -4
  39. package/dist/mcp-config.d.ts.map +1 -1
  40. package/dist/mcp-config.js +66 -6
  41. package/dist/mcp-config.js.map +1 -1
  42. package/dist/owned-files.d.ts +21 -0
  43. package/dist/owned-files.d.ts.map +1 -0
  44. package/dist/owned-files.js +88 -0
  45. package/dist/owned-files.js.map +1 -0
  46. package/dist/recovery-cloud.d.ts +1 -1
  47. package/dist/runtime.d.ts.map +1 -1
  48. package/dist/runtime.js +50 -19
  49. package/dist/runtime.js.map +1 -1
  50. package/dist/self-host.d.ts +1 -1
  51. package/dist/self-host.js +2 -2
  52. package/dist/skills.d.ts +2 -0
  53. package/dist/skills.d.ts.map +1 -1
  54. package/dist/skills.js +46 -97
  55. package/dist/skills.js.map +1 -1
  56. package/dist/update.d.ts.map +1 -1
  57. package/dist/update.js +7 -4
  58. package/dist/update.js.map +1 -1
  59. package/package.json +6 -5
@@ -0,0 +1,88 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { lstat, mkdir, readFile, rename, rm, rmdir, writeFile } from "node:fs/promises";
3
+ import { dirname } from "node:path";
4
+ /**
5
+ * Files Lore writes into an agent's own directories (skills, agent
6
+ * definitions) and must later remove without touching the customer's edits.
7
+ * Ownership is a manifest of file path to content digest; a file is only
8
+ * rewritten or deleted while its content still matches the recorded digest.
9
+ */
10
+ export const digest = (text) => createHash("sha256").update(text).digest("hex");
11
+ /** True when no component of the path is a symlink. Lore never follows links into other files. */
12
+ export async function regularPath(path) {
13
+ let current = path;
14
+ while (dirname(current) !== current) {
15
+ const stat = await lstat(current).catch((error) => {
16
+ if (error.code !== "ENOENT")
17
+ throw error;
18
+ return null;
19
+ });
20
+ if (stat?.isSymbolicLink())
21
+ return false;
22
+ current = dirname(current);
23
+ }
24
+ return true;
25
+ }
26
+ export async function readOwnedManifest(file, subject) {
27
+ if (!await regularPath(file))
28
+ throw new Error(`${subject} ownership file is a symlink.`);
29
+ try {
30
+ const value = JSON.parse(await readFile(file, "utf8"));
31
+ if (!value || typeof value !== "object" || Array.isArray(value))
32
+ throw new Error(`Invalid ${subject.toLowerCase()} ownership file.`);
33
+ return Object.fromEntries(Object.entries(value).filter((entry) => typeof entry[1] === "string" && /^[a-f0-9]{64}$/u.test(entry[1])));
34
+ }
35
+ catch (error) {
36
+ if (error.code === "ENOENT")
37
+ return {};
38
+ throw error;
39
+ }
40
+ }
41
+ export async function atomicWrite(file, text) {
42
+ await mkdir(dirname(file), { recursive: true });
43
+ const temporary = `${file}.${randomUUID()}.tmp`;
44
+ try {
45
+ await writeFile(temporary, text, { flag: "wx", mode: 0o600 });
46
+ await rename(temporary, file);
47
+ }
48
+ finally {
49
+ await rm(temporary, { force: true });
50
+ }
51
+ }
52
+ export async function readIfPresent(file) {
53
+ return readFile(file, "utf8").catch((error) => {
54
+ if (error.code !== "ENOENT")
55
+ throw error;
56
+ return null;
57
+ });
58
+ }
59
+ /**
60
+ * Delete the file when the manifest owns it and its content is unchanged;
61
+ * then drop an empty parent directory and the manifest entry. Returns false
62
+ * when the file was left alone.
63
+ */
64
+ export async function removeOwnedFile(file, manifest, removeEmptyDirectory = true) {
65
+ if (!manifest[file] || !await regularPath(file))
66
+ return false;
67
+ const existing = await readIfPresent(file);
68
+ if (existing !== null && digest(existing) !== manifest[file])
69
+ return false;
70
+ if (existing !== null) {
71
+ await rm(file);
72
+ // Remove only an empty directory; preserve any customer resources.
73
+ if (removeEmptyDirectory) {
74
+ await rmdir(dirname(file)).catch((error) => {
75
+ if (!["ENOENT", "ENOTEMPTY", "EEXIST"].includes(error.code ?? ""))
76
+ throw error;
77
+ });
78
+ }
79
+ }
80
+ delete manifest[file];
81
+ return true;
82
+ }
83
+ export function ownedFileHint(subject, file, error, consequence) {
84
+ const code = error.code;
85
+ const reason = code === "EACCES" || code === "EPERM" ? "permission denied" : (code ?? error.message);
86
+ return `${subject} ${file} (${reason}). ${consequence}`;
87
+ }
88
+ //# sourceMappingURL=owned-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-files.js","sourceRoot":"","sources":["../src/owned-files.ts"],"names":[],"mappings":"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"}
@@ -11,9 +11,9 @@ declare const Runner: z.ZodObject<{
11
11
  agents: z.ZodArray<z.ZodEnum<{
12
12
  claude: "claude";
13
13
  "copilot-cli": "copilot-cli";
14
+ codex: "codex";
14
15
  cursor: "cursor";
15
16
  devin: "devin";
16
- codex: "codex";
17
17
  opencode: "opencode";
18
18
  polytoken: "polytoken";
19
19
  }>>;
@@ -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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"}
package/dist/runtime.js CHANGED
@@ -367,6 +367,7 @@ async function readRuntimeConfig(home, cwd) {
367
367
  token: parsed.token,
368
368
  agents,
369
369
  ...(timeoutMs === undefined ? {} : { timeoutMs }),
370
+ capture: saved?.capture !== "off",
370
371
  };
371
372
  }
372
373
  catch {
@@ -1305,13 +1306,17 @@ async function postPromptObservation(config, request, fetchImplementation, _stor
1305
1306
  throw new IncompatibleReliabilityError("Lore observation response has no matching durable acknowledgement");
1306
1307
  }
1307
1308
  }
1308
- async function getPromptContext(config, agent, sessionId, sourceEventId, prompt, gitContext, fetchImplementation, store, retained = []) {
1309
+ async function getPromptContext(config, agent, sessionId, sourceEventId, prompt, gitContext, fetchImplementation, store, retained = [], capture = true) {
1309
1310
  const deliveryEventId = deterministicUuid(`lore-context\0${sourceEventId}`);
1310
1311
  const deliveryRequest = redactRequestValues({
1311
1312
  connector: "lore-cli",
1312
1313
  eventId: deliveryEventId,
1313
1314
  sessionId,
1314
1315
  ...(retained.length ? { retainedReceiptIds: retained } : {}),
1316
+ // Capture off: the server returns context and stores nothing from the
1317
+ // prompt. Older servers reject the field, and this runtime does not retry
1318
+ // without it, so they never receive a prompt they would keep.
1319
+ ...(capture ? {} : { capture: false }),
1315
1320
  task: {
1316
1321
  agent,
1317
1322
  ...(gitContext.scope === undefined
@@ -1338,7 +1343,7 @@ async function getPromptContext(config, agent, sessionId, sourceEventId, prompt,
1338
1343
  signal: AbortSignal.timeout(config.timeoutMs ?? 2_500),
1339
1344
  });
1340
1345
  if (response.status === 400 && retained.length) {
1341
- return getPromptContext(config, agent, sessionId, sourceEventId, prompt, gitContext, fetchImplementation, store);
1346
+ return getPromptContext(config, agent, sessionId, sourceEventId, prompt, gitContext, fetchImplementation, store, [], capture);
1342
1347
  }
1343
1348
  if (!response.ok) {
1344
1349
  throw new RuntimeHttpError(`Lore context request failed with HTTP ${response.status}`, response.status);
@@ -1472,9 +1477,9 @@ async function getCachedPromptContext(config, prompt, gitContext, store, now, re
1472
1477
  },
1473
1478
  };
1474
1479
  }
1475
- async function getPromptContextWithFallback(config, agent, sessionId, sourceEventId, prompt, gitContext, fetchImplementation, store, now, retained = [], failures) {
1480
+ async function getPromptContextWithFallback(config, agent, sessionId, sourceEventId, prompt, gitContext, fetchImplementation, store, now, retained = [], failures, capture = true) {
1476
1481
  try {
1477
- return await getPromptContext(config, agent, sessionId, sourceEventId, prompt, gitContext, fetchImplementation, store, retained);
1482
+ return await getPromptContext(config, agent, sessionId, sourceEventId, prompt, gitContext, fetchImplementation, store, retained, capture);
1478
1483
  }
1479
1484
  catch (error) {
1480
1485
  failures?.push({
@@ -1934,6 +1939,12 @@ async function postGuardCheck(config, request, fetchImplementation, store) {
1934
1939
  body: JSON.stringify(request),
1935
1940
  signal: AbortSignal.timeout(Math.min(config.timeoutMs ?? GUARD_TIMEOUT_MS, GUARD_TIMEOUT_MS)),
1936
1941
  });
1942
+ if (response.status === 400 && request.capture === false) {
1943
+ // Older servers reject the field. Guard is a safety check and its request
1944
+ // carries no prompt, so it still runs there.
1945
+ const { capture: _capture, ...compatible } = request;
1946
+ return postGuardCheck(config, compatible, fetchImplementation, store);
1947
+ }
1937
1948
  if (!response.ok) {
1938
1949
  throw new RuntimeHttpError(`Lore guard check failed with HTTP ${response.status}`, response.status);
1939
1950
  }
@@ -2013,7 +2024,7 @@ async function offlineGuard(config, store, request, now, previouslyEnforced, all
2013
2024
  };
2014
2025
  }
2015
2026
  }
2016
- async function handleGuardEvent(input, agent, config, sessionId, options, now) {
2027
+ async function handleGuardEvent(input, agent, config, sessionId, options, now, capture = true) {
2017
2028
  const toolName = stringField(input.tool_name);
2018
2029
  if (toolName === undefined) {
2019
2030
  return undefined;
@@ -2084,6 +2095,8 @@ async function handleGuardEvent(input, agent, config, sessionId, options, now) {
2084
2095
  ...(trigger.command === undefined
2085
2096
  ? {}
2086
2097
  : { command: redactSecrets(trigger.command) }),
2098
+ // Capture off: the audit record keeps the decision, not the command or files.
2099
+ ...(capture ? {} : { capture: false }),
2087
2100
  };
2088
2101
  try {
2089
2102
  result = await postGuardCheck(config, guardRequest, options.fetch ?? globalThis.fetch, store);
@@ -2223,6 +2236,11 @@ export async function handleHookEvent(value, agent, options = {}) {
2223
2236
  return agent === "cursor" && eventName === "UserPromptSubmit" ? { continue: true } : undefined;
2224
2237
  }
2225
2238
  const now = (options.now ?? (() => new Date()))();
2239
+ // One definition of "capture off": the machine's retrieval-only mode, or a
2240
+ // workspace or personal switch paused in the dashboard. The switches arrive
2241
+ // with the repository policy fetched above, so a pause reaches every
2242
+ // connected machine on its next hook event without re-running lore connect.
2243
+ const capture = config.capture && access.capturePausedBy === undefined;
2226
2244
  if (agent === "cursor" && eventName === "SessionStart") {
2227
2245
  const cwd = stringField(input.cwd);
2228
2246
  if (!cwd)
@@ -2232,12 +2250,21 @@ export async function handleHookEvent(value, agent, options = {}) {
2232
2250
  return { additional_context: [
2233
2251
  "Lore shared context is connected through the lore-native MCP server.",
2234
2252
  `For this conversation use sessionId ${JSON.stringify(sessionId)}.`,
2235
- "Before answering each user request or using other tools, call lore_context with that sessionId and the full user message as prompt. This retrieves relevant shared knowledge and records durable teachings through Lore's normal capture pipeline.",
2253
+ capture
2254
+ ? "Before answering each user request or using other tools, call lore_context with that sessionId and the full user message as prompt. This retrieves relevant shared knowledge and records durable teachings through Lore's normal capture pipeline."
2255
+ : "Before answering each user request or using other tools, call lore_context with that sessionId and the full user message as prompt. This retrieves relevant shared knowledge; automatic capture is paused, so nothing is recorded.",
2236
2256
  "Use the returned context when relevant. If retrieval fails, report that limitation; do not invent shared knowledge.",
2237
- "After completing each response, call lore_complete with the same sessionId and a concise response summary so the next user correction retains the prior attempt. These Lore calls are available through MCP and require no shell commands.",
2257
+ ...(capture ? ["After completing each response, call lore_complete with the same sessionId and a concise response summary so the next user correction retains the prior attempt. These Lore calls are available through MCP and require no shell commands."] : ["These Lore calls are available through MCP and require no shell commands."]),
2238
2258
  ].join("\n") };
2239
2259
  }
2240
2260
  if (eventName === "Stop" || eventName === "AssistantResponse") {
2261
+ if (!capture) {
2262
+ // Retrieval-only mode or a paused switch: a capture hook left behind by
2263
+ // an older install still records nothing, and no turn from before the
2264
+ // switch is kept.
2265
+ await clearPending(agent, sessionId, options.home, config.connectionId);
2266
+ return undefined;
2267
+ }
2241
2268
  await savePending(input, agent, sessionId, now, options.home, config.connectionId);
2242
2269
  {
2243
2270
  const store = await runtimeStore(config, options.home);
@@ -2261,7 +2288,7 @@ export async function handleHookEvent(value, agent, options = {}) {
2261
2288
  }
2262
2289
  if (eventName === "PreToolUse") {
2263
2290
  try {
2264
- return await handleGuardEvent(input, agent, config, sessionId, options, now);
2291
+ return await handleGuardEvent(input, agent, config, sessionId, options, now, capture);
2265
2292
  }
2266
2293
  catch {
2267
2294
  const prior = await readGuardState(agent, sessionId, options.home, config.connectionId).catch(() => null);
@@ -2310,10 +2337,10 @@ export async function handleHookEvent(value, agent, options = {}) {
2310
2337
  // delivers the context; capture here retains native editor event identity.
2311
2338
  // Retrieve is skipped so the notice cooldown is not primed by a discarded
2312
2339
  // result: the MCP `lore_context` call surfaces the reliability notice.
2313
- await handlePromptEvent(input, agent, sessionId, config, options, now, true, false);
2340
+ await handlePromptEvent(input, agent, sessionId, config, options, now, capture, false);
2314
2341
  return { continue: true };
2315
2342
  }
2316
- return handlePromptEvent(input, agent, sessionId, config, options, now);
2343
+ return handlePromptEvent(input, agent, sessionId, config, options, now, capture);
2317
2344
  }
2318
2345
  function cursorSessionKey(sessionId) {
2319
2346
  return `cursor-session-${sha256(sessionId)}`;
@@ -2328,7 +2355,7 @@ async function cursorSession(sessionId, options) {
2328
2355
  const saved = connections.find(value => value.connectionId === binding.connectionId);
2329
2356
  if (!saved)
2330
2357
  throw new Error("This Cursor connection is no longer available. Start a new conversation.");
2331
- config = { ...saved, version: 2, agents: Array.isArray(saved.agents) ? saved.agents.filter(isCommandHookAgent) : [] };
2358
+ config = { ...saved, version: 2, agents: Array.isArray(saved.agents) ? saved.agents.filter(isCommandHookAgent) : [], capture: saved.capture !== "off" };
2332
2359
  }
2333
2360
  if (!config?.agents.includes("cursor"))
2334
2361
  throw new Error("Reconnect Cursor to Lore before requesting context.");
@@ -2342,21 +2369,24 @@ async function cursorSession(sessionId, options) {
2342
2369
  await clearRetrievalTask(store, { agent: "cursor", sessionId, connectionKey: credentialReliabilityWorkspaceKey(config) }).catch(() => undefined);
2343
2370
  throw new Error(`Lore is off: ${access.reason}.`);
2344
2371
  }
2345
- return { config, store, state, cwd: stringField(state.cwd) };
2372
+ // Same definition as the native hooks: local mode and the dashboard switches.
2373
+ const capture = config.capture && access.capturePausedBy === undefined;
2374
+ return { config, store, state, cwd: stringField(state.cwd), capture };
2346
2375
  }
2347
2376
  export async function getCursorContext(sessionId, prompt, options = {}) {
2348
- const { config, state, cwd } = await cursorSession(sessionId, options);
2377
+ const { config, state, cwd, capture } = await cursorSession(sessionId, options);
2349
2378
  const now = (options.now ?? (() => new Date()))();
2350
2379
  const result = await handlePromptEvent({ session_id: sessionId, cwd,
2351
2380
  prompt: stringField(state.prompt) ?? prompt,
2352
2381
  ...(stringField(state.promptId) ? { prompt_id: state.promptId } : {}),
2353
- }, "cursor", sessionId, config, options, now, stringField(state.prompt) === undefined);
2382
+ }, "cursor", sessionId, config, options, now, capture && stringField(state.prompt) === undefined);
2354
2383
  return result?.additional_context || "No relevant shared knowledge was found for this request.";
2355
2384
  }
2356
2385
  export async function completeCursorResponse(sessionId, response, options = {}) {
2357
- const { config, store, state, cwd } = await cursorSession(sessionId, options);
2386
+ const { config, store, state, cwd, capture } = await cursorSession(sessionId, options);
2358
2387
  const now = (options.now ?? (() => new Date()))();
2359
- await savePending({ cwd, last_assistant_message: response }, "cursor", sessionId, now, options.home, config.connectionId);
2388
+ if (capture)
2389
+ await savePending({ cwd, last_assistant_message: response }, "cursor", sessionId, now, options.home, config.connectionId);
2360
2390
  const { prompt: _prompt, promptId: _promptId, ...rest } = state;
2361
2391
  await store.writeState(cursorSessionKey(sessionId), { ...rest, updatedAt: now.toISOString() });
2362
2392
  }
@@ -2417,7 +2447,8 @@ async function handlePromptEvent(input, agent, sessionId, config, options, now,
2417
2447
  }
2418
2448
  const codexHome = (options.environment ?? process.env).CODEX_HOME ?? resolve(homeDirectory(options.home), ".codex");
2419
2449
  const claudeHome = (options.environment ?? process.env).CLAUDE_CONFIG_DIR ?? resolve(homeDirectory(options.home), ".claude");
2420
- await capturePendingImages(store, sessionId, codexHome, claudeHome).catch(() => undefined);
2450
+ if (capture)
2451
+ await capturePendingImages(store, sessionId, codexHome, claudeHome).catch(() => undefined);
2421
2452
  const contextSession = { agent, sessionId, cwd: stringField(input.cwd), transcriptPath: stringField(input.transcript_path), codexHome, claudeHome };
2422
2453
  const retainedContext = await retainedContextTexts(contextSession);
2423
2454
  const retained = retrieve ? await retainedReceiptIds(store, contextSession, retainedContext) : [];
@@ -2502,7 +2533,7 @@ async function handlePromptEvent(input, agent, sessionId, config, options, now,
2502
2533
  learningScope: request.learningScope,
2503
2534
  ...(request.diff === undefined ? {} : { diff: request.diff }),
2504
2535
  ...(request.files === undefined ? {} : { files: request.files }),
2505
- }, fetchImplementation, store, now, retained, retrievalFailures);
2536
+ }, fetchImplementation, store, now, retained, retrievalFailures, capture);
2506
2537
  }
2507
2538
  catch (error) {
2508
2539
  retrievalFailures.push({ reason: classifyRetrievalFailure(error), agent, path: "context" });
@@ -2565,7 +2596,7 @@ async function handlePromptEvent(input, agent, sessionId, config, options, now,
2565
2596
  }
2566
2597
  if (retrieve) {
2567
2598
  try {
2568
- delivery = await getPromptContextWithFallback(config, agent, sessionId, observation.eventId, task, gitContext, fetchImplementation, store, now, retained, retrievalFailures);
2599
+ delivery = await getPromptContextWithFallback(config, agent, sessionId, observation.eventId, task, gitContext, fetchImplementation, store, now, retained, retrievalFailures, capture);
2569
2600
  }
2570
2601
  catch (error) {
2571
2602
  retrievalFailures.push({ reason: classifyRetrievalFailure(error), agent, path: "context" });