@opvs-ai/cli 0.23.0 → 0.25.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.
Files changed (45) hide show
  1. package/README.md +73 -0
  2. package/claude-plugin/.claude-plugin/marketplace.json +14 -0
  3. package/claude-plugin/.claude-plugin/plugin.json +9 -0
  4. package/claude-plugin/.mcp.json +8 -0
  5. package/claude-plugin/README.md +24 -0
  6. package/claude-plugin/hooks/hooks.json +50 -0
  7. package/claude-plugin/skills/remember/SKILL.md +31 -0
  8. package/claude-plugin/skills/remember/scripts/remember.mjs +121 -0
  9. package/dist/.build-stamp.json +4 -4
  10. package/dist/commands/code-graph.d.ts +17 -0
  11. package/dist/commands/code-graph.js +64 -0
  12. package/dist/commands/code-graph.js.map +1 -0
  13. package/dist/commands/code.d.ts +13 -3
  14. package/dist/commands/code.js +191 -3
  15. package/dist/commands/code.js.map +1 -1
  16. package/dist/commands/memory-capture.d.ts +76 -0
  17. package/dist/commands/memory-capture.js +592 -0
  18. package/dist/commands/memory-capture.js.map +1 -0
  19. package/dist/commands/memory-hook.d.ts +1 -0
  20. package/dist/commands/memory-hook.js +35 -11
  21. package/dist/commands/memory-hook.js.map +1 -1
  22. package/dist/commands/memory-install.d.ts +17 -0
  23. package/dist/commands/memory-install.js +349 -0
  24. package/dist/commands/memory-install.js.map +1 -0
  25. package/dist/commands/memory-lessons.d.ts +8 -0
  26. package/dist/commands/memory-lessons.js +135 -0
  27. package/dist/commands/memory-lessons.js.map +1 -0
  28. package/dist/commands/memory.d.ts +1 -9
  29. package/dist/commands/memory.js +17 -85
  30. package/dist/commands/memory.js.map +1 -1
  31. package/dist/commands/orgChart.d.ts +3 -0
  32. package/dist/commands/orgChart.js +88 -0
  33. package/dist/commands/orgChart.js.map +1 -0
  34. package/dist/commands/tasks.js +45 -3
  35. package/dist/commands/tasks.js.map +1 -1
  36. package/dist/index.js +4 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/lib/redact.d.ts +16 -0
  39. package/dist/lib/redact.js +120 -0
  40. package/dist/lib/redact.js.map +1 -0
  41. package/memory-services.d.ts +9 -0
  42. package/memory-services.js +118 -0
  43. package/package.json +5 -1
  44. package/runtime-plugins/cline/opvs-memory.ts +99 -0
  45. package/runtime-plugins/opencode/opvs-memory.ts +94 -0
