@damian87/omp 0.19.0 → 0.20.1
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 +3 -0
- package/dist/src/cli.js +113 -11
- 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 +8 -2
- package/dist/src/copilot/paths.js.map +1 -1
- package/dist/src/copilot/setup.d.ts +16 -1
- package/dist/src/copilot/setup.js +109 -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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { copyFileSync, existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { dirname, join, relative } from "node:path";
|
|
3
3
|
import { resolveCopilotPaths } from "./paths.js";
|
|
4
4
|
const COPILOT_INSTRUCTIONS_TEMPLATE = `# oh-my-copilot
|
|
@@ -29,7 +29,15 @@ next attempt. Prefer bounded summaries for large logs. Oversized postToolUse out
|
|
|
29
29
|
minimized before it re-enters model context, with raw output preserved on disk and savings
|
|
30
30
|
recorded in the cost ledger. Budget gates and retry-cost guidance are not current live behavior.
|
|
31
31
|
`;
|
|
32
|
-
function
|
|
32
|
+
function filesEqual(a, b) {
|
|
33
|
+
try {
|
|
34
|
+
return readFileSync(a, "utf8") === readFileSync(b, "utf8");
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function copyDirRecursive(source, target, actions, dryRun, force) {
|
|
33
41
|
if (!existsSync(source)) {
|
|
34
42
|
actions.push({ source, target, kind: "skip-source-missing" });
|
|
35
43
|
return;
|
|
@@ -40,11 +48,25 @@ function copyDirRecursive(source, target, actions, dryRun) {
|
|
|
40
48
|
const sPath = join(source, entry.name);
|
|
41
49
|
const tPath = join(target, entry.name);
|
|
42
50
|
if (entry.isDirectory()) {
|
|
43
|
-
copyDirRecursive(sPath, tPath, actions, dryRun);
|
|
51
|
+
copyDirRecursive(sPath, tPath, actions, dryRun, force);
|
|
44
52
|
}
|
|
45
53
|
else if (entry.isFile()) {
|
|
46
54
|
if (existsSync(tPath)) {
|
|
47
|
-
|
|
55
|
+
// Identical → always skip. Differs → skip unless forced (the CLI offers
|
|
56
|
+
// an override prompt), so updated bundled skills can actually propagate.
|
|
57
|
+
if (filesEqual(sPath, tPath)) {
|
|
58
|
+
actions.push({ source: sPath, target: tPath, kind: "skip-exists" });
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (!force) {
|
|
62
|
+
actions.push({ source: sPath, target: tPath, kind: "skip-changed" });
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (!dryRun) {
|
|
66
|
+
mkdirSync(dirname(tPath), { recursive: true });
|
|
67
|
+
copyFileSync(sPath, tPath);
|
|
68
|
+
}
|
|
69
|
+
actions.push({ source: sPath, target: tPath, kind: "update" });
|
|
48
70
|
continue;
|
|
49
71
|
}
|
|
50
72
|
if (!dryRun) {
|
|
@@ -75,21 +97,98 @@ function ensureDir(target, actions, dryRun) {
|
|
|
75
97
|
mkdirSync(target, { recursive: true });
|
|
76
98
|
actions.push({ source: "(dir)", target, kind: "create" });
|
|
77
99
|
}
|
|
100
|
+
// Copilot only loads hooks from user (`~/.copilot/hooks/*.json`) or project
|
|
101
|
+
// (`.github/hooks/*.json`) locations — NOT from a plugin's own hooks/hooks.json.
|
|
102
|
+
// So omp's lifecycle hooks (sessionEnd → memory-review, cost ledger, etc.) never
|
|
103
|
+
// fire until we install them into one of those locations (this is how Orca's
|
|
104
|
+
// orca.json works). The file is machine-local (absolute node script paths), so
|
|
105
|
+
// it always goes to the user location regardless of skills/agents scope.
|
|
106
|
+
const HOOK_FILE_NAME = "omp.json";
|
|
107
|
+
/** Pin the plugin root for a hook command. The bundled hooks.json resolves its
|
|
108
|
+
* script dir from `${COPILOT_PLUGIN_ROOT:-…}`, but copilot does NOT set that var
|
|
109
|
+
* for user/project hook files (only for plugin-context hooks). We `export` the
|
|
110
|
+
* vars as a SEPARATE statement first: an assignment prefix on the same simple
|
|
111
|
+
* command (`VAR=x node "${VAR:-…}"`) is NOT visible to that command's own
|
|
112
|
+
* parameter expansion, so it must be exported before the command runs. */
|
|
113
|
+
function pinPluginRoot(bash, pluginRoot) {
|
|
114
|
+
const esc = pluginRoot.replace(/'/g, "'\\''");
|
|
115
|
+
return `export COPILOT_PLUGIN_ROOT='${esc}' OMP_PLUGIN_ROOT='${esc}'; ${bash}`;
|
|
116
|
+
}
|
|
117
|
+
function installHooks(paths, dryRun, actions) {
|
|
118
|
+
const source = paths.hooksManifest;
|
|
119
|
+
if (!existsSync(source)) {
|
|
120
|
+
actions.push({ source, target: HOOK_FILE_NAME, kind: "skip-source-missing" });
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
let manifest;
|
|
124
|
+
try {
|
|
125
|
+
manifest = JSON.parse(readFileSync(source, "utf8"));
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Present but unparseable — surface it rather than masking as "missing".
|
|
129
|
+
actions.push({ source, target: HOOK_FILE_NAME, kind: "skip-source-invalid" });
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const hooks = manifest.hooks;
|
|
133
|
+
if (!hooks || typeof hooks !== "object") {
|
|
134
|
+
actions.push({ source, target: HOOK_FILE_NAME, kind: "skip-source-invalid" });
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// Rewrite every command's bash to pin the absolute plugin root.
|
|
138
|
+
for (const handlers of Object.values(hooks)) {
|
|
139
|
+
if (!Array.isArray(handlers))
|
|
140
|
+
continue;
|
|
141
|
+
for (const handler of handlers) {
|
|
142
|
+
if (handler && typeof handler === "object" && typeof handler.bash === "string") {
|
|
143
|
+
const h = handler;
|
|
144
|
+
h.bash = pinPluginRoot(h.bash, paths.pluginRoot);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const target = join(paths.userScope, "hooks", HOOK_FILE_NAME);
|
|
149
|
+
// Managed, generated file — refresh on every setup so updated script paths /
|
|
150
|
+
// new events propagate (unlike copied skills, which we never clobber).
|
|
151
|
+
const kind = existsSync(target) ? "update" : "create";
|
|
152
|
+
if (!dryRun) {
|
|
153
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
154
|
+
const tmp = `${target}.tmp.${process.pid}.${Date.now()}`;
|
|
155
|
+
writeFileSync(tmp, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
156
|
+
renameSync(tmp, target);
|
|
157
|
+
}
|
|
158
|
+
actions.push({ source, target, kind });
|
|
159
|
+
}
|
|
160
|
+
/** Absolute path of the user-level hook file omp installs/refreshes. Lets callers
|
|
161
|
+
* (e.g. bare-launch first-run setup) cheaply check "are hooks installed?". */
|
|
162
|
+
export function userHookPath(options = {}) {
|
|
163
|
+
return join(resolveCopilotPaths(options).userScope, "hooks", HOOK_FILE_NAME);
|
|
164
|
+
}
|
|
165
|
+
/** Install just the user-level hooks (the piece copilot won't load from the
|
|
166
|
+
* plugin dir). Used by `omp update` to refresh hooks after a self-update without
|
|
167
|
+
* scaffolding the current project's .github (skills/agents ship via the
|
|
168
|
+
* marketplace plugin). Idempotent. */
|
|
169
|
+
export function installUserHooks(options = {}) {
|
|
170
|
+
const paths = resolveCopilotPaths(options);
|
|
171
|
+
const actions = [];
|
|
172
|
+
installHooks(paths, Boolean(options.dryRun), actions);
|
|
173
|
+
return { actions, paths };
|
|
174
|
+
}
|
|
78
175
|
export function runSetup(options = {}) {
|
|
79
176
|
const paths = resolveCopilotPaths(options);
|
|
80
177
|
const dryRun = Boolean(options.dryRun);
|
|
178
|
+
const force = Boolean(options.force);
|
|
81
179
|
const scope = options.scope ?? "project";
|
|
82
180
|
const actions = [];
|
|
83
181
|
const bundleSkills = join(paths.pluginRoot, ".github", "skills");
|
|
84
182
|
if (relative(bundleSkills, paths.projectScopeSkills) !== "") {
|
|
85
|
-
copyDirRecursive(bundleSkills, paths.projectScopeSkills, actions, dryRun);
|
|
183
|
+
copyDirRecursive(bundleSkills, paths.projectScopeSkills, actions, dryRun, force);
|
|
86
184
|
}
|
|
87
185
|
const bundleAgents = join(paths.pluginRoot, ".github", "agents");
|
|
88
186
|
if (relative(bundleAgents, paths.projectScopeAgents) !== "") {
|
|
89
|
-
copyDirRecursive(bundleAgents, paths.projectScopeAgents, actions, dryRun);
|
|
187
|
+
copyDirRecursive(bundleAgents, paths.projectScopeAgents, actions, dryRun, force);
|
|
90
188
|
}
|
|
91
189
|
ensureFile(paths.copilotInstructions, COPILOT_INSTRUCTIONS_TEMPLATE, actions, dryRun);
|
|
92
190
|
ensureDir(paths.stateDir, actions, dryRun);
|
|
191
|
+
installHooks(paths, dryRun, actions);
|
|
93
192
|
return { ok: true, dryRun, scope, actions, paths };
|
|
94
193
|
}
|
|
95
194
|
export function formatSetup(result) {
|
|
@@ -98,6 +197,10 @@ export function formatSetup(result) {
|
|
|
98
197
|
for (const action of result.actions) {
|
|
99
198
|
lines.push(` [${action.kind}] ${action.target}`);
|
|
100
199
|
}
|
|
200
|
+
const changed = result.actions.filter((a) => a.kind === "skip-changed").length;
|
|
201
|
+
if (changed > 0) {
|
|
202
|
+
lines.push(`${changed} bundled file(s) differ from your local copies — re-run with --force to override.`);
|
|
203
|
+
}
|
|
101
204
|
return lines.join("\n");
|
|
102
205
|
}
|
|
103
206
|
//# sourceMappingURL=setup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/copilot/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/copilot/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAWzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AACjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAoBtC,SAAS,iBAAiB,CAAC,GAAW;IACpC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB;IACxC,2EAA2E;IAC3E,4EAA4E;IAC5E,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,EAAE,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACjD,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,OAA0B,EAAE;IACxE,qCAAqC;IACrC,MAAM,GAAG,GAAG,EAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAEnG,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC5C,MAAM,UAAU,GACd,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK;QACnC,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,GAAG,CAAC,UAAU,KAAK,IAAI;YACvB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,KAAK,CAAC;IACd,MAAM,iBAAiB,GACrB,OAAO,GAAG,CAAC,iBAAiB,KAAK,QAAQ,IAAI,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE;QACvE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE;QAC9B,CAAC,CAAC,oBAAoB,CAAC;IAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACtD,MAAM,uBAAuB,GAC3B,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC9F,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,CAAC;AACpE,CAAC;AAED;gFACgF;AAChF,MAAM,UAAU,oBAAoB,CAClC,GAAW,EACX,GAAoB,EACpB,KAAa,EACb,OAAyB,EAAE;IAE3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC5F,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACzB,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACjB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACpD,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChE,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACrB,CAAC"}
|
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@damian87/omp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.1",
|
|
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.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Damian Borek",
|
|
7
7
|
"email": "borekdamian@yahoo.pl"
|