@lore-co/cli 0.2.19 → 0.2.21
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 +18 -2
- package/dist/api.d.ts +4 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +11 -3
- package/dist/api.js.map +1 -1
- package/dist/approach-guidance.d.ts.map +1 -1
- package/dist/approach-guidance.js +2 -1
- package/dist/approach-guidance.js.map +1 -1
- package/dist/approach.d.ts +1 -1
- package/dist/approach.d.ts.map +1 -1
- package/dist/approach.js +12 -4
- package/dist/approach.js.map +1 -1
- package/dist/ask.d.ts +9 -1
- package/dist/ask.d.ts.map +1 -1
- package/dist/ask.js +32 -3
- package/dist/ask.js.map +1 -1
- package/dist/cli.d.ts +36 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +225 -48
- package/dist/cli.js.map +1 -1
- package/dist/command-help.d.ts +3 -1
- package/dist/command-help.d.ts.map +1 -1
- package/dist/command-help.js +13 -1
- package/dist/command-help.js.map +1 -1
- package/dist/devin-cli.js +2 -2
- package/dist/devin-cli.js.map +1 -1
- package/dist/embeddings.d.ts +12 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +105 -0
- package/dist/embeddings.js.map +1 -0
- 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/github.d.ts.map +1 -1
- package/dist/github.js +242 -4
- package/dist/github.js.map +1 -1
- package/dist/guard.d.ts.map +1 -1
- package/dist/guard.js +4 -6
- package/dist/guard.js.map +1 -1
- package/dist/handoff.js +2 -2
- package/dist/handoff.js.map +1 -1
- package/dist/learnings.d.ts +31 -0
- package/dist/learnings.d.ts.map +1 -0
- package/dist/learnings.js +265 -0
- package/dist/learnings.js.map +1 -0
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +96 -11
- package/dist/live.js.map +1 -1
- package/dist/platform.d.ts +7 -0
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +25 -1
- package/dist/platform.js.map +1 -1
- package/dist/recovery-state.js +1 -1
- package/dist/recovery-state.js.map +1 -1
- package/dist/reliability-store.d.ts +31 -0
- package/dist/reliability-store.d.ts.map +1 -1
- package/dist/reliability-store.js +89 -0
- package/dist/reliability-store.js.map +1 -1
- package/dist/retrieval-task.d.ts.map +1 -1
- package/dist/retrieval-task.js +2 -11
- package/dist/retrieval-task.js.map +1 -1
- package/dist/runtime.d.ts +13 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +124 -33
- package/dist/runtime.js.map +1 -1
- package/dist/self-host.d.ts +2 -2
- 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/skill-guidance.js +1 -1
- package/dist/skill-guidance.js.map +1 -1
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +24 -4
- package/dist/skills.js.map +1 -1
- package/dist/uninstall.d.ts.map +1 -1
- package/dist/uninstall.js +4 -3
- package/dist/uninstall.js.map +1 -1
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +4 -23
- package/dist/update.js.map +1 -1
- package/package.json +3 -3
package/dist/guard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,mBAAmB,EACnB,0BAA0B,GAG3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAwB,MAAM,UAAU,CAAC;AACzE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"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"}
|
package/dist/handoff.js
CHANGED
|
@@ -4,7 +4,7 @@ import { promisify } from "node:util";
|
|
|
4
4
|
import { HandoffResponseSchema } from "@lore-co/core";
|
|
5
5
|
import { loreApiRequest } from "./api.js";
|
|
6
6
|
import { ensureMachineRegistered } from "./machine.js";
|
|
7
|
-
import {
|
|
7
|
+
import { repositoryRemoteScope } from "./repository.js";
|
|
8
8
|
import { hostLiveRuntime } from "./live.js";
|
|
9
9
|
import { recoveryFallback } from "./recovery.js";
|
|
10
10
|
import { findAgentExecutable, isLaunchable, launchArguments } from "./agents.js";
|
|
@@ -106,7 +106,7 @@ async function detectRepoScope() {
|
|
|
106
106
|
if (root === "") {
|
|
107
107
|
return undefined;
|
|
108
108
|
}
|
|
109
|
-
return await
|
|
109
|
+
return await repositoryRemoteScope(root);
|
|
110
110
|
}
|
|
111
111
|
catch {
|
|
112
112
|
return undefined;
|
package/dist/handoff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../src/handoff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAwB,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../src/handoff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type Memory, type MemoryCategory, type MemoryStatus } from "@lore-co/core";
|
|
2
|
+
import { SharedMemoryClient } from "@lore-co/sdk";
|
|
3
|
+
import type { ConnectorConfig } from "./cli.js";
|
|
4
|
+
interface LearningsArguments {
|
|
5
|
+
repo?: string;
|
|
6
|
+
allRepositories: boolean;
|
|
7
|
+
statuses: MemoryStatus[];
|
|
8
|
+
categories?: MemoryCategory[];
|
|
9
|
+
query?: string;
|
|
10
|
+
json: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseLearningsArguments(args: readonly string[]): LearningsArguments | null;
|
|
13
|
+
export interface LearningsListing {
|
|
14
|
+
repo: string | null;
|
|
15
|
+
statuses: readonly MemoryStatus[];
|
|
16
|
+
learnings: readonly Memory[];
|
|
17
|
+
}
|
|
18
|
+
export declare function formatLearnings(listing: LearningsListing, repoSource: "flag" | "folder" | "all"): string;
|
|
19
|
+
/** Every matching learning, loaded page by page so exports are complete. */
|
|
20
|
+
export declare function loadAllLearnings(client: Pick<SharedMemoryClient, "listLearnings">, filters: {
|
|
21
|
+
repo?: string;
|
|
22
|
+
statuses: readonly MemoryStatus[];
|
|
23
|
+
categories?: readonly MemoryCategory[];
|
|
24
|
+
query?: string;
|
|
25
|
+
}): Promise<Memory[]>;
|
|
26
|
+
export declare function runLearningsCommand(args: readonly string[], config: ConnectorConfig | null, options?: {
|
|
27
|
+
cwd?: string;
|
|
28
|
+
fetcher?: typeof fetch;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=learnings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learnings.d.ts","sourceRoot":"","sources":["../src/learnings.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,MAAM,EACX,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAGL,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAGtB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAyChD,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAgBD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,kBAAkB,GAAG,IAAI,CAgD3B;AAqCD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GACpC,MAAM,CA6BR;AA8BD,4EAA4E;AAC5E,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,eAAe,CAAC,EACjD,OAAO,EAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,UAAU,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,MAAM,EAAE,CAAC,CAsBnB;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,eAAe,GAAG,IAAI,EAC9B,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GACrD,OAAO,CAAC,IAAI,CAAC,CAyEf"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { MemoryCategorySchema, MemoryStatusSchema, } from "@lore-co/core";
|
|
2
|
+
import { LoreTransportError, SharedMemoryApiError, SharedMemoryClient, } from "@lore-co/sdk";
|
|
3
|
+
import { ZodError } from "zod";
|
|
4
|
+
import { detectRepository } from "./ask.js";
|
|
5
|
+
import { checkWorkspaceRepository } from "./directory-policy.js";
|
|
6
|
+
const LEARNINGS_HELP = `lore learnings
|
|
7
|
+
List or export the learnings Lore holds for a repository, without a question.
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
lore learnings [options]
|
|
11
|
+
|
|
12
|
+
Options:
|
|
13
|
+
--repo <repo> List the learnings that apply to this repository: its
|
|
14
|
+
own plus workspace-wide ones (default: the Git
|
|
15
|
+
repository of the current folder)
|
|
16
|
+
--all-repositories List every learning in the workspace, including
|
|
17
|
+
other repositories
|
|
18
|
+
--status <list> Statuses to include, separated by commas (default: active)
|
|
19
|
+
--category <list> Categories to include, separated by commas (default: all)
|
|
20
|
+
--query <text> Only learnings whose text contains this phrase
|
|
21
|
+
--json Print every matching learning as machine-readable JSON
|
|
22
|
+
--help Show this command's help
|
|
23
|
+
|
|
24
|
+
Statuses:
|
|
25
|
+
${MemoryStatusSchema.options.join(", ")}
|
|
26
|
+
|
|
27
|
+
Categories:
|
|
28
|
+
${MemoryCategorySchema.options.join(", ")}
|
|
29
|
+
|
|
30
|
+
The command pages through GET /v1/learnings until every match is loaded, so the
|
|
31
|
+
output is complete rather than a ranked sample. Use lore ask for ranked answers
|
|
32
|
+
to a question. Workspace repository restrictions apply before anything is read.
|
|
33
|
+
|
|
34
|
+
Examples:
|
|
35
|
+
lore learnings
|
|
36
|
+
lore learnings --repo acme/billing --json > learnings.json
|
|
37
|
+
lore learnings --status active,proposed --category convention
|
|
38
|
+
lore learnings --all-repositories --json
|
|
39
|
+
`;
|
|
40
|
+
/** The API's page ceiling; fewer round trips for a full export. */
|
|
41
|
+
const PAGE_SIZE = 100;
|
|
42
|
+
function parseList(argument, value, options) {
|
|
43
|
+
const items = value.split(",").map((item) => item.trim()).filter(Boolean);
|
|
44
|
+
if (items.length === 0)
|
|
45
|
+
throw new Error(`Missing value for ${argument}`);
|
|
46
|
+
const unknown = items.find((item) => !options.includes(item));
|
|
47
|
+
if (unknown !== undefined) {
|
|
48
|
+
throw new Error(`${argument} must list values from: ${options.join(", ")}`);
|
|
49
|
+
}
|
|
50
|
+
return [...new Set(items)];
|
|
51
|
+
}
|
|
52
|
+
export function parseLearningsArguments(args) {
|
|
53
|
+
const parsed = {
|
|
54
|
+
allRepositories: false,
|
|
55
|
+
statuses: ["active"],
|
|
56
|
+
json: false,
|
|
57
|
+
};
|
|
58
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
59
|
+
const argument = args[index];
|
|
60
|
+
if (argument === "--help" || argument === "-h") {
|
|
61
|
+
process.stdout.write(LEARNINGS_HELP);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
if (argument === "--json") {
|
|
65
|
+
parsed.json = true;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (argument === "--all-repositories") {
|
|
69
|
+
parsed.allRepositories = true;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (argument === "--repo" ||
|
|
73
|
+
argument === "--status" ||
|
|
74
|
+
argument === "--category" ||
|
|
75
|
+
argument === "--query") {
|
|
76
|
+
const value = args[index + 1]?.trim();
|
|
77
|
+
if (value === undefined || value === "" || value.startsWith("-")) {
|
|
78
|
+
throw new Error(`Missing value for ${argument}`);
|
|
79
|
+
}
|
|
80
|
+
index += 1;
|
|
81
|
+
if (argument === "--repo") {
|
|
82
|
+
parsed.repo = value;
|
|
83
|
+
}
|
|
84
|
+
else if (argument === "--status") {
|
|
85
|
+
parsed.statuses = parseList(argument, value, MemoryStatusSchema.options);
|
|
86
|
+
}
|
|
87
|
+
else if (argument === "--category") {
|
|
88
|
+
parsed.categories = parseList(argument, value, MemoryCategorySchema.options);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
parsed.query = value;
|
|
92
|
+
}
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
throw new Error(`Unknown learnings option: ${argument}`);
|
|
96
|
+
}
|
|
97
|
+
if (parsed.repo !== undefined && parsed.allRepositories) {
|
|
98
|
+
throw new Error("Use --repo or --all-repositories, not both.");
|
|
99
|
+
}
|
|
100
|
+
return parsed;
|
|
101
|
+
}
|
|
102
|
+
function formatDate(value) {
|
|
103
|
+
return value.slice(0, 10);
|
|
104
|
+
}
|
|
105
|
+
function singleLine(text, width) {
|
|
106
|
+
const flat = text.replaceAll(/\s+/gu, " ").trim();
|
|
107
|
+
return flat.length > width ? `${flat.slice(0, width - 1)}…` : flat;
|
|
108
|
+
}
|
|
109
|
+
function scopeLabel(memory) {
|
|
110
|
+
const scope = memory.scope;
|
|
111
|
+
const parts = [
|
|
112
|
+
...(scope.repo === undefined ? [] : [scope.repo]),
|
|
113
|
+
...(scope.project === undefined ? [] : [`project ${scope.project}`]),
|
|
114
|
+
...(scope.path === undefined ? [] : [scope.path]),
|
|
115
|
+
...(scope.component === undefined ? [] : [scope.component]),
|
|
116
|
+
...(scope.agent === undefined ? [] : [`for ${scope.agent}`]),
|
|
117
|
+
];
|
|
118
|
+
return parts.length === 0 ? "workspace" : parts.join(" · ");
|
|
119
|
+
}
|
|
120
|
+
function table(rows, headers) {
|
|
121
|
+
const widths = headers.map((header, column) => Math.max(header.length, ...rows.map((row) => row[column].length)));
|
|
122
|
+
const line = (cells) => cells
|
|
123
|
+
.map((cell, column) => column === cells.length - 1 ? cell : cell.padEnd(widths[column]))
|
|
124
|
+
.join(" ")
|
|
125
|
+
.trimEnd();
|
|
126
|
+
return [line(headers), ...rows.map(line)].join("\n");
|
|
127
|
+
}
|
|
128
|
+
export function formatLearnings(listing, repoSource) {
|
|
129
|
+
const header = repoSource === "all"
|
|
130
|
+
? "Repository: all repositories in the workspace\n"
|
|
131
|
+
: `Repository: ${listing.repo} (${repoSource === "flag" ? "from --repo" : "detected from the current folder"})\n`;
|
|
132
|
+
const count = listing.learnings.length;
|
|
133
|
+
const statusLabel = listing.statuses.length === 1 ? `${listing.statuses[0]} ` : "";
|
|
134
|
+
const summary = `${count} ${statusLabel}learning${count === 1 ? "" : "s"}\n`;
|
|
135
|
+
if (count === 0)
|
|
136
|
+
return `${header}${summary}`;
|
|
137
|
+
const showStatus = listing.statuses.length > 1;
|
|
138
|
+
const showScope = repoSource === "all";
|
|
139
|
+
const headers = [
|
|
140
|
+
"ID",
|
|
141
|
+
"CATEGORY",
|
|
142
|
+
...(showStatus ? ["STATUS"] : []),
|
|
143
|
+
"UPDATED",
|
|
144
|
+
...(showScope ? ["SCOPE"] : []),
|
|
145
|
+
"CONTENT",
|
|
146
|
+
];
|
|
147
|
+
const rows = listing.learnings.map((memory) => [
|
|
148
|
+
memory.id,
|
|
149
|
+
memory.category,
|
|
150
|
+
...(showStatus ? [memory.status] : []),
|
|
151
|
+
formatDate(memory.updatedAt),
|
|
152
|
+
...(showScope ? [singleLine(scopeLabel(memory), 40)] : []),
|
|
153
|
+
singleLine(memory.content, 100),
|
|
154
|
+
]);
|
|
155
|
+
return `${header}${summary}\n${table(rows, headers)}\n`;
|
|
156
|
+
}
|
|
157
|
+
function describeFailure(error) {
|
|
158
|
+
if (error instanceof SharedMemoryApiError) {
|
|
159
|
+
if (error.status === 401 || error.status === 403) {
|
|
160
|
+
return new Error("Lore authentication failed. Reconnect with a valid workspace token.");
|
|
161
|
+
}
|
|
162
|
+
if (error.status === 404) {
|
|
163
|
+
return new Error("This Lore server does not support listing learnings. Upgrade the server to use lore learnings.");
|
|
164
|
+
}
|
|
165
|
+
return new Error(`Lore learnings failed with HTTP ${error.status}.`);
|
|
166
|
+
}
|
|
167
|
+
if (error instanceof ZodError ||
|
|
168
|
+
error instanceof SyntaxError ||
|
|
169
|
+
(error instanceof LoreTransportError && error.code === "response_too_large")) {
|
|
170
|
+
return new Error("Lore server returned an incompatible learnings response. Upgrade the server and CLI.");
|
|
171
|
+
}
|
|
172
|
+
return new Error("Lore API is unreachable. Run lore doctor to diagnose connectivity.");
|
|
173
|
+
}
|
|
174
|
+
/** Every matching learning, loaded page by page so exports are complete. */
|
|
175
|
+
export async function loadAllLearnings(client, filters) {
|
|
176
|
+
const learnings = [];
|
|
177
|
+
const seen = new Set();
|
|
178
|
+
for (let offset = 0;;) {
|
|
179
|
+
const page = await client.listLearnings({
|
|
180
|
+
...(filters.repo === undefined ? {} : { repo: filters.repo }),
|
|
181
|
+
status: [...filters.statuses],
|
|
182
|
+
...(filters.categories === undefined ? {} : { category: [...filters.categories] }),
|
|
183
|
+
...(filters.query === undefined ? {} : { query: filters.query }),
|
|
184
|
+
limit: PAGE_SIZE,
|
|
185
|
+
offset,
|
|
186
|
+
});
|
|
187
|
+
for (const memory of page.memories) {
|
|
188
|
+
// A learning created mid-export can shift pages; keep each one once.
|
|
189
|
+
if (!seen.has(memory.id)) {
|
|
190
|
+
seen.add(memory.id);
|
|
191
|
+
learnings.push(memory);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
offset += page.memories.length;
|
|
195
|
+
if (page.memories.length === 0 || offset >= page.total)
|
|
196
|
+
return learnings;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
export async function runLearningsCommand(args, config, options = {}) {
|
|
200
|
+
const parsed = parseLearningsArguments(args);
|
|
201
|
+
if (parsed === null)
|
|
202
|
+
return;
|
|
203
|
+
if (config === null) {
|
|
204
|
+
throw new Error("Lore is not connected. Run: lore connect --token <workspace-token>");
|
|
205
|
+
}
|
|
206
|
+
const fetcher = options.fetcher ?? fetch;
|
|
207
|
+
let repo;
|
|
208
|
+
let repoSource;
|
|
209
|
+
if (parsed.allRepositories) {
|
|
210
|
+
repoSource = "all";
|
|
211
|
+
}
|
|
212
|
+
else if (parsed.repo !== undefined) {
|
|
213
|
+
repo = parsed.repo;
|
|
214
|
+
repoSource = "flag";
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
repo = await detectRepository(options.cwd ?? process.cwd());
|
|
218
|
+
repoSource = "folder";
|
|
219
|
+
if (repo === undefined) {
|
|
220
|
+
throw new Error("No Git repository detected in this folder. Use --repo <owner/repository> or --all-repositories.");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// The same workspace repository policy that hooks and lore ask honour.
|
|
224
|
+
// Without a repository, only a workspace that allows every repository passes.
|
|
225
|
+
const permission = await checkWorkspaceRepository(config, repo, fetcher);
|
|
226
|
+
if (!permission.allowed) {
|
|
227
|
+
if (permission.failure === "rejected") {
|
|
228
|
+
throw new Error("Lore authentication failed. Reconnect with a valid workspace token.");
|
|
229
|
+
}
|
|
230
|
+
if (permission.failure !== undefined) {
|
|
231
|
+
throw new Error("Lore API is unreachable. Run lore doctor to diagnose connectivity.");
|
|
232
|
+
}
|
|
233
|
+
throw new Error(repo === undefined
|
|
234
|
+
? "This workspace limits Lore to selected repositories. Use --repo <owner/repository>."
|
|
235
|
+
: `Lore is off for this repository. ${permission.reason}.`);
|
|
236
|
+
}
|
|
237
|
+
const client = new SharedMemoryClient({
|
|
238
|
+
baseUrl: config.apiUrl,
|
|
239
|
+
headers: { authorization: `Bearer ${config.token}` },
|
|
240
|
+
fetch: fetcher,
|
|
241
|
+
});
|
|
242
|
+
let learnings;
|
|
243
|
+
try {
|
|
244
|
+
learnings = await loadAllLearnings(client, {
|
|
245
|
+
...(repo === undefined ? {} : { repo }),
|
|
246
|
+
statuses: parsed.statuses,
|
|
247
|
+
...(parsed.categories === undefined ? {} : { categories: parsed.categories }),
|
|
248
|
+
...(parsed.query === undefined ? {} : { query: parsed.query }),
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
throw describeFailure(error);
|
|
253
|
+
}
|
|
254
|
+
const listing = {
|
|
255
|
+
repo: repo ?? null,
|
|
256
|
+
statuses: parsed.statuses,
|
|
257
|
+
learnings,
|
|
258
|
+
};
|
|
259
|
+
if (parsed.json) {
|
|
260
|
+
process.stdout.write(`${JSON.stringify({ repo: listing.repo, total: learnings.length, learnings }, null, 2)}\n`);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
process.stdout.write(formatLearnings(listing, repoSource));
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=learnings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learnings.js","sourceRoot":"","sources":["../src/learnings.ts"],"names":[],"mappings":"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"}
|
package/dist/live.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AA2Q3D,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAED,6DAA6D;AAC7D,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,eAAe,GAAG,IAAI,EAC9B,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,IAAI,CAAC,CAgSf;AAwMD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,eAAe,GAAG,IAAI,EAC9B,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,IAAI,CAAC,CA0Gf;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,eAAe,GAAG,IAAI,EAC9B,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,IAAI,CAAC,CAwBf"}
|
package/dist/live.js
CHANGED
|
@@ -7,7 +7,7 @@ import { dirname, resolve } from "node:path";
|
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
8
|
import { WebSocket } from "ws";
|
|
9
9
|
import { ListRuntimesResponseSchema, LiveRuntimeSchema, } from "@lore-co/core";
|
|
10
|
-
import { loreApiRequest } from "./api.js";
|
|
10
|
+
import { LoreApiError, loreApiRequest } from "./api.js";
|
|
11
11
|
import { ensureMachineRegistered, readMachineIdentity } from "./machine.js";
|
|
12
12
|
import { openPty } from "./pty.js";
|
|
13
13
|
import { IS_STANDALONE_BINARY } from "./version.js";
|
|
@@ -38,6 +38,9 @@ Start a live session with:
|
|
|
38
38
|
`;
|
|
39
39
|
const REPLAY_BUFFER_LIMIT = 256 * 1024;
|
|
40
40
|
const HEARTBEAT_INTERVAL_MS = 30_000;
|
|
41
|
+
const RELAY_RETRY_INITIAL_MS = 5_000;
|
|
42
|
+
const RELAY_RETRY_MAX_MS = 30_000;
|
|
43
|
+
const RELAY_CONFLICT_NOTICE = "Remote connection already in use. Retrying automatically.";
|
|
41
44
|
const SOCKET_WAIT_MS = process.platform === "win32" ? 20_000 : 5_000;
|
|
42
45
|
// A spec with no persisted pid is ambiguous: either the daemon is still
|
|
43
46
|
// starting (the parent wrote the spec; the daemon has not reached its pid
|
|
@@ -293,10 +296,11 @@ export async function runLiveHostCommand(args, config, paths) {
|
|
|
293
296
|
if (id === undefined) {
|
|
294
297
|
throw new Error("live-host requires --id");
|
|
295
298
|
}
|
|
296
|
-
const
|
|
297
|
-
if (
|
|
299
|
+
const loadedSpec = await readSpec(paths, id);
|
|
300
|
+
if (loadedSpec === null) {
|
|
298
301
|
throw new Error(`Unknown live session: ${id}`);
|
|
299
302
|
}
|
|
303
|
+
const spec = loadedSpec;
|
|
300
304
|
spec.pid = process.pid;
|
|
301
305
|
if (process.platform === "win32")
|
|
302
306
|
spec.pipeToken = randomBytes(32).toString("hex");
|
|
@@ -315,7 +319,11 @@ export async function runLiveHostCommand(args, config, paths) {
|
|
|
315
319
|
let replay = Buffer.alloc(0);
|
|
316
320
|
let hostSocket = null;
|
|
317
321
|
let heartbeat = null;
|
|
322
|
+
let reconnect = null;
|
|
323
|
+
let reconnectDelay = RELAY_RETRY_INITIAL_MS;
|
|
318
324
|
let exited = false;
|
|
325
|
+
let hubStopped = false;
|
|
326
|
+
let hubStateWrite;
|
|
319
327
|
const broadcast = (frame) => {
|
|
320
328
|
const encoded = encodeFrame(frame);
|
|
321
329
|
for (const client of clients) {
|
|
@@ -325,6 +333,28 @@ export async function runLiveHostCommand(args, config, paths) {
|
|
|
325
333
|
hostSocket.send(JSON.stringify(frame));
|
|
326
334
|
}
|
|
327
335
|
};
|
|
336
|
+
const persistHubState = () => {
|
|
337
|
+
const state = { ...spec };
|
|
338
|
+
// Serialize transient recovery notices with permanent access failures.
|
|
339
|
+
hubStateWrite = (hubStateWrite ?? Promise.resolve())
|
|
340
|
+
.then(() => writeSpec(paths, state)).catch(() => undefined);
|
|
341
|
+
};
|
|
342
|
+
const stopHubLink = (status) => {
|
|
343
|
+
if (exited || hubStopped || ![401, 403, 404].includes(status))
|
|
344
|
+
return;
|
|
345
|
+
hubStopped = true;
|
|
346
|
+
if (heartbeat !== null)
|
|
347
|
+
clearInterval(heartbeat);
|
|
348
|
+
if (reconnect !== null)
|
|
349
|
+
clearTimeout(reconnect);
|
|
350
|
+
hostSocket?.terminate();
|
|
351
|
+
spec.hubError = status === 404
|
|
352
|
+
? "Remote session unavailable. Check the server version and restart this live session."
|
|
353
|
+
: "Remote access denied. Reconnect Lore and restart this live session.";
|
|
354
|
+
broadcast({ t: "notice", message: `${spec.hubError} Local access still works.` });
|
|
355
|
+
// Persist the notice for detached sessions and later lore attach --list.
|
|
356
|
+
persistHubState();
|
|
357
|
+
};
|
|
328
358
|
pty.onData((chunk) => {
|
|
329
359
|
replay = Buffer.concat([replay, chunk]);
|
|
330
360
|
if (replay.length > REPLAY_BUFFER_LIMIT) {
|
|
@@ -340,12 +370,14 @@ export async function runLiveHostCommand(args, config, paths) {
|
|
|
340
370
|
if (heartbeat !== null) {
|
|
341
371
|
clearInterval(heartbeat);
|
|
342
372
|
}
|
|
373
|
+
if (reconnect !== null)
|
|
374
|
+
clearTimeout(reconnect);
|
|
343
375
|
broadcast({ t: "exit", code });
|
|
344
376
|
for (const client of clients) {
|
|
345
377
|
client.end();
|
|
346
378
|
}
|
|
347
379
|
hostSocket?.close();
|
|
348
|
-
if (config !== null && spec.runtimeId !== undefined) {
|
|
380
|
+
if (config !== null && spec.runtimeId !== undefined && !hubStopped) {
|
|
349
381
|
try {
|
|
350
382
|
await loreApiRequest(config, "POST", `/v1/runtimes/${spec.runtimeId}/heartbeat`, LiveRuntimeSchema, { status: "exited" });
|
|
351
383
|
}
|
|
@@ -353,6 +385,7 @@ export async function runLiveHostCommand(args, config, paths) {
|
|
|
353
385
|
// The hub may be unreachable; local cleanup still applies.
|
|
354
386
|
}
|
|
355
387
|
}
|
|
388
|
+
await hubStateWrite;
|
|
356
389
|
await rm(specPath(paths, id), { force: true });
|
|
357
390
|
await removeSocket(socketPath(paths, id));
|
|
358
391
|
process.exit(code ?? 0);
|
|
@@ -382,6 +415,8 @@ export async function runLiveHostCommand(args, config, paths) {
|
|
|
382
415
|
const accept = () => {
|
|
383
416
|
clients.add(client);
|
|
384
417
|
client.write(encodeFrame({ t: "replay", d: replay.toString("base64") }));
|
|
418
|
+
if (spec.hubError)
|
|
419
|
+
client.write(encodeFrame({ t: "notice", message: `${spec.hubError} Local access still works.` }));
|
|
385
420
|
};
|
|
386
421
|
if (authenticated)
|
|
387
422
|
accept();
|
|
@@ -451,21 +486,47 @@ export async function runLiveHostCommand(args, config, paths) {
|
|
|
451
486
|
spec.runtimeId = runtime.id;
|
|
452
487
|
await writeSpec(paths, spec);
|
|
453
488
|
heartbeat = setInterval(() => {
|
|
454
|
-
void loreApiRequest(config, "POST", `/v1/runtimes/${runtime.id}/heartbeat`, LiveRuntimeSchema, { status: "running" }).catch(
|
|
489
|
+
void loreApiRequest(config, "POST", `/v1/runtimes/${runtime.id}/heartbeat`, LiveRuntimeSchema, { status: "running" }).catch(error => {
|
|
490
|
+
if (error instanceof LoreApiError)
|
|
491
|
+
stopHubLink(error.status);
|
|
492
|
+
// Transient connectivity failures are retried on the next heartbeat.
|
|
493
|
+
});
|
|
455
494
|
}, HEARTBEAT_INTERVAL_MS);
|
|
456
495
|
connectHostRelay(config, runtime.id);
|
|
457
496
|
}
|
|
458
|
-
catch {
|
|
459
|
-
|
|
497
|
+
catch (error) {
|
|
498
|
+
if (error instanceof LoreApiError)
|
|
499
|
+
stopHubLink(error.status);
|
|
500
|
+
// Local access remains available even if the hub is unreachable.
|
|
460
501
|
}
|
|
461
502
|
}
|
|
462
503
|
function connectHostRelay(activeConfig, runtimeId) {
|
|
504
|
+
if (exited || hubStopped)
|
|
505
|
+
return;
|
|
463
506
|
const socket = new WebSocket(wsUrl(activeConfig.apiUrl, runtimeId, "host"), {
|
|
464
507
|
headers: { authorization: `Bearer ${activeConfig.token}` },
|
|
465
508
|
});
|
|
509
|
+
let stable;
|
|
510
|
+
const connected = () => {
|
|
511
|
+
if (exited || hubStopped || socket !== hostSocket || socket.readyState !== WebSocket.OPEN)
|
|
512
|
+
return;
|
|
513
|
+
clearTimeout(stable);
|
|
514
|
+
reconnectDelay = RELAY_RETRY_INITIAL_MS;
|
|
515
|
+
if (spec.hubError === RELAY_CONFLICT_NOTICE) {
|
|
516
|
+
delete spec.hubError;
|
|
517
|
+
persistHubState();
|
|
518
|
+
broadcast({ t: "notice", message: "Remote connection restored." });
|
|
519
|
+
}
|
|
520
|
+
};
|
|
521
|
+
// An upgrade alone is not acceptance: a duplicate host opens before 4009.
|
|
522
|
+
// A ping/frame proves acceptance; the timer supports older idle relays.
|
|
523
|
+
socket.on("open", () => { stable = setTimeout(connected, HEARTBEAT_INTERVAL_MS); stable.unref(); });
|
|
524
|
+
socket.on("ping", connected);
|
|
466
525
|
socket.on("message", (raw) => {
|
|
467
526
|
try {
|
|
468
527
|
const frame = JSON.parse(String(raw));
|
|
528
|
+
if (["joined", "i", "resize"].includes(frame.t))
|
|
529
|
+
connected();
|
|
469
530
|
if (frame.t === "joined" && typeof frame.client === "string") {
|
|
470
531
|
socket.send(JSON.stringify({
|
|
471
532
|
t: "replay",
|
|
@@ -480,11 +541,29 @@ export async function runLiveHostCommand(args, config, paths) {
|
|
|
480
541
|
// Ignore malformed frames.
|
|
481
542
|
}
|
|
482
543
|
});
|
|
483
|
-
socket.on("
|
|
484
|
-
|
|
485
|
-
|
|
544
|
+
socket.on("unexpected-response", (_request, response) => {
|
|
545
|
+
stopHubLink(response.statusCode ?? 0);
|
|
546
|
+
response.resume();
|
|
547
|
+
socket.terminate();
|
|
548
|
+
});
|
|
549
|
+
socket.on("close", code => {
|
|
550
|
+
clearTimeout(stable);
|
|
551
|
+
if (hostSocket === socket)
|
|
552
|
+
hostSocket = null;
|
|
553
|
+
if (code === 4001)
|
|
554
|
+
stopHubLink(403);
|
|
555
|
+
if (!exited && !hubStopped) {
|
|
556
|
+
if (code === 4009 && spec.hubError !== RELAY_CONFLICT_NOTICE) {
|
|
557
|
+
spec.hubError = RELAY_CONFLICT_NOTICE;
|
|
558
|
+
persistHubState();
|
|
559
|
+
broadcast({ t: "notice", message: `${RELAY_CONFLICT_NOTICE} Local access still works.` });
|
|
560
|
+
}
|
|
561
|
+
reconnect = setTimeout(() => {
|
|
562
|
+
reconnect = null;
|
|
486
563
|
connectHostRelay(activeConfig, runtimeId);
|
|
487
|
-
},
|
|
564
|
+
}, reconnectDelay);
|
|
565
|
+
reconnect.unref();
|
|
566
|
+
reconnectDelay = Math.min(reconnectDelay * 2, RELAY_RETRY_MAX_MS);
|
|
488
567
|
}
|
|
489
568
|
});
|
|
490
569
|
socket.on("error", () => {
|
|
@@ -547,6 +626,10 @@ function runTerminalLoop(transport, onEnd) {
|
|
|
547
626
|
handleFrame(frame) {
|
|
548
627
|
if (ended)
|
|
549
628
|
return;
|
|
629
|
+
if (frame.t === "notice" && typeof frame.message === "string") {
|
|
630
|
+
process.stdout.write(`\r\n[lore] ${frame.message}\r\n`);
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
550
633
|
if ((frame.t === "o" || frame.t === "replay") &&
|
|
551
634
|
typeof frame.d === "string") {
|
|
552
635
|
process.stdout.write(Buffer.from(frame.d, "base64"));
|
|
@@ -730,6 +813,8 @@ export async function runAttachCommand(args, config, paths) {
|
|
|
730
813
|
for (const spec of specs) {
|
|
731
814
|
const where = spec.repo ?? spec.project ?? "no repo";
|
|
732
815
|
process.stdout.write(`${displayRuntimeId(spec.id, localSpecs)} · ${spec.agent} · ${where} · started ${spec.createdAt.slice(0, 16).replace("T", " ")}\n`);
|
|
816
|
+
if (spec.hubError)
|
|
817
|
+
process.stdout.write(` ${spec.hubError} Local access still works.\n`);
|
|
733
818
|
}
|
|
734
819
|
if (!list) {
|
|
735
820
|
process.stdout.write("\nSeveral live sessions are running. Pick one with --runtime <id>.\n");
|