figjam-context-mcp 0.0.0-stage → 0.4.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 (95) hide show
  1. package/.env.example +66 -0
  2. package/CHANGELOG.md +43 -0
  3. package/LICENSE +21 -0
  4. package/README.md +149 -2
  5. package/SECURITY.md +26 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +20 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/lib/boardDiff.d.ts +55 -0
  10. package/dist/lib/boardDiff.js +285 -0
  11. package/dist/lib/boardDiff.js.map +1 -0
  12. package/dist/lib/cache.d.ts +9 -0
  13. package/dist/lib/cache.js +63 -0
  14. package/dist/lib/cache.js.map +1 -0
  15. package/dist/lib/connectorGraph.d.ts +32 -0
  16. package/dist/lib/connectorGraph.js +121 -0
  17. package/dist/lib/connectorGraph.js.map +1 -0
  18. package/dist/lib/docStructureMapper.d.ts +24 -0
  19. package/dist/lib/docStructureMapper.js +121 -0
  20. package/dist/lib/docStructureMapper.js.map +1 -0
  21. package/dist/lib/env.d.ts +2 -0
  22. package/dist/lib/env.js +25 -0
  23. package/dist/lib/env.js.map +1 -0
  24. package/dist/lib/evidence.d.ts +63 -0
  25. package/dist/lib/evidence.js +474 -0
  26. package/dist/lib/evidence.js.map +1 -0
  27. package/dist/lib/figmaApi.d.ts +24 -0
  28. package/dist/lib/figmaApi.js +173 -0
  29. package/dist/lib/figmaApi.js.map +1 -0
  30. package/dist/lib/llmClient.d.ts +61 -0
  31. package/dist/lib/llmClient.js +441 -0
  32. package/dist/lib/llmClient.js.map +1 -0
  33. package/dist/lib/llmOutputBudgets.d.ts +6 -0
  34. package/dist/lib/llmOutputBudgets.js +13 -0
  35. package/dist/lib/llmOutputBudgets.js.map +1 -0
  36. package/dist/lib/llmTimeouts.d.ts +4 -0
  37. package/dist/lib/llmTimeouts.js +10 -0
  38. package/dist/lib/llmTimeouts.js.map +1 -0
  39. package/dist/lib/modelRegistry.d.ts +12 -0
  40. package/dist/lib/modelRegistry.js +91 -0
  41. package/dist/lib/modelRegistry.js.map +1 -0
  42. package/dist/lib/nodeTree.d.ts +9 -0
  43. package/dist/lib/nodeTree.js +174 -0
  44. package/dist/lib/nodeTree.js.map +1 -0
  45. package/dist/lib/persistentCache.d.ts +32 -0
  46. package/dist/lib/persistentCache.js +301 -0
  47. package/dist/lib/persistentCache.js.map +1 -0
  48. package/dist/lib/spatialCluster.d.ts +58 -0
  49. package/dist/lib/spatialCluster.js +340 -0
  50. package/dist/lib/spatialCluster.js.map +1 -0
  51. package/dist/lib/visionInterpreter.d.ts +14 -0
  52. package/dist/lib/visionInterpreter.js +205 -0
  53. package/dist/lib/visionInterpreter.js.map +1 -0
  54. package/dist/schemas/answerFromBoard.d.ts +75 -0
  55. package/dist/schemas/answerFromBoard.js +28 -0
  56. package/dist/schemas/answerFromBoard.js.map +1 -0
  57. package/dist/schemas/common.d.ts +14 -0
  58. package/dist/schemas/common.js +59 -0
  59. package/dist/schemas/common.js.map +1 -0
  60. package/dist/schemas/diagnoseLlmConfig.d.ts +35 -0
  61. package/dist/schemas/diagnoseLlmConfig.js +20 -0
  62. package/dist/schemas/diagnoseLlmConfig.js.map +1 -0
  63. package/dist/schemas/diffBoard.d.ts +118 -0
  64. package/dist/schemas/diffBoard.js +61 -0
  65. package/dist/schemas/diffBoard.js.map +1 -0
  66. package/dist/schemas/getBoardContext.d.ts +255 -0
  67. package/dist/schemas/getBoardContext.js +77 -0
  68. package/dist/schemas/getBoardContext.js.map +1 -0
  69. package/dist/schemas/ingestBoard.d.ts +96 -0
  70. package/dist/schemas/ingestBoard.js +88 -0
  71. package/dist/schemas/ingestBoard.js.map +1 -0
  72. package/dist/server.d.ts +16 -0
  73. package/dist/server.js +131 -0
  74. package/dist/server.js.map +1 -0
  75. package/dist/tools/answerFromBoard.d.ts +9 -0
  76. package/dist/tools/answerFromBoard.js +239 -0
  77. package/dist/tools/answerFromBoard.js.map +1 -0
  78. package/dist/tools/diagnoseLlmConfig.d.ts +4 -0
  79. package/dist/tools/diagnoseLlmConfig.js +158 -0
  80. package/dist/tools/diagnoseLlmConfig.js.map +1 -0
  81. package/dist/tools/diffBoard.d.ts +11 -0
  82. package/dist/tools/diffBoard.js +49 -0
  83. package/dist/tools/diffBoard.js.map +1 -0
  84. package/dist/tools/getBoardContext.d.ts +3 -0
  85. package/dist/tools/getBoardContext.js +157 -0
  86. package/dist/tools/getBoardContext.js.map +1 -0
  87. package/dist/tools/ingestBoard.d.ts +8 -0
  88. package/dist/tools/ingestBoard.js +594 -0
  89. package/dist/tools/ingestBoard.js.map +1 -0
  90. package/dist/types.d.ts +145 -0
  91. package/dist/types.js +6 -0
  92. package/dist/types.js.map +1 -0
  93. package/docs/pipeline.gif +0 -0
  94. package/package.json +73 -4
  95. package/server.json +48 -0
