@telora/mcp-products 0.21.28 → 0.22.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 (44) hide show
  1. package/dist/handlers/componentHandlers.d.ts +3 -0
  2. package/dist/handlers/componentHandlers.js +128 -0
  3. package/dist/handlers/componentHandlers.js.map +1 -0
  4. package/dist/handlers/contextHandlers.d.ts +1 -6
  5. package/dist/handlers/contextHandlers.js +13 -145
  6. package/dist/handlers/contextHandlers.js.map +1 -1
  7. package/dist/handlers/contractHandlers.d.ts +3 -0
  8. package/dist/handlers/contractHandlers.js +150 -0
  9. package/dist/handlers/contractHandlers.js.map +1 -0
  10. package/dist/handlers/factoryHandlers.js +3 -182
  11. package/dist/handlers/factoryHandlers.js.map +1 -1
  12. package/dist/handlers/index.d.ts +5 -1
  13. package/dist/handlers/index.js +5 -1
  14. package/dist/handlers/index.js.map +1 -1
  15. package/dist/handlers/prerequisiteTreeHandlers.d.ts +3 -0
  16. package/dist/handlers/prerequisiteTreeHandlers.js +416 -0
  17. package/dist/handlers/prerequisiteTreeHandlers.js.map +1 -0
  18. package/dist/handlers/productHandlers.js +6 -9
  19. package/dist/handlers/productHandlers.js.map +1 -1
  20. package/dist/handlers/realityTreeHandlers.js +6 -4
  21. package/dist/handlers/realityTreeHandlers.js.map +1 -1
  22. package/dist/handlers/wikiHandlers.d.ts +15 -0
  23. package/dist/handlers/wikiHandlers.js +294 -0
  24. package/dist/handlers/wikiHandlers.js.map +1 -0
  25. package/dist/index.js +96 -14
  26. package/dist/index.js.map +1 -1
  27. package/dist/scanner/ast-extraction.d.ts +10 -0
  28. package/dist/scanner/ast-extraction.js +156 -0
  29. package/dist/scanner/ast-extraction.js.map +1 -0
  30. package/dist/scanner/file-discovery.d.ts +9 -0
  31. package/dist/scanner/file-discovery.js +134 -0
  32. package/dist/scanner/file-discovery.js.map +1 -0
  33. package/dist/scanner/index.d.ts +19 -0
  34. package/dist/scanner/index.js +193 -0
  35. package/dist/scanner/index.js.map +1 -0
  36. package/dist/scanner/relationship-extraction.d.ts +11 -0
  37. package/dist/scanner/relationship-extraction.js +187 -0
  38. package/dist/scanner/relationship-extraction.js.map +1 -0
  39. package/dist/scanner/types.d.ts +45 -0
  40. package/dist/scanner/types.js +3 -0
  41. package/dist/scanner/types.js.map +1 -0
  42. package/dist/shared.js +34 -7
  43. package/dist/shared.js.map +1 -1
  44. package/package.json +2 -1
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type GetCreds } from "../shared.js";
3
+ export declare function registerComponentTools(server: McpServer, getCreds: GetCreds): void;
@@ -0,0 +1,128 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Component architecture MCP tool handlers:
3
+ // telora_component_scan (scan codebase)
4
+ // telora_component (list | get)
5
+ // telora_component_scan_list (list scans)
6
+ // telora_component_scan_diff (compare two scans)
7
+ // ---------------------------------------------------------------------------
8
+ import { z } from "zod";
9
+ import { callProductApi, successResult, validationError, wrapHandler, } from "../shared.js";
10
+ import { runScan } from "../scanner/index.js";
11
+ export function registerComponentTools(server, getCreds) {
12
+ // ── Scanner ─────────────────────────────────────────────────────
13
+ server.tool("telora_component_scan", "Scan a product's source code to extract its component architecture: files, " +
14
+ "public API (props, functions, types), and import relationships. Creates a " +
15
+ "snapshot that can be compared with previous scans to track architectural drift. " +
16
+ "Uses ts-morph AST parsing for accurate extraction.", {
17
+ productId: z.string().uuid().describe("Product UUID to scan"),
18
+ repoPath: z.string().optional().describe("Path to git repository (defaults to cwd)"),
19
+ sourceRoot: z.string().optional().describe("Source root relative to repo (default: 'src/')"),
20
+ maxScans: z.number().int().min(1).max(100).optional().describe("Max completed scans to retain per product (default: 10). Older scans are pruned after a successful scan."),
21
+ }, wrapHandler(async (params) => {
22
+ if (!params.productId)
23
+ return validationError("productId is required");
24
+ const repoPath = params.repoPath || process.cwd();
25
+ const result = await runScan(getCreds(), {
26
+ productId: params.productId,
27
+ repoPath,
28
+ sourceRoot: params.sourceRoot,
29
+ maxScans: params.maxScans,
30
+ });
31
+ return successResult({
32
+ scanId: result.scanId,
33
+ commitSha: result.commitSha,
34
+ componentCount: result.componentCount,
35
+ memberCount: result.memberCount,
36
+ relationshipCount: result.relationshipCount,
37
+ });
38
+ }));
39
+ // ── Component List ──────────────────────────────────────────────
40
+ server.tool("telora_component_list", "List components from the persisted architecture model. Defaults to the latest " +
41
+ "completed scan. Filter by type, parent directory, or scan. Returns hierarchy-aware " +
42
+ "results ordered by path.", {
43
+ productId: z.string().uuid().describe("Product UUID"),
44
+ scanId: z.string().uuid().optional().describe("Specific scan ID (default: latest completed)"),
45
+ componentType: z.enum([
46
+ "page", "component", "hook", "context",
47
+ "library", "utility", "type_definition", "barrel",
48
+ ]).optional().describe("Filter by component type"),
49
+ parentId: z.string().uuid().nullable().optional().describe("List children of this directory (null = root level)"),
50
+ limit: z.number().int().min(1).max(500).optional().describe("Max results (default 50)"),
51
+ offset: z.number().int().min(0).optional().describe("Skip N results"),
52
+ }, wrapHandler(async (params) => {
53
+ if (!params.productId)
54
+ return validationError("productId is required");
55
+ const body = {
56
+ action: "component_list",
57
+ productId: params.productId,
58
+ };
59
+ if (params.scanId)
60
+ body.scanId = params.scanId;
61
+ if (params.componentType)
62
+ body.componentType = params.componentType;
63
+ if (params.parentId !== undefined)
64
+ body.parentId = params.parentId;
65
+ if (params.limit !== undefined)
66
+ body.limit = params.limit;
67
+ if (params.offset !== undefined)
68
+ body.offset = params.offset;
69
+ const result = await callProductApi(getCreds(), body);
70
+ return successResult({ items: result.components, totalCount: result.totalCount });
71
+ }));
72
+ // ── Component Get ───────────────────────────────────────────────
73
+ server.tool("telora_component_get", "Get full details for a single component: its members (props, functions, types), " +
74
+ "inbound/outbound relationships, parent info, and children. Use after " +
75
+ "telora_component_list to drill into a specific component.", {
76
+ componentId: z.string().uuid().describe("Component UUID"),
77
+ }, wrapHandler(async (params) => {
78
+ if (!params.componentId)
79
+ return validationError("componentId is required");
80
+ const result = await callProductApi(getCreds(), {
81
+ action: "component_get",
82
+ componentId: params.componentId,
83
+ });
84
+ return successResult(result);
85
+ }));
86
+ // ── Scan List ───────────────────────────────────────────────────
87
+ server.tool("telora_component_scan_list", "List past component scans for a product. Shows commit SHA, scan time, " +
88
+ "component/relationship counts, and status. Most recent first.", {
89
+ productId: z.string().uuid().describe("Product UUID"),
90
+ status: z.enum(["running", "completed", "failed"]).optional().describe("Filter by status"),
91
+ limit: z.number().int().min(1).max(500).optional().describe("Max results (default 50)"),
92
+ offset: z.number().int().min(0).optional().describe("Skip N results"),
93
+ }, wrapHandler(async (params) => {
94
+ if (!params.productId)
95
+ return validationError("productId is required");
96
+ const body = {
97
+ action: "component_scan_list",
98
+ productId: params.productId,
99
+ };
100
+ if (params.status)
101
+ body.fields = { status: params.status };
102
+ if (params.limit !== undefined)
103
+ body.limit = params.limit;
104
+ if (params.offset !== undefined)
105
+ body.offset = params.offset;
106
+ const result = await callProductApi(getCreds(), body);
107
+ return successResult({ items: result.scans, totalCount: result.totalCount });
108
+ }));
109
+ // ── Scan Diff ───────────────────────────────────────────────────
110
+ server.tool("telora_component_scan_diff", "Compare two scans to see what changed: added/removed/changed components, " +
111
+ "new/dropped import relationships, and changed member signatures. Components " +
112
+ "matched by path (stable identity across scans).", {
113
+ baseScanId: z.string().uuid().describe("Base scan UUID (older)"),
114
+ headScanId: z.string().uuid().describe("Head scan UUID (newer)"),
115
+ }, wrapHandler(async (params) => {
116
+ if (!params.baseScanId)
117
+ return validationError("baseScanId is required");
118
+ if (!params.headScanId)
119
+ return validationError("headScanId is required");
120
+ const result = await callProductApi(getCreds(), {
121
+ action: "component_scan_diff",
122
+ baseScanId: params.baseScanId,
123
+ headScanId: params.headScanId,
124
+ });
125
+ return successResult(result);
126
+ }));
127
+ }
128
+ //# sourceMappingURL=componentHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"componentHandlers.js","sourceRoot":"","sources":["../../src/handlers/componentHandlers.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,3 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { type GetCreds, type ToolProfile } from "../shared.js";
3
- /**
4
- * Register only the telora_context_assemble tool (for human profile core startup).
5
- * This avoids loading all context CRUD tools at startup.
6
- */
2
+ import { type GetCreds } from "../shared.js";
7
3
  export declare function registerContextAssembleTool(server: McpServer, getCreds: GetCreds): void;
