@lore-co/cli 0.2.14 → 0.2.15
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 +78 -4
- package/dist/capture-scope.d.ts +12 -0
- package/dist/capture-scope.d.ts.map +1 -0
- package/dist/capture-scope.js +45 -0
- package/dist/capture-scope.js.map +1 -0
- package/dist/cli.d.ts +7 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +118 -36
- package/dist/cli.js.map +1 -1
- package/dist/command-help.d.ts +2 -1
- package/dist/command-help.d.ts.map +1 -1
- package/dist/command-help.js +4 -1
- package/dist/command-help.js.map +1 -1
- package/dist/connect-project.d.ts +15 -0
- package/dist/connect-project.d.ts.map +1 -0
- package/dist/connect-project.js +87 -0
- package/dist/connect-project.js.map +1 -0
- package/dist/connections.d.ts +3 -1
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +6 -1
- package/dist/connections.js.map +1 -1
- package/dist/devin-cli.d.ts.map +1 -1
- package/dist/devin-cli.js +14 -6
- package/dist/devin-cli.js.map +1 -1
- package/dist/devin.d.ts.map +1 -1
- package/dist/devin.js +5 -2
- package/dist/devin.js.map +1 -1
- package/dist/generated-assets.d.ts +5 -4
- package/dist/generated-assets.d.ts.map +1 -1
- package/dist/generated-assets.js +5 -4
- package/dist/generated-assets.js.map +1 -1
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +5 -5
- package/dist/host.js.map +1 -1
- package/dist/remember.d.ts.map +1 -1
- package/dist/remember.js +8 -1
- package/dist/remember.js.map +1 -1
- package/dist/retrieval-task.d.ts +20 -0
- package/dist/retrieval-task.d.ts.map +1 -0
- package/dist/retrieval-task.js +78 -0
- package/dist/retrieval-task.js.map +1 -0
- package/dist/runtime-redaction.d.ts +2 -0
- package/dist/runtime-redaction.d.ts.map +1 -0
- package/dist/runtime-redaction.js +69 -0
- package/dist/runtime-redaction.js.map +1 -0
- package/dist/runtime.d.ts +2 -2
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +45 -70
- package/dist/runtime.js.map +1 -1
- package/dist/self-host.d.ts +2 -1
- package/dist/self-host.d.ts.map +1 -1
- package/dist/self-host.js +4 -3
- package/dist/self-host.js.map +1 -1
- package/dist/signed-snapshot.d.ts.map +1 -1
- package/dist/signed-snapshot.js +2 -0
- package/dist/signed-snapshot.js.map +1 -1
- package/dist/skill-command.d.ts +20 -0
- package/dist/skill-command.d.ts.map +1 -0
- package/dist/skill-command.js +215 -0
- package/dist/skill-command.js.map +1 -0
- package/dist/skill-guidance.d.ts +2 -0
- package/dist/skill-guidance.d.ts.map +1 -0
- package/dist/skill-guidance.js +7 -0
- package/dist/skill-guidance.js.map +1 -0
- package/dist/skills.d.ts +16 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +126 -0
- package/dist/skills.js.map +1 -0
- package/dist/update.js +3 -3
- package/package.json +7 -3
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
const NON_SECRET_TOKEN_VALUES = new Set([
|
|
2
|
+
"available",
|
|
3
|
+
"configured",
|
|
4
|
+
"generated",
|
|
5
|
+
"optional",
|
|
6
|
+
"placeholder",
|
|
7
|
+
"redacted",
|
|
8
|
+
"required",
|
|
9
|
+
"undefined",
|
|
10
|
+
]);
|
|
11
|
+
function redactedCredential(value) {
|
|
12
|
+
// Preserve markers from earlier token rules and repeated redaction passes.
|
|
13
|
+
if (/^\[REDACTED(?::[A-Z_]+|_[A-Z_]+)?\][.,!?]*$/u.test(value)) {
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
const trailing = /[.,!?]+$/u.exec(value)?.[0] ?? "";
|
|
17
|
+
return `[REDACTED:CREDENTIAL]${trailing}`;
|
|
18
|
+
}
|
|
19
|
+
// This standalone runtime cannot import @lore-co/core after it is copied to
|
|
20
|
+
// ~/.lore. Keep these rules aligned with core/redaction.ts through parity tests.
|
|
21
|
+
// Match invisible characters inside tokens without changing ordinary text;
|
|
22
|
+
// real whitespace still separates token bodies and adjacent lines.
|
|
23
|
+
const TOKEN_GAP = "(?:\\p{Cf}|(?!\\s)\\p{Cc})*";
|
|
24
|
+
const tokenPrefix = (prefix) => Array.from(prefix, (character) => character.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&")).join(TOKEN_GAP);
|
|
25
|
+
const tokenBody = (characters, minimum, maximum) => `${characters}(?:${TOKEN_GAP}${characters}){${minimum - 1},${maximum === undefined ? "" : maximum - 1}}`;
|
|
26
|
+
const providerToken = (prefix, characters, minimum, maximum) => tokenPrefix(prefix) + TOKEN_GAP + tokenBody(characters, minimum, maximum);
|
|
27
|
+
const AUTHORIZATION_TOKEN_PATTERN = new RegExp([
|
|
28
|
+
`\\b(${tokenPrefix("Bearer")}|${tokenPrefix("Basic")})`,
|
|
29
|
+
"[\\s\\p{Cc}\\p{Cf}]+",
|
|
30
|
+
tokenBody(/[A-Za-z0-9._~+\/=-]/u.source, 8),
|
|
31
|
+
].join(""), "giu");
|
|
32
|
+
const JWT_TOKEN_PATTERN = new RegExp(`\\b${tokenPrefix("eyJ")}${TOKEN_GAP}${tokenBody("[A-Za-z0-9_-]", 8)}(?:${TOKEN_GAP}\\.${TOKEN_GAP}${tokenBody("[A-Za-z0-9_-]", 8)}){2}\\b`, "gu");
|
|
33
|
+
const PROVIDER_TOKEN_PATTERN = new RegExp(`\\b(?:${[
|
|
34
|
+
...["sk-", "glpat-", "npm_", "pypi-"].map((prefix) => providerToken(prefix, "[A-Za-z0-9_-]", 16)),
|
|
35
|
+
...["sk_live_", "sk_test_", "rk_live_", "rk_test_", "whsec_"].map((prefix) => providerToken(prefix, "[A-Za-z0-9]", 16)),
|
|
36
|
+
...["ghp_", "gho_", "ghu_", "ghs_", "ghr_", "github_pat_"].map((prefix) => providerToken(prefix, "[A-Za-z0-9_]", 20)),
|
|
37
|
+
...["xoxb-", "xoxa-", "xoxp-", "xoxr-", "xoxs-"].map((prefix) => providerToken(prefix, "[A-Za-z0-9-]", 10)),
|
|
38
|
+
providerToken("AIza", "[A-Za-z0-9_-]", 20),
|
|
39
|
+
providerToken("AKIA", "[0-9A-Z]", 16, 16),
|
|
40
|
+
].join("|")})\\b`, "gu");
|
|
41
|
+
export function redactSecrets(text) {
|
|
42
|
+
return text
|
|
43
|
+
.replace(/-----BEGIN (?:RSA |EC |OPENSSH |DSA |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |DSA |ENCRYPTED )?PRIVATE KEY-----/gu, "[REDACTED:PRIVATE_KEY]")
|
|
44
|
+
.replace(AUTHORIZATION_TOKEN_PATTERN, (_match, scheme) => `${scheme.replace(/[\p{Cc}\p{Cf}]/gu, "")} [REDACTED:AUTHORIZATION]`)
|
|
45
|
+
.replace(/\b((?:postgres(?:ql)?|mysql|mariadb|mongodb(?:\+srv)?|redis|amqps?):\/\/[^:\s/@]+:)[^@\s/]+@/giu, (_match, prefix) => `${prefix}[REDACTED:PASSWORD]@`)
|
|
46
|
+
.replace(JWT_TOKEN_PATTERN, "[REDACTED:JWT]")
|
|
47
|
+
.replace(PROVIDER_TOKEN_PATTERN, "[REDACTED:API_KEY]")
|
|
48
|
+
.replace(/(["']?)\b((?:(?:[A-Za-z][A-Za-z0-9]*[_-])*(?:api[_-]?key|access[_-]?token|auth[_-]?token|client[_-]?secret|private[_-]?key|connection[_-]?(?:string|url)|database[_-]?url|token|secret|password|passwd|credential)|[A-Za-z][A-Za-z0-9]*(?:token|secret|password|passwd|credential|apiKey|privateKey|connectionString|databaseUrl)))\b\1(\s*[:=]\s*)(["']?)([^\s,"'};]{4,})\4/giu, (_match, keyQuote, name, separator, valueQuote, value) => `${keyQuote}${name}${keyQuote}${separator}${valueQuote}${redactedCredential(value)}${valueQuote}`)
|
|
49
|
+
.replace(/(["']?)\b(api[ _-]?key|access[ _-]?token|auth[ _-]?token|client[ _-]?secret|private[ _-]?key|verification[ _-]?token|password|passwd|secret|credential)\b\1(\s+(?:is|was|equals?)\s+)(["']?)([^\s,"'};]{4,})\4/giu, (_match, keyQuote, name, separator, valueQuote, value) => `${keyQuote}${name}${keyQuote}${separator}${valueQuote}${redactedCredential(value)}${valueQuote}`)
|
|
50
|
+
.replace(/\b(token|credential)\b(\s+(?:is|was|equals?)\s+)(["']?)([^\s,"'};]{8,})\3/giu, (match, name, separator, valueQuote, value) => {
|
|
51
|
+
const normalized = value
|
|
52
|
+
.replace(/^["']|["']$/gu, "")
|
|
53
|
+
.replace(/[.,!?]+$/gu, "");
|
|
54
|
+
const knownPlaceholder = NON_SECRET_TOKEN_VALUES.has(normalized.toLowerCase());
|
|
55
|
+
const classes = [
|
|
56
|
+
/[a-z]/u,
|
|
57
|
+
/[A-Z]/u,
|
|
58
|
+
/[0-9]/u,
|
|
59
|
+
/[^A-Za-z0-9]/u,
|
|
60
|
+
].filter((pattern) => pattern.test(normalized)).length;
|
|
61
|
+
return !knownPlaceholder &&
|
|
62
|
+
(normalized.length >= 16 ||
|
|
63
|
+
(normalized.length >= 10 && classes >= 2))
|
|
64
|
+
? `${name}${separator}${valueQuote}${redactedCredential(value)}${valueQuote}`
|
|
65
|
+
: match;
|
|
66
|
+
})
|
|
67
|
+
.replace(/\b((?:set-)?cookie\s*:\s*)[^\r\n]+/giu, (_match, prefix) => `${prefix}[REDACTED:AUTHORIZATION]`);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=runtime-redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-redaction.js","sourceRoot":"","sources":["../src/runtime-redaction.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { redactSecrets } from "./runtime-redaction.js";
|
|
1
2
|
export declare const COMMAND_HOOK_AGENT_NAMES: readonly ["codex", "claude", "copilot-cli", "copilot-vscode", "cursor", "polytoken"];
|
|
2
3
|
export type CommandHookAgentName = (typeof COMMAND_HOOK_AGENT_NAMES)[number];
|
|
3
4
|
/** @deprecated Use CommandHookAgentName for native command-hook integrations. */
|
|
@@ -17,6 +18,7 @@ export interface TurnRequest {
|
|
|
17
18
|
agent: CommandHookAgentName;
|
|
18
19
|
sessionId: string;
|
|
19
20
|
retainedReceiptIds?: string[];
|
|
21
|
+
task?: string;
|
|
20
22
|
previousAssistant: {
|
|
21
23
|
content: string;
|
|
22
24
|
id?: string;
|
|
@@ -115,7 +117,6 @@ export interface LineageMetadata {
|
|
|
115
117
|
* be attributed to the machine that produced them.
|
|
116
118
|
*/
|
|
117
119
|
export declare function readLineageMetadata(home?: string, environment?: NodeJS.ProcessEnv): Promise<LineageMetadata>;
|
|
118
|
-
export declare function redactSecrets(text: string): string;
|
|
119
120
|
export declare function createTurnRequest(input: HookInput, agent: CommandHookAgentName, pending: PendingAssistantMessage, now: Date, lineage?: LineageMetadata): Promise<TurnRequest | null>;
|
|
120
121
|
interface GuardTrigger {
|
|
121
122
|
action: "edit" | "commit" | "deploy" | "command";
|
|
@@ -133,5 +134,4 @@ export declare function handleHookEvent(value: unknown, agent: CommandHookAgentN
|
|
|
133
134
|
export declare function getCursorContext(sessionId: string, prompt: string, options?: HookRuntimeOptions): Promise<string>;
|
|
134
135
|
export declare function completeCursorResponse(sessionId: string, response: string, options?: HookRuntimeOptions): Promise<void>;
|
|
135
136
|
export declare function runHook(args?: readonly string[]): Promise<void>;
|
|
136
|
-
export {};
|
|
137
137
|
//# sourceMappingURL=runtime.d.ts.map
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
import { redactSecrets } from "./runtime-redaction.js";
|
|
2
|
+
export { redactSecrets } from "./runtime-redaction.js";
|
|
1
3
|
import { createHash, randomUUID } from "node:crypto";
|
|
2
4
|
import { approachGuidance } from "./approach-guidance.js";
|
|
5
|
+
import { skillGuidance } from "./skill-guidance.js";
|
|
3
6
|
import { retainedContextTexts, retainedReceiptIds, rememberDeliveredContext } from "./retained-context.js";
|
|
7
|
+
import { clearRetrievalTask, resolveRetrievalTask } from "./retrieval-task.js";
|
|
4
8
|
import { access, chmod, mkdir, readFile, stat, } from "node:fs/promises";
|
|
5
9
|
import { constants as fsConstants, realpathSync } from "node:fs";
|
|
6
10
|
import { execFile as execFileCallback } from "node:child_process";
|
|
@@ -8,7 +12,7 @@ import { dirname, parse, relative, resolve } from "node:path";
|
|
|
8
12
|
import { homedir } from "node:os";
|
|
9
13
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
10
14
|
import { promisify } from "node:util";
|
|
11
|
-
import { boundedUtf8Text, repositoryScopeFromGitRoot, } from "./repository.js";
|
|
15
|
+
import { boundedUtf8Text, defaultGitPushBranches, repositoryScopeFromGitRoot, } from "./repository.js";
|
|
12
16
|
import { ReliabilityStore, ReliabilityStoreError, atomicWriteJson as durableAtomicWriteJson, classifyRetryFailure, createIntegrationInvocationAttempt, durableUnlink, recordLocalGuardMetric, recordLocalRetrievalMetric, } from "./reliability-store.js";
|
|
13
17
|
import { writeInvocationAttemptBounded, writeInvocationCompletionBounded, } from "./invocation-health-writer.js";
|
|
14
18
|
import { SignedSnapshotError, verifySignedSnapshot, } from "./signed-snapshot.js";
|
|
@@ -58,24 +62,6 @@ const RELIABILITY_REASON_CODES = new Set([
|
|
|
58
62
|
"invalid_response",
|
|
59
63
|
"integration_unsupported",
|
|
60
64
|
]);
|
|
61
|
-
const NON_SECRET_TOKEN_VALUES = new Set([
|
|
62
|
-
"available",
|
|
63
|
-
"configured",
|
|
64
|
-
"generated",
|
|
65
|
-
"optional",
|
|
66
|
-
"placeholder",
|
|
67
|
-
"redacted",
|
|
68
|
-
"required",
|
|
69
|
-
"undefined",
|
|
70
|
-
]);
|
|
71
|
-
function redactedCredential(value) {
|
|
72
|
-
// Preserve markers from earlier token rules and repeated redaction passes.
|
|
73
|
-
if (/^\[REDACTED(?::[A-Z_]+|_[A-Z_]+)?\][.,!?]*$/u.test(value)) {
|
|
74
|
-
return value;
|
|
75
|
-
}
|
|
76
|
-
const trailing = /[.,!?]+$/u.exec(value)?.[0] ?? "";
|
|
77
|
-
return `[REDACTED:CREDENTIAL]${trailing}`;
|
|
78
|
-
}
|
|
79
65
|
const execFile = promisify(execFileCallback);
|
|
80
66
|
function homeDirectory(override) {
|
|
81
67
|
return override ?? process.env.LORE_HOME ?? process.env.HOME ?? homedir();
|
|
@@ -339,52 +325,6 @@ function deterministicUuid(value) {
|
|
|
339
325
|
joined.slice(20, 32),
|
|
340
326
|
].join("-");
|
|
341
327
|
}
|
|
342
|
-
// This standalone runtime cannot import @lore-co/core after it is copied to
|
|
343
|
-
// ~/.lore. Keep these rules aligned with core/redaction.ts through parity tests.
|
|
344
|
-
// Match invisible characters inside tokens without changing ordinary text;
|
|
345
|
-
// real whitespace still separates token bodies and adjacent lines.
|
|
346
|
-
const TOKEN_GAP = "(?:\\p{Cf}|(?!\\s)\\p{Cc})*";
|
|
347
|
-
const tokenPrefix = (prefix) => Array.from(prefix, (character) => character.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&")).join(TOKEN_GAP);
|
|
348
|
-
const tokenBody = (characters, minimum, maximum) => `${characters}(?:${TOKEN_GAP}${characters}){${minimum - 1},${maximum === undefined ? "" : maximum - 1}}`;
|
|
349
|
-
const providerToken = (prefix, characters, minimum, maximum) => tokenPrefix(prefix) + TOKEN_GAP + tokenBody(characters, minimum, maximum);
|
|
350
|
-
const AUTHORIZATION_TOKEN_PATTERN = new RegExp(`\\b(${tokenPrefix("Bearer")}|${tokenPrefix("Basic")})[\\s\\p{Cc}\\p{Cf}]+${tokenBody("[A-Za-z0-9._~+/=-]", 8)}`, "giu");
|
|
351
|
-
const JWT_TOKEN_PATTERN = new RegExp(`\\b${tokenPrefix("eyJ")}${TOKEN_GAP}${tokenBody("[A-Za-z0-9_-]", 8)}(?:${TOKEN_GAP}\\.${TOKEN_GAP}${tokenBody("[A-Za-z0-9_-]", 8)}){2}\\b`, "gu");
|
|
352
|
-
const PROVIDER_TOKEN_PATTERN = new RegExp(`\\b(?:${[
|
|
353
|
-
...["sk-", "glpat-", "npm_", "pypi-"].map((prefix) => providerToken(prefix, "[A-Za-z0-9_-]", 16)),
|
|
354
|
-
...["sk_live_", "sk_test_", "rk_live_", "rk_test_", "whsec_"].map((prefix) => providerToken(prefix, "[A-Za-z0-9]", 16)),
|
|
355
|
-
...["ghp_", "gho_", "ghu_", "ghs_", "ghr_", "github_pat_"].map((prefix) => providerToken(prefix, "[A-Za-z0-9_]", 20)),
|
|
356
|
-
...["xoxb-", "xoxa-", "xoxp-", "xoxr-", "xoxs-"].map((prefix) => providerToken(prefix, "[A-Za-z0-9-]", 10)),
|
|
357
|
-
providerToken("AIza", "[A-Za-z0-9_-]", 20),
|
|
358
|
-
providerToken("AKIA", "[0-9A-Z]", 16, 16),
|
|
359
|
-
].join("|")})\\b`, "gu");
|
|
360
|
-
export function redactSecrets(text) {
|
|
361
|
-
return text
|
|
362
|
-
.replace(/-----BEGIN (?:RSA |EC |OPENSSH |DSA |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |DSA |ENCRYPTED )?PRIVATE KEY-----/gu, "[REDACTED:PRIVATE_KEY]")
|
|
363
|
-
.replace(AUTHORIZATION_TOKEN_PATTERN, (_match, scheme) => `${scheme.replace(/[\p{Cc}\p{Cf}]/gu, "")} [REDACTED:AUTHORIZATION]`)
|
|
364
|
-
.replace(/\b((?:postgres(?:ql)?|mysql|mariadb|mongodb(?:\+srv)?|redis|amqps?):\/\/[^:\s/@]+:)[^@\s/]+@/giu, (_match, prefix) => `${prefix}[REDACTED:PASSWORD]@`)
|
|
365
|
-
.replace(JWT_TOKEN_PATTERN, "[REDACTED:JWT]")
|
|
366
|
-
.replace(PROVIDER_TOKEN_PATTERN, "[REDACTED:API_KEY]")
|
|
367
|
-
.replace(/(["']?)\b((?:(?:[A-Za-z][A-Za-z0-9]*[_-])*(?:api[_-]?key|access[_-]?token|auth[_-]?token|client[_-]?secret|private[_-]?key|connection[_-]?(?:string|url)|database[_-]?url|token|secret|password|passwd|credential)|[A-Za-z][A-Za-z0-9]*(?:token|secret|password|passwd|credential|apiKey|privateKey|connectionString|databaseUrl)))\b\1(\s*[:=]\s*)(["']?)([^\s,"'};]{4,})\4/giu, (_match, keyQuote, name, separator, valueQuote, value) => `${keyQuote}${name}${keyQuote}${separator}${valueQuote}${redactedCredential(value)}${valueQuote}`)
|
|
368
|
-
.replace(/(["']?)\b(api[ _-]?key|access[ _-]?token|auth[ _-]?token|client[ _-]?secret|private[ _-]?key|verification[ _-]?token|password|passwd|secret|credential)\b\1(\s+(?:is|was|equals?)\s+)(["']?)([^\s,"'};]{4,})\4/giu, (_match, keyQuote, name, separator, valueQuote, value) => `${keyQuote}${name}${keyQuote}${separator}${valueQuote}${redactedCredential(value)}${valueQuote}`)
|
|
369
|
-
.replace(/\b(token|credential)\b(\s+(?:is|was|equals?)\s+)(["']?)([^\s,"'};]{8,})\3/giu, (match, name, separator, valueQuote, value) => {
|
|
370
|
-
const normalized = value
|
|
371
|
-
.replace(/^["']|["']$/gu, "")
|
|
372
|
-
.replace(/[.,!?]+$/gu, "");
|
|
373
|
-
const knownPlaceholder = NON_SECRET_TOKEN_VALUES.has(normalized.toLowerCase());
|
|
374
|
-
const classes = [
|
|
375
|
-
/[a-z]/u,
|
|
376
|
-
/[A-Z]/u,
|
|
377
|
-
/[0-9]/u,
|
|
378
|
-
/[^A-Za-z0-9]/u,
|
|
379
|
-
].filter((pattern) => pattern.test(normalized)).length;
|
|
380
|
-
return !knownPlaceholder &&
|
|
381
|
-
(normalized.length >= 16 ||
|
|
382
|
-
(normalized.length >= 10 && classes >= 2))
|
|
383
|
-
? `${name}${separator}${valueQuote}${redactedCredential(value)}${valueQuote}`
|
|
384
|
-
: match;
|
|
385
|
-
})
|
|
386
|
-
.replace(/\b((?:set-)?cookie\s*:\s*)[^\r\n]+/giu, (_match, prefix) => `${prefix}[REDACTED:AUTHORIZATION]`);
|
|
387
|
-
}
|
|
388
328
|
async function atomicWriteJson(path, value) {
|
|
389
329
|
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
390
330
|
await chmod(dirname(path), 0o700);
|
|
@@ -839,6 +779,10 @@ function deliveryFromResponse(value) {
|
|
|
839
779
|
: memorySummaries(value.memories);
|
|
840
780
|
return {
|
|
841
781
|
context: boundedContext(context),
|
|
782
|
+
...(typeof value.relatedContext === "string" ? { relatedContext: redactSecrets(value.relatedContext).slice(0, 2_500) }
|
|
783
|
+
: isObject(value.context) && typeof value.context.relatedContext === "string" ? { relatedContext: redactSecrets(value.context.relatedContext).slice(0, 2_500) } : {}),
|
|
784
|
+
...(typeof value.skillContext === "string" && value.skillContext.length <= 72_000 ? { skillContext: redactSecrets(value.skillContext) }
|
|
785
|
+
: isObject(value.context) && typeof value.context.skillContext === "string" && value.context.skillContext.length <= 72_000 ? { skillContext: redactSecrets(value.context.skillContext) } : {}),
|
|
842
786
|
completeContext: context.length <= MAX_CONTEXT_CHARS,
|
|
843
787
|
...(receiptId === undefined ? {} : { receiptId }),
|
|
844
788
|
learned,
|
|
@@ -891,6 +835,8 @@ function deliveryFromSignedContext(payload, expectedRequest) {
|
|
|
891
835
|
}
|
|
892
836
|
return deliveryFromResponse({
|
|
893
837
|
context: payload.context,
|
|
838
|
+
relatedContext: payload.relatedContext,
|
|
839
|
+
skillContext: payload.skillContext,
|
|
894
840
|
receipt: { id: payload.receiptId },
|
|
895
841
|
memories: payload.memories,
|
|
896
842
|
hits: payload.hits,
|
|
@@ -1137,6 +1083,8 @@ async function postTurn(config, request, fetchImplementation, store) {
|
|
|
1137
1083
|
const response = await fetchImplementation(turnsUrl(config.apiUrl), {
|
|
1138
1084
|
method: "POST",
|
|
1139
1085
|
headers: {
|
|
1086
|
+
"x-lore-context": "related-work-v1",
|
|
1087
|
+
"x-lore-skills": "skills-v1",
|
|
1140
1088
|
accept: runtimeAccept(config),
|
|
1141
1089
|
authorization: `Bearer ${config.token}`,
|
|
1142
1090
|
"content-type": "application/json",
|
|
@@ -1202,7 +1150,7 @@ async function postTurn(config, request, fetchImplementation, store) {
|
|
|
1202
1150
|
task: {
|
|
1203
1151
|
agent: request.agent,
|
|
1204
1152
|
...(request.scope === undefined ? {} : { scope: request.scope }),
|
|
1205
|
-
task: request.currentUser.content.trim(),
|
|
1153
|
+
task: request.task ?? request.currentUser.content.trim(),
|
|
1206
1154
|
},
|
|
1207
1155
|
});
|
|
1208
1156
|
await store
|
|
@@ -1284,6 +1232,8 @@ async function getPromptContext(config, agent, sessionId, sourceEventId, prompt,
|
|
|
1284
1232
|
const response = await fetchImplementation(contextDeliveriesUrl(config.apiUrl), {
|
|
1285
1233
|
method: "POST",
|
|
1286
1234
|
headers: {
|
|
1235
|
+
"x-lore-context": "related-work-v1",
|
|
1236
|
+
"x-lore-skills": "skills-v1",
|
|
1287
1237
|
accept: runtimeAccept(config),
|
|
1288
1238
|
authorization: `Bearer ${config.token}`,
|
|
1289
1239
|
"content-type": "application/json",
|
|
@@ -1414,6 +1364,7 @@ async function getCachedPromptContext(config, prompt, gitContext, store, now, re
|
|
|
1414
1364
|
}
|
|
1415
1365
|
return {
|
|
1416
1366
|
context: retained.includes(String(selected.payload.receiptId)) ? "" : selected.context,
|
|
1367
|
+
skillContext: "Lore is using saved learning context. Enabled skills could not be checked and saved skill instructions have not been reapplied. Reconnect to Lore before relying on skills for this task.",
|
|
1417
1368
|
learned: [],
|
|
1418
1369
|
delivered: [],
|
|
1419
1370
|
reliability: {
|
|
@@ -1904,6 +1855,7 @@ async function offlineGuard(config, store, request, now, previouslyEnforced, all
|
|
|
1904
1855
|
...(typeof request.repo === "string" ? { repo: request.repo } : {}),
|
|
1905
1856
|
...(typeof request.path === "string" ? { path: request.path } : {}),
|
|
1906
1857
|
...(typeof request.command === "string" ? { command: request.command } : {}),
|
|
1858
|
+
...(Array.isArray(request.defaultPushBranches) ? { defaultPushBranches: request.defaultPushBranches.filter((branch) => typeof branch === "string") } : {}),
|
|
1907
1859
|
...(Array.isArray(request.files) ? { files: request.files.filter((file) => typeof file === "string") } : {}),
|
|
1908
1860
|
}) !== null) : [];
|
|
1909
1861
|
return {
|
|
@@ -1976,6 +1928,12 @@ async function handleGuardEvent(input, agent, config, sessionId, options, now) {
|
|
|
1976
1928
|
const startedAt = Date.now();
|
|
1977
1929
|
let result;
|
|
1978
1930
|
const guardRequest = {
|
|
1931
|
+
...await (async () => {
|
|
1932
|
+
const args = isObject(input.tool_input) ? input.tool_input : {};
|
|
1933
|
+
const changesContext = ["cwd", "workdir", "working_directory", "env", "environment"].some(key => args[key] !== undefined);
|
|
1934
|
+
const defaultPushBranches = changesContext ? undefined : await defaultGitPushBranches(trigger.command, cwd);
|
|
1935
|
+
return defaultPushBranches ? { defaultPushBranches } : {};
|
|
1936
|
+
})(),
|
|
1979
1937
|
connector: "lore-cli",
|
|
1980
1938
|
agent,
|
|
1981
1939
|
sessionId,
|
|
@@ -2103,6 +2061,9 @@ export async function handleHookEvent(value, agent, options = {}) {
|
|
|
2103
2061
|
const access = await checkLoreAccess(stringField(input.cwd), options.home, config, options.fetch ?? globalThis.fetch);
|
|
2104
2062
|
if (!access.allowed) {
|
|
2105
2063
|
await clearPending(agent, sessionId, options.home, config.connectionId);
|
|
2064
|
+
await runtimeStore(config, options.home).then(store => clearRetrievalTask(store, {
|
|
2065
|
+
agent, sessionId, connectionKey: credentialReliabilityWorkspaceKey(config),
|
|
2066
|
+
})).catch(() => undefined);
|
|
2106
2067
|
// A policy outage must not silently bypass an already enforced Guard.
|
|
2107
2068
|
if (eventName === "PreToolUse" && access.reason === "Workspace repository settings are unavailable") {
|
|
2108
2069
|
const prior = await readGuardState(agent, sessionId, options.home, config.connectionId).catch(() => null);
|
|
@@ -2239,8 +2200,10 @@ async function cursorSession(sessionId, options) {
|
|
|
2239
2200
|
throw new Error("Start a new Cursor conversation to register this Lore session.");
|
|
2240
2201
|
}
|
|
2241
2202
|
const access = await checkLoreAccess(stringField(state.cwd), options.home, config, options.fetch ?? globalThis.fetch);
|
|
2242
|
-
if (!access.allowed)
|
|
2203
|
+
if (!access.allowed) {
|
|
2204
|
+
await clearRetrievalTask(store, { agent: "cursor", sessionId, connectionKey: credentialReliabilityWorkspaceKey(config) }).catch(() => undefined);
|
|
2243
2205
|
throw new Error(`Lore is off: ${access.reason}.`);
|
|
2206
|
+
}
|
|
2244
2207
|
return { config, store, state, cwd: stringField(state.cwd) };
|
|
2245
2208
|
}
|
|
2246
2209
|
export async function getCursorContext(sessionId, prompt, options = {}) {
|
|
@@ -2327,12 +2290,20 @@ async function handlePromptEvent(input, agent, sessionId, config, options, now,
|
|
|
2327
2290
|
};
|
|
2328
2291
|
const lineage = await readLineageMetadata(options.home, options.environment ?? process.env);
|
|
2329
2292
|
let delivery = emptyDelivery();
|
|
2293
|
+
const retrievalTask = (repo) => resolveRetrievalTask(store, {
|
|
2294
|
+
agent, sessionId, connectionKey: credentialReliabilityWorkspaceKey(config),
|
|
2295
|
+
cwd: stringField(input.cwd), repo,
|
|
2296
|
+
}, prompt, now, pending?.cwd === stringField(input.cwd) && pending
|
|
2297
|
+
? { content: pending.assistantMessage, capturedAt: pending.capturedAt } : undefined);
|
|
2330
2298
|
if (pending !== null) {
|
|
2331
2299
|
let receivedTurnContext = false;
|
|
2332
2300
|
const request = await createTurnRequest(input, agent, pending, now, lineage);
|
|
2333
2301
|
if (request === null) {
|
|
2334
2302
|
return undefined;
|
|
2335
2303
|
}
|
|
2304
|
+
const task = await retrievalTask(request.scope?.repo);
|
|
2305
|
+
if (task !== request.currentUser.content.trim())
|
|
2306
|
+
request.task = task;
|
|
2336
2307
|
if (retained.length)
|
|
2337
2308
|
request.retainedReceiptIds = retained;
|
|
2338
2309
|
let enqueued = false;
|
|
@@ -2370,7 +2341,7 @@ async function handlePromptEvent(input, agent, sessionId, config, options, now,
|
|
|
2370
2341
|
}
|
|
2371
2342
|
if (retrieve && !receivedTurnContext) {
|
|
2372
2343
|
try {
|
|
2373
|
-
delivery = await getPromptContextWithFallback(config, agent, sessionId, request.eventId,
|
|
2344
|
+
delivery = await getPromptContextWithFallback(config, agent, sessionId, request.eventId, task, {
|
|
2374
2345
|
...(request.scope === undefined ? {} : { scope: request.scope }),
|
|
2375
2346
|
learningScope: request.learningScope,
|
|
2376
2347
|
...(request.diff === undefined ? {} : { diff: request.diff }),
|
|
@@ -2399,6 +2370,7 @@ async function handlePromptEvent(input, agent, sessionId, config, options, now,
|
|
|
2399
2370
|
}
|
|
2400
2371
|
else {
|
|
2401
2372
|
const gitContext = await collectGitContext(stringField(input.cwd));
|
|
2373
|
+
const task = await retrievalTask(gitContext.scope?.repo);
|
|
2402
2374
|
const observation = createPromptObservationRequest(input, agent, sessionId, now, gitContext, lineage);
|
|
2403
2375
|
if (observation === null) {
|
|
2404
2376
|
return undefined;
|
|
@@ -2432,7 +2404,7 @@ async function handlePromptEvent(input, agent, sessionId, config, options, now,
|
|
|
2432
2404
|
}
|
|
2433
2405
|
if (retrieve) {
|
|
2434
2406
|
try {
|
|
2435
|
-
delivery = await getPromptContextWithFallback(config, agent, sessionId, observation.eventId,
|
|
2407
|
+
delivery = await getPromptContextWithFallback(config, agent, sessionId, observation.eventId, task, gitContext, fetchImplementation, store, now, retained);
|
|
2436
2408
|
}
|
|
2437
2409
|
catch {
|
|
2438
2410
|
delivery = {
|
|
@@ -2480,7 +2452,10 @@ async function handlePromptEvent(input, agent, sessionId, config, options, now,
|
|
|
2480
2452
|
const receipt = receiptMessage(config, agent, delivery);
|
|
2481
2453
|
if (retrieve && delivery.completeContext)
|
|
2482
2454
|
await rememberDeliveredContext(store, contextSession, delivery).catch(() => undefined);
|
|
2483
|
-
const
|
|
2455
|
+
const relatedContext = delivery.relatedContext && !retainedContext.some(text => text.includes(delivery.relatedContext))
|
|
2456
|
+
? delivery.relatedContext : undefined;
|
|
2457
|
+
// Skills are fresh on every turn, even when learning context is retained.
|
|
2458
|
+
const taskContext = [delivery.skillContext, delivery.context, relatedContext, delivery.reliability?.status === "failed" ? undefined : approachGuidance(prompt, agent, redactSecrets(sessionId), retainedContext), delivery.skillContext === undefined && delivery.reliability?.status !== "failed" ? skillGuidance(retainedContext) : undefined].filter(Boolean).join("\n\n");
|
|
2484
2459
|
const systemMessage = agent === "cursor" || agent === "polytoken"
|
|
2485
2460
|
? undefined
|
|
2486
2461
|
: [receipt, reliabilityNotice].filter(Boolean).join(" · ") || undefined;
|