@lore-co/cli 0.1.22 → 0.1.24
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 +13 -5
- package/dist/agents.d.ts +16 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +80 -0
- package/dist/agents.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +38 -4
- package/dist/cli.js.map +1 -1
- package/dist/devin-client.d.ts +2 -2
- package/dist/generated-assets.d.ts +4 -4
- package/dist/generated-assets.js +4 -4
- package/dist/handoff.d.ts.map +1 -1
- package/dist/handoff.js +12 -25
- package/dist/handoff.js.map +1 -1
- package/dist/pty.d.ts.map +1 -1
- package/dist/pty.js +46 -6
- package/dist/pty.js.map +1 -1
- package/dist/recovery-opencode.d.ts +3 -0
- package/dist/recovery-opencode.d.ts.map +1 -0
- package/dist/recovery-opencode.js +72 -0
- package/dist/recovery-opencode.js.map +1 -0
- package/dist/recovery-state.d.ts +77 -0
- package/dist/recovery-state.d.ts.map +1 -0
- package/dist/recovery-state.js +262 -0
- package/dist/recovery-state.js.map +1 -0
- package/dist/recovery.d.ts +21 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +560 -0
- package/dist/recovery.js.map +1 -0
- package/dist/self-host.d.ts +1 -1
- package/dist/self-host.js +2 -2
- package/dist/update.js +3 -3
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -83,11 +83,19 @@ Dashboard self-hosting uses `lore self-host up`, human signup, then:
|
|
|
83
83
|
lore connect --login --url http://127.0.0.1:3001 \
|
|
84
84
|
--dashboard-url http://127.0.0.1:3000
|
|
85
85
|
```
|
|
86
|
-
For a review-first rollout
|
|
87
|
-
[
|
|
86
|
+
For a review-first OpenCode rollout, follow the
|
|
87
|
+
[plugin guide](../opencode-plugin/README.md#review-first-use).
|
|
88
88
|
|
|
89
89
|
## Query shared context
|
|
90
90
|
|
|
91
|
+
Use `lore connect --fallback <agent>` or set independent routes with
|
|
92
|
+
`lore recovery enable --from opencode --to devin`, then open a new terminal.
|
|
93
|
+
Local destinations are Claude, Codex, OpenCode, Devin CLI, Cursor Agent and
|
|
94
|
+
Copilot CLI, plus Polytoken. Claude and OpenCode support automatic offers for documented failure
|
|
95
|
+
conditions; Claude/Codex/OpenCode/Devin also support a manual Ctrl+] switch.
|
|
96
|
+
Setup adds reversible shell wrappers and separate checkpoint integrations.
|
|
97
|
+
See the [recovery guide](../../docs/recovery.md) for exact coverage and evidence.
|
|
98
|
+
|
|
91
99
|
```sh
|
|
92
100
|
lore ask "How should payment retries work?"
|
|
93
101
|
lore ask "What did the previous agent already try?" --repo acme/billing
|
|
@@ -156,7 +164,7 @@ content-free `guard_check` audit event.
|
|
|
156
164
|
|
|
157
165
|
```sh
|
|
158
166
|
lore update
|
|
159
|
-
lore update --version v0.1.
|
|
167
|
+
lore update --version v0.1.24
|
|
160
168
|
```
|
|
161
169
|
|
|
162
170
|
`update` resolves the latest release to an exact tag, or uses the exact
|
|
@@ -419,7 +427,7 @@ same-repository, non-draft pull requests bearing the corresponding
|
|
|
419
427
|
`lore:codex-review` or `lore:devin-review` label.
|
|
420
428
|
|
|
421
429
|
Generated jobs require a published standalone binary release and default to
|
|
422
|
-
`treadiehq/lore-releases` at `v0.1.
|
|
430
|
+
`treadiehq/lore-releases` at `v0.1.24`. Set `LORE_CLI_REPOSITORY` to the publicly
|
|
423
431
|
readable `owner/repository` and `LORE_CLI_VERSION` to an existing release tag
|
|
424
432
|
when using another release source.
|
|
425
433
|
|
|
@@ -452,4 +460,4 @@ The correction and current behavior go here.
|
|
|
452
460
|
and update it deliberately.
|
|
453
461
|
|
|
454
462
|
For source builds, self-hosting, tests, and release internals, see the
|
|
455
|
-
[
|
|
463
|
+
[documentation index](../../docs/README.md).
|
package/dist/agents.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Local terminal clients. Cloud and desktop surfaces need different transports. */
|
|
2
|
+
export declare const LAUNCHABLE_AGENTS: readonly ["claude", "codex", "opencode", "devin", "cursor", "copilot-cli", "polytoken"];
|
|
3
|
+
export type LaunchableAgent = (typeof LAUNCHABLE_AGENTS)[number];
|
|
4
|
+
export declare const RECOVERY_SOURCES: readonly ["claude", "codex", "opencode", "devin"];
|
|
5
|
+
export type RecoverySource = (typeof RECOVERY_SOURCES)[number];
|
|
6
|
+
export declare const AGENTS: Record<LaunchableAgent, {
|
|
7
|
+
label: string;
|
|
8
|
+
commands: readonly string[];
|
|
9
|
+
automatic: string | null;
|
|
10
|
+
}>;
|
|
11
|
+
export declare const isLaunchable: (value: string) => value is LaunchableAgent;
|
|
12
|
+
export declare const isRecoverySource: (value: string) => value is RecoverySource;
|
|
13
|
+
export declare function launchArguments(agent: LaunchableAgent, brief: string): string[];
|
|
14
|
+
export declare function findAgentExecutable(agent: LaunchableAgent, env?: NodeJS.ProcessEnv): Promise<string>;
|
|
15
|
+
export declare function isInteractiveAgent(agent: RecoverySource, args: readonly string[], stdinIsTty: boolean, stdoutIsTty: boolean): boolean;
|
|
16
|
+
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAIA,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,yFAA0F,CAAC;AACzH,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AACjE,eAAO,MAAM,gBAAgB,mDAAoD,CAAC;AAClF,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/D,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,eAAe,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAQpH,CAAC;AACF,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,KAAK,IAAI,eAA2E,CAAC;AAClI,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,KAAG,KAAK,IAAI,cAAyE,CAAC;AAEpI,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAM/E;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,oBAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CASpG;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CA6BrI"}
|
package/dist/agents.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { access, realpath, stat } from "node:fs/promises";
|
|
3
|
+
import { delimiter, resolve } from "node:path";
|
|
4
|
+
/** Local terminal clients. Cloud and desktop surfaces need different transports. */
|
|
5
|
+
export const LAUNCHABLE_AGENTS = ["claude", "codex", "opencode", "devin", "cursor", "copilot-cli", "polytoken"];
|
|
6
|
+
export const RECOVERY_SOURCES = ["claude", "codex", "opencode", "devin"];
|
|
7
|
+
export const AGENTS = {
|
|
8
|
+
claude: { label: "Claude", commands: ["claude"], automatic: "StopFailure: rate_limit" },
|
|
9
|
+
codex: { label: "Codex", commands: ["codex"], automatic: null },
|
|
10
|
+
opencode: { label: "OpenCode", commands: ["opencode"], automatic: "APIError: HTTP 429, or 3 provider retries" },
|
|
11
|
+
devin: { label: "Devin CLI", commands: ["devin"], automatic: null },
|
|
12
|
+
cursor: { label: "Cursor Agent", commands: ["cursor-agent", "agent"], automatic: null },
|
|
13
|
+
"copilot-cli": { label: "Copilot CLI", commands: ["copilot"], automatic: null },
|
|
14
|
+
polytoken: { label: "Polytoken", commands: ["polytoken"], automatic: null },
|
|
15
|
+
};
|
|
16
|
+
export const isLaunchable = (value) => LAUNCHABLE_AGENTS.includes(value);
|
|
17
|
+
export const isRecoverySource = (value) => RECOVERY_SOURCES.includes(value);
|
|
18
|
+
export function launchArguments(agent, brief) {
|
|
19
|
+
if (agent === "opencode")
|
|
20
|
+
return ["--prompt", brief];
|
|
21
|
+
if (agent === "copilot-cli")
|
|
22
|
+
return ["--interactive", brief];
|
|
23
|
+
if (agent === "devin")
|
|
24
|
+
return ["--", brief];
|
|
25
|
+
if (agent === "polytoken")
|
|
26
|
+
return ["new", "--prompt", brief];
|
|
27
|
+
return [brief];
|
|
28
|
+
}
|
|
29
|
+
export async function findAgentExecutable(agent, env = process.env) {
|
|
30
|
+
for (const command of AGENTS[agent].commands) {
|
|
31
|
+
for (const directory of (env.PATH ?? "").split(delimiter)) {
|
|
32
|
+
if (!directory)
|
|
33
|
+
continue;
|
|
34
|
+
const path = resolve(directory, command);
|
|
35
|
+
try {
|
|
36
|
+
await access(path, constants.X_OK);
|
|
37
|
+
if ((await stat(path)).isFile())
|
|
38
|
+
return await realpath(path);
|
|
39
|
+
}
|
|
40
|
+
catch { /* next PATH entry */ }
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
throw new Error(`${AGENTS[agent].label} is not installed or is not on PATH (expected ${AGENTS[agent].commands.join(" or ")}).`);
|
|
44
|
+
}
|
|
45
|
+
export function isInteractiveAgent(agent, args, stdinIsTty, stdoutIsTty) {
|
|
46
|
+
if (!stdinIsTty || !stdoutIsTty)
|
|
47
|
+
return false;
|
|
48
|
+
const common = ["--help", "-h", "--version", "-v", "-V", "--print", "-p"];
|
|
49
|
+
const bypass = {
|
|
50
|
+
claude: ["--bg", "--background", "--cloud", "--bare", "--safe-mode", "--worktree", "-w", "--tmux"],
|
|
51
|
+
codex: ["--cd", "-C", "--remote", "--remote-session"],
|
|
52
|
+
devin: ["--config"],
|
|
53
|
+
opencode: [],
|
|
54
|
+
};
|
|
55
|
+
const beforeDelimiter = args.slice(0, args.indexOf("--") < 0 ? args.length : args.indexOf("--"));
|
|
56
|
+
if (beforeDelimiter.some((arg) => [...common, ...bypass[agent]].includes(arg.split("=")[0] ?? arg)))
|
|
57
|
+
return false;
|
|
58
|
+
const commands = {
|
|
59
|
+
claude: ["auth", "mcp", "plugin", "plugins", "install", "update", "upgrade", "doctor", "setup-token", "agents", "attach", "logs", "rm", "stop", "kill", "respawn", "gateway", "import", "project", "ultrareview"],
|
|
60
|
+
codex: ["exec", "e", "review", "login", "logout", "mcp", "mcp-server", "app-server", "app", "completion", "sandbox", "debug", "apply", "a", "resume", "fork", "cloud", "features", "help"],
|
|
61
|
+
devin: ["auth", "mcp", "models", "rules", "skills", "plugins", "cloud", "list", "ls", "update", "version", "migrate", "sandbox", "setup", "uninstall", "acp", "help"],
|
|
62
|
+
opencode: ["completion", "acp", "mcp", "attach", "run", "debug", "providers", "auth", "agent", "upgrade", "uninstall", "serve", "web", "models", "stats", "export", "import", "github", "pr", "session", "db"],
|
|
63
|
+
};
|
|
64
|
+
if (commands[agent].includes(args[0] ?? ""))
|
|
65
|
+
return false;
|
|
66
|
+
// OpenCode's positional argument selects another directory. Keep wrappers
|
|
67
|
+
// scoped to their existing cwd; flags with values are still supported.
|
|
68
|
+
if (agent === "opencode") {
|
|
69
|
+
const valued = ["--prompt", "--model", "-m", "--session", "-s", "--agent", "--port", "--hostname", "--log-level", "--mdns-domain", "--cors"];
|
|
70
|
+
for (let i = 0; i < args.length; i++) {
|
|
71
|
+
const arg = args[i];
|
|
72
|
+
if (!arg.startsWith("-"))
|
|
73
|
+
return false;
|
|
74
|
+
if (valued.includes(arg))
|
|
75
|
+
i++;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/C,oFAAoF;AACpF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,CAAU,CAAC;AAEzH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAU,CAAC;AAElF,MAAM,CAAC,MAAM,MAAM,GAAsG;IACvH,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,yBAAyB,EAAE;IACvF,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;IAC/D,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,2CAA2C,EAAE;IAC/G,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;IACnE,MAAM,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;IACvF,aAAa,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;IAC/E,SAAS,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;CAC5E,CAAC;AACF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAA4B,EAAE,CAAE,iBAAuC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClI,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAA2B,EAAE,CAAE,gBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAEpI,MAAM,UAAU,eAAe,CAAC,KAAsB,EAAE,KAAa;IACnE,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACrD,IAAI,KAAK,KAAK,aAAa;QAAE,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IAC7D,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7D,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAsB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG;IACjF,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7C,KAAK,MAAM,SAAS,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,SAAS;gBAAE,SAAS;YACzB,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACzC,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;oBAAE,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC;QAC3I,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,iDAAiD,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClI,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAqB,EAAE,IAAuB,EAAE,UAAmB,EAAE,WAAoB;IAC1H,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAqC;QAC/C,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC;QAClG,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,CAAC;QACrD,KAAK,EAAE,CAAC,UAAU,CAAC;QACnB,QAAQ,EAAE,EAAE;KACb,CAAC;IACF,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAClH,MAAM,QAAQ,GAAqC;QACjD,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC;QACjN,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC;QAC1L,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC;QACrK,QAAQ,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC;KAC/M,CAAC;IACF,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,0EAA0E;IAC1E,uEAAuE;IACvE,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;QAC7I,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,CAAC,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -78,6 +78,7 @@ export interface AgentInstallation {
|
|
|
78
78
|
}
|
|
79
79
|
export declare function t3CodeProviderInstallations(settings: unknown, paths: LorePaths): AgentInstallation[];
|
|
80
80
|
export interface ConnectWithCredentialOptions {
|
|
81
|
+
fallback?: string;
|
|
81
82
|
/** Explicit installation root for embedded callers and isolated acceptance tests. */
|
|
82
83
|
home?: string;
|
|
83
84
|
/** Repository root for project-local integrations such as VS Code. */
|
|
@@ -89,6 +90,7 @@ export interface ConnectWithCredentialOptions {
|
|
|
89
90
|
timeoutMs?: number;
|
|
90
91
|
}
|
|
91
92
|
export interface ConnectResult {
|
|
93
|
+
recoveryNotice?: string;
|
|
92
94
|
connected: true;
|
|
93
95
|
apiUrl: string;
|
|
94
96
|
identity: WorkspaceIdentityResponse;
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAsBA,OAAO,EAwBL,KAAK,yBAAyB,EAC/B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -14,6 +14,8 @@ import { runAskCommand } from "./ask.js";
|
|
|
14
14
|
import { runRememberCommand } from "./remember.js";
|
|
15
15
|
import { runGuardCommand } from "./guard.js";
|
|
16
16
|
import { runContinueCommand, runResumeCommand } from "./handoff.js";
|
|
17
|
+
import { disableRecovery, prepareRecoveryInstallation, runRecoveryCommand, runRecoveryHook, runWrappedAgent } from "./recovery.js";
|
|
18
|
+
import { LAUNCHABLE_AGENTS, isLaunchable, isRecoverySource } from "./agents.js";
|
|
17
19
|
import { runAttachCommand, runLiveHostCommand, runLiveRunCommand, } from "./live.js";
|
|
18
20
|
import { runMachinesCommand } from "./machine.js";
|
|
19
21
|
import { connectGithub, runGithubCommand } from "./github.js";
|
|
@@ -86,6 +88,8 @@ Commands:
|
|
|
86
88
|
guard Control Context Guard (off, assist, enforce)
|
|
87
89
|
resume Continue previous work with saved Lore context
|
|
88
90
|
continue Hand the current work to a different agent (--on <agent>)
|
|
91
|
+
run Run a coding agent with configured recovery
|
|
92
|
+
recovery Inspect recovery metrics, record feedback, or disable recovery
|
|
89
93
|
attach Reconnect to a live Lore-managed session (--from <machine>)
|
|
90
94
|
machines List registered machines and their live sessions
|
|
91
95
|
github Prepare/post GitHub reviews and observe corrections
|
|
@@ -141,6 +145,7 @@ Options:
|
|
|
141
145
|
--token <token> Workspace bearer token (or LORE_WORKSPACE_TOKEN/LORE_TOKEN)
|
|
142
146
|
--agent <name> claude, codex, copilot, copilot-cli, copilot-vscode, cowork, cursor, opencode, polytoken, or t3code
|
|
143
147
|
--timeout-ms <ms> Hook request timeout, 250-10000 (default: 2500)
|
|
148
|
+
--fallback <agent> claude, codex, opencode, devin, cursor, copilot-cli, polytoken
|
|
144
149
|
--json Print machine-readable output
|
|
145
150
|
--help Show this command's help
|
|
146
151
|
|
|
@@ -1552,12 +1557,18 @@ function parseConnectArguments(args) {
|
|
|
1552
1557
|
argument !== "--dashboard-url" &&
|
|
1553
1558
|
argument !== "--token" &&
|
|
1554
1559
|
argument !== "--agent" &&
|
|
1560
|
+
argument !== "--fallback" &&
|
|
1555
1561
|
argument !== "--timeout-ms") {
|
|
1556
1562
|
throw new Error(`Unknown connect option: ${argument ?? ""}`);
|
|
1557
1563
|
}
|
|
1558
1564
|
const [value, valueIndex] = valueAfter(args, index, argument);
|
|
1559
1565
|
index = valueIndex;
|
|
1560
|
-
if (argument === "--
|
|
1566
|
+
if (argument === "--fallback") {
|
|
1567
|
+
if (!isLaunchable(value))
|
|
1568
|
+
throw new Error(`--fallback must be ${LAUNCHABLE_AGENTS.join(", ")}`);
|
|
1569
|
+
parsed.fallback = value;
|
|
1570
|
+
}
|
|
1571
|
+
else if (argument === "--url") {
|
|
1561
1572
|
parsed.apiUrl = value;
|
|
1562
1573
|
}
|
|
1563
1574
|
else if (argument === "--dashboard-url") {
|
|
@@ -1613,6 +1624,8 @@ export async function connectWithCredential(options) {
|
|
|
1613
1624
|
throw new Error("Lore agent integrations currently support macOS and Linux");
|
|
1614
1625
|
}
|
|
1615
1626
|
const paths = getLorePaths(options.home, options.home === undefined ? process.env : {}, options.cwd);
|
|
1627
|
+
const installRecovery = options.fallback === undefined ? undefined :
|
|
1628
|
+
await prepareRecoveryInstallation(paths, options.fallback, options.home === undefined ? process.env : { ...process.env, ZDOTDIR: paths.home });
|
|
1616
1629
|
const existing = await readConnectorConfig(paths);
|
|
1617
1630
|
const apiUrl = normalizeApiUrl(options.apiUrl);
|
|
1618
1631
|
const dashboardUrl = options.dashboardUrl === undefined
|
|
@@ -1624,9 +1637,12 @@ export async function connectWithCredential(options) {
|
|
|
1624
1637
|
}
|
|
1625
1638
|
const timeoutMs = options.timeoutMs ?? existing?.timeoutMs ?? 2_500;
|
|
1626
1639
|
const identity = await authenticatedIdentity(apiUrl, token.trim(), timeoutMs);
|
|
1627
|
-
const
|
|
1640
|
+
const recoveryAgents = installRecovery ? [...installRecovery.sources, installRecovery.fallback]
|
|
1641
|
+
.filter((agent) => agent !== "devin") : [];
|
|
1642
|
+
const requestedAgents = [...new Set([...options.agents, ...recoveryAgents])];
|
|
1643
|
+
const requestedExpansion = requestedAgents.length === 0
|
|
1628
1644
|
? { installations: [], warnings: [] }
|
|
1629
|
-
: await expandConnectInstallations(
|
|
1645
|
+
: await expandConnectInstallations(requestedAgents, paths);
|
|
1630
1646
|
const detectedAgents = options.agents.length === 0 ? await detectAgents(paths) : [];
|
|
1631
1647
|
const installations = uniqueInstallations([
|
|
1632
1648
|
...configuredInstallations(existing, paths),
|
|
@@ -1713,6 +1729,7 @@ export async function connectWithCredential(options) {
|
|
|
1713
1729
|
await credentialStore.transferPendingTo(reliabilityStore);
|
|
1714
1730
|
}
|
|
1715
1731
|
await reliabilityStore.releaseAuthBlocked(now);
|
|
1732
|
+
const recoveryNotice = installRecovery ? await installRecovery() : undefined;
|
|
1716
1733
|
return {
|
|
1717
1734
|
connected: true,
|
|
1718
1735
|
apiUrl: config.apiUrl,
|
|
@@ -1722,6 +1739,7 @@ export async function connectWithCredential(options) {
|
|
|
1722
1739
|
changedHookFiles,
|
|
1723
1740
|
backups,
|
|
1724
1741
|
warnings: requestedExpansion.warnings,
|
|
1742
|
+
...(recoveryNotice ? { recoveryNotice } : {}),
|
|
1725
1743
|
};
|
|
1726
1744
|
}
|
|
1727
1745
|
async function requestDeviceAuthorization(input) {
|
|
@@ -1854,13 +1872,14 @@ async function connectCommand(args) {
|
|
|
1854
1872
|
throw new Error("Workspace token is required. Use --login, --token <token>, LORE_WORKSPACE_TOKEN, or LORE_TOKEN.");
|
|
1855
1873
|
}
|
|
1856
1874
|
const result = await connectWithCredential({
|
|
1875
|
+
...(parsed.fallback === undefined ? {} : { fallback: parsed.fallback }),
|
|
1857
1876
|
apiUrl,
|
|
1858
1877
|
...(dashboardUrl === undefined ? {} : { dashboardUrl }),
|
|
1859
1878
|
token,
|
|
1860
1879
|
agents: parsed.agents,
|
|
1861
1880
|
...(parsed.timeoutMs === undefined ? {} : { timeoutMs: parsed.timeoutMs }),
|
|
1862
1881
|
});
|
|
1863
|
-
writeResult(result, parsed.json, `connected: ${result.agents.join(", ")}\napi_url: ${result.apiUrl}\nconfig: ${result.config}\n${result.warnings.map((warning) => `warning: ${warning}\n`).join("")}`);
|
|
1882
|
+
writeResult(result, parsed.json, `connected: ${result.agents.join(", ")}\napi_url: ${result.apiUrl}\nconfig: ${result.config}\n${result.recoveryNotice ? `${result.recoveryNotice}\n` : ""}${result.warnings.map((warning) => `warning: ${warning}\n`).join("")}`);
|
|
1864
1883
|
}
|
|
1865
1884
|
async function queueCount(paths) {
|
|
1866
1885
|
try {
|
|
@@ -2181,6 +2200,7 @@ async function disconnectCommand(args) {
|
|
|
2181
2200
|
return;
|
|
2182
2201
|
}
|
|
2183
2202
|
const paths = getLorePaths();
|
|
2203
|
+
await disableRecovery(paths.home);
|
|
2184
2204
|
const config = await readConnectorConfig(paths);
|
|
2185
2205
|
const now = new Date();
|
|
2186
2206
|
const changedHookFiles = [];
|
|
@@ -2517,6 +2537,20 @@ export async function runCli(args = process.argv.slice(2)) {
|
|
|
2517
2537
|
case "continue":
|
|
2518
2538
|
await runContinueCommand(commandArgs, await readConnectorConfig(getLorePaths()), getLorePaths());
|
|
2519
2539
|
return;
|
|
2540
|
+
case "run":
|
|
2541
|
+
await runWrappedAgent(commandArgs, getLorePaths(process.env.LORE_HOME));
|
|
2542
|
+
return;
|
|
2543
|
+
case "recovery":
|
|
2544
|
+
await runRecoveryCommand(commandArgs, getLorePaths(process.env.LORE_HOME));
|
|
2545
|
+
return;
|
|
2546
|
+
case "recovery-hook":
|
|
2547
|
+
{
|
|
2548
|
+
const agent = commandArgs.includes("--agent") ? commandArgs[commandArgs.indexOf("--agent") + 1] : "claude";
|
|
2549
|
+
if (!agent || !isRecoverySource(agent))
|
|
2550
|
+
throw new Error("Unknown recovery hook agent.");
|
|
2551
|
+
await runRecoveryHook(getLorePaths(process.env.LORE_HOME).home, agent);
|
|
2552
|
+
}
|
|
2553
|
+
return;
|
|
2520
2554
|
case "attach":
|
|
2521
2555
|
await runAttachCommand(commandArgs, await readConnectorConfig(getLorePaths()), getLorePaths());
|
|
2522
2556
|
return;
|