@bli-cockpit/cli 0.2.242 → 0.2.243
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/adapters/git-state.js +1 -0
- package/dist/adapters/raw-evidence-collection-state.js +22 -11
- package/dist/adapters/raw-evidence-git-diff.js +1 -0
- package/dist/agent-rules.js +8 -0
- package/dist/autostart-contract.js +12 -0
- package/dist/autostart-darwin-plist.js +2 -2
- package/dist/autostart-darwin.js +1 -1
- package/dist/autostart-remind.js +245 -0
- package/dist/autostart-self-heal.js +17 -1
- package/dist/autostart-windows-scripts.js +7 -7
- package/dist/autostart.js +16 -15
- package/dist/commands/approvals-check-where.js +14 -0
- package/dist/commands/approvals-render.js +8 -1
- package/dist/commands/approvals.js +3 -2
- package/dist/commands/autostart-command.js +10 -0
- package/dist/commands/autostart-heal.js +36 -1
- package/dist/commands/brain.js +1 -1
- package/dist/commands/cal-agenda.js +44 -0
- package/dist/commands/cal-availability-share.js +97 -0
- package/dist/commands/cal-booking.js +147 -0
- package/dist/commands/cal-join.js +62 -0
- package/dist/commands/cal-links.js +68 -0
- package/dist/commands/cal-people.js +136 -0
- package/dist/commands/cal-remind.js +176 -0
- package/dist/commands/cal-reminders.js +33 -0
- package/dist/commands/cal-suggest.js +89 -0
- package/dist/commands/cal.js +41 -1
- package/dist/commands/cycle-args.js +127 -0
- package/dist/commands/cycles.js +117 -0
- package/dist/commands/docs-comments-args.js +85 -0
- package/dist/commands/docs-comments.js +128 -0
- package/dist/commands/docs-files-args.js +49 -0
- package/dist/commands/docs-files.js +179 -0
- package/dist/commands/docs-formatting.js +45 -0
- package/dist/commands/docs-inbox-args.js +93 -0
- package/dist/commands/docs-inbox.js +126 -0
- package/dist/commands/docs-notion.js +5 -0
- package/dist/commands/docs-read.js +2 -1
- package/dist/commands/docs-recovery.js +173 -0
- package/dist/commands/docs-refs-args.js +104 -0
- package/dist/commands/docs-refs.js +153 -0
- package/dist/commands/docs-search-args.js +79 -0
- package/dist/commands/docs-search.js +64 -0
- package/dist/commands/docs-sync-args.js +82 -0
- package/dist/commands/docs-sync.js +197 -0
- package/dist/commands/docs-tree.js +136 -0
- package/dist/commands/docs.js +85 -51
- package/dist/commands/doctor-update.js +4 -1
- package/dist/commands/inbox-args.js +81 -0
- package/dist/commands/inbox.js +88 -0
- package/dist/commands/issue-batch.js +61 -0
- package/dist/commands/issue-relations.js +151 -0
- package/dist/commands/issue-write.js +38 -5
- package/dist/commands/issue.js +32 -1
- package/dist/commands/local-args-tower-approvals.js +16 -4
- package/dist/commands/local-args-tower-cal-booking.js +81 -0
- package/dist/commands/local-args-tower-cal-links.js +42 -0
- package/dist/commands/local-args-tower-cal-remind.js +74 -0
- package/dist/commands/local-args-tower-cal-share.js +41 -0
- package/dist/commands/local-args-tower-cal.js +81 -8
- package/dist/commands/local-args-tower-docs-msg.js +98 -9
- package/dist/commands/local-args-tower-msg.js +222 -10
- package/dist/commands/local-args-tower-search.js +32 -5
- package/dist/commands/local-args-tower-work.js +110 -34
- package/dist/commands/local-auth.js +1 -1
- package/dist/commands/local-help-commands-tower-ops.js +2 -0
- package/dist/commands/local-help-commands-tower.js +47 -31
- package/dist/commands/local-help-cycles.js +9 -0
- package/dist/commands/local-help-docs-files.js +10 -0
- package/dist/commands/local-help-docs-formatting.js +7 -0
- package/dist/commands/local-help-docs-inbox.js +10 -0
- package/dist/commands/local-help-docs-recovery.js +10 -0
- package/dist/commands/local-help-docs-refs.js +11 -0
- package/dist/commands/local-help-docs-sync.js +9 -0
- package/dist/commands/local-help-inbox.js +9 -0
- package/dist/commands/local-help-project.js +21 -0
- package/dist/commands/local-help-templates.js +9 -0
- package/dist/commands/local-help-views.js +10 -0
- package/dist/commands/local-help-work-notify.js +6 -0
- package/dist/commands/local-help.js +2 -2
- package/dist/commands/mcp-stdio-probe.js +1 -0
- package/dist/commands/msg-activity.js +134 -0
- package/dist/commands/msg-channel-args.js +92 -0
- package/dist/commands/msg-channel.js +125 -0
- package/dist/commands/msg-context-args.js +67 -0
- package/dist/commands/msg-context.js +65 -0
- package/dist/commands/msg-dm.js +28 -0
- package/dist/commands/msg-file.js +185 -0
- package/dist/commands/msg-mark-args.js +78 -0
- package/dist/commands/msg-mark.js +148 -0
- package/dist/commands/msg-notify-args.js +100 -0
- package/dist/commands/msg-notify.js +122 -0
- package/dist/commands/msg-schedule-args.js +114 -0
- package/dist/commands/msg-schedule.js +226 -0
- package/dist/commands/msg-search-args.js +71 -0
- package/dist/commands/msg-search.js +48 -0
- package/dist/commands/msg-write.js +15 -1
- package/dist/commands/msg.js +62 -39
- package/dist/commands/project-args.js +82 -0
- package/dist/commands/project.js +71 -7
- package/dist/commands/public-root.js +1 -1
- package/dist/commands/search.js +23 -0
- package/dist/commands/session-sync-failures.js +17 -4
- package/dist/commands/session-sync-health.js +7 -2
- package/dist/commands/session-sync-hold.js +42 -1
- package/dist/commands/session-sync-upload.js +2 -0
- package/dist/commands/session-sync.js +1 -0
- package/dist/commands/sync-doctor.js +14 -1
- package/dist/commands/sync-report.js +1 -1
- package/dist/commands/template-args.js +122 -0
- package/dist/commands/templates.js +162 -0
- package/dist/commands/view-args.js +131 -0
- package/dist/commands/views.js +138 -0
- package/dist/commands/work-notify-args.js +67 -0
- package/dist/commands/work-notify.js +63 -0
- package/dist/delivery-hold-notice.js +34 -0
- package/dist/log-rotation.js +2 -2
- package/dist/notifier.js +83 -0
- package/dist/process-runner.js +4 -0
- package/dist/repo-identity-git.js +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { askAgentDoor, emitAgentDoor, failAgentDoor } from "./agent-door.js";
|
|
2
|
+
import { writeLine } from "./cli-io.js";
|
|
3
|
+
import { READ_DEADLINE_MS, WRITE_DEADLINE_MS } from "./issue-contracts.js";
|
|
4
|
+
const TAG = "[ticket notifications cli]";
|
|
5
|
+
function writeSettings(door, settings) {
|
|
6
|
+
const out = door.io.stdout;
|
|
7
|
+
writeLine(out, `Slack delivery: ${settings.slack_enabled ? "on" : "off"}${settings.slack_enabled_at && settings.slack_enabled ? ` (since ${settings.slack_enabled_at})` : ""}`);
|
|
8
|
+
if (settings.slack_linked === null)
|
|
9
|
+
writeLine(out, `Slack account: could not check (${settings.slack_linked_reason ?? "unknown"}).`);
|
|
10
|
+
else
|
|
11
|
+
writeLine(out, settings.slack_linked ? "Slack account: linked." : "Slack account: none linked, so delivery would fail with slack_identity_missing.");
|
|
12
|
+
}
|
|
13
|
+
export async function runWorkNotify(command, io, door) {
|
|
14
|
+
void io;
|
|
15
|
+
const notify = command.notify;
|
|
16
|
+
if (notify.sub === "receipts") {
|
|
17
|
+
const query = new URLSearchParams();
|
|
18
|
+
if (notify.notification)
|
|
19
|
+
query.set("notification_id", notify.notification);
|
|
20
|
+
if (notify.before)
|
|
21
|
+
query.set("before", notify.before);
|
|
22
|
+
if (notify.limit !== undefined)
|
|
23
|
+
query.set("limit", String(notify.limit));
|
|
24
|
+
const suffix = query.toString();
|
|
25
|
+
const answer = await askAgentDoor(door, {
|
|
26
|
+
path: `/api/work/notifications/receipts${suffix ? `?${suffix}` : ""}`,
|
|
27
|
+
method: "GET",
|
|
28
|
+
label: "ticket notifications receipts",
|
|
29
|
+
timeoutMs: READ_DEADLINE_MS,
|
|
30
|
+
});
|
|
31
|
+
if (!answer.ok)
|
|
32
|
+
return failAgentDoor(door, TAG, answer.reason, answer.detail);
|
|
33
|
+
const body = answer.body;
|
|
34
|
+
if (door.json)
|
|
35
|
+
return emitAgentDoor(door, { ok: true, ...body });
|
|
36
|
+
const receipts = body.receipts ?? [];
|
|
37
|
+
if (receipts.length === 0)
|
|
38
|
+
writeLine(door.io.stdout, "No delivery receipts yet.");
|
|
39
|
+
for (const receipt of receipts) {
|
|
40
|
+
writeLine(door.io.stdout, `${receipt.id} ${receipt.outcome.padEnd(10)} ${(receipt.reason ?? "-").padEnd(22)} ${(receipt.identifier ?? "(ticket not readable)").padEnd(9)} ${receipt.created_at}`);
|
|
41
|
+
}
|
|
42
|
+
if (body.has_more && body.next_cursor)
|
|
43
|
+
writeLine(door.io.stdout, `More receipts available. Continue with --before ${body.next_cursor}`);
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
const setting = notify.sub === "set";
|
|
47
|
+
const answer = await askAgentDoor(door, {
|
|
48
|
+
path: "/api/work/notifications/settings",
|
|
49
|
+
method: setting ? "PUT" : "GET",
|
|
50
|
+
label: setting ? "ticket notifications set" : "ticket notifications",
|
|
51
|
+
timeoutMs: setting ? WRITE_DEADLINE_MS : READ_DEADLINE_MS,
|
|
52
|
+
...(setting ? { body: { slack_enabled: notify.slackEnabled } } : {}),
|
|
53
|
+
});
|
|
54
|
+
if (!answer.ok)
|
|
55
|
+
return failAgentDoor(door, TAG, answer.reason, answer.detail);
|
|
56
|
+
const body = answer.body;
|
|
57
|
+
console.error(`${TAG} ${setting ? "set" : "read"} done`, JSON.stringify({ slack_enabled: body.settings?.slack_enabled }));
|
|
58
|
+
if (door.json)
|
|
59
|
+
return emitAgentDoor(door, { ok: true, ...body });
|
|
60
|
+
if (body.settings)
|
|
61
|
+
writeSettings(door, body.settings);
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
@@ -163,4 +163,38 @@ function reasonWord(reason, budget) {
|
|
|
163
163
|
if (safe.length === 0)
|
|
164
164
|
return ABSENT;
|
|
165
165
|
return safe.slice(0, budget);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Ticket 21952: the per-tick SIZE BUDGET's hold, the second token this file owns.
|
|
169
|
+
*
|
|
170
|
+
* A tick that sent some evidence and held the rest for the next tick reports
|
|
171
|
+
* `ok` with this token instead of failing, because overflow defers and converges
|
|
172
|
+
* by design. The collector writes it and the fleet board reads it
|
|
173
|
+
* (`apps/dashboard/src/lib/ops/fleet-budget-hold.ts`), which turns a hold that
|
|
174
|
+
* never drains into a RED row, so a growing backlog cannot stay green.
|
|
175
|
+
*
|
|
176
|
+
* held_budget:<held objects>:<held MiB>:<sent MiB>
|
|
177
|
+
* held_budget:3:901:2043
|
|
178
|
+
*/
|
|
179
|
+
export const BUDGET_HOLD_NOTICE_PREFIX = "held_budget";
|
|
180
|
+
const MIB = 1024 * 1024;
|
|
181
|
+
/** Render the size-budget hold, or null for a hold of nothing. Held MiB rounds up so a held byte never reads as 0. */
|
|
182
|
+
export function formatBudgetHoldNotice(use) {
|
|
183
|
+
if (use.deferredObjects <= 0)
|
|
184
|
+
return null;
|
|
185
|
+
const heldMib = Math.ceil(Math.max(0, use.deferredBytes) / MIB);
|
|
186
|
+
const sentMib = Math.round(Math.max(0, use.admittedBytes) / MIB);
|
|
187
|
+
return `${BUDGET_HOLD_NOTICE_PREFIX}:${Math.trunc(use.deferredObjects)}:${heldMib}:${sentMib}`;
|
|
188
|
+
}
|
|
189
|
+
/** Find a size-budget hold token anywhere in a receipt's detail. A search, for the same reason as `parseDeliveryHoldNotice`. */
|
|
190
|
+
export function parseBudgetHoldNotice(text) {
|
|
191
|
+
if (!text)
|
|
192
|
+
return null;
|
|
193
|
+
const match = new RegExp(String.raw `${BUDGET_HOLD_NOTICE_PREFIX}:(\d+):(\d+):(\d+)`, "u").exec(text);
|
|
194
|
+
if (!match)
|
|
195
|
+
return null;
|
|
196
|
+
const heldObjects = Number.parseInt(match[1], 10);
|
|
197
|
+
if (!Number.isFinite(heldObjects) || heldObjects <= 0)
|
|
198
|
+
return null;
|
|
199
|
+
return { heldObjects, heldMib: Number.parseInt(match[2], 10), sentMib: Number.parseInt(match[3], 10) };
|
|
166
200
|
}
|
package/dist/log-rotation.js
CHANGED
|
@@ -47,8 +47,8 @@ import path from "node:path";
|
|
|
47
47
|
*/
|
|
48
48
|
export const DEFAULT_LOG_ROTATION_MAX_BYTES = 10 * 1024 * 1024;
|
|
49
49
|
export const DEFAULT_LOG_ROTATION_KEEP = 2;
|
|
50
|
-
/** The
|
|
51
|
-
export const ROTATED_LOG_NAMES = ["sync.log", "sync.err.log"];
|
|
50
|
+
/** The files launchd writes for the scheduled ticks (sync, and BLI-21564 the reminder job). */
|
|
51
|
+
export const ROTATED_LOG_NAMES = ["sync.log", "sync.err.log", "remind.log", "remind.err.log"];
|
|
52
52
|
/**
|
|
53
53
|
* Caps the scheduled tick's own logs. Never throws: a rotation failure is data
|
|
54
54
|
* for the caller to log, never a reason a sync does not run.
|
package/dist/notifier.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one place the collector paints an OS banner (BLI-21564, calendar slice 11).
|
|
3
|
+
*
|
|
4
|
+
* macOS goes through `osascript -e 'display notification ...'`, Windows through
|
|
5
|
+
* a PowerShell toast on PowerShell's own app id. Both are spawned through
|
|
6
|
+
* `process-runner.ts` with an ARRAY of arguments (never a shell line), and every
|
|
7
|
+
* string a person or a calendar can influence is escaped (AppleScript) or passed
|
|
8
|
+
* by environment variable (PowerShell), so a meeting title cannot become code.
|
|
9
|
+
*
|
|
10
|
+
* The result is always one of three named outcomes. A banner the OS refused is
|
|
11
|
+
* `permission_denied`; a helper that failed any other way is `notifier_failed`
|
|
12
|
+
* with its exit code; nothing here is silent. `osascript` exits 0 when the user
|
|
13
|
+
* switched notifications off for it, so a silent denial is not detectable: a
|
|
14
|
+
* desktop receipt, not this module, is the proof a banner appeared.
|
|
15
|
+
*/
|
|
16
|
+
import { createCapturedExecRunner } from "./process-runner.js";
|
|
17
|
+
const NOTIFIER_TIMEOUT_MS = 15_000;
|
|
18
|
+
const MAX_TEXT = 200;
|
|
19
|
+
const DENIAL = /not allowed|not authorized|not permitted|access.*denied|notifications? (?:are |is )?(?:disabled|blocked|turned off)|\(-1743\)|\(-1744\)|blocked by/i;
|
|
20
|
+
/** Controls become spaces and the length is bounded; the text is a banner, not a document. */
|
|
21
|
+
function plain(value) {
|
|
22
|
+
// eslint-disable-next-line no-control-regex
|
|
23
|
+
return value.replace(/[\u0000-\u001f\u007f]+/g, " ").trim().slice(0, MAX_TEXT);
|
|
24
|
+
}
|
|
25
|
+
/** An AppleScript string literal body: backslash and double quote are the only escapes it needs. */
|
|
26
|
+
export function appleScriptEscape(value) {
|
|
27
|
+
return plain(value).replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
28
|
+
}
|
|
29
|
+
export function macNotifyArgs(request) {
|
|
30
|
+
const sound = request.sound ? ' sound name "Glass"' : "";
|
|
31
|
+
return ["-e", `display notification "${appleScriptEscape(request.message)}" with title "${appleScriptEscape(request.title)}"${sound}`];
|
|
32
|
+
}
|
|
33
|
+
/** The toast script reads its text from the environment, so no title can reach the script body. */
|
|
34
|
+
export const WINDOWS_TOAST_SCRIPT = [
|
|
35
|
+
"$ErrorActionPreference = 'Stop'",
|
|
36
|
+
"[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null",
|
|
37
|
+
"[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null",
|
|
38
|
+
"$title = [System.Security.SecurityElement]::Escape($env:TOWER_TOAST_TITLE)",
|
|
39
|
+
"$message = [System.Security.SecurityElement]::Escape($env:TOWER_TOAST_MESSAGE)",
|
|
40
|
+
"$audio = if ($env:TOWER_TOAST_SOUND -eq '1') { '' } else { '<audio silent=\"true\"/>' }",
|
|
41
|
+
"$xml = New-Object Windows.Data.Xml.Dom.XmlDocument",
|
|
42
|
+
"$xml.LoadXml('<toast><visual><binding template=\"ToastText02\"><text id=\"1\">' + $title + '</text><text id=\"2\">' + $message + '</text></binding></visual>' + $audio + '</toast>')",
|
|
43
|
+
"$toast = New-Object Windows.UI.Notifications.ToastNotification $xml",
|
|
44
|
+
"$appId = '{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\\WindowsPowerShell\\v1.0\\powershell.exe'",
|
|
45
|
+
"[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($appId).Show($toast)",
|
|
46
|
+
].join("\n");
|
|
47
|
+
export function windowsNotifyArgs() {
|
|
48
|
+
const encoded = Buffer.from(WINDOWS_TOAST_SCRIPT, "utf16le").toString("base64");
|
|
49
|
+
return ["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-EncodedCommand", encoded];
|
|
50
|
+
}
|
|
51
|
+
export async function showNotification(request, options = {}) {
|
|
52
|
+
const platform = options.platform ?? process.platform;
|
|
53
|
+
const exec = options.exec ?? createCapturedExecRunner({ platform });
|
|
54
|
+
let command;
|
|
55
|
+
let args;
|
|
56
|
+
let env;
|
|
57
|
+
if (platform === "darwin") {
|
|
58
|
+
command = "osascript";
|
|
59
|
+
args = macNotifyArgs(request);
|
|
60
|
+
}
|
|
61
|
+
else if (platform === "win32") {
|
|
62
|
+
command = "powershell.exe";
|
|
63
|
+
args = windowsNotifyArgs();
|
|
64
|
+
env = { ...(options.env ?? process.env), TOWER_TOAST_TITLE: plain(request.title), TOWER_TOAST_MESSAGE: plain(request.message), TOWER_TOAST_SOUND: request.sound ? "1" : "0" };
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const reason = `no_notifier_for_${platform}`;
|
|
68
|
+
console.error("[notifier] not shown", JSON.stringify({ outcome: "notifier_failed", reason }));
|
|
69
|
+
return { outcome: "notifier_failed", reason };
|
|
70
|
+
}
|
|
71
|
+
const result = await exec(command, args, { timeoutMs: NOTIFIER_TIMEOUT_MS, ...(env ? { env } : {}) });
|
|
72
|
+
if (result.code === 0) {
|
|
73
|
+
console.error("[notifier] shown", JSON.stringify({ outcome: "shown", platform }));
|
|
74
|
+
return { outcome: "shown", reason: null };
|
|
75
|
+
}
|
|
76
|
+
if (DENIAL.test(`${result.stderr}\n${result.stdout}`)) {
|
|
77
|
+
console.error("[notifier] not shown", JSON.stringify({ outcome: "permission_denied", platform, exit: result.code }));
|
|
78
|
+
return { outcome: "permission_denied", reason: `os_refused_exit_${result.code}` };
|
|
79
|
+
}
|
|
80
|
+
const reason = result.code === 124 ? "timed_out" : `exit_${result.code}`;
|
|
81
|
+
console.error("[notifier] not shown", JSON.stringify({ outcome: "notifier_failed", platform, exit: result.code }));
|
|
82
|
+
return { outcome: "notifier_failed", reason };
|
|
83
|
+
}
|
package/dist/process-runner.js
CHANGED
|
@@ -35,6 +35,7 @@ export function createCapturedExecRunner(options = {}) {
|
|
|
35
35
|
encoding: "utf8",
|
|
36
36
|
env,
|
|
37
37
|
windowsVerbatimArguments: invocation.windowsVerbatimArguments,
|
|
38
|
+
windowsHide: true,
|
|
38
39
|
...(runOptions?.timeoutMs ? { timeout: runOptions.timeoutMs } : {}),
|
|
39
40
|
}, (error, stdout, stderr) => {
|
|
40
41
|
const code = capturedExitCode(error, runOptions?.timeoutMs);
|
|
@@ -86,6 +87,9 @@ export function createInteractiveExecRunner(options = {}) {
|
|
|
86
87
|
stdio,
|
|
87
88
|
env,
|
|
88
89
|
windowsVerbatimArguments: invocation.windowsVerbatimArguments,
|
|
90
|
+
// Ticket 21952: a scheduled sync has no console, so a child without this opens a visible window on Windows.
|
|
91
|
+
// With a console (a person typing `cockpit doctor`) the child shares it and the flag changes nothing.
|
|
92
|
+
windowsHide: true,
|
|
89
93
|
});
|
|
90
94
|
let settled = false;
|
|
91
95
|
child.on("error", (error) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bli-cockpit/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.243",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
"test": "node dist/cli.js --help && node ../../scripts/assert-public-cli-routing.mjs && node ../../scripts/assert-public-cli-verb-help.mjs && node ../../scripts/assert-public-cli-surface-doors.mjs && node ../../scripts/assert-public-cli-runtime-files.mjs && node ../../scripts/assert-public-cli-exit-contract.mjs && node ../../scripts/assert-public-cli-no-fleet-posts.mjs && node ../../scripts/assert-public-cli-doctor-json.mjs && node ../../scripts/assert-public-package-pack.mjs --workspace=@bli-cockpit/cli"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@bli-cockpit/memory-mcp": "0.1.
|
|
31
|
-
"@bli-cockpit/mcp": "0.1.
|
|
32
|
-
"@bli-cockpit/telemetry-core": "0.1.
|
|
30
|
+
"@bli-cockpit/memory-mcp": "0.1.71",
|
|
31
|
+
"@bli-cockpit/mcp": "0.1.148",
|
|
32
|
+
"@bli-cockpit/telemetry-core": "0.1.78"
|
|
33
33
|
},
|
|
34
34
|
"repository": {
|
|
35
35
|
"type": "git",
|