@productbrain/mcp 0.0.1-beta.4250 → 0.0.1-beta.4262
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-WTGHEQHB.js → chunk-SD33RK7E.js} +2 -1
- package/dist/chunk-SD33RK7E.js.map +1 -0
- package/dist/{chunk-3NAU25R5.js → chunk-WGTVDUBC.js} +120 -16
- package/dist/{chunk-3NAU25R5.js.map → chunk-WGTVDUBC.js.map} +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/http.js +2 -2
- package/dist/index.js +2 -2
- package/dist/{setup-RTUHXH7J.js → setup-DUKI2SYN.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-WTGHEQHB.js.map +0 -1
- /package/dist/{setup-RTUHXH7J.js.map → setup-DUKI2SYN.js.map} +0 -0
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
trackSessionCaptureRate,
|
|
43
43
|
trackWriteBackHintServed,
|
|
44
44
|
trackZeroCaptureAuditFired
|
|
45
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-SD33RK7E.js";
|
|
46
46
|
|
|
47
47
|
// src/server.ts
|
|
48
48
|
import { McpServer as McpServer2 } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
@@ -8874,24 +8874,96 @@ async function loadSkillBody(entryId) {
|
|
|
8874
8874
|
}
|
|
8875
8875
|
|
|
8876
8876
|
// src/lib/sessionNotices.ts
|
|
8877
|
+
var ANSI_AND_CONTROL_RE = /\x1b\[[0-9;]*[A-Za-z]|\x1b\][^\x07]*\x07|\x1b[^[\]0-9;A-Za-z]?|[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g;
|
|
8878
|
+
function safe(str) {
|
|
8879
|
+
return str ? str.replace(ANSI_AND_CONTROL_RE, "") : "";
|
|
8880
|
+
}
|
|
8877
8881
|
var FEEDBACK_SUBMIT_HINT = "Friction or ideas? Use `feedback action=submit` \u2014 describe how pb behaved, not your workspace content. Once screening completes, it enters the builders' triage queue.";
|
|
8878
|
-
function nextActionForVerb(verb) {
|
|
8882
|
+
function nextActionForVerb(verb, args) {
|
|
8879
8883
|
switch (verb) {
|
|
8880
8884
|
case "feedback.list":
|
|
8881
8885
|
return { tool: "feedback", description: "Read your workspace's own feedback (all statuses)", parameters: { action: "list" } };
|
|
8882
8886
|
case "feedback.queue":
|
|
8883
8887
|
return { tool: "feedback", description: "Read the vendor triage queue (system admins only)", parameters: { action: "queue" } };
|
|
8888
|
+
case "question.create":
|
|
8889
|
+
return { tool: "question", description: "Create a routed question", parameters: { action: "create" } };
|
|
8890
|
+
case "question.adopt":
|
|
8891
|
+
return { tool: "question", description: "Attach routing to a captured tension", parameters: { action: "adopt" } };
|
|
8892
|
+
case "question.assign":
|
|
8893
|
+
return { tool: "question", description: "Confirm or reassign a question", parameters: { action: "assign" } };
|
|
8894
|
+
case "question.snooze":
|
|
8895
|
+
return { tool: "question", description: "Snooze a routed/escalated question", parameters: { action: "snooze" } };
|
|
8896
|
+
case "question.decline":
|
|
8897
|
+
return { tool: "question", description: "Pass on or decline a question", parameters: { action: "decline" } };
|
|
8898
|
+
case "question.answer":
|
|
8899
|
+
return { tool: "question", description: "Answer a question", parameters: { action: "answer" } };
|
|
8900
|
+
case "question.forceClose":
|
|
8901
|
+
return { tool: "question", description: "Team-Lead-only force-close", parameters: { action: "force-close" } };
|
|
8902
|
+
case "question.list":
|
|
8903
|
+
return { tool: "question", description: args.mine === true ? "List every question you asked" : "List open questions", parameters: { action: "list", ...args.mine === true ? { mine: true } : {} } };
|
|
8884
8904
|
default:
|
|
8885
8905
|
return null;
|
|
8886
8906
|
}
|
|
8887
8907
|
}
|
|
8888
8908
|
function noticesToNextActions(notices) {
|
|
8889
8909
|
if (!notices || notices.length === 0) return [];
|
|
8890
|
-
|
|
8910
|
+
const actions2 = notices.map((n) => nextActionForVerb(n.action.verb, n.action.args)).filter((a) => a !== null);
|
|
8911
|
+
const seen = /* @__PURE__ */ new Set();
|
|
8912
|
+
return actions2.filter((a) => {
|
|
8913
|
+
const key = `${a.tool}:${JSON.stringify(a.parameters)}`;
|
|
8914
|
+
if (seen.has(key)) return false;
|
|
8915
|
+
seen.add(key);
|
|
8916
|
+
return true;
|
|
8917
|
+
});
|
|
8918
|
+
}
|
|
8919
|
+
var QUESTION_ACK_GATE_SOURCE_ID = "question-ack-gate";
|
|
8920
|
+
function displayVerbFromRoute(route) {
|
|
8921
|
+
switch (route) {
|
|
8922
|
+
case "question.assign":
|
|
8923
|
+
return "take it / reassign";
|
|
8924
|
+
case "question.decline":
|
|
8925
|
+
return "pass / decline";
|
|
8926
|
+
case "question.forceClose":
|
|
8927
|
+
return "force-close";
|
|
8928
|
+
default:
|
|
8929
|
+
return route.replace(/^question\./, "");
|
|
8930
|
+
}
|
|
8931
|
+
}
|
|
8932
|
+
function formatQuestionBrief(q) {
|
|
8933
|
+
const lines = [];
|
|
8934
|
+
lines.push(` [${safe(q.sourcePointer)}] ${safe(q.name)} \u2014 ${safe(q.whyYou)}, ${q.ageDays}d`);
|
|
8935
|
+
lines.push(` "${safe(q.question)}" \u2014 asked by ${safe(q.asker)}${q.domain ? `, ${safe(q.domain)} domain` : ""}`);
|
|
8936
|
+
if (q.dependents.count > 0) {
|
|
8937
|
+
const names = q.dependents.named.map((d) => `${safe(d.name)} (${safe(d.id)})`).join(", ");
|
|
8938
|
+
const countLabel = q.dependents.truncated ? `${q.dependents.count}+` : String(q.dependents.count);
|
|
8939
|
+
lines.push(` blocks ${countLabel} item(s)${names ? `: ${names}` : ""}`);
|
|
8940
|
+
}
|
|
8941
|
+
if (q.declineContext) lines.push(` declined: ${safe(q.declineContext)}`);
|
|
8942
|
+
if (q.answerContext) lines.push(` ${safe(q.answerContext)}`);
|
|
8943
|
+
const verbList = [...new Set(q.actions.map((a) => safe(a.label) || displayVerbFromRoute(a.verb)))].join(" \xB7 ") || "answer";
|
|
8944
|
+
lines.push(` ${verbList} -> question action=answer entryId=${safe(q.sourcePointer)} text="<your answer>"`);
|
|
8945
|
+
return lines;
|
|
8946
|
+
}
|
|
8947
|
+
function formatQuestionAckGateBlock(notice) {
|
|
8948
|
+
const questions = notice.payload?.questions ?? [];
|
|
8949
|
+
const lines = [];
|
|
8950
|
+
lines.push(`- ${questions.length} open question${questions.length === 1 ? "" : "s"} need you before you continue.`);
|
|
8951
|
+
for (const q of questions) lines.push(...formatQuestionBrief(q));
|
|
8952
|
+
lines.push(" Deal with each question above before proceeding.");
|
|
8953
|
+
if (notice.payload?.truncated) {
|
|
8954
|
+
lines.push(" (This list may be incomplete \u2014 you may have more open questions than shown.)");
|
|
8955
|
+
}
|
|
8956
|
+
return lines;
|
|
8891
8957
|
}
|
|
8892
8958
|
function formatNoticeLines(notices) {
|
|
8893
8959
|
if (!notices || notices.length === 0) return [];
|
|
8894
|
-
return notices.
|
|
8960
|
+
return notices.flatMap(
|
|
8961
|
+
(n) => n.source === QUESTION_ACK_GATE_SOURCE_ID && n.payload ? formatQuestionAckGateBlock(n) : [`- ${safe(n.subject)} (${safe(n.change)})`]
|
|
8962
|
+
);
|
|
8963
|
+
}
|
|
8964
|
+
function formatAdoptDiscoveryLine(display) {
|
|
8965
|
+
if (!display) return [];
|
|
8966
|
+
return [`- ${display} open question${display === "1" ? "" : "s"} you raised have no owner yet \u2014 use \`question action=adopt\` to route one.`];
|
|
8895
8967
|
}
|
|
8896
8968
|
|
|
8897
8969
|
// src/tools/start_pb.ts
|
|
@@ -13316,6 +13388,10 @@ async function handleStart2() {
|
|
|
13316
13388
|
if (noticeLines.length > 0) {
|
|
13317
13389
|
lines.push("", "Notices:", ...noticeLines);
|
|
13318
13390
|
}
|
|
13391
|
+
const adoptLines = formatAdoptDiscoveryLine(result2.adoptDiscoveryHint);
|
|
13392
|
+
if (adoptLines.length > 0) {
|
|
13393
|
+
lines.push("", ...adoptLines);
|
|
13394
|
+
}
|
|
13319
13395
|
const summary = `Session ${result2.sessionId} active. Workspace ${result2.workspaceName}. Write tools available after orient.`;
|
|
13320
13396
|
return {
|
|
13321
13397
|
content: [{ type: "text", text: lines.join("\n") }],
|
|
@@ -13326,7 +13402,8 @@ async function handleStart2() {
|
|
|
13326
13402
|
toolsScope: result2.toolsScope,
|
|
13327
13403
|
feedbackQueueNew: result2.feedbackQueueNew,
|
|
13328
13404
|
feedbackOldestNewAt: result2.feedbackOldestNewAt,
|
|
13329
|
-
notices: result2.notices ?? []
|
|
13405
|
+
notices: result2.notices ?? [],
|
|
13406
|
+
adoptDiscoveryHint: result2.adoptDiscoveryHint
|
|
13330
13407
|
// Finding #16: bare `parameters: {}` lets orient's schema default kick in
|
|
13331
13408
|
// (action defaults to "task", which requires a `task` string) — the suggested
|
|
13332
13409
|
// next-action call failed validation instead of running. `action: "start"` is
|
|
@@ -15811,19 +15888,20 @@ function registerShapeTools(server) {
|
|
|
15811
15888
|
|
|
15812
15889
|
// src/tools/question.ts
|
|
15813
15890
|
import { z as z34 } from "zod/v3";
|
|
15814
|
-
var QUESTION_ACTIONS = ["create", "adopt", "assign", "snooze", "decline", "answer", "force-close"];
|
|
15891
|
+
var QUESTION_ACTIONS = ["create", "adopt", "assign", "snooze", "decline", "answer", "force-close", "list"];
|
|
15815
15892
|
var questionSchema = z34.object({
|
|
15816
15893
|
action: z34.enum(QUESTION_ACTIONS).describe(
|
|
15817
|
-
"'create': create a new routed question from text (domains come from `pb question --help` / this tool's own refusal \u2014 never hardcode a slug). 'adopt': attach routing to a tension already captured (e.g. via `pb capture \"TEN: ...\"`) \u2014 the pilot's real birth path; without adopt, captured tensions stay invisible to routing forever. 'assign': confirm ('take it', omit toRole/toPerson) or reassign (supply toRole and/or toPerson) ownership. 'snooze': defer a routed/escalated question (max 2, then it escalates). 'decline': pass on a suggested question, or (as owner/lead) decline an owned one \u2014 reason required. 'answer': close the loop \u2014 creates the answering entry itself unless --entry is given. 'force-close': Team-Lead-only escape hatch \u2014 reason required."
|
|
15894
|
+
"'create': create a new routed question from text (domains come from `pb question --help` / this tool's own refusal \u2014 never hardcode a slug). 'adopt': attach routing to a tension already captured (e.g. via `pb capture \"TEN: ...\"`) \u2014 the pilot's real birth path; without adopt, captured tensions stay invisible to routing forever. 'assign': confirm ('take it', omit toRole/toPerson) or reassign (supply toRole and/or toPerson) ownership. 'snooze': defer a routed/escalated question (max 2, then it escalates). 'decline': pass on a suggested question, or (as owner/lead) decline an owned one \u2014 reason required. 'answer': close the loop \u2014 creates the answering entry itself unless --entry is given. 'force-close': Team-Lead-only escape hatch \u2014 reason required. 'list': the ack-gate read model \u2014 what you owe (or, with mine:true, every question you asked, including closed ones)."
|
|
15818
15895
|
),
|
|
15819
|
-
entryId: z34.string().max(200).optional().describe("Target question's id (human TEN-nnn form or a raw entry id). Required for every action except 'create'."),
|
|
15896
|
+
entryId: z34.string().max(200).optional().describe("Target question's id (human TEN-nnn form or a raw entry id). Required for every action except 'create'/'list'."),
|
|
15820
15897
|
text: z34.string().max(5e3).optional().describe("'create': the question text. 'answer': the answer text (mutually exclusive with answerEntryId, max 2000 chars)."),
|
|
15821
15898
|
domain: z34.string().max(200).optional().describe("'create'/'adopt': the domain slug (see this tool's refusal for the live list)."),
|
|
15822
15899
|
blocks: z34.array(z34.string().max(200)).max(50).optional().describe("'create'/'adopt': entry ids this question is blocking (repeatable)."),
|
|
15823
15900
|
toRole: z34.string().max(200).optional().describe("'assign': reassign to this role (human ROL-nnn form or a raw entry id)."),
|
|
15824
15901
|
toPerson: z34.string().max(200).optional().describe("'assign': reassign to this person (a raw person id)."),
|
|
15825
15902
|
reason: z34.string().max(2e3).optional().describe("'decline'/'force-close': required reason."),
|
|
15826
|
-
answerEntryId: z34.string().max(200).optional().describe("'answer': point at an already-written entry instead of supplying text (mutually exclusive with text).")
|
|
15903
|
+
answerEntryId: z34.string().max(200).optional().describe("'answer': point at an already-written entry instead of supplying text (mutually exclusive with text)."),
|
|
15904
|
+
mine: z34.boolean().optional().describe("'list': true for arm C (every question YOU asked, every status). Omit/false for the ack-gate view (what you owe).")
|
|
15827
15905
|
});
|
|
15828
15906
|
var createVariant = z34.object({ action: z34.literal("create"), text: z34.string().min(1).max(5e3), domain: z34.string().max(200).optional(), blocks: z34.array(z34.string().max(200)).max(50).optional() });
|
|
15829
15907
|
var adoptVariant = z34.object({ action: z34.literal("adopt"), entryId: z34.string().max(200), domain: z34.string().max(200).optional(), blocks: z34.array(z34.string().max(200)).max(50).optional() });
|
|
@@ -15832,6 +15910,7 @@ var snoozeVariant = z34.object({ action: z34.literal("snooze"), entryId: z34.str
|
|
|
15832
15910
|
var declineVariant = z34.object({ action: z34.literal("decline"), entryId: z34.string().max(200), reason: z34.string().min(1).max(2e3) });
|
|
15833
15911
|
var answerVariant = z34.object({ action: z34.literal("answer"), entryId: z34.string().max(200), text: z34.string().max(2e3).optional(), answerEntryId: z34.string().max(200).optional() });
|
|
15834
15912
|
var forceCloseVariant = z34.object({ action: z34.literal("force-close"), entryId: z34.string().max(200), reason: z34.string().min(1).max(2e3) });
|
|
15913
|
+
var listVariant = z34.object({ action: z34.literal("list"), mine: z34.boolean().optional() });
|
|
15835
15914
|
var questionActionUnion = z34.discriminatedUnion("action", [
|
|
15836
15915
|
createVariant,
|
|
15837
15916
|
adoptVariant,
|
|
@@ -15839,7 +15918,8 @@ var questionActionUnion = z34.discriminatedUnion("action", [
|
|
|
15839
15918
|
snoozeVariant,
|
|
15840
15919
|
declineVariant,
|
|
15841
15920
|
answerVariant,
|
|
15842
|
-
forceCloseVariant
|
|
15921
|
+
forceCloseVariant,
|
|
15922
|
+
listVariant
|
|
15843
15923
|
]);
|
|
15844
15924
|
var QUESTION_ACTION_SPECS = {
|
|
15845
15925
|
create: { params: ["text", "domain", "blocks"], description: "text is required; domain/blocks are optional." },
|
|
@@ -15848,7 +15928,8 @@ var QUESTION_ACTION_SPECS = {
|
|
|
15848
15928
|
snooze: { params: ["entryId"], description: "entryId is required." },
|
|
15849
15929
|
decline: { params: ["entryId", "reason"], description: "entryId and reason are both required." },
|
|
15850
15930
|
answer: { params: ["entryId", "text", "answerEntryId"], description: "entryId is required; supply exactly one of text or answerEntryId." },
|
|
15851
|
-
"force-close": { params: ["entryId", "reason"], description: "entryId and reason are both required." }
|
|
15931
|
+
"force-close": { params: ["entryId", "reason"], description: "entryId and reason are both required." },
|
|
15932
|
+
list: { params: ["mine"], description: "mine is optional \u2014 omit/false for the ack-gate view, true for every question you asked." }
|
|
15852
15933
|
};
|
|
15853
15934
|
var HUMAN_ID_PATTERN = /^[A-Za-z]+-\d+$/;
|
|
15854
15935
|
async function resolveEntryRef(raw, label) {
|
|
@@ -15987,7 +16068,7 @@ async function handleQuestionAnswer(entryId, text, answerEntryId) {
|
|
|
15987
16068
|
const result2 = await kernelMutation("question.answer", { entryId: resolvedEntryId, text, answerEntryId: resolvedAnswerEntryId });
|
|
15988
16069
|
const askerName = result2.askerName ?? "The asker";
|
|
15989
16070
|
const pendingNote = result2.answerPending ? " The answer is a draft awaiting accept." : "";
|
|
15990
|
-
const message = result2.idempotent ? `${entryId} is already answered \u2014 no change.` : `Answered. ${askerName} will see the outcome at their next session.${pendingNote}`;
|
|
16071
|
+
const message = result2.idempotent ? result2.processedVia === "declined" || result2.processedVia === "force_closed" ? `${entryId} is already processed (${result2.processedVia === "declined" ? "declined" : "force-closed"}) \u2014 no change.` : `${entryId} is already answered \u2014 no change.` : `Answered. ${askerName} will see the outcome at their next session (and in pb question list --mine).${pendingNote}`;
|
|
15991
16072
|
return successResult(message, message, result2);
|
|
15992
16073
|
} catch (err) {
|
|
15993
16074
|
return questionErrorResult(err, "answer", { entryId, text, answerEntryId });
|
|
@@ -16004,15 +16085,37 @@ async function handleQuestionForceClose(entryId, reason) {
|
|
|
16004
16085
|
return questionErrorResult(err, "force-close", { entryId, reason });
|
|
16005
16086
|
}
|
|
16006
16087
|
}
|
|
16088
|
+
async function handleQuestionList(mine) {
|
|
16089
|
+
try {
|
|
16090
|
+
const result2 = await kernelQuery("question.list", { mine });
|
|
16091
|
+
const rows = result2.questions;
|
|
16092
|
+
if (rows.length === 0) {
|
|
16093
|
+
const message2 = mine ? "You haven't asked any questions yet." : "No open questions.";
|
|
16094
|
+
return successResult(message2, message2, { ...result2, action: "list" });
|
|
16095
|
+
}
|
|
16096
|
+
const lines = rows.map((r) => {
|
|
16097
|
+
const outcomeSuffix = mine && r.outcome ? ` \u2014 ${r.outcome}` : "";
|
|
16098
|
+
return `[${r.entryId}] ${r.question} \u2014 ${r.stateLabel} \u2014 ${r.why} \u2014 ${r.domain} \u2014 ${r.withLabel} \u2014 ${r.ageDays}d${outcomeSuffix}`;
|
|
16099
|
+
});
|
|
16100
|
+
const truncationNote = result2.truncated ? `
|
|
16101
|
+
(${mine ? "showing your most recent questions only \u2014 older ones exist but are not shown" : "this list may be incomplete \u2014 some obligations may not be shown"})` : "";
|
|
16102
|
+
const message = `${rows.length} question${rows.length === 1 ? "" : "s"}:
|
|
16103
|
+
${lines.join("\n")}${truncationNote}`;
|
|
16104
|
+
return successResult(message, message, { ...result2, action: "list" });
|
|
16105
|
+
} catch (err) {
|
|
16106
|
+
return questionErrorResult(err, "list", { mine });
|
|
16107
|
+
}
|
|
16108
|
+
}
|
|
16007
16109
|
function questionErrorResult(err, action, params = {}) {
|
|
16008
16110
|
const classified = classifyError(err);
|
|
16009
16111
|
const definedParams = Object.fromEntries(Object.entries(params).filter(([, v]) => v !== void 0));
|
|
16112
|
+
const fallbackActions = classified.code === "VALIDATION_ERROR" ? void 0 : [{ tool: "question", description: `Retry ${action}`, parameters: { action, ...definedParams } }];
|
|
16010
16113
|
return failureResult(
|
|
16011
16114
|
classified.message,
|
|
16012
16115
|
classified.code,
|
|
16013
16116
|
classified.message,
|
|
16014
16117
|
classified.recovery ?? "Use action='create' with no --domain, or `pb question --help` / this tool's description, to find valid domains and next steps.",
|
|
16015
|
-
classified.availableActions ??
|
|
16118
|
+
classified.availableActions ?? fallbackActions,
|
|
16016
16119
|
classified.diagnostics
|
|
16017
16120
|
);
|
|
16018
16121
|
}
|
|
@@ -16024,13 +16127,14 @@ function registerQuestionTools(server) {
|
|
|
16024
16127
|
snooze: (data) => handleQuestionSnooze(data.entryId),
|
|
16025
16128
|
decline: (data) => handleQuestionDecline(data.entryId, data.reason),
|
|
16026
16129
|
answer: (data) => handleQuestionAnswer(data.entryId, data.text, data.answerEntryId),
|
|
16027
|
-
"force-close": (data) => handleQuestionForceClose(data.entryId, data.reason)
|
|
16130
|
+
"force-close": (data) => handleQuestionForceClose(data.entryId, data.reason),
|
|
16131
|
+
list: (data) => handleQuestionList(data.mine)
|
|
16028
16132
|
};
|
|
16029
16133
|
server.registerTool(
|
|
16030
16134
|
"question",
|
|
16031
16135
|
{
|
|
16032
16136
|
title: "Question",
|
|
16033
|
-
description: "Routed questions \u2014 a question with no owner routes itself to the owning role, the team lead when ambiguous, and up the team-lead chain until someone owns it.
|
|
16137
|
+
description: "Routed questions \u2014 a question with no owner routes itself to the owning role, the team lead when ambiguous, and up the team-lead chain until someone owns it. Eight actions:\n\n- **create**: create a new routed question from text. Domains are discovered by using this tool \u2014 an unresolvable `domain` refusal lists the workspace's real slugs; there is no fixed list to memorize.\n- **adopt**: attach routing to a tension already captured (e.g. via `capture` with `collection: tensions`) \u2014 the real birth path for most questions. Without adopt, a captured tension stays invisible to routing forever.\n- **assign**: confirm ('take it', no `toRole`/`toPerson`) or reassign (`toRole`/`toPerson`) ownership.\n- **snooze**: defer a routed/escalated question \u2014 max 2, then it escalates to the team lead.\n- **decline**: pass on a suggested question (never closes it), or \u2014 as the owner/team lead \u2014 decline an owned one (reason required; closes it, or escalates it, depending on dependents).\n- **answer**: close the loop. Creates the answering entry itself from `text`, or points at an existing one via `answerEntryId` \u2014 never both.\n- **force-close**: Team-Lead-only escape hatch (reason required) for a question that cannot otherwise be resolved.\n- **list**: the ack-gate read model \u2014 what you owe (`mine:false`, the default), or (`mine:true`) every question you asked, including closed ones, with its outcome.\n\n`blocks` (repeatable, on create/adopt) records what a question is holding up \u2014 pass entry ids it blocks.",
|
|
16034
16138
|
inputSchema: questionSchema,
|
|
16035
16139
|
annotations: { readOnlyHint: false, idempotentHint: false, openWorldHint: false }
|
|
16036
16140
|
},
|
|
@@ -16978,4 +17082,4 @@ export {
|
|
|
16978
17082
|
createProductBrainServer,
|
|
16979
17083
|
initFeatureFlags
|
|
16980
17084
|
};
|
|
16981
|
-
//# sourceMappingURL=chunk-
|
|
17085
|
+
//# sourceMappingURL=chunk-WGTVDUBC.js.map
|