@productbrain/mcp 0.0.1-beta.5561 → 0.0.1-beta.5572
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/{chunk-O53EBDOP.js → chunk-AFWQI35U.js} +2 -2
- package/dist/{chunk-O53EBDOP.js.map → chunk-AFWQI35U.js.map} +1 -1
- package/dist/{chunk-Y2JXPTBG.js → chunk-C5BIZH5N.js} +239 -10
- package/dist/chunk-C5BIZH5N.js.map +1 -0
- package/dist/cli/index.js +1 -1
- package/dist/http.js +2 -2
- package/dist/index.js +2 -2
- package/dist/{setup-VT6LVSJ7.js → setup-X7I26HIK.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-Y2JXPTBG.js.map +0 -1
- /package/dist/{setup-VT6LVSJ7.js.map → setup-X7I26HIK.js.map} +0 -0
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
trackSessionCaptureRate,
|
|
43
43
|
trackWriteBackHintServed,
|
|
44
44
|
trackZeroCaptureAuditFired
|
|
45
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-AFWQI35U.js";
|
|
46
46
|
|
|
47
47
|
// src/server.ts
|
|
48
48
|
import { McpServer as McpServer2 } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
@@ -15634,10 +15634,10 @@ function formatSection(label, rows, truncated, cursorHint) {
|
|
|
15634
15634
|
return lines;
|
|
15635
15635
|
}
|
|
15636
15636
|
function formatRoleAccountable(result2) {
|
|
15637
|
-
const
|
|
15637
|
+
const roleLabel2 = `${sanitizeSingleLineField(result2.role.name)} (${result2.role.entryId ?? result2.role.id})`;
|
|
15638
15638
|
const explicitCursorHint = result2.nextCursor !== null ? `raise limit or continue with cursor ${result2.nextCursor}` : "raise limit";
|
|
15639
15639
|
return [
|
|
15640
|
-
`${
|
|
15640
|
+
`${roleLabel2} \u2014 accountability:`,
|
|
15641
15641
|
...formatSection("explicit (owns)", result2.explicit, result2.explicitTruncated, explicitCursorHint),
|
|
15642
15642
|
...formatSection("reporting (reports on)", result2.reporting, result2.reportingTruncated),
|
|
15643
15643
|
` inherited: not-computed \u2014 ${result2.inheritedNotComputedReason}`
|
|
@@ -15689,6 +15689,234 @@ function registerRoleTools(server) {
|
|
|
15689
15689
|
);
|
|
15690
15690
|
}
|
|
15691
15691
|
|
|
15692
|
+
// src/tools/outcome.ts
|
|
15693
|
+
import { z as z35 } from "zod/v3";
|
|
15694
|
+
var OUTCOME_ACTIONS = ["record", "list", "show"];
|
|
15695
|
+
var READING_KINDS = ["measurement", "estimate", "correction"];
|
|
15696
|
+
var outcomeSchema = z35.object({
|
|
15697
|
+
action: z35.enum(OUTCOME_ACTIONS).describe(
|
|
15698
|
+
"'record': record a reading (evidence, not a verdict). 'list': list readings, newest first. 'show': the derived view \u2014 current, progress, pace, staleness, recorded completion."
|
|
15699
|
+
),
|
|
15700
|
+
entryId: z35.string().max(200).optional().describe("The key result (or other outcome-bearing) entry, by its chain id. Required for all three actions."),
|
|
15701
|
+
value: z35.number().optional().describe("'record': the measured value. Required for 'record'."),
|
|
15702
|
+
valueText: z35.string().max(500).optional().describe("'record': verbatim as-reported form when the source was not clean, e.g. '~62%'. Display only."),
|
|
15703
|
+
asOf: z35.string().max(64).optional().describe("'record': when the world was in this state, as a parseable date (default: now). Back-dating a backfill is legitimate \u2014 it shows up as asOf earlier than recordedAt."),
|
|
15704
|
+
kind: z35.enum(READING_KINDS).optional().describe("'record': measurement | estimate | correction (default: measurement)."),
|
|
15705
|
+
correctsReadingId: z35.string().max(200).optional().describe("'record': required with kind='correction' \u2014 the reading id this replaces. Refused if that row is already superseded."),
|
|
15706
|
+
recordedByRoleId: z35.string().max(200).optional().describe("'record': the accountable role (default: the entry's reporterRoleId, then ownerRoleId)."),
|
|
15707
|
+
note: z35.string().max(2e3).optional().describe("'record': free-text note recorded with the reading."),
|
|
15708
|
+
source: z35.string().max(500).optional().describe("'record': where the number came from \u2014 a dashboard name, a query, a URL."),
|
|
15709
|
+
limit: z35.number().int().positive().max(200).optional().describe("'list': max rows to return (default and maximum 200).")
|
|
15710
|
+
});
|
|
15711
|
+
var recordVariant = z35.object({
|
|
15712
|
+
action: z35.literal("record"),
|
|
15713
|
+
entryId: z35.string().max(200),
|
|
15714
|
+
value: z35.number(),
|
|
15715
|
+
valueText: z35.string().max(500).optional(),
|
|
15716
|
+
asOf: z35.string().max(64).optional(),
|
|
15717
|
+
kind: z35.enum(READING_KINDS).optional(),
|
|
15718
|
+
correctsReadingId: z35.string().max(200).optional(),
|
|
15719
|
+
recordedByRoleId: z35.string().max(200).optional(),
|
|
15720
|
+
note: z35.string().max(2e3).optional(),
|
|
15721
|
+
source: z35.string().max(500).optional()
|
|
15722
|
+
});
|
|
15723
|
+
var listVariant2 = z35.object({
|
|
15724
|
+
action: z35.literal("list"),
|
|
15725
|
+
entryId: z35.string().max(200),
|
|
15726
|
+
limit: z35.number().int().positive().max(200).optional()
|
|
15727
|
+
});
|
|
15728
|
+
var showVariant = z35.object({ action: z35.literal("show"), entryId: z35.string().max(200) });
|
|
15729
|
+
var outcomeActionUnion = z35.discriminatedUnion("action", [recordVariant, listVariant2, showVariant]);
|
|
15730
|
+
var OUTCOME_ACTION_SPECS = {
|
|
15731
|
+
record: {
|
|
15732
|
+
params: ["entryId", "value", "valueText", "asOf", "kind", "correctsReadingId", "recordedByRoleId", "note", "source"],
|
|
15733
|
+
description: "entryId and value are required; the rest are optional."
|
|
15734
|
+
},
|
|
15735
|
+
list: { params: ["entryId", "limit"], description: "entryId is required; limit is optional." },
|
|
15736
|
+
show: { params: ["entryId"], description: "entryId is required." }
|
|
15737
|
+
};
|
|
15738
|
+
function formatRecordReceipt(numericValue, entryId, valueText, receipt) {
|
|
15739
|
+
const tier = receipt.independenceTier ?? "unknown";
|
|
15740
|
+
const lines = [
|
|
15741
|
+
`Recorded ${numericValue}${valueText ? ` ("${sanitizeSingleLineField(valueText)}")` : ""} on ${sanitizeSingleLineField(entryId)}.`,
|
|
15742
|
+
` attributed: ${receipt.actorKind ?? "unknown"} \xB7 independence: ${tier}`
|
|
15743
|
+
];
|
|
15744
|
+
if (tier === "provenance_unknown") {
|
|
15745
|
+
lines.push(" (no session named, so provenance is unknown \u2014 that is the honest answer, not an error)");
|
|
15746
|
+
}
|
|
15747
|
+
return lines.join("\n");
|
|
15748
|
+
}
|
|
15749
|
+
function formatReadingsList(entryId, result2) {
|
|
15750
|
+
const safeEntryId = sanitizeSingleLineField(entryId);
|
|
15751
|
+
const rows = result2?.readings ?? [];
|
|
15752
|
+
if (rows.length === 0) return `No readings recorded on ${safeEntryId} yet.`;
|
|
15753
|
+
const lines = rows.map((row) => {
|
|
15754
|
+
const when = new Date(row.asOf).toISOString().slice(0, 10);
|
|
15755
|
+
const superseded = row.supersededByReadingId ? ` <- superseded by ${row.supersededByReadingId}` : "";
|
|
15756
|
+
const text = row.valueText ? ` ("${sanitizeSingleLineField(row.valueText)}")` : "";
|
|
15757
|
+
const note = row.note ? ` - ${sanitizeSingleLineField(row.note)}` : "";
|
|
15758
|
+
return ` ${when} ${String(row.value).padStart(8)}${text} [${row.kind}\xB7${row.independenceTier}] ${row.readingId}${note}${superseded}`;
|
|
15759
|
+
});
|
|
15760
|
+
const tail = result2?.pageExhausted === false ? "\n (older readings not loaded - raise --limit)" : "";
|
|
15761
|
+
return `${rows.length} reading(s) on ${safeEntryId}, newest first:
|
|
15762
|
+
${lines.join("\n")}${tail}`;
|
|
15763
|
+
}
|
|
15764
|
+
var pct = (v, unit = "%") => v === void 0 ? "\u2014" : `${Math.round(v * 10) / 10}${unit}`;
|
|
15765
|
+
var roleLabel = (role) => role === null ? "not set" : role.name === null ? "a role that no longer exists" : sanitizeSingleLineField(role.name);
|
|
15766
|
+
function formatOutcomeShow(result2) {
|
|
15767
|
+
if (!result2) return "No outcome found.";
|
|
15768
|
+
const o = result2.outcome;
|
|
15769
|
+
const unit = o.unit ? ` ${sanitizeSingleLineField(o.unit)}` : "";
|
|
15770
|
+
const lines = [
|
|
15771
|
+
`${sanitizeSingleLineField(result2.entryId)} \u2014 ${sanitizeSingleLineField(result2.name)}`,
|
|
15772
|
+
` metric ${o.metric ? sanitizeSingleLineField(o.metric) : "not set"}`,
|
|
15773
|
+
` current ${o.current ? `${o.current.value}${unit}` : "no readings yet"} (${o.readingCount} reading(s))`,
|
|
15774
|
+
` progress ${pct(o.progressPct)} direction ${o.direction}`,
|
|
15775
|
+
` pace ${pct(o.pacePct)} ${o.pacePct === void 0 ? "(no cycle end set)" : o.pacePct >= 0 ? "(ahead of pace)" : "(behind pace)"}`,
|
|
15776
|
+
` state ${o.state}${o.hasNoReadings ? " \u2014 never read" : ""}${o.overdueByMs ? ` (by ${Math.floor(o.overdueByMs / 864e5)}d)` : ""}`,
|
|
15777
|
+
` next due ${o.nextDueAt ? new Date(o.nextDueAt).toISOString().slice(0, 10) : "no cadence set"}`,
|
|
15778
|
+
` owner ${roleLabel(o.ownerRole)}`,
|
|
15779
|
+
` reporter ${roleLabel(o.reporterRole)}`,
|
|
15780
|
+
` completion recorded as ${o.completion} (source: ${o.completionProvenance})`,
|
|
15781
|
+
` attestation weakest in cycle: ${o.weakestTierInCycle ?? "none recorded"} \u2014 reported, not enforced`
|
|
15782
|
+
];
|
|
15783
|
+
if (o.currentResolution === "page-exhausted") {
|
|
15784
|
+
lines.push(' note every loaded reading is superseded and more remain \u2014 this is not "never read"');
|
|
15785
|
+
}
|
|
15786
|
+
if (result2.readyToCloseInstruction) {
|
|
15787
|
+
lines.push("", ` ${result2.readyToCloseInstruction}`);
|
|
15788
|
+
}
|
|
15789
|
+
return lines.join("\n");
|
|
15790
|
+
}
|
|
15791
|
+
function outcomeErrorResult(err, action, entryId, params = {}) {
|
|
15792
|
+
const classified = classifyError(err);
|
|
15793
|
+
const definedParams = Object.fromEntries(Object.entries(params).filter(([, v]) => v !== void 0));
|
|
15794
|
+
const isUnverifiedRecordTimeout = action === "record" && classified.code === "GATEWAY_TIMEOUT";
|
|
15795
|
+
const defaultActions = isUnverifiedRecordTimeout ? [
|
|
15796
|
+
{ tool: "outcome", description: "Check whether the reading already landed", parameters: { action: "list", entryId } },
|
|
15797
|
+
{ tool: "outcome", description: "Check the derived view", parameters: { action: "show", entryId } }
|
|
15798
|
+
] : [{ tool: "outcome", description: `Retry ${action}`, parameters: { action, ...definedParams } }];
|
|
15799
|
+
return failureResult(
|
|
15800
|
+
classified.message,
|
|
15801
|
+
classified.code,
|
|
15802
|
+
classified.message,
|
|
15803
|
+
classified.recovery ?? "Use action='show' or action='list' with a valid entryId to check the key result exists.",
|
|
15804
|
+
classified.availableActions ?? defaultActions,
|
|
15805
|
+
classified.diagnostics
|
|
15806
|
+
);
|
|
15807
|
+
}
|
|
15808
|
+
async function handleOutcomeRecord(entryId, value, opts = {}) {
|
|
15809
|
+
requireWriteAccess();
|
|
15810
|
+
if (opts.correctsReadingId !== void 0 && opts.kind !== "correction") {
|
|
15811
|
+
return failureResult(
|
|
15812
|
+
"correctsReadingId is only meaningful with kind='correction'.",
|
|
15813
|
+
"VALIDATION_ERROR",
|
|
15814
|
+
"correctsReadingId is only meaningful with kind='correction'.",
|
|
15815
|
+
"Set kind='correction', or drop correctsReadingId to record an ordinary reading."
|
|
15816
|
+
);
|
|
15817
|
+
}
|
|
15818
|
+
if (opts.kind === "correction" && opts.correctsReadingId === void 0) {
|
|
15819
|
+
return failureResult(
|
|
15820
|
+
"kind='correction' requires correctsReadingId.",
|
|
15821
|
+
"VALIDATION_ERROR",
|
|
15822
|
+
"kind='correction' requires correctsReadingId.",
|
|
15823
|
+
"A correction must name the reading it replaces \u2014 find it with action='list'."
|
|
15824
|
+
);
|
|
15825
|
+
}
|
|
15826
|
+
let asOf;
|
|
15827
|
+
if (opts.asOf !== void 0) {
|
|
15828
|
+
const parsed = Date.parse(opts.asOf);
|
|
15829
|
+
if (Number.isNaN(parsed)) {
|
|
15830
|
+
return failureResult(
|
|
15831
|
+
`asOf must be a parseable date (got "${opts.asOf}").`,
|
|
15832
|
+
"VALIDATION_ERROR",
|
|
15833
|
+
`asOf must be a parseable date (got "${opts.asOf}").`,
|
|
15834
|
+
"Example: asOf='2026-03-01'. Back-dating is legitimate \u2014 a backfill shows up as asOf earlier than recordedAt."
|
|
15835
|
+
);
|
|
15836
|
+
}
|
|
15837
|
+
asOf = parsed;
|
|
15838
|
+
}
|
|
15839
|
+
try {
|
|
15840
|
+
const agentSessionId = getAgentSessionId();
|
|
15841
|
+
const receipt = await kernelMutation("outcomes.recordReading", {
|
|
15842
|
+
entryId,
|
|
15843
|
+
value,
|
|
15844
|
+
...asOf !== void 0 ? { asOf } : {},
|
|
15845
|
+
...opts.kind ? { kind: opts.kind } : {},
|
|
15846
|
+
...opts.correctsReadingId ? { correctsReadingId: opts.correctsReadingId } : {},
|
|
15847
|
+
...opts.recordedByRoleId ? { recordedByRoleId: opts.recordedByRoleId } : {},
|
|
15848
|
+
...opts.note ? { note: opts.note } : {},
|
|
15849
|
+
...opts.source ? { source: opts.source } : {},
|
|
15850
|
+
...opts.valueText ? { valueText: opts.valueText } : {},
|
|
15851
|
+
...agentSessionId ? { agentSessionId } : {}
|
|
15852
|
+
});
|
|
15853
|
+
const message = formatRecordReceipt(value, entryId, opts.valueText, receipt);
|
|
15854
|
+
return successResult(message, message, receipt);
|
|
15855
|
+
} catch (err) {
|
|
15856
|
+
return outcomeErrorResult(err, "record", entryId, { entryId, value, ...opts });
|
|
15857
|
+
}
|
|
15858
|
+
}
|
|
15859
|
+
async function handleOutcomeList(entryId, limit) {
|
|
15860
|
+
try {
|
|
15861
|
+
const result2 = await kernelQuery("outcomes.listReadings", {
|
|
15862
|
+
entryId,
|
|
15863
|
+
...limit !== void 0 ? { limit } : {}
|
|
15864
|
+
});
|
|
15865
|
+
const message = formatReadingsList(entryId, result2);
|
|
15866
|
+
return successResult(message, message, result2);
|
|
15867
|
+
} catch (err) {
|
|
15868
|
+
return outcomeErrorResult(err, "list", entryId, { entryId, limit });
|
|
15869
|
+
}
|
|
15870
|
+
}
|
|
15871
|
+
async function handleOutcomeShow(entryId) {
|
|
15872
|
+
try {
|
|
15873
|
+
const result2 = await kernelQuery("outcomes.showOutcome", { entryId });
|
|
15874
|
+
const message = formatOutcomeShow(result2);
|
|
15875
|
+
return successResult(message, message, result2);
|
|
15876
|
+
} catch (err) {
|
|
15877
|
+
return outcomeErrorResult(err, "show", entryId, { entryId });
|
|
15878
|
+
}
|
|
15879
|
+
}
|
|
15880
|
+
function registerOutcomeTools(server) {
|
|
15881
|
+
const outcomeHandlers = {
|
|
15882
|
+
record: (data) => handleOutcomeRecord(data.entryId, data.value, {
|
|
15883
|
+
valueText: data.valueText,
|
|
15884
|
+
asOf: data.asOf,
|
|
15885
|
+
kind: data.kind,
|
|
15886
|
+
correctsReadingId: data.correctsReadingId,
|
|
15887
|
+
recordedByRoleId: data.recordedByRoleId,
|
|
15888
|
+
note: data.note,
|
|
15889
|
+
source: data.source
|
|
15890
|
+
}),
|
|
15891
|
+
list: (data) => handleOutcomeList(data.entryId, data.limit),
|
|
15892
|
+
show: (data) => handleOutcomeShow(data.entryId)
|
|
15893
|
+
};
|
|
15894
|
+
server.registerTool(
|
|
15895
|
+
"outcome",
|
|
15896
|
+
{
|
|
15897
|
+
title: "Outcome",
|
|
15898
|
+
description: (
|
|
15899
|
+
// Chain IDs stay OUT of this user-facing string (check:chain-id-leaks) — same
|
|
15900
|
+
// precedent role.ts's own docblock names for its Team-Lead-vacancy sentence.
|
|
15901
|
+
"Key-result outcomes \u2014 record and read the measured readings behind a number. Three actions:\n\n- **record**: Record a reading \u2014 evidence, not a verdict; any connector may record one.\n- **list**: List readings, newest first; superseded rows are shown and marked with their replacement.\n- **show**: The derived view \u2014 current, progress, pace, staleness, recorded completion and its provenance, and any close proposal."
|
|
15902
|
+
),
|
|
15903
|
+
inputSchema: outcomeSchema,
|
|
15904
|
+
// Mixed read/write noun (same as shape's list/show read, agree/dismiss write): record
|
|
15905
|
+
// writes; list/show read.
|
|
15906
|
+
annotations: { readOnlyHint: false, idempotentHint: false, openWorldHint: false }
|
|
15907
|
+
},
|
|
15908
|
+
thinWrapper(async (args) => {
|
|
15909
|
+
const parsed = parseOrFail(outcomeSchema, args);
|
|
15910
|
+
if (!parsed.ok) return parsed.result;
|
|
15911
|
+
const { action } = parsed.data;
|
|
15912
|
+
return runWithToolContext(
|
|
15913
|
+
{ tool: "outcome", action },
|
|
15914
|
+
() => dispatchDiscriminated("outcome", outcomeActionUnion, parsed.data, OUTCOME_ACTION_SPECS, outcomeHandlers)
|
|
15915
|
+
);
|
|
15916
|
+
})
|
|
15917
|
+
);
|
|
15918
|
+
}
|
|
15919
|
+
|
|
15692
15920
|
// src/resources/index.ts
|
|
15693
15921
|
import { existsSync as existsSync3 } from "fs";
|
|
15694
15922
|
import { dirname, join, resolve as resolve4 } from "path";
|
|
@@ -16201,12 +16429,12 @@ ${entry.labels.map((l) => `- ${l.name ?? l.slug}`).join("\n")}`);
|
|
|
16201
16429
|
}
|
|
16202
16430
|
|
|
16203
16431
|
// src/prompts/index.ts
|
|
16204
|
-
import { z as
|
|
16432
|
+
import { z as z36 } from "zod/v3";
|
|
16205
16433
|
function registerPrompts(server) {
|
|
16206
16434
|
server.prompt(
|
|
16207
16435
|
"review-against-rules",
|
|
16208
16436
|
"Review code or a design decision against all business rules for a given domain. Fetches the rules and asks you to do a structured compliance review.",
|
|
16209
|
-
{ domain:
|
|
16437
|
+
{ domain: z36.string().describe("Business rule domain (e.g. 'Identity & Access', 'Governance & Decision-Making')") },
|
|
16210
16438
|
async ({ domain }) => {
|
|
16211
16439
|
const entries = await kernelQuery("chain.listEntries", { collectionSlug: "business-rules" });
|
|
16212
16440
|
const rules = entries.filter((e) => e.data?.domain === domain);
|
|
@@ -16259,7 +16487,7 @@ Provide a structured review with a compliance status for each rule (COMPLIANT /
|
|
|
16259
16487
|
server.prompt(
|
|
16260
16488
|
"name-check",
|
|
16261
16489
|
"Check variable names, field names, or API names against the glossary for terminology alignment. Flags drift from canonical terms.",
|
|
16262
|
-
{ names:
|
|
16490
|
+
{ names: z36.string().describe("Comma-separated list of names to check (e.g. 'vendor_id, compliance_level, formulator_type')") },
|
|
16263
16491
|
async ({ names }) => {
|
|
16264
16492
|
const terms = await kernelQuery("chain.listEntries", { collectionSlug: "glossary" });
|
|
16265
16493
|
const glossaryContext = terms.map(
|
|
@@ -16295,7 +16523,7 @@ Format as a table: Name | Status | Canonical Form | Action Needed`
|
|
|
16295
16523
|
server.prompt(
|
|
16296
16524
|
"draft-decision-record",
|
|
16297
16525
|
"Draft a structured decision record from a description of what was decided. Includes context from recent decisions and relevant rules.",
|
|
16298
|
-
{ context:
|
|
16526
|
+
{ context: z36.string().describe("Description of the decision (e.g. 'We decided to use MRSL v3.1 as the conformance baseline because...')") },
|
|
16299
16527
|
async ({ context }) => {
|
|
16300
16528
|
const recentDecisions = await kernelQuery("chain.listEntries", { collectionSlug: "decisions" });
|
|
16301
16529
|
const sorted = [...recentDecisions].sort((a, b) => (b.data?.date ?? "") > (a.data?.date ?? "") ? 1 : -1).slice(0, 5);
|
|
@@ -16333,8 +16561,8 @@ After drafting, I can log it using the capture tool with collection "decisions".
|
|
|
16333
16561
|
"draft-rule-from-context",
|
|
16334
16562
|
"Draft a new business rule from an observation or discovery made while coding. Fetches existing rules for the domain to ensure consistency.",
|
|
16335
16563
|
{
|
|
16336
|
-
observation:
|
|
16337
|
-
domain:
|
|
16564
|
+
observation: z36.string().describe("What you observed or discovered (e.g. 'Suppliers can have multiple org types in Gateway')"),
|
|
16565
|
+
domain: z36.string().describe("Which domain this rule belongs to (e.g. 'Governance & Decision-Making')")
|
|
16338
16566
|
},
|
|
16339
16567
|
async ({ observation, domain }) => {
|
|
16340
16568
|
const allRules = await kernelQuery("chain.listEntries", { collectionSlug: "business-rules" });
|
|
@@ -16473,6 +16701,7 @@ function createProductBrainServer() {
|
|
|
16473
16701
|
registerShapeTools(server);
|
|
16474
16702
|
registerQuestionTools(server);
|
|
16475
16703
|
registerRoleTools(server);
|
|
16704
|
+
registerOutcomeTools(server);
|
|
16476
16705
|
if (enabledModules.has("gitchain")) registerGitChainTools(server);
|
|
16477
16706
|
registerResources(server);
|
|
16478
16707
|
registerPrompts(server);
|
|
@@ -16612,4 +16841,4 @@ export {
|
|
|
16612
16841
|
createProductBrainServer,
|
|
16613
16842
|
initFeatureFlags
|
|
16614
16843
|
};
|
|
16615
|
-
//# sourceMappingURL=chunk-
|
|
16844
|
+
//# sourceMappingURL=chunk-C5BIZH5N.js.map
|