@bli-cockpit/mcp 0.1.15 → 0.1.18

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 CHANGED
@@ -134,6 +134,9 @@ A claim about the verb's nature, not a backlog.
134
134
 
135
135
  <!-- END GENERATED verb census -->
136
136
 
137
+ For memory adoption and ordinary hook measurements, use `cockpit ops --memory`
138
+ or `ops_status` with `memory: true`. Both also read `GET /api/ops/memory-usage`.
139
+
137
140
  ## `jarvis_*` tools (BLI-3732)
138
141
 
139
142
  JARVIS itself — the same assistant Tower web chat, the Slack DM and
package/dist/ops-tools.js CHANGED
@@ -56,6 +56,7 @@ export function registerOpsTools(server, deps) {
56
56
  inputSchema: {
57
57
  job: z.string().min(1).max(100).optional().describe("One pipeline id instead of the whole board."),
58
58
  skips: z.boolean().optional().describe("Also return the open ingest-skip ledgers."),
59
+ memory: z.boolean().optional().describe("Also return memory adoption and observed prompt-hook outcomes, delay bounds and cache reuse. No memory text."),
59
60
  },
60
61
  }, async (args) => withSession(deps, async (session) => {
61
62
  const params = new URLSearchParams();
@@ -72,16 +73,30 @@ export function registerOpsTools(server, deps) {
72
73
  const lines = rows
73
74
  .map((row) => `${(row.verdict ?? "?").padEnd(14)} ${row.id ?? "?"} ${row.detail ?? row.label ?? ""}`.trimEnd())
74
75
  .join("\n");
76
+ const memory = args.memory
77
+ ? await callAgentDoor(session, deps.fetchImpl, "GET", "/api/ops/memory-usage") : null;
78
+ if (memory && !memory.ok)
79
+ return errorResult(doorFailureText("ops_status memory", memory));
80
+ const hooks = memory?.ok ? asRecord(memory.body.hooks) : null;
81
+ const memoryLines = hooks && Array.isArray(hooks.devices)
82
+ ? hooks.devices.map((device) => {
83
+ const row = asRecord(device);
84
+ return [row.line, row.performanceLine].filter((line) => typeof line === "string").join("\n");
85
+ }).join("\n") : "";
75
86
  // Both branches say something. A board that is entirely green and
76
87
  // reports nothing cannot answer "did anybody look today?".
77
88
  return textResult(`${rows.length} pipeline(s), ${unhealthy.length} unhealthy`
78
89
  + `${unhealthy.length > 0 ? `: ${unhealthy.map((row) => row.id ?? "?").join(", ")}` : "."}`
79
- + `${lines ? `\n${lines}` : ""}`, {
90
+ + `${lines ? `\n${lines}` : ""}`
91
+ + `${memoryLines ? `\n${memoryLines}` : ""}`,
92
+ // The API owns the wording and the timing boundary on every surface.
93
+ {
80
94
  pipelines: rows,
81
95
  unhealthy: unhealthy.map((row) => row.id ?? "?"),
82
96
  ...(body.fleet ? { fleet: body.fleet } : {}),
83
97
  ...(body.coverage ? { coverage: body.coverage } : {}),
84
98
  ...(body.skips ? { skips: body.skips } : {}),
99
+ ...(memory?.ok ? { memory: memory.body.memory, hooks: memory.body.hooks } : {}),
85
100
  });
86
101
  }));
87
102
  register("slack_coverage", {
@@ -25,12 +25,17 @@
25
25
  import { z } from "zod";
26
26
  import { loadAgentDoorSession } from "./agent-door-session.js";
27
27
  import { callAgentDoor } from "./agent-door.js";
28
- const KINDS = ["doc", "msg", "issue", "note", "memory"];
28
+ // Mirrors `SEARCH_KINDS` in apps/dashboard/src/lib/search/contracts.ts.
29
+ // BLI-3880 added mail and cal; nothing in the type system ties the two
30
+ // lists together, so `search-tool.test.ts` pins this one against the door.
31
+ const KINDS = ["doc", "msg", "issue", "note", "mail", "cal", "memory"];
29
32
  const KIND_LABELS = {
30
33
  doc: "Document",
31
34
  msg: "Message",
32
35
  issue: "Issue",
33
36
  note: "Meeting note",
37
+ mail: "Email",
38
+ cal: "Calendar event",
34
39
  memory: "Memory",
35
40
  };
36
41
  function textResult(text, structured) {
@@ -46,13 +51,13 @@ export function registerSearchTool(server, deps) {
46
51
  const register = server.registerTool.bind(server);
47
52
  register("tower_search", {
48
53
  title: "Search everything in Tower",
49
- description: "One search over documents, messages, issues, meeting notes and BLI Memory. Use it when you know WHAT you are looking for but not WHERE it lives. Every result names the corpus it came from and where to open it; a memory has no page, so its text is the whole record. A corpus that could not answer is reported separately from one that found nothing — do not read a failure as silence.",
54
+ description: "One search over documents, messages, issues, meeting notes, the caller's own mail, their calendar and BLI Memory. Use it when you know WHAT you are looking for but not WHERE it lives. Every result names the corpus it came from and where to open it; a memory has no page, so its text is the whole record. Mail and calendar are the caller's OWN — their mailboxes, their calendars and the ones shared with the organisation — never the whole company's. A calendar hit is the stored event, so a recurring meeting comes back once as its series rather than once per occurrence. A corpus that could not answer is reported separately from one that found nothing — do not read a failure as silence.",
50
55
  inputSchema: {
51
56
  query: z.string().min(2).max(1000).describe("What to look for, in the words a person would type."),
52
57
  kinds: z
53
58
  .array(z.enum(KINDS))
54
59
  .optional()
55
- .describe("Narrow to these corpora. Omit to search all five."),
60
+ .describe("Narrow to these corpora. Omit to search every one."),
56
61
  limit: z.number().int().min(1).max(50).optional().describe("Results to return (default 20)."),
57
62
  },
58
63
  }, async (args) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bli-cockpit/mcp",
3
- "version": "0.1.15",
3
+ "version": "0.1.18",
4
4
  "private": false,
5
5
  "description": "bli-tower \u2014 an MCP server over BLI Cockpit's agent doors: JARVIS (jarvis_*), documents (docs_*), channels (msg_*), issues (work_*), the daily page (brief_*), meeting notes (notes_*), the ops board (ops_status/slack_*), settings/team/model, Scout and the workbook, plus the legacy event-stream tools (emit_event, get_ticket_timeline, get_active_tickets).",
6
6
  "type": "module",
@@ -30,7 +30,7 @@
30
30
  "readme": "npm run build && node scripts/write-readme-census.mjs"
31
31
  },
32
32
  "dependencies": {
33
- "@bli-cockpit/telemetry-core": "0.1.32",
33
+ "@bli-cockpit/telemetry-core": "0.1.34",
34
34
  "@modelcontextprotocol/sdk": "^1.29.0",
35
35
  "zod": "^4.3.6"
36
36
  },