8
- export declare function registerContextTools(server: McpServer, getCreds: GetCreds, profile?: ToolProfile): void;
@@ -1,23 +1,22 @@
1
1
  // ---------------------------------------------------------------------------
2
- // Context document tool handlers (consolidated):
3
- // telora_product_context (list | create | update | delete | reorder)
4
- // telora_product_context_link (link | unlink)
5
- // telora_context_assemble (layered context assembly)
2
+ // Context assembly MCP tool: telora_context_assemble.
3
+ //
4
+ // The legacy context document CRUD tools (telora_product_context,
5
+ // telora_product_context_link) were retired with the wiki schema cut.
6
+ // Use the telora_wiki_* tools for wiki content management.
6
7
  // ---------------------------------------------------------------------------
7
8
  import { z } from "zod";
8
- import { callProductApi, successResult, validationError, buildFields, wrapHandler, compactEntity, } from "../shared.js";
9
- /**
10
- * Register only the telora_context_assemble tool (for human profile core startup).
11
- * This avoids loading all context CRUD tools at startup.
12
- */
9
+ import { callProductApi, successResult, validationError, wrapHandler, } from "../shared.js";
13
10
  export function registerContextAssembleTool(server, getCreds) {
14
11
  server.tool("telora_context_assemble", "Assemble layered context for a product, strategy, or delivery. " +
15
- "Returns pre-formatted markdown with product philosophy, context documents, strategy goals, " +
16
- "delivery details, and issue hierarchy. Use at session start for architectural/design work. " +
17
- "Each scope level includes the previous: product -> strategy -> delivery.", {
12
+ "Returns pre-formatted markdown with product overview, strategy/delivery " +
13
+ "scaffolding, and a wiki section drawn from wiki_search using scope-derived " +
14
+ "queries (or your own `queries` override). Use at session start for " +
15
+ "architectural/design work.", {
18
16
  productId: z.string().uuid().describe("Product UUID (required)"),
19
17
  strategyId: z.string().uuid().optional().describe("Strategy UUID (adds strategy + delivery summaries)"),
20
18
  deliveryId: z.string().uuid().optional().describe("Delivery UUID (adds tech context + acceptance criteria + issues)"),
19
+ queries: z.array(z.string()).optional().describe("Override the scope-derived wiki retrieval queries"),
21
20
  }, wrapHandler(async (params) => {
22
21
  if (!params.productId)
23
22
  return validationError("productId is required");
@@ -29,141 +28,10 @@ export function registerContextAssembleTool(server, getCreds) {
29
28
  body.strategyId = params.strategyId;
30
29
  if (params.deliveryId)
31
30
  body.deliveryId = params.deliveryId;
31
+ if (params.queries)
32
+ body.queries = params.queries;
32
33
  const result = await callProductApi(getCreds(), body);
33
34
  return successResult(result);
34
35
  }));
35
36
  }
36
- export function registerContextTools(server, getCreds, profile = 'full') {
37
- // -- telora_product_context (consolidated) ------------------------------------
38
- const contextActions = (profile === 'full' || profile === 'human')
39
- ? ["list", "create", "update", "delete", "reorder"]
40
- : ["list"];
41
- server.tool("telora_product_context", `Knowledge base: product context documents provide background knowledge for AI agents and strategy planning. ` +
42
- `Documents can be scoped as always-included, linked to specific strategies/deliveries, or draft. ` +
43
- `Actions: ${contextActions.join(", ")}. ` +
44
- `list: productId required. create: productId + title + content. update: documentId + fields. ` +
45
- `delete: documentId. reorder: productId + documentIds.`, {
46
- action: z.enum(contextActions).describe("Action to perform"),
47
- productId: z.string().uuid().optional().describe("Product UUID (required for list, create, reorder)"),
48
- documentId: z.string().uuid().optional().describe("Document UUID (required for update, delete)"),
49
- strategyId: z.string().uuid().optional().describe("Strategy UUID - list returns always + linked docs, excluding drafts"),
50
- deliveryId: z.string().uuid().optional().describe("Delivery UUID - list returns always + linked docs, excluding drafts"),
51
- title: z.string().max(500).optional().describe("Document title (required for create)"),
52
- content: z.string().optional().describe("Markdown content (required for create)"),
53
- includeMode: z.enum(["draft", "always", "linked"]).optional().describe("Include mode (list: filter; create: defaults to draft)"),
54
- documentIds: z.array(z.string().uuid()).optional().describe("Ordered array of document UUIDs for reorder (first = sort_order 0)"),
55
- limit: z.number().int().min(1).max(500).optional().describe("Max results (1-500, default 50)"),
56
- offset: z.number().int().min(0).optional().describe("Number of results to skip (default 0)"),
57
- detail: z.enum(["titles", "summary", "full"]).optional().describe("Response detail level"),
58
- returnFull: z.boolean().optional().describe("Return full entity (default: compact)"),
59
- }, wrapHandler(async (params) => {
60
- switch (params.action) {
61
- case "list": {
62
- if (!params.productId)
63
- return validationError("productId required for list");
64
- const fields = buildFields({ includeMode: params.includeMode });
65
- const body = {
66
- action: "context_list",
67
- productId: params.productId,
68
- fields: Object.keys(fields).length > 0 ? fields : undefined,
69
- };
70
- if (params.strategyId !== undefined)
71
- body.strategyId = params.strategyId;
72
- if (params.deliveryId !== undefined)
73
- body.deliveryId = params.deliveryId;
74
- if (params.limit !== undefined)
75
- body.limit = params.limit;
76
- if (params.offset !== undefined)
77
- body.offset = params.offset;
78
- if (params.detail !== undefined)
79
- body.detail = params.detail;
80
- const result = await callProductApi(getCreds(), body);
81
- return successResult({ items: result.documents, totalCount: result.totalCount });
82
- }
83
- case "create": {
84
- if (!params.productId)
85
- return validationError("productId required for create");
86
- if (!params.title)
87
- return validationError("title required for create");
88
- if (!params.content)
89
- return validationError("content required for create");
90
- const fields = buildFields({ title: params.title, content: params.content, includeMode: params.includeMode });
91
- const result = await callProductApi(getCreds(), {
92
- action: "context_create",
93
- productId: params.productId,
94
- fields,
95
- });
96
- return successResult(compactEntity(result.document, Object.keys(fields), params.returnFull));
97
- }
98
- case "update": {
99
- if (!params.documentId)
100
- return validationError("documentId required for update");
101
- const fields = buildFields({ title: params.title, content: params.content, includeMode: params.includeMode });
102
- if (Object.keys(fields).length === 0) {
103
- return validationError("Provide at least one field to update");
104
- }
105
- const result = await callProductApi(getCreds(), {
106
- action: "context_update",
107
- documentId: params.documentId,
108
- fields,
109
- });
110
- return successResult(compactEntity(result.document, Object.keys(fields), params.returnFull));
111
- }
112
- case "delete": {
113
- if (!params.documentId)
114
- return validationError("documentId required for delete");
115
- const result = await callProductApi(getCreds(), {
116
- action: "context_delete",
117
- documentId: params.documentId,
118
- });
119
- return successResult(result);
120
- }
121
- case "reorder": {
122
- if (!params.productId)
123
- return validationError("productId required for reorder");
124
- if (!params.documentIds)
125
- return validationError("documentIds required for reorder");
126
- const result = await callProductApi(getCreds(), {
127
- action: "context_reorder",
128
- productId: params.productId,
129
- documentIds: params.documentIds,
130
- });
131
- return successResult(result.documents);
132
- }
133
- default:
134
- return validationError(`Unknown action: ${params.action}`);
135
- }
136
- }));
137
- // -- telora_product_context_link (consolidated) -------------------------------
138
- if (profile === 'full' || profile === 'human') {
139
- server.tool("telora_product_context_link", "Document linking: attach or detach context documents to strategies or deliveries. " +
140
- "Linked documents are included in the AI agent's context when working on that entity. Actions: link, unlink.", {
141
- action: z.enum(["link", "unlink"]).describe("Action to perform"),
142
- documentId: z.string().uuid().describe("Document UUID"),
143
- entityType: z.enum(["strategy", "delivery"]).describe("Entity type to link/unlink"),
144
- entityId: z.string().uuid().describe("Entity UUID to link/unlink"),
145
- }, wrapHandler(async ({ action, documentId, entityType, entityId }) => {
146
- if (action === "link") {
147
- const result = await callProductApi(getCreds(), {
148
- action: "context_link",
149
- documentId,
150
- fields: { entityType, entityId },
151
- });
152
- return successResult(result.link);
153
- }
154
- else {
155
- const result = await callProductApi(getCreds(), {
156
- action: "context_unlink",
157
- documentId,
158
- fields: { entityType, entityId },
159
- });
160
- return successResult(result);
161
- }
162
- }));
163
- }
164
- // -- telora_context_assemble (non-human profiles only; human uses registerContextAssembleTool) --
165
- if (profile === 'full') {
166
- registerContextAssembleTool(server, getCreds);
167
- }
168
- }
169
37
  //# sourceMappingURL=contextHandlers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contextHandlers.js","sourceRoot":"","sources":["../../src/handlers/contextHandlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contextHandlers.js","sourceRoot":"","sources":["../../src/handlers/contextHandlers.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,sDAAsD;AACtD,EAAE;AACF,kEAAkE;AAClE,sEAAsE;AACtE,2DAA2D;AAC3D,8EAA8E;AAE9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,EACf,WAAW,GAEZ,MAAM,cAAc,CAAC;AAEtB,MAAM,UAAU,2BAA2B,CACzC,MAAiB,EACjB,QAAkB;IAElB,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,iEAAiE;QACjE,0EAA0E;QAC1E,6EAA6E;QAC7E,qEAAqE;QACrE,4BAA4B,EAC5B;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAChE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;QACvG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;QACrH,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;KACtG,EACD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAC3B,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,eAAe,CAAC,uBAAuB,CAAC,CAAC;QACvE,MAAM,IAAI,GAA4B;YACpC,MAAM,EAAE,kBAAkB;YAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;QACF,IAAI,MAAM,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAC3D,IAAI,MAAM,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAC3D,IAAI,MAAM,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,IAAI,CAA4B,CAAC;QACjF,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type GetCreds } from "../shared.js";
3
+ export declare function registerContractTools(server: McpServer, getCreds: GetCreds): void;
@@ -0,0 +1,150 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Contract tool handlers:
3
+ // telora_contract (list | create | get | update)
4
+ // telora_contract_version (add | list | get | diff)
5
+ // ---------------------------------------------------------------------------
6
+ import { z } from "zod";
7
+ import { callProductApi, successResult, validationError, wrapHandler, compactEntity, } from "../shared.js";
8
+ const contractStatusEnum = z.enum(["draft", "active", "completed", "terminated"]);
9
+ export function registerContractTools(server, getCreds) {
10
+ // -- telora_contract --------------------------------------------------------
11
+ server.tool("telora_contract", "Contracts: named agreements linked to a product. " +
12
+ "Each contract has a name, counterparty, effective date, and status (draft/active/completed/terminated). " +
13
+ "Contract text is stored as versioned markdown in contract_versions. " +
14
+ "Actions: list (productId, optional status filter), create (productId + name), " +
15
+ "get (contractId -- returns contract with version metadata), update (contractId + fields).", {
16
+ action: z.enum(["list", "create", "get", "update"]).describe("Action to perform"),
17
+ productId: z.string().uuid().optional().describe("Product UUID (required for list, create)"),
18
+ contractId: z.string().uuid().optional().describe("Contract UUID (required for get, update)"),
19
+ name: z.string().max(200).optional().describe("Contract name (required for create)"),
20
+ counterparty: z.string().max(500).optional().describe("Counterparty name"),
21
+ effectiveDate: z.string().optional().describe("Effective date (ISO 8601 date)"),
22
+ status: contractStatusEnum.optional().describe("Contract status"),
23
+ returnFull: z.boolean().optional().describe("Return full entity (default: compact)"),
24
+ }, wrapHandler(async (params) => {
25
+ switch (params.action) {
26
+ case "list": {
27
+ if (!params.productId)
28
+ return validationError("productId required for list");
29
+ const body = {
30
+ action: "contract_list",
31
+ productId: params.productId,
32
+ };
33
+ if (params.status !== undefined)
34
+ body.status = params.status;
35
+ const result = await callProductApi(getCreds(), body);
36
+ return successResult(result);
37
+ }
38
+ case "create": {
39
+ if (!params.productId || !params.name)
40
+ return validationError("productId and name required for create");
41
+ const body = {
42
+ action: "contract_create",
43
+ productId: params.productId,
44
+ name: params.name,
45
+ };
46
+ if (params.counterparty !== undefined)
47
+ body.counterparty = params.counterparty;
48
+ if (params.effectiveDate !== undefined)
49
+ body.effectiveDate = params.effectiveDate;
50
+ if (params.status !== undefined)
51
+ body.status = params.status;
52
+ const result = await callProductApi(getCreds(), body);
53
+ const contract = result.contract;
54
+ return successResult({ contract: params.returnFull ? contract : compactEntity(contract, ["name", "status", "counterparty"]) });
55
+ }
56
+ case "get": {
57
+ if (!params.contractId)
58
+ return validationError("contractId required for get");
59
+ const result = await callProductApi(getCreds(), {
60
+ action: "contract_get",
61
+ contractId: params.contractId,
62
+ });
63
+ return successResult(result);
64
+ }
65
+ case "update": {
66
+ if (!params.contractId)
67
+ return validationError("contractId required for update");
68
+ const body = {
69
+ action: "contract_update",
70
+ contractId: params.contractId,
71
+ };
72
+ if (params.name !== undefined)
73
+ body.name = params.name;
74
+ if (params.counterparty !== undefined)
75
+ body.counterparty = params.counterparty;
76
+ if (params.effectiveDate !== undefined)
77
+ body.effectiveDate = params.effectiveDate;
78
+ if (params.status !== undefined)
79
+ body.status = params.status;
80
+ const result = await callProductApi(getCreds(), body);
81
+ const contract = result.contract;
82
+ return successResult({ contract: params.returnFull ? contract : compactEntity(contract, ["name", "status", "counterparty"]) });
83
+ }
84
+ default:
85
+ return validationError(`Unknown action: ${params.action}`);
86
+ }
87
+ }));
88
+ // -- telora_contract_version ------------------------------------------------
89
+ server.tool("telora_contract_version", "Contract versions: versioned markdown text for contracts. " +
90
+ "Each version is immutable once created. Version numbers auto-increment per contract. " +
91
+ "Actions: add (contractId + content -- creates next version), " +
92
+ "list (contractId -- version metadata without content), " +
93
+ "get (contractId + versionNumber -- returns full content), " +
94
+ "diff (contractId + fromVersion + toVersion -- line-level diff).", {
95
+ action: z.enum(["add", "list", "get", "diff"]).describe("Action to perform"),
96
+ contractId: z.string().uuid().describe("Contract UUID"),
97
+ content: z.string().optional().describe("Markdown content (required for add)"),
98
+ versionNumber: z.number().int().positive().optional()
99
+ .describe("Version number (required for get)"),
100
+ fromVersion: z.number().int().positive().optional()
101
+ .describe("From version number (required for diff)"),
102
+ toVersion: z.number().int().positive().optional()
103
+ .describe("To version number (required for diff)"),
104
+ }, wrapHandler(async (params) => {
105
+ switch (params.action) {
106
+ case "add": {
107
+ if (!params.content)
108
+ return validationError("content required for add");
109
+ const result = await callProductApi(getCreds(), {
110
+ action: "contract_version_add",
111
+ contractId: params.contractId,
112
+ content: params.content,
113
+ });
114
+ return successResult(result);
115
+ }
116
+ case "list": {
117
+ const result = await callProductApi(getCreds(), {
118
+ action: "contract_version_list",
119
+ contractId: params.contractId,
120
+ });
121
+ return successResult(result);
122
+ }
123
+ case "get": {
124
+ if (params.versionNumber === undefined)
125
+ return validationError("versionNumber required for get");
126
+ const result = await callProductApi(getCreds(), {
127
+ action: "contract_version_get",
128
+ contractId: params.contractId,
129
+ versionNumber: params.versionNumber,
130
+ });
131
+ return successResult(result);
132
+ }
133
+ case "diff": {
134
+ if (params.fromVersion === undefined || params.toVersion === undefined) {
135
+ return validationError("fromVersion and toVersion required for diff");
136
+ }
137
+ const result = await callProductApi(getCreds(), {
138
+ action: "contract_version_diff",
139
+ contractId: params.contractId,
140
+ fromVersion: params.fromVersion,
141
+ toVersion: params.toVersion,
142
+ });
143
+ return successResult(result);
144
+ }
145
+ default:
146
+ return validationError(`Unknown action: ${params.action}`);
147
+ }
148
+ }));
149
+ }
150
+ //# sourceMappingURL=contractHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contractHandlers.js","sourceRoot":"","sources":["../../src/handlers/contractHandlers.ts"],"names":[],"mappings":"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"}