@@ -0,0 +1,121 @@
1
+ const FRAMEWORKS = {
2
+ double_diamond: [
3
+ {
4
+ name: "discover",
5
+ keywords: [
6
+ "research", "interview", "insight", "observation", "survey", "persona",
7
+ "user need", "pain point", "quote", "empathy", "explore", "discovery",
8
+ "finding", "field study", "competitor", "benchmark", "umfrage", "zitat",
9
+ ],
10
+ },
11
+ {
12
+ name: "define",
13
+ keywords: [
14
+ "problem", "define", "how might we", "hmw", "scope", "goal", "requirement",
15
+ "constraint", "framing", "point of view", "synthesis", "target group",
16
+ "hypothesis", "opportunity", "priorit", "ziel", "anforderung", "zielgruppe",
17
+ ],
18
+ },
19
+ {
20
+ name: "develop",
21
+ keywords: [
22
+ "idea", "ideation", "brainstorm", "sketch", "concept", "prototype",
23
+ "solution", "wireframe", "variant", "experiment", "crazy 8", "mockup",
24
+ "design option", "storyboard", "idee", "konzept", "entwurf", "skizze",
25
+ ],
26
+ },
27
+ {
28
+ name: "deliver",
29
+ keywords: [
30
+ "deliver", "launch", "ship", "roadmap", "next step", "action item",
31
+ "timeline", "implementation", "rollout", "release", "mvp", "milestone",
32
+ "test plan", "handoff", "todo", "owner", "umsetzung", "nächste schritte",
33
+ ],
34
+ },
35
+ ],
36
+ lean_canvas: [
37
+ { name: "problem", keywords: ["problem", "pain", "need", "frustration", "existing alternative"] },
38
+ { name: "solution", keywords: ["solution", "feature", "lösung", "approach", "fix"] },
39
+ { name: "value_proposition", keywords: ["value", "unique", "proposition", "promise", "benefit", "nutzen"] },
40
+ { name: "customer_segments", keywords: ["customer", "segment", "target", "audience", "persona", "user group", "zielgruppe"] },
41
+ { name: "channels", keywords: ["channel", "marketing", "reach", "distribution", "social media", "kanal"] },
42
+ { name: "revenue_costs", keywords: ["revenue", "cost", "price", "pricing", "budget", "monetiz", "umsatz", "kosten"] },
43
+ { name: "metrics", keywords: ["metric", "kpi", "measure", "analytics", "retention", "conversion", "messung"] },
44
+ { name: "advantage", keywords: ["advantage", "moat", "unfair", "differentiat", "alleinstellung"] },
45
+ ],
46
+ retro: [
47
+ {
48
+ name: "went_well",
49
+ keywords: ["went well", "good", "success", "win", "proud", "liked", "lief gut", "positiv", "gut gelaufen", "kudos", "danke"],
50
+ },
51
+ {
52
+ name: "needs_improvement",
53
+ keywords: ["improve", "didn't go well", "problem", "issue", "friction", "frustrat", "blocker", "verbessern", "schlecht", "ärger", "hindernis"],
54
+ },
55
+ {
56
+ name: "action_items",
57
+ keywords: ["action", "next step", "todo", "try", "experiment", "owner", "commit", "maßnahme", "nächste schritte", "ausprobieren"],
58
+ },
59
+ ],
60
+ user_journey: [
61
+ { name: "awareness", keywords: ["awareness", "discover", "first contact", "ad", "hears about", "aufmerksam"] },
62
+ { name: "consideration", keywords: ["consider", "compare", "evaluate", "research", "alternative", "vergleich"] },
63
+ { name: "onboarding", keywords: ["onboard", "sign up", "signup", "register", "first use", "setup", "registrier"] },
64
+ { name: "usage", keywords: ["use", "usage", "daily", "task", "workflow", "habit", "interaction", "nutzung", "alltag"] },
65
+ { name: "retention", keywords: ["retention", "return", "churn", "loyal", "recommend", "advocate", "bindung", "empfehl"] },
66
+ ],
67
+ };
68
+ /**
69
+ * Assigns each cluster a phase from the active framework. Order of
70
+ * precedence: customPhases (free-form names) > built-in framework for the
71
+ * hint > no-op for "freeform". Clusters with no keyword hits — or a tie
72
+ * between phases — get "unclear".
73
+ */
74
+ export function mapClustersToPhases(clusters, hint, customPhases) {
75
+ const phases = customPhases && customPhases.length > 0
76
+ ? customPhases.map(toCustomPhase)
77
+ : hint !== "freeform"
78
+ ? FRAMEWORKS[hint]
79
+ : undefined;
80
+ if (!phases) {
81
+ return clusters;
82
+ }
83
+ return clusters.map((cluster) => ({
84
+ ...cluster,
85
+ phase: classify(cluster, phases),
86
+ }));
87
+ }
88
+ /**
89
+ * Custom phases arrive as bare names ("Ideen sammeln"), so their keywords
90
+ * are the name itself plus its individual significant words.
91
+ */
92
+ function toCustomPhase(name) {
93
+ const normalized = name.trim().toLowerCase();
94
+ const words = normalized.split(/[^\p{L}\p{N}]+/u).filter((word) => word.length > 2);
95
+ return { name: name.trim(), keywords: [...new Set([normalized, ...words])] };
96
+ }
97
+ /** Scores one cluster against all phases and picks the unambiguous winner. */
98
+ function classify(cluster, phases) {
99
+ const label = cluster.label.toLowerCase();
100
+ const summary = cluster.summary.toLowerCase();
101
+ let best = "unclear";
102
+ let bestScore = 0;
103
+ let tied = false;
104
+ for (const phase of phases) {
105
+ const score = phase.keywords.reduce((total, keyword) => {
106
+ const inLabel = label.includes(keyword) ? 2 : 0;
107
+ const inSummary = summary.includes(keyword) ? 1 : 0;
108
+ return total + inLabel + inSummary;
109
+ }, 0);
110
+ if (score > bestScore) {
111
+ best = phase.name;
112
+ bestScore = score;
113
+ tied = false;
114
+ }
115
+ else if (score === bestScore && score > 0) {
116
+ tied = true;
117
+ }
118
+ }
119
+ return bestScore === 0 || tied ? "unclear" : best;
120
+ }
121
+ //# sourceMappingURL=docStructureMapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docStructureMapper.js","sourceRoot":"","sources":["../../src/lib/docStructureMapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function readIntEnv(name: string, fallback: number, min: number): number;
2
+ export declare function readBoolEnv(name: string, fallback: boolean): boolean;
@@ -0,0 +1,25 @@
1
+ export function readIntEnv(name, fallback, min) {
2
+ const raw = process.env[name]?.trim();
3
+ if (!raw) {
4
+ return fallback;
5
+ }
6
+ const parsed = Number(raw);
7
+ if (!Number.isInteger(parsed) || parsed < min) {
8
+ throw new Error(`${name} must be an integer >= ${min}`);
9
+ }
10
+ return parsed;
11
+ }
12
+ export function readBoolEnv(name, fallback) {
13
+ const raw = process.env[name]?.trim().toLowerCase();
14
+ if (!raw) {
15
+ return fallback;
16
+ }
17
+ if (["1", "true", "yes", "on"].includes(raw)) {
18
+ return true;
19
+ }
20
+ if (["0", "false", "no", "off"].includes(raw)) {
21
+ return false;
22
+ }
23
+ throw new Error(`${name} must be a boolean`);
24
+ }
25
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,QAAgB,EAAE,GAAW;IACpE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACtC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,0BAA0B,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,QAAiB;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,63 @@
1
+ import type { BoardData, ConnectorEdge } from "../types.js";
2
+ export declare const EVIDENCE_CHUNK_CHARS = 1200;
3
+ export declare const MAX_CONTEXT_RESPONSE_BYTES: number;
4
+ /** Original board text and model interpretations remain distinguishable at every boundary. */
5
+ export interface Evidence {
6
+ evidenceId: string;
7
+ snapshotId: string;
8
+ nodeId: string;
9
+ text: string;
10
+ sourceType: "board_text" | "table_cell" | "board_metadata" | "model_interpretation" | "cluster_summary";
11
+ modelDerived: boolean;
12
+ clusterId?: string;
13
+ clusterLabel?: string;
14
+ nodeName?: string;
15
+ pageName?: string;
16
+ sectionNames?: string[];
17
+ pageId?: string;
18
+ sectionIds?: string[];
19
+ renderNodeId?: string;
20
+ row?: number;
21
+ column?: number;
22
+ chunkIndex: number;
23
+ url: string;
24
+ truncated: boolean;
25
+ }
26
+ export interface EvidenceConnection {
27
+ connectorId: string;
28
+ fromNodeId: string;
29
+ toNodeId: string;
30
+ direction: NonNullable<ConnectorEdge["direction"]>;
31
+ label?: string;
32
+ url: string;
33
+ }
34
+ export interface EvidenceQuery {
35
+ query?: string;
36
+ nodeIds?: string[];
37
+ /** Restricts primary matches before bounded one-hop expansion (Q&A). */
38
+ limit?: number;
39
+ includeNeighbors?: boolean;
40
+ neighborLimit?: number;
41
+ /** Bounded cell context for lexical table matches, separate from graph neighbors. */
42
+ tableNeighborLimit?: number;
43
+ }
44
+ export interface EvidenceResult {
45
+ snapshotId: string;
46
+ evidence: Evidence[];
47
+ /** Internal selection boundary; never serialized as an MCP response field. */
48
+ primaryEvidenceIds: string[];
49
+ connections: EvidenceConnection[];
50
+ totalMatched: number;
51
+ }
52
+ /** Unicode word segmentation supports accented words and scripts without whitespace. */
53
+ export declare function evidenceTokens(text: string): string[];
54
+ export declare function snapshotIdForBoard(board: BoardData): string;
55
+ export declare function nodeLink(board: BoardData, nodeId: string): string;
56
+ /** Deterministic field-weighted BM25 over original chunks and source metadata. */
57
+ export declare function retrieveEvidence(board: BoardData, options?: EvidenceQuery): EvidenceResult;
58
+ /** Only connections between displayed source nodes are evidence for the current response. */
59
+ export declare function connectionsForEvidence(board: BoardData, evidence: Evidence[]): EvidenceConnection[];
60
+ export declare function countConnectionsForEvidence(board: BoardData, evidence: Evidence[]): number;
61
+ export declare function formatEvidenceConnection(connection: EvidenceConnection): string;
62
+ export declare function formatEvidence(item: Evidence): string;
63
+ export declare function boundedText(value: string, maxChars: number): string;