@damian87/omp 0.19.0 → 0.20.0
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/dist/src/cli.js +99 -10
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/models.d.ts +21 -0
- package/dist/src/commands/models.js +80 -0
- package/dist/src/commands/models.js.map +1 -0
- package/dist/src/commands/registry.js +2 -1
- package/dist/src/commands/registry.js.map +1 -1
- package/dist/src/copilot/doctor.d.ts +13 -0
- package/dist/src/copilot/doctor.js +43 -0
- package/dist/src/copilot/doctor.js.map +1 -1
- package/dist/src/copilot/models.d.ts +49 -0
- package/dist/src/copilot/models.js +67 -0
- package/dist/src/copilot/models.js.map +1 -0
- package/dist/src/copilot/paths.d.ts +3 -0
- package/dist/src/copilot/paths.js +1 -1
- package/dist/src/copilot/paths.js.map +1 -1
- package/dist/src/copilot/setup.d.ts +13 -1
- package/dist/src/copilot/setup.js +104 -6
- package/dist/src/copilot/setup.js.map +1 -1
- package/dist/src/council/engine.js +1 -5
- package/dist/src/council/engine.js.map +1 -1
- package/dist/src/council/persona.d.ts +14 -0
- package/dist/src/council/persona.js +45 -0
- package/dist/src/council/persona.js.map +1 -0
- package/dist/src/council/types.d.ts +8 -0
- package/dist/src/council/types.js +10 -1
- package/dist/src/council/types.js.map +1 -1
- package/dist/src/memory-review/config.d.ts +7 -0
- package/dist/src/memory-review/config.js +29 -0
- package/dist/src/memory-review/config.js.map +1 -1
- package/dist/src/memory-review/enable.d.ts +25 -0
- package/dist/src/memory-review/enable.js +106 -0
- package/dist/src/memory-review/enable.js.map +1 -0
- package/dist/src/memory-review/index.js +10 -0
- package/dist/src/memory-review/index.js.map +1 -1
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/scripts/lib/memory-review-trigger.mjs +18 -8
|
@@ -3,11 +3,7 @@ import { join } from "node:path";
|
|
|
3
3
|
import { loadCouncilConfig } from "./config.js";
|
|
4
4
|
import { buildMemberPrompt, parseMemberOutput } from "./prompts.js";
|
|
5
5
|
import { synthesize } from "./synth.js";
|
|
6
|
-
|
|
7
|
-
const UNAVAILABLE_SIGNATURE = /is not available/i;
|
|
8
|
-
function isUnavailable(res) {
|
|
9
|
-
return res.exitCode !== 0 && !res.timedOut && UNAVAILABLE_SIGNATURE.test(res.stderr);
|
|
10
|
-
}
|
|
6
|
+
import { isModelUnavailable as isUnavailable } from "./types.js";
|
|
11
7
|
/**
|
|
12
8
|
* Run `worker` over `items` with at most `limit` in flight. The slot is released
|
|
13
9
|
* in a finally block so a rejected/errored worker frees its slot too (otherwise
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/council/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAiC,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/council/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load a council member's persona definition from `<agentsDir>/<role>.md`,
|
|
3
|
+
* stripping the leading YAML frontmatter so only the instructional body is
|
|
4
|
+
* injected into the member prompt. Returns null when the file is absent or the
|
|
5
|
+
* role is not a safe bare filename — callers fall back to role-string-only
|
|
6
|
+
* prompting, preserving the pre-persona behaviour.
|
|
7
|
+
*
|
|
8
|
+
* Security: the persona body is injected verbatim into an LLM prompt, so a
|
|
9
|
+
* repo-controlled persona file must not be able to escape the agents dir. We
|
|
10
|
+
* reject non-bare roles AND verify the canonical (symlink-resolved) path stays
|
|
11
|
+
* inside the canonical agents dir and is a regular file — a `critic.md` symlink
|
|
12
|
+
* pointing at `~/.ssh/id_rsa` resolves outside and is refused.
|
|
13
|
+
*/
|
|
14
|
+
export declare function loadPersonaBody(role: string, agentsDir: string): string | null;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { lstatSync, readFileSync, realpathSync } from "node:fs";
|
|
2
|
+
import { join, sep } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Load a council member's persona definition from `<agentsDir>/<role>.md`,
|
|
5
|
+
* stripping the leading YAML frontmatter so only the instructional body is
|
|
6
|
+
* injected into the member prompt. Returns null when the file is absent or the
|
|
7
|
+
* role is not a safe bare filename — callers fall back to role-string-only
|
|
8
|
+
* prompting, preserving the pre-persona behaviour.
|
|
9
|
+
*
|
|
10
|
+
* Security: the persona body is injected verbatim into an LLM prompt, so a
|
|
11
|
+
* repo-controlled persona file must not be able to escape the agents dir. We
|
|
12
|
+
* reject non-bare roles AND verify the canonical (symlink-resolved) path stays
|
|
13
|
+
* inside the canonical agents dir and is a regular file — a `critic.md` symlink
|
|
14
|
+
* pointing at `~/.ssh/id_rsa` resolves outside and is refused.
|
|
15
|
+
*/
|
|
16
|
+
export function loadPersonaBody(role, agentsDir) {
|
|
17
|
+
// Only bare role names map to a persona file; reject traversal / nesting.
|
|
18
|
+
if (!/^[a-z0-9][a-z0-9_-]*$/i.test(role))
|
|
19
|
+
return null;
|
|
20
|
+
let realDir;
|
|
21
|
+
let realFile;
|
|
22
|
+
try {
|
|
23
|
+
realDir = realpathSync(agentsDir);
|
|
24
|
+
realFile = realpathSync(join(agentsDir, `${role}.md`));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null; // missing dir/file, or a broken symlink
|
|
28
|
+
}
|
|
29
|
+
// Containment: the resolved file must live directly inside the resolved dir,
|
|
30
|
+
// and be a regular file (not a dir / fifo / device).
|
|
31
|
+
if (realFile !== join(realDir, `${role}.md`) && !realFile.startsWith(realDir + sep)) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
if (!lstatSync(realFile).isFile())
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const raw = readFileSync(realFile, "utf8");
|
|
42
|
+
const body = raw.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, "").trim();
|
|
43
|
+
return body.length > 0 ? body : null;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=persona.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona.js","sourceRoot":"","sources":["../../../src/council/persona.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,SAAiB;IAC7D,0EAA0E;IAC1E,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtD,IAAI,OAAe,CAAC;IACpB,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAClC,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,wCAAwC;IACvD,CAAC;IAED,6EAA6E;IAC7E,qDAAqD;IACrD,IAAI,QAAQ,KAAK,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;QACpF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACvC,CAAC"}
|
|
@@ -91,6 +91,14 @@ export interface SpawnResponse {
|
|
|
91
91
|
}
|
|
92
92
|
/** Real impl spawns `copilot --model <model> -p <prompt>`; tests inject a fake. */
|
|
93
93
|
export type CouncilSpawn = (req: SpawnRequest) => Promise<SpawnResponse>;
|
|
94
|
+
/** stderr signature copilot emits when a --model slug is not entitled to the plan. */
|
|
95
|
+
export declare const UNAVAILABLE_SIGNATURE: RegExp;
|
|
96
|
+
/**
|
|
97
|
+
* True only for an entitlement failure (model not available to this plan), not a
|
|
98
|
+
* transient crash/timeout. Lives here (a leaf module) so both the council and
|
|
99
|
+
* the copilot model-probing utilities share one detector without a cycle.
|
|
100
|
+
*/
|
|
101
|
+
export declare function isModelUnavailable(res: SpawnResponse): boolean;
|
|
94
102
|
export interface CouncilDeps {
|
|
95
103
|
spawn: CouncilSpawn;
|
|
96
104
|
now?: () => number;
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
// Type contracts for the weighted-consensus model council.
|
|
2
2
|
// See docs/plans / .omc/plans/weighted-consensus.md for the authoritative design.
|
|
3
|
-
|
|
3
|
+
/** stderr signature copilot emits when a --model slug is not entitled to the plan. */
|
|
4
|
+
export const UNAVAILABLE_SIGNATURE = /is not available/i;
|
|
5
|
+
/**
|
|
6
|
+
* True only for an entitlement failure (model not available to this plan), not a
|
|
7
|
+
* transient crash/timeout. Lives here (a leaf module) so both the council and
|
|
8
|
+
* the copilot model-probing utilities share one detector without a cycle.
|
|
9
|
+
*/
|
|
10
|
+
export function isModelUnavailable(res) {
|
|
11
|
+
return res.exitCode !== 0 && !res.timedOut && UNAVAILABLE_SIGNATURE.test(res.stderr);
|
|
12
|
+
}
|
|
4
13
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/council/types.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,kFAAkF"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/council/types.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,kFAAkF;AA+GlF,sFAAsF;AACtF,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAkB;IACnD,OAAO,GAAG,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACvF,CAAC"}
|
|
@@ -20,3 +20,10 @@ export declare function readMemoryConfig(cwd: string, opts?: ReadConfigOptions):
|
|
|
20
20
|
/** Persist a single memory key, preserving all other keys in that file. Atomic.
|
|
21
21
|
* Writes the project file by default, or the global ~/.omp file with scope. */
|
|
22
22
|
export declare function setMemoryConfigValue(cwd: string, key: MemoryConfigKey, value: string, opts?: SetConfigOptions): void;
|
|
23
|
+
/** Remove a key from one scope's config file (atomic; no-op if absent). Used so
|
|
24
|
+
* a global `memory-mode` write isn't silently shadowed by a stale PROJECT key —
|
|
25
|
+
* readMemoryConfig merges project OVER global, so the project copy must go. */
|
|
26
|
+
export declare function unsetMemoryConfigValue(cwd: string, key: MemoryConfigKey, opts?: SetConfigOptions): void;
|
|
27
|
+
/** Persist several memory keys in ONE atomic read-modify-write, so enabling
|
|
28
|
+
* memory never leaves `memoryMode=on` paired with a stale model. */
|
|
29
|
+
export declare function setMemoryConfigValues(cwd: string, entries: Partial<Record<MemoryConfigKey, string>>, opts?: SetConfigOptions): void;
|
|
@@ -51,4 +51,33 @@ export function setMemoryConfigValue(cwd, key, value, opts = {}) {
|
|
|
51
51
|
writeFileSync(tmp, `${JSON.stringify(raw, null, 2)}\n`, "utf8");
|
|
52
52
|
renameSync(tmp, p);
|
|
53
53
|
}
|
|
54
|
+
/** Remove a key from one scope's config file (atomic; no-op if absent). Used so
|
|
55
|
+
* a global `memory-mode` write isn't silently shadowed by a stale PROJECT key —
|
|
56
|
+
* readMemoryConfig merges project OVER global, so the project copy must go. */
|
|
57
|
+
export function unsetMemoryConfigValue(cwd, key, opts = {}) {
|
|
58
|
+
const p = opts.scope === "global" ? globalConfigPath(opts.homeDir) : projectConfigPath(cwd);
|
|
59
|
+
if (!existsSync(p))
|
|
60
|
+
return;
|
|
61
|
+
const raw = readRawAt(p);
|
|
62
|
+
if (!(key in raw))
|
|
63
|
+
return;
|
|
64
|
+
delete raw[key];
|
|
65
|
+
const tmp = `${p}.tmp.${process.pid}.${Date.now()}`;
|
|
66
|
+
writeFileSync(tmp, `${JSON.stringify(raw, null, 2)}\n`, "utf8");
|
|
67
|
+
renameSync(tmp, p);
|
|
68
|
+
}
|
|
69
|
+
/** Persist several memory keys in ONE atomic read-modify-write, so enabling
|
|
70
|
+
* memory never leaves `memoryMode=on` paired with a stale model. */
|
|
71
|
+
export function setMemoryConfigValues(cwd, entries, opts = {}) {
|
|
72
|
+
const p = opts.scope === "global" ? globalConfigPath(opts.homeDir) : projectConfigPath(cwd);
|
|
73
|
+
const raw = readRawAt(p);
|
|
74
|
+
for (const [key, val] of Object.entries(entries)) {
|
|
75
|
+
if (val !== undefined)
|
|
76
|
+
raw[key] = val;
|
|
77
|
+
}
|
|
78
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
79
|
+
const tmp = `${p}.tmp.${process.pid}.${Date.now()}`;
|
|
80
|
+
writeFileSync(tmp, `${JSON.stringify(raw, null, 2)}\n`, "utf8");
|
|
81
|
+
renameSync(tmp, p);
|
|
82
|
+
}
|
|
54
83
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/memory-review/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/memory-review/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { CouncilSpawn } from "../council/types.js";
|
|
2
|
+
export interface EnableIO {
|
|
3
|
+
print(line: string): void;
|
|
4
|
+
/** One line of input, or undefined when non-interactive / stream closed. */
|
|
5
|
+
ask(prompt: string): Promise<string | undefined>;
|
|
6
|
+
}
|
|
7
|
+
export interface EnableMemoryOptions {
|
|
8
|
+
cwd: string;
|
|
9
|
+
homeDir?: string;
|
|
10
|
+
/** Show the model picker. Caller computes via isInteractive(json). */
|
|
11
|
+
interactive: boolean;
|
|
12
|
+
/** Probe the chosen model before saving. False under --no-validate. */
|
|
13
|
+
validate: boolean;
|
|
14
|
+
spawn: CouncilSpawn;
|
|
15
|
+
io: EnableIO;
|
|
16
|
+
/** From a `--model <slug>` flag; skips the prompt's default. */
|
|
17
|
+
explicitModel?: string;
|
|
18
|
+
probeTimeoutMs?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface EnableMemoryResult {
|
|
21
|
+
ok: boolean;
|
|
22
|
+
model?: string;
|
|
23
|
+
message: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function enableMemoryMode(opts: EnableMemoryOptions): Promise<EnableMemoryResult>;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive `omp config set memory-mode on` flow.
|
|
3
|
+
*
|
|
4
|
+
* Enabling memory review is the moment to make sure a usable model is
|
|
5
|
+
* configured — otherwise reviews fail silently every session (see index.ts).
|
|
6
|
+
* So we: (interactive) probe candidate models, show which the plan can actually
|
|
7
|
+
* run, prompt for a choice (default gpt-5-mini); validate the choice by probing;
|
|
8
|
+
* REJECT without saving if it's entitlement-unavailable; persist mode+model to
|
|
9
|
+
* the GLOBAL ~/.omp config (a user preference, like `git user.email`).
|
|
10
|
+
*
|
|
11
|
+
* All I/O and model probing is injected so this is unit-testable without a TTY
|
|
12
|
+
* or a real copilot subprocess.
|
|
13
|
+
*/
|
|
14
|
+
import { DEFAULT_PROBE_TIMEOUT_MS, KNOWN_MODEL_SLUGS, probeModel, probeModels, } from "../copilot/models.js";
|
|
15
|
+
import { DEFAULT_MEMBERS } from "../council/config.js";
|
|
16
|
+
import { readMemoryConfig, setMemoryConfigValues, unsetMemoryConfigValue, } from "./config.js";
|
|
17
|
+
/** Candidates to probe/offer: curated list + the configured model + council defaults. */
|
|
18
|
+
function candidateSlugs(configured) {
|
|
19
|
+
return Array.from(new Set([...KNOWN_MODEL_SLUGS, configured, ...DEFAULT_MEMBERS.map((m) => m.model)]));
|
|
20
|
+
}
|
|
21
|
+
export async function enableMemoryMode(opts) {
|
|
22
|
+
const { cwd, homeDir, interactive, validate, spawn, io } = opts;
|
|
23
|
+
const timeoutMs = opts.probeTimeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS;
|
|
24
|
+
const configured = readMemoryConfig(cwd, { homeDir }).memoryReviewModel; // gpt-5-mini by default
|
|
25
|
+
const candidates = candidateSlugs(configured);
|
|
26
|
+
// Default applied on an empty answer: an explicit --model, else the currently
|
|
27
|
+
// configured model (which itself defaults to gpt-5-mini). Pressing Enter must
|
|
28
|
+
// never silently switch the user off their configured model.
|
|
29
|
+
const def = opts.explicitModel ?? configured;
|
|
30
|
+
let chosen = def;
|
|
31
|
+
let probed;
|
|
32
|
+
if (interactive) {
|
|
33
|
+
let offered = candidates;
|
|
34
|
+
if (validate) {
|
|
35
|
+
io.print(`Probing ${candidates.length} model(s) — up to ~${Math.round(timeoutMs / 1000)}s each (copilot's headless mode is slow)…`);
|
|
36
|
+
probed = await probeModels(spawn, candidates, {
|
|
37
|
+
timeoutMs,
|
|
38
|
+
onProbe: (r, done, total) => {
|
|
39
|
+
const mark = r.status === "available" ? "✓" : r.status === "unavailable" ? "✗" : "?";
|
|
40
|
+
io.print(` [${done}/${total}] ${mark} ${r.model}`);
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
const available = probed.filter((r) => r.status === "available").map((r) => r.model);
|
|
44
|
+
const unavailable = probed.filter((r) => r.status === "unavailable").map((r) => r.model);
|
|
45
|
+
const unknown = probed.filter((r) => r.status === "unknown").map((r) => r.model);
|
|
46
|
+
offered = available;
|
|
47
|
+
if (available.length) {
|
|
48
|
+
io.print("Available models:");
|
|
49
|
+
available.forEach((m, i) => io.print(` ${i + 1}) ${m}`));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
io.print("(could not confirm any model — you can still type a slug)");
|
|
53
|
+
}
|
|
54
|
+
if (unavailable.length)
|
|
55
|
+
io.print(`Not available on your plan: ${unavailable.join(", ")}`);
|
|
56
|
+
if (unknown.length)
|
|
57
|
+
io.print(`Unverified: ${unknown.join(", ")}`);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
io.print("Candidate models:");
|
|
61
|
+
candidates.forEach((m, i) => io.print(` ${i + 1}) ${m}`));
|
|
62
|
+
}
|
|
63
|
+
const answer = ((await io.ask(`Review model [${def}]: `)) ?? "").trim();
|
|
64
|
+
if (!answer) {
|
|
65
|
+
chosen = def;
|
|
66
|
+
}
|
|
67
|
+
else if (/^\d+$/.test(answer)) {
|
|
68
|
+
const idx = Number(answer) - 1;
|
|
69
|
+
if (idx < 0 || idx >= offered.length) {
|
|
70
|
+
return {
|
|
71
|
+
ok: false,
|
|
72
|
+
message: `invalid selection '${answer}' — choose 1-${offered.length} or type a model slug`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
chosen = offered[idx];
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
chosen = answer;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (validate) {
|
|
82
|
+
// Reuse the picker's probe when we already have it; else probe just the pick.
|
|
83
|
+
const known = probed?.find((r) => r.model === chosen);
|
|
84
|
+
const status = known?.status ?? (await probeModel(spawn, chosen, timeoutMs)).status;
|
|
85
|
+
if (status === "unavailable") {
|
|
86
|
+
return {
|
|
87
|
+
ok: false,
|
|
88
|
+
message: `model '${chosen}' is not available — pick another (run: omp models)`,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (status === "unknown") {
|
|
92
|
+
// Offline / transient — can't prove it's bad, so don't block enabling.
|
|
93
|
+
io.print(`Warning: could not verify '${chosen}' (offline?) — saving anyway; run 'omp models' later.`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
setMemoryConfigValues(cwd, { memoryMode: "on", memoryReviewModel: chosen }, { scope: "global", homeDir });
|
|
97
|
+
// A stale PROJECT memoryMode would shadow the global write (project wins in the
|
|
98
|
+
// merge), silently defeating enable — drop it so global is authoritative.
|
|
99
|
+
unsetMemoryConfigValue(cwd, "memoryMode", { scope: "project" });
|
|
100
|
+
return {
|
|
101
|
+
ok: true,
|
|
102
|
+
model: chosen,
|
|
103
|
+
message: `memory-mode=on, review model=${chosen} (global ~/.omp)`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=enable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enable.js","sourceRoot":"","sources":["../../../src/memory-review/enable.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { appendFileSync, mkdirSync } from "node:fs";
|
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import { ompRoot } from "../omp-root.js";
|
|
4
4
|
import { appendCostRecord } from "../cost/ledger.js";
|
|
5
|
+
import { isModelUnavailable } from "../council/types.js";
|
|
5
6
|
import { readMemoryConfig } from "./config.js";
|
|
6
7
|
import { claimSession, releaseClaim } from "./guard.js";
|
|
7
8
|
import { isValidSessionId, readSessionTranscript } from "./transcript.js";
|
|
@@ -48,6 +49,15 @@ export async function runMemoryReview(options) {
|
|
|
48
49
|
const prompt = buildReviewPrompt(messages);
|
|
49
50
|
const timeoutMs = options.timeoutMs ?? 90_000;
|
|
50
51
|
const res = await options.spawn({ model, prompt, timeoutMs });
|
|
52
|
+
// An unavailable model is a permanent config error, not a transient failure:
|
|
53
|
+
// surface an actionable fix instead of the generic message below. Detached
|
|
54
|
+
// sessionEnd reviews would otherwise fail this way silently every session.
|
|
55
|
+
if (isModelUnavailable(res)) {
|
|
56
|
+
releaseClaim(cwd, sessionId);
|
|
57
|
+
const reason = `review model '${model}' not available — run: omp config set memory-review-model <slug>`;
|
|
58
|
+
logLine(cwd, { sessionId, ran: false, reason, model });
|
|
59
|
+
return { ran: false, reason };
|
|
60
|
+
}
|
|
51
61
|
if (res.exitCode !== 0 || res.timedOut) {
|
|
52
62
|
// Nothing was written — release the claim so the session can be retried.
|
|
53
63
|
releaseClaim(cwd, sessionId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/memory-review/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/memory-review/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAA0B,MAAM,iBAAiB,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAC;AAsB5D,SAAS,OAAO,CAAC,GAAW,EAAE,OAAgC;IAC5D,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACnE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,cAAc,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAA+B;IAE/B,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACnC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACjF,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAC/D,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAEtF,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACpD,CAAC;IACD,6EAA6E;IAC7E,qEAAqE;IACrE,IAAI,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,uBAAuB,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC,CAAC;QAChF,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;IAChE,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAEpF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,iBAAiB,CAAC;IACxD,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAE9C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9D,6EAA6E;IAC7E,2EAA2E;IAC3E,2EAA2E;IAC3E,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,iBAAiB,KAAK,kEAAkE,CAAC;QACxG,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChC,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACvC,yEAAyE;QACzE,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,6BAA6B,GAAG,CAAC,QAAQ,cAAc,GAAG,CAAC,QAAQ,GAAG,CAAC;QACtF,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChC,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC,CAAC;QAC7E,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAEzC,0EAA0E;IAC1E,6EAA6E;IAC7E,IAAI,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;YAC7E,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,GAAG,EAAE;QACpB,SAAS;QACT,KAAK,EAAE,eAAe;QACtB,KAAK;QACL,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,IAAI,EAAE,SAAS,OAAO,CAAC,UAAU,WAAW,OAAO,CAAC,aAAa,CAAC,MAAM,qBAAqB,OAAO,CAAC,gBAAgB,EAAE;KACxH,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@damian87/omp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"description": "Multi-agent orchestration for GitHub Copilot CLI — autonomous loops (Autopilot, Ralph, UltraQA, Ultrawork), parallel tmux agent teams, a weighted-consensus model council, a Slack chat bridge, durable scheduled jobs, and in-session skills + custom agents. Zero learning curve.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oh-my-copilot",
|
|
3
3
|
"description": "Multi-agent orchestration skills for GitHub Copilot CLI — autopilot, ralph, ultrawork, ultraqa, team, council, code-review and more as in-session slash skills + custom agents.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.20.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Damian Borek",
|
|
7
7
|
"email": "borekdamian@yahoo.pl"
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { spawn as nodeSpawn } from "node:child_process";
|
|
2
2
|
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
3
4
|
import { fileURLToPath } from "node:url";
|
|
4
5
|
import { dirname, join } from "node:path";
|
|
5
6
|
import { ompRoot } from "./omp-root.mjs";
|
|
@@ -9,20 +10,29 @@ import { ompRoot } from "./omp-root.mjs";
|
|
|
9
10
|
// downstream claim guard de-dupes against the wrapper fallback. Fail-open:
|
|
10
11
|
// any error means "don't trigger", never throw into the hook.
|
|
11
12
|
|
|
12
|
-
function
|
|
13
|
-
const env = process.env.OMP_MEMORY_MODE;
|
|
14
|
-
if (env === "on") return "on";
|
|
15
|
-
if (env === "off") return "off";
|
|
13
|
+
function readModeFrom(p) {
|
|
16
14
|
try {
|
|
17
|
-
|
|
18
|
-
if (!existsSync(p)) return "off";
|
|
15
|
+
if (!existsSync(p)) return undefined;
|
|
19
16
|
const raw = JSON.parse(readFileSync(p, "utf8"));
|
|
20
|
-
return raw && raw.memoryMode === "on"
|
|
17
|
+
return raw && (raw.memoryMode === "on" || raw.memoryMode === "off") ? raw.memoryMode : undefined;
|
|
21
18
|
} catch {
|
|
22
|
-
return
|
|
19
|
+
return undefined;
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
22
|
|
|
23
|
+
// Precedence mirrors readMemoryConfig (TS): OMP_MEMORY_MODE env > project
|
|
24
|
+
// .omp/config.json > GLOBAL ~/.omp/config.json. The global fallback is essential
|
|
25
|
+
// — `omp config set memory-mode on` writes GLOBAL, so without it the hook would
|
|
26
|
+
// never trigger for a globally-enabled (but project-unset) memory mode.
|
|
27
|
+
function readMemoryMode(cwd) {
|
|
28
|
+
const env = process.env.OMP_MEMORY_MODE;
|
|
29
|
+
if (env === "on" || env === "off") return env;
|
|
30
|
+
const projectMode = readModeFrom(join(ompRoot(cwd), ".omp", "config.json"));
|
|
31
|
+
if (projectMode) return projectMode;
|
|
32
|
+
const home = process.env.OMP_HOME_OVERRIDE || homedir();
|
|
33
|
+
return readModeFrom(join(home, ".omp", "config.json")) ?? "off";
|
|
34
|
+
}
|
|
35
|
+
|
|
26
36
|
function defaultDistPath() {
|
|
27
37
|
// scripts/lib/ -> packageRoot/dist/src/cli.js (present in the npm package and
|
|
28
38
|
// dev builds, but NOT in a plugin installed from GitHub — dist is gitignored).
|