@@ -0,0 +1,592 @@
1
+ /** Opt-in, local-first session capture for supported coding runtimes. */
2
+ import { createHash } from "node:crypto";
3
+ import { chmodSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync, } from "node:fs";
4
+ import { homedir } from "node:os";
5
+ import { basename, dirname, join } from "node:path";
6
+ import { createInterface } from "node:readline/promises";
7
+ import { getConfigPath, getEffectiveConfig } from "@opvs-ai/core";
8
+ import { sanitizeAllowed, } from "../lib/redact.js";
9
+ const INGEST_SCOPE = "memory:ingest";
10
+ const STATE_VERSION = 1;
11
+ const MAX_STDIN_BYTES = 2 * 1024 * 1024;
12
+ const MAX_INGEST_EVENTS = 500;
13
+ const CAPTURE_TIMEOUT_MS = 10_000;
14
+ function statePath() {
15
+ return join(dirname(getConfigPath()), "memory-capture.json");
16
+ }
17
+ export function loadCaptureState() {
18
+ try {
19
+ const parsed = JSON.parse(readFileSync(statePath(), "utf8"));
20
+ if (parsed.version !== STATE_VERSION ||
21
+ parsed.enabled !== true ||
22
+ typeof parsed.token !== "string" ||
23
+ !parsed.token ||
24
+ typeof parsed.api_url !== "string") {
25
+ return null;
26
+ }
27
+ return {
28
+ version: STATE_VERSION,
29
+ enabled: true,
30
+ token: parsed.token,
31
+ api_url: parsed.api_url,
32
+ brand_id: typeof parsed.brand_id === "number" ? parsed.brand_id : null,
33
+ codex_files: parsed.codex_files ?? {},
34
+ };
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ export function saveCaptureState(state) {
41
+ const path = statePath();
42
+ mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
43
+ writeFileSync(path, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 });
44
+ chmodSync(path, 0o600);
45
+ }
46
+ function removeCaptureState() {
47
+ rmSync(statePath(), { force: true });
48
+ }
49
+ export function disableCapture() {
50
+ removeCaptureState();
51
+ }
52
+ export function deterministicEventId(runtime, sessionId, eventIndex, rawLine) {
53
+ return createHash("sha256")
54
+ .update(runtime)
55
+ .update("\0")
56
+ .update(sessionId)
57
+ .update("\0")
58
+ .update(String(eventIndex))
59
+ .update("\0")
60
+ .update(rawLine)
61
+ .digest("hex");
62
+ }
63
+ function stableIndex(rawLine, supplied) {
64
+ if (typeof supplied === "number" && Number.isSafeInteger(supplied) && supplied >= 0) {
65
+ return supplied;
66
+ }
67
+ return Number.parseInt(createHash("sha256").update(rawLine).digest("hex").slice(0, 12), 16);
68
+ }
69
+ function event(runtime, sessionId, index, rawLine, kind, fidelity, allowlisted, timestamp, redact) {
70
+ const cleaned = sanitizeAllowed(allowlisted, redact);
71
+ return {
72
+ id: deterministicEventId(runtime, sessionId, index, rawLine),
73
+ kind,
74
+ index,
75
+ fidelity,
76
+ content_state: cleaned.contentState,
77
+ ...(typeof timestamp === "string" ? { timestamp } : {}),
78
+ data: cleaned.value,
79
+ };
80
+ }
81
+ function asObject(value) {
82
+ return value && typeof value === "object" && !Array.isArray(value)
83
+ ? value
84
+ : {};
85
+ }
86
+ /** Map one Claude hook input. No field not named here can leave the machine. */
87
+ export function buildClaudeEvents(hook, input, options = {}) {
88
+ const rawLine = options.rawLine ?? JSON.stringify(input);
89
+ const redact = options.redact !== false;
90
+ const sessionId = typeof input.session_id === "string" && input.session_id
91
+ ? input.session_id
92
+ : "unknown";
93
+ const baseIndex = stableIndex(rawLine, input.event_index);
94
+ const timestamp = input.timestamp;
95
+ let events;
96
+ if (hook === "post-tool") {
97
+ const common = {
98
+ tool_name: typeof input.tool_name === "string" ? input.tool_name : "unknown",
99
+ tool_use_id: typeof input.tool_use_id === "string" ? input.tool_use_id : undefined,
100
+ };
101
+ events = [
102
+ event("claude_code", sessionId, baseIndex * 2, rawLine, "action", "seen", { ...common, tool_input: input.tool_input ?? {} }, timestamp, redact),
103
+ event("claude_code", sessionId, baseIndex * 2 + 1, rawLine, "observation", "seen", { ...common, tool_response: input.tool_response ?? {} }, timestamp, redact),
104
+ ];
105
+ }
106
+ else if (hook === "stop") {
107
+ events = [
108
+ event("claude_code", sessionId, baseIndex, rawLine, "message", "seen", {
109
+ role: "assistant",
110
+ content: typeof input.last_assistant_message === "string"
111
+ ? input.last_assistant_message
112
+ : "",
113
+ }, timestamp, redact),
114
+ ];
115
+ }
116
+ else {
117
+ events = [
118
+ event("claude_code", sessionId, baseIndex, rawLine, "session.completed", "seen", { reason: typeof input.reason === "string" ? input.reason : "other" }, timestamp, redact),
119
+ ];
120
+ }
121
+ return { runtime: "claude_code", session_id: sessionId, events };
122
+ }
123
+ function presentFields(input, fields) {
124
+ return Object.fromEntries(fields.flatMap((field) => (Object.prototype.hasOwnProperty.call(input, field) ? [[field, input[field]]] : [])));
125
+ }
126
+ /** Map Cursor hook input conservatively; every semantic mapping is inferred. */
127
+ export function buildCursorEvents(hook, input, options = {}) {
128
+ const sessionId = typeof input.conversation_id === "string" && input.conversation_id
129
+ ? input.conversation_id
130
+ : null;
131
+ if (!sessionId)
132
+ return null;
133
+ const expectedEvent = {
134
+ "post-tool": "postToolUse",
135
+ stop: "stop",
136
+ "session-end": "sessionEnd",
137
+ }[hook];
138
+ if (typeof input.hook_event_name === "string" && input.hook_event_name !== expectedEvent) {
139
+ return null;
140
+ }
141
+ const rawLine = options.rawLine ?? JSON.stringify(input);
142
+ const redact = options.redact !== false;
143
+ const baseIndex = stableIndex(rawLine, input.event_index);
144
+ const timestamp = input.timestamp;
145
+ let events;
146
+ if (hook === "post-tool") {
147
+ const tool = presentFields(input, ["tool_name"]);
148
+ events = [
149
+ event("cursor", sessionId, baseIndex * 2, rawLine, "action", "guessed", { ...tool, ...presentFields(input, ["tool_input"]) }, timestamp, redact),
150
+ event("cursor", sessionId, baseIndex * 2 + 1, rawLine, "observation", "guessed", {
151
+ ...tool,
152
+ ...(Object.prototype.hasOwnProperty.call(input, "tool_output")
153
+ ? { tool_response: input.tool_output }
154
+ : {}),
155
+ }, timestamp, redact),
156
+ ];
157
+ }
158
+ else if (hook === "stop") {
159
+ const content = firstString([input], ["last_assistant_message", "assistant_message", "assistantMessage", "assistant_text", "assistantText"]);
160
+ events = content
161
+ ? [event("cursor", sessionId, baseIndex, rawLine, "message", "guessed", { role: "assistant", content }, timestamp, redact)]
162
+ : [];
163
+ }
164
+ else {
165
+ events = [
166
+ event("cursor", sessionId, baseIndex, rawLine, "session.completed", "guessed", presentFields(input, ["reason"]), timestamp, redact),
167
+ ];
168
+ }
169
+ return { runtime: "cursor", session_id: sessionId, events };
170
+ }
171
+ function firstValue(input, fields) {
172
+ for (const field of fields) {
173
+ if (Object.prototype.hasOwnProperty.call(input, field))
174
+ return input[field];
175
+ }
176
+ return undefined;
177
+ }
178
+ function firstString(inputs, fields) {
179
+ for (const input of inputs) {
180
+ for (const field of fields) {
181
+ const value = input[field];
182
+ if (typeof value === "string" && value)
183
+ return value;
184
+ }
185
+ }
186
+ return null;
187
+ }
188
+ /** Map an OpenCode or Cline hook conservatively; their semantics are inferred. */
189
+ export function buildPluginRuntimeEvent(runtime, hook, input, options = {}) {
190
+ const properties = asObject(input.properties);
191
+ const context = asObject(input.context);
192
+ const sessionId = runtime === "opencode"
193
+ ? firstString([input, properties], ["sessionID"])
194
+ : firstString([input, context], ["taskId", "taskID", "runId", "runID"]);
195
+ if (!sessionId)
196
+ return null;
197
+ const rawLine = options.rawLine ?? JSON.stringify(input);
198
+ const redact = options.redact !== false;
199
+ const index = stableIndex(rawLine, input.event_index);
200
+ const timestamp = firstValue(input, ["timestamp", "time"]);
201
+ const toolName = firstValue(input, ["tool", "toolName", "tool_name"]);
202
+ const toolUseId = firstValue(input, ["callID", "callId", "toolUseId", "tool_use_id"]);
203
+ const toolInput = firstValue(input, ["args", "input", "toolInput", "tool_input"]);
204
+ const toolOutput = firstValue(input, ["output", "result", "toolOutput", "tool_response"]);
205
+ let events;
206
+ if (hook === "post-tool") {
207
+ const common = {
208
+ ...(typeof toolName === "string" ? { tool_name: toolName } : {}),
209
+ ...(typeof toolUseId === "string" ? { tool_use_id: toolUseId } : {}),
210
+ };
211
+ events = [
212
+ event(runtime, sessionId, index * 2, rawLine, "action", "guessed", { ...common, ...(toolInput !== undefined ? { tool_input: toolInput } : {}) }, timestamp, redact),
213
+ event(runtime, sessionId, index * 2 + 1, rawLine, "observation", "guessed", { ...common, ...(toolOutput !== undefined ? { tool_response: toolOutput } : {}) }, timestamp, redact),
214
+ ];
215
+ }
216
+ else if (hook === "stop") {
217
+ const content = firstString([input, properties, context], ["last_assistant_message", "assistant_message", "assistantMessage", "assistant_text", "assistantText"]);
218
+ events = content
219
+ ? [event(runtime, sessionId, index, rawLine, "message", "guessed", { role: "assistant", content }, timestamp, redact)]
220
+ : [];
221
+ }
222
+ else {
223
+ events = [event(runtime, sessionId, index, rawLine, "session.completed", "guessed", {
224
+ reason: typeof input.reason === "string"
225
+ ? input.reason
226
+ : typeof input.type === "string" ? input.type : "other",
227
+ }, timestamp, redact)];
228
+ }
229
+ return {
230
+ runtime,
231
+ session_id: sessionId,
232
+ events,
233
+ };
234
+ }
235
+ function textParts(content) {
236
+ if (typeof content === "string")
237
+ return content;
238
+ if (!Array.isArray(content))
239
+ return "";
240
+ return content
241
+ .flatMap((part) => {
242
+ const obj = asObject(part);
243
+ const type = obj.type;
244
+ if (type === "input_text" || type === "output_text" || type === "text") {
245
+ return typeof obj.text === "string" ? [obj.text] : [];
246
+ }
247
+ return [];
248
+ })
249
+ .join("\n");
250
+ }
251
+ /** Map one Codex session JSONL line using only documented message/tool fields. */
252
+ export function buildCodexEvent(sessionId, lineIndex, rawLine, redact = true) {
253
+ let parsed;
254
+ try {
255
+ parsed = asObject(JSON.parse(rawLine));
256
+ }
257
+ catch {
258
+ return null;
259
+ }
260
+ const payload = asObject(parsed.payload);
261
+ const outerType = typeof parsed.type === "string" ? parsed.type : "";
262
+ const innerType = typeof payload.type === "string" ? payload.type : outerType;
263
+ const timestamp = parsed.timestamp ?? payload.timestamp;
264
+ if (outerType === "session_meta") {
265
+ return event("codex", sessionId, lineIndex, rawLine, "session.started", "seen", {
266
+ runtime: "codex",
267
+ model: typeof payload.model === "string" ? payload.model : undefined,
268
+ }, timestamp, redact);
269
+ }
270
+ if (innerType === "function_call" || innerType === "custom_tool_call") {
271
+ return event("codex", sessionId, lineIndex, rawLine, "action", "seen", {
272
+ tool_name: typeof payload.name === "string" ? payload.name : "unknown",
273
+ tool_use_id: payload.call_id,
274
+ tool_input: payload.arguments ?? payload.input ?? {},
275
+ }, timestamp, redact);
276
+ }
277
+ if (innerType === "function_call_output" || innerType === "custom_tool_call_output") {
278
+ return event("codex", sessionId, lineIndex, rawLine, "observation", "seen", {
279
+ tool_use_id: payload.call_id,
280
+ tool_response: payload.output ?? "",
281
+ }, timestamp, redact);
282
+ }
283
+ if (innerType === "error" || outerType === "error") {
284
+ return event("codex", sessionId, lineIndex, rawLine, "error", "seen", { message: payload.message ?? parsed.message ?? "Codex session error" }, timestamp, redact);
285
+ }
286
+ if (innerType === "turn_aborted" || innerType === "task_complete") {
287
+ return event("codex", sessionId, lineIndex, rawLine, "session.completed", "guessed", { reason: innerType }, timestamp, redact);
288
+ }
289
+ const role = typeof payload.role === "string"
290
+ ? payload.role
291
+ : innerType === "agent_message" ? "assistant" : "unknown";
292
+ const content = textParts(payload.content) ||
293
+ (typeof payload.message === "string" ? payload.message : "");
294
+ if (content) {
295
+ return event("codex", sessionId, lineIndex, rawLine, "message", innerType === "message" || innerType === "agent_message" ? "seen" : "guessed", { role, content }, timestamp, redact);
296
+ }
297
+ return null;
298
+ }
299
+ export async function sendCapture(state, payload, fetchImpl = fetch) {
300
+ if (!payload.events.length)
301
+ return;
302
+ const base = state.api_url.replace(/\/+$/, "");
303
+ const headers = {
304
+ Authorization: `Bearer ${state.token}`,
305
+ "Content-Type": "application/json",
306
+ };
307
+ if (state.brand_id !== null)
308
+ headers["X-Brand-ID"] = String(state.brand_id);
309
+ const controller = new AbortController();
310
+ const timeout = setTimeout(() => controller.abort(), CAPTURE_TIMEOUT_MS);
311
+ let response;
312
+ try {
313
+ response = await fetchImpl(`${base}/api/v1/memory/ingest`, {
314
+ method: "POST",
315
+ headers,
316
+ body: JSON.stringify(payload),
317
+ signal: controller.signal,
318
+ });
319
+ }
320
+ catch (error) {
321
+ if (controller.signal.aborted) {
322
+ throw new Error("ingest request timed out after 10 seconds", { cause: error });
323
+ }
324
+ throw error;
325
+ }
326
+ finally {
327
+ clearTimeout(timeout);
328
+ }
329
+ if (!response.ok)
330
+ throw new Error(`ingest returned HTTP ${response.status}`);
331
+ }
332
+ async function readStdin() {
333
+ const chunks = [];
334
+ let length = 0;
335
+ for await (const chunk of process.stdin) {
336
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
337
+ length += buffer.length;
338
+ if (length > MAX_STDIN_BYTES)
339
+ throw new Error("hook input exceeds 2 MiB");
340
+ chunks.push(buffer);
341
+ }
342
+ return Buffer.concat(chunks).toString("utf8");
343
+ }
344
+ const AGENT_HOOK_DEPENDENCIES = {
345
+ loadState: loadCaptureState,
346
+ send: sendCapture,
347
+ readInput: readStdin,
348
+ };
349
+ function isClaudeHookInput(hook, input) {
350
+ if (typeof input.session_id !== "string" || !input.session_id)
351
+ return false;
352
+ if (hook === "post-tool") {
353
+ return typeof input.tool_name === "string" && (Object.prototype.hasOwnProperty.call(input, "tool_input") ||
354
+ Object.prototype.hasOwnProperty.call(input, "tool_response"));
355
+ }
356
+ if (hook === "stop")
357
+ return typeof input.last_assistant_message === "string";
358
+ return typeof input.reason === "string";
359
+ }
360
+ export async function runAgentHook(hook, dependencies = {}, options = {}) {
361
+ const deps = { ...AGENT_HOOK_DEPENDENCIES, ...dependencies };
362
+ const state = deps.loadState();
363
+ if (!state)
364
+ return;
365
+ const raw = await deps.readInput();
366
+ let input;
367
+ try {
368
+ input = asObject(JSON.parse(raw));
369
+ }
370
+ catch {
371
+ return;
372
+ }
373
+ const payload = options.runtime
374
+ ? buildPluginRuntimeEvent(options.runtime, hook, input, { rawLine: raw })
375
+ : typeof input.conversation_id === "string"
376
+ ? buildCursorEvents(hook, input, { rawLine: raw })
377
+ : isClaudeHookInput(hook, input)
378
+ ? buildClaudeEvents(hook, input, { rawLine: raw })
379
+ : null;
380
+ if (!payload?.events.length)
381
+ return;
382
+ await deps.send(state, payload);
383
+ }
384
+ function jsonlFiles(root) {
385
+ if (!existsSync(root))
386
+ return [];
387
+ const found = [];
388
+ const walk = (dir) => {
389
+ let entries;
390
+ try {
391
+ entries = readdirSync(dir, { withFileTypes: true });
392
+ }
393
+ catch {
394
+ return;
395
+ }
396
+ for (const entry of entries) {
397
+ const path = join(dir, entry.name);
398
+ if (entry.isDirectory())
399
+ walk(path);
400
+ else if (entry.isFile() && entry.name.endsWith(".jsonl"))
401
+ found.push(path);
402
+ }
403
+ };
404
+ walk(root);
405
+ return found;
406
+ }
407
+ /** Find only the rollout belonging to this Codex thread. */
408
+ export function codexRolloutForThread(root, threadId) {
409
+ if (!/^[A-Za-z0-9_-]+$/.test(threadId))
410
+ return null;
411
+ let newest = null;
412
+ for (const path of jsonlFiles(root)) {
413
+ const name = basename(path);
414
+ if (!name.startsWith("rollout-") || !name.endsWith(`-${threadId}.jsonl`))
415
+ continue;
416
+ let mtime;
417
+ try {
418
+ mtime = statSync(path).mtimeMs;
419
+ }
420
+ catch {
421
+ continue;
422
+ }
423
+ if (!newest || mtime > newest.mtime)
424
+ newest = { path, mtime };
425
+ }
426
+ return newest?.path ?? null;
427
+ }
428
+ function threadIdFromNotify(raw) {
429
+ let value;
430
+ try {
431
+ value = JSON.parse(raw);
432
+ }
433
+ catch {
434
+ return null;
435
+ }
436
+ const find = (candidate) => {
437
+ if (!candidate || typeof candidate !== "object" || Array.isArray(candidate))
438
+ return null;
439
+ const input = candidate;
440
+ for (const key of ["thread-id", "thread_id", "session_id"]) {
441
+ if (typeof input[key] === "string" && input[key])
442
+ return input[key];
443
+ }
444
+ for (const key of ["payload", "input", "hook_input"]) {
445
+ const nested = find(input[key]);
446
+ if (nested)
447
+ return nested;
448
+ }
449
+ return null;
450
+ };
451
+ return find(value);
452
+ }
453
+ const CODEX_NOTIFY_DEPENDENCIES = {
454
+ loadState: loadCaptureState,
455
+ saveState: saveCaptureState,
456
+ send: sendCapture,
457
+ readInput: () => process.stdin.isTTY ? Promise.resolve("") : readStdin(),
458
+ codexHome: () => process.env.CODEX_HOME || join(homedir(), ".codex"),
459
+ };
460
+ export async function runCodexNotify(payload, dependencies = {}) {
461
+ const deps = { ...CODEX_NOTIFY_DEPENDENCIES, ...dependencies };
462
+ const rawInput = payload ?? await deps.readInput();
463
+ const threadId = threadIdFromNotify(rawInput);
464
+ if (!threadId)
465
+ return;
466
+ let state = deps.loadState();
467
+ if (!state)
468
+ return;
469
+ const path = codexRolloutForThread(join(deps.codexHome(), "sessions"), threadId);
470
+ if (!path)
471
+ return;
472
+ const raw = readFileSync(path, "utf8");
473
+ const lines = raw.split(/\r?\n/);
474
+ // A writer may be between chunks when notify fires. Never advance past an
475
+ // incomplete JSONL record; the next notification will see the whole line.
476
+ lines.pop();
477
+ const previous = state.codex_files[path] ?? 0;
478
+ const start = previous <= lines.length ? previous : 0;
479
+ for (let chunkStart = start; chunkStart < lines.length; chunkStart += MAX_INGEST_EVENTS) {
480
+ const chunkEnd = Math.min(chunkStart + MAX_INGEST_EVENTS, lines.length);
481
+ const events = lines
482
+ .slice(chunkStart, chunkEnd)
483
+ .map((line, offset) => buildCodexEvent(threadId, chunkStart + offset, line))
484
+ .filter((item) => item !== null);
485
+ await deps.send(state, { runtime: "codex", session_id: threadId, events });
486
+ const currentState = deps.loadState();
487
+ if (!currentState)
488
+ return;
489
+ currentState.codex_files[path] = chunkEnd;
490
+ deps.saveState(currentState);
491
+ state = currentState;
492
+ }
493
+ }
494
+ async function verifyIngestOnlyToken(token, apiUrl, brandId, fetchImpl = fetch) {
495
+ const headers = { Authorization: `Bearer ${token}` };
496
+ if (brandId !== null)
497
+ headers["X-Brand-ID"] = String(brandId);
498
+ const response = await fetchImpl(`${apiUrl.replace(/\/+$/, "")}/api/v1/auth/me`, { headers });
499
+ if (!response.ok)
500
+ throw new Error(`token check returned HTTP ${response.status}`);
501
+ const body = asObject(await response.json());
502
+ const tokenInfo = asObject(body.token);
503
+ const scopes = Array.isArray(tokenInfo.scopes)
504
+ ? tokenInfo.scopes.filter((scope) => typeof scope === "string")
505
+ : [];
506
+ if (scopes.length !== 1 || scopes[0] !== INGEST_SCOPE) {
507
+ throw new Error(`capture requires a PAT whose only scope is ${INGEST_SCOPE}`);
508
+ }
509
+ if (brandId !== null && tokenInfo.brand_id !== brandId) {
510
+ const tokenBrand = typeof tokenInfo.brand_id === "number"
511
+ ? String(tokenInfo.brand_id)
512
+ : "unknown";
513
+ throw new Error(`capture token belongs to brand ${tokenBrand}, but the configured workspace uses brand ${brandId}`);
514
+ }
515
+ }
516
+ async function promptForToken() {
517
+ const rl = createInterface({ input: process.stdin, output: process.stderr });
518
+ try {
519
+ return (await rl.question(`Memory-only PAT (${INGEST_SCOPE}): `)).trim();
520
+ }
521
+ finally {
522
+ rl.close();
523
+ }
524
+ }
525
+ export async function enableCapture(workspace, suppliedToken, fetchImpl = fetch) {
526
+ const cfg = getEffectiveConfig(workspace);
527
+ const token = (suppliedToken ?? process.env.OPVS_MEMORY_INGEST_TOKEN ?? await promptForToken()).trim();
528
+ if (!token)
529
+ throw new Error("a memory-only PAT is required");
530
+ const brandId = typeof cfg.brand_id === "number" ? cfg.brand_id : null;
531
+ await verifyIngestOnlyToken(token, cfg.api_url, brandId, fetchImpl);
532
+ saveCaptureState({
533
+ version: STATE_VERSION,
534
+ enabled: true,
535
+ token,
536
+ api_url: cfg.api_url,
537
+ brand_id: brandId,
538
+ codex_files: {},
539
+ });
540
+ }
541
+ async function runHookSafely(action) {
542
+ try {
543
+ await action();
544
+ }
545
+ catch (error) {
546
+ const message = error instanceof Error ? error.message : "unknown capture error";
547
+ process.stderr.write(`Memory capture skipped: ${message}\n`);
548
+ }
549
+ }
550
+ function pluginRuntime(value) {
551
+ if (value === undefined || value === "cline" || value === "opencode")
552
+ return value;
553
+ throw new Error(`unsupported hook runtime '${value}' (expected opencode or cline)`);
554
+ }
555
+ /** Add `hook ...` and `capture on|off` below an existing memory command. */
556
+ export function registerCaptureHooks(memory) {
557
+ const hook = memory.commands.find((command) => command.name() === "hook")
558
+ ?? memory.command("hook").description("Receive a local agent session hook");
559
+ hook.command("post-tool").description("Capture a runtime post-tool event")
560
+ .option("--runtime <runtime>", "Input runtime (opencode or cline)")
561
+ .action((opts) => runHookSafely(() => (runAgentHook("post-tool", {}, { runtime: pluginRuntime(opts.runtime) }))));
562
+ hook.command("stop").description("Capture a runtime stop event")
563
+ .option("--runtime <runtime>", "Input runtime (opencode or cline)")
564
+ .action((opts) => runHookSafely(() => (runAgentHook("stop", {}, { runtime: pluginRuntime(opts.runtime) }))));
565
+ hook.command("session-end").description("Capture a runtime session-end event")
566
+ .option("--runtime <runtime>", "Input runtime (opencode or cline)")
567
+ .action((opts) => runHookSafely(() => (runAgentHook("session-end", {}, { runtime: pluginRuntime(opts.runtime) }))));
568
+ hook.command("codex-notify [payload]").description("Capture new lines from this Codex thread")
569
+ .action((payload) => runHookSafely(() => runCodexNotify(payload)));
570
+ const capture = memory.command("capture").description("Manage opt-in local session capture");
571
+ capture.command("on")
572
+ .description(`Enable capture with a PAT scoped only to ${INGEST_SCOPE}`)
573
+ .option("--token <pat>", "Dedicated PAT (or set OPVS_MEMORY_INGEST_TOKEN)")
574
+ .action(async (opts) => {
575
+ try {
576
+ await enableCapture(memory.parent?.opts().workspace, opts.token);
577
+ console.log("Memory capture enabled. Claude Code hooks activate with the plugin; " +
578
+ 'for Codex set notify = ["opvs", "memory", "hook", "codex-notify"] in user config.toml.');
579
+ }
580
+ catch (error) {
581
+ console.error(error instanceof Error ? error.message : String(error));
582
+ process.exitCode = 1;
583
+ }
584
+ });
585
+ capture.command("off")
586
+ .description("Disable capture and remove the dedicated local PAT")
587
+ .action(() => {
588
+ disableCapture();
589
+ console.log("Memory capture disabled and its local PAT removed.");
590
+ });
591
+ }
592
+ //# sourceMappingURL=memory-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-capture.js","sourceRoot":"","sources":["../../src/commands/memory-capture.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ type SessionStartDependencies = {
8
8
  readInput: () => Promise<string>;
9
9
  writeOutput: (text: string) => void;
10
10
  repoRoot: (cwd: string) => string;
11
+ repoName: (root: string) => string | undefined;
11
12
  readServices: (root: string) => string;
12
13
  };
13
14
  /** Render complete entries where possible, then hard-truncate at the budget. */