@telora/mcp-products 0.22.126 → 0.22.133
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/affordances.js +1 -1
- package/dist/affordances.js.map +1 -1
- package/dist/handlers/agentHandlers.d.ts +1 -0
- package/dist/handlers/agentHandlers.js +15 -9
- package/dist/handlers/agentHandlers.js.map +1 -1
- package/dist/handlers/deliveryHandlers.d.ts +2 -0
- package/dist/handlers/deliveryHandlers.js +19 -79
- package/dist/handlers/deliveryHandlers.js.map +1 -1
- package/dist/handlers/externalDataSourceHandlers.d.ts +3 -0
- package/dist/handlers/externalDataSourceHandlers.js +130 -0
- package/dist/handlers/externalDataSourceHandlers.js.map +1 -0
- package/dist/handlers/externalReferenceHandlers.d.ts +3 -0
- package/dist/handlers/externalReferenceHandlers.js +96 -0
- package/dist/handlers/externalReferenceHandlers.js.map +1 -0
- package/dist/handlers/focusHandlers.d.ts +2 -0
- package/dist/handlers/focusHandlers.js +12 -2
- package/dist/handlers/focusHandlers.js.map +1 -1
- package/dist/handlers/index.d.ts +3 -0
- package/dist/handlers/index.js +3 -0
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/issueHandlers.d.ts +2 -0
- package/dist/handlers/issueHandlers.js +12 -2
- package/dist/handlers/issueHandlers.js.map +1 -1
- package/dist/handlers/linearHandlers.d.ts +34 -0
- package/dist/handlers/linearHandlers.js +131 -0
- package/dist/handlers/linearHandlers.js.map +1 -0
- package/dist/handlers/prdAuthoringGuide.d.ts +1 -1
- package/dist/handlers/prdAuthoringGuide.js +6 -3
- package/dist/handlers/prdAuthoringGuide.js.map +1 -1
- package/dist/index.js +34 -1
- package/dist/index.js.map +1 -1
- package/dist/shared.d.ts +28 -3
- package/dist/shared.js +87 -5
- package/dist/shared.js.map +1 -1
- package/dist/wire-contract.generated.d.ts +19 -0
- package/dist/wire-contract.generated.js +63 -0
- package/dist/wire-contract.generated.js.map +1 -0
- package/package.json +2 -2
package/dist/affordances.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// delivery scope start empty; their shape is fixed so future seeds slot in
|
|
12
12
|
// without changing the rendering or test code paths.
|
|
13
13
|
// ---------------------------------------------------------------------------
|
|
14
|
-
|
|
14
|
+
import { PRODUCT_API_ENDPOINT } from './shared.js';
|
|
15
15
|
const FOCUS_AFFORDANCES = [
|
|
16
16
|
{
|
|
17
17
|
name: 'debug_artifacts',
|
package/dist/affordances.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"affordances.js","sourceRoot":"","sources":["../src/affordances.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,qEAAqE;AACrE,yEAAyE;AACzE,qDAAqD;AACrD,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,qEAAqE;AACrE,EAAE;AACF,uEAAuE;AACvE,2EAA2E;AAC3E,qDAAqD;AACrD,8EAA8E;
|
|
1
|
+
{"version":3,"file":"affordances.js","sourceRoot":"","sources":["../src/affordances.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import { type GetCreds } from "../shared.js";
|
|
|
9
9
|
* or null when the disposition is fileable (agent_resolvable / needs_operator /
|
|
10
10
|
* external_wait / unset). Pure so the refusal is unit-tested without the network.
|
|
11
11
|
*/
|
|
12
|
+
export declare const ESCALATION_CREATE_FIELD_KEYS: readonly ["reasonType", "description", "issueId", "whatWasTried", "helpNeeded", "productId", "focusId", "deliveryId", "disposition"];
|
|
12
13
|
export declare function directedHoldFilingRefusal(disposition: string | undefined): string | null;
|
|
13
14
|
/**
|
|
14
15
|
* An agent_resolvable filing is MACHINE-OWNED: hidden from the operator inbox
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
// telora_agent (role_list | escalate | escalation_list | escalation_get | escalation_update)
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
5
|
import { z } from "zod";
|
|
6
|
-
import { ESCALATION_DISPOSITION_VALUES, ESCALATION_DISPOSITIONS } from "@telora/daemon-core";
|
|
6
|
+
import { ESCALATION_DISPOSITION_VALUES, ESCALATION_DISPOSITIONS, ESCALATION_REASONS } from "@telora/daemon-core";
|
|
7
|
+
// Reason-type values from the daemon-core canonical (escalation-types.ts) --
|
|
8
|
+
// same import pattern as the disposition enum above; no local value mirror.
|
|
9
|
+
const ESCALATION_REASON_VALUES = Object.values(ESCALATION_REASONS);
|
|
7
10
|
import { callProductApi, successResult, validationError, buildFields, wrapHandler, LIST_INDEX_NOTE, } from "../shared.js";
|
|
8
11
|
/**
|
|
9
12
|
* A team executing inside a focus can no longer FILE a directed hold. An
|
|
@@ -14,6 +17,14 @@ import { callProductApi, successResult, validationError, buildFields, wrapHandle
|
|
|
14
17
|
* or null when the disposition is fileable (agent_resolvable / needs_operator /
|
|
15
18
|
* external_wait / unset). Pure so the refusal is unit-tested without the network.
|
|
16
19
|
*/
|
|
20
|
+
// Field keys the escalate action forwards to product-api. Exported so the
|
|
21
|
+
// wire-contract drift test can bind them to the generated manifest projection
|
|
22
|
+
// (../wire-contract.generated.ts). `issueId` is the escalation's anchor
|
|
23
|
+
// identifier, not a wire field -- the drift test declares it as such.
|
|
24
|
+
export const ESCALATION_CREATE_FIELD_KEYS = [
|
|
25
|
+
'reasonType', 'description', 'issueId', 'whatWasTried', 'helpNeeded',
|
|
26
|
+
'productId', 'focusId', 'deliveryId', 'disposition',
|
|
27
|
+
];
|
|
17
28
|
export function directedHoldFilingRefusal(disposition) {
|
|
18
29
|
if (disposition === ESCALATION_DISPOSITIONS.NEEDS_INTENT ||
|
|
19
30
|
disposition === ESCALATION_DISPOSITIONS.NEEDS_CLARIFICATION) {
|
|
@@ -159,10 +170,8 @@ export function registerAgentTools(server, getCreds) {
|
|
|
159
170
|
action: z.enum(["role_list", "escalate", "escalation_list", "escalation_get", "escalation_update"]).describe("Action to perform"),
|
|
160
171
|
escalationId: z.string().uuid().optional().describe("Escalation UUID (required for escalation_get, escalation_update)"),
|
|
161
172
|
issueId: z.string().uuid().optional().describe("Issue UUID being worked on (escalate only)"),
|
|
162
|
-
reasonType: z.enum([
|
|
163
|
-
"
|
|
164
|
-
"blocked_by_external", "needs_clarification", "security_concern",
|
|
165
|
-
]).optional().describe("Type of escalation (required for escalate)"),
|
|
173
|
+
reasonType: z.enum([...ESCALATION_REASON_VALUES])
|
|
174
|
+
.optional().describe("Type of escalation (required for escalate)"),
|
|
166
175
|
description: z.string().max(5000).optional().describe("What happened and why escalation is needed (required for escalate)"),
|
|
167
176
|
whatWasTried: z.string().max(5000).optional().describe("What approaches were attempted (escalate only)"),
|
|
168
177
|
helpNeeded: z.string().max(5000).optional().describe("Specific help or decision needed from human (escalate only)"),
|
|
@@ -240,10 +249,7 @@ export function registerAgentTools(server, getCreds) {
|
|
|
240
249
|
const humanActRefusal = humanOwningWithoutHumanActRefusal(params.disposition, { description: params.description, helpNeeded: params.helpNeeded });
|
|
241
250
|
if (humanActRefusal)
|
|
242
251
|
return validationError(humanActRefusal);
|
|
243
|
-
const fields = buildFields(params, [
|
|
244
|
-
'reasonType', 'description', 'issueId', 'whatWasTried', 'helpNeeded',
|
|
245
|
-
'productId', 'focusId', 'deliveryId', 'disposition',
|
|
246
|
-
]);
|
|
252
|
+
const fields = buildFields(params, [...ESCALATION_CREATE_FIELD_KEYS]);
|
|
247
253
|
// Stamp a recorded kind on every hand-filed escalation. This surface
|
|
248
254
|
// never set one, so hand-filed filings were the null-kind population
|
|
249
255
|
// the routing focus targets; 'agent_filed' makes each a classifiable
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentHandlers.js","sourceRoot":"","sources":["../../src/handlers/agentHandlers.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,mDAAmD;AACnD,+FAA+F;AAC/F,8EAA8E;AAE9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"agentHandlers.js","sourceRoot":"","sources":["../../src/handlers/agentHandlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,5 +15,7 @@ export interface DeliveryCreateParams {
|
|
|
15
15
|
workFacing?: string;
|
|
16
16
|
returnFull?: boolean;
|
|
17
17
|
}
|
|
18
|
+
export declare const DELIVERY_CREATE_FIELD_KEYS: readonly ["name", "description", "targetDate", "acceptanceCriteria", "techContext", "workFacing"];
|
|
19
|
+
export declare const DELIVERY_UPDATE_FIELD_KEYS: readonly ["name", "description", "targetDate", "acceptanceCriteria", "techContext", "focusId", "executionStatus", "workFacing"];
|
|
18
20
|
export declare function handleDeliveryCreate(params: DeliveryCreateParams, callApi: (body: Record<string, unknown>) => Promise<unknown>): Promise<ReturnType<typeof successResult> | ReturnType<typeof validationError>>;
|
|
19
21
|
export declare function registerDeliveryTools(server: McpServer, getCreds: GetCreds, profile?: ToolProfile): void;
|
|
@@ -3,94 +3,34 @@
|
|
|
3
3
|
// telora_product_delivery (list | create | update | operationalize | delete | reorder)
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
5
|
import { z } from "zod";
|
|
6
|
-
import { EXECUTION_STATUSES,
|
|
6
|
+
import { EXECUTION_STATUSES, WORK_FACINGS } from "@telora/daemon-core";
|
|
7
7
|
import { callProductApi, successResult, validationError, buildFields, wrapHandler, compactEntity, LIST_INDEX_NOTE, } from "../shared.js";
|
|
8
8
|
import { focusRefSchema, isUuid, resolveFocusRef } from "./focusHandlers.js";
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
// work to land in 'queued' so a team can pick it up — defaulting to 'planning'
|
|
20
|
-
// would leave the row invisible. Membership is checked via isPostPlanning().
|
|
21
|
-
// Page size for the focus_list lookup. focus_list has no by-id filter, so we
|
|
22
|
-
// walk pages until we find the focus or exhaust them.
|
|
23
|
-
const FOCUS_LOOKUP_PAGE_SIZE = 500;
|
|
24
|
-
// Hard cap on pages walked. 25 * 500 = 12500 focuses per product, well beyond
|
|
25
|
-
// any realistic product size; the cap is a defensive ceiling so a misbehaving
|
|
26
|
-
// backend cannot wedge the handler in an infinite loop.
|
|
27
|
-
const FOCUS_LOOKUP_MAX_PAGES = 25;
|
|
28
|
-
/**
|
|
29
|
-
* Resolve the default executionStatus for a new delivery based on its parent
|
|
30
|
-
* focus's current stage. Returns 'queued' when the focus is past planning,
|
|
31
|
-
* 'planning' otherwise (including when focusId is absent or the focus cannot
|
|
32
|
-
* be located).
|
|
33
|
-
*
|
|
34
|
-
* focus_list is the only available MCP read path (no focus_get by id), so we
|
|
35
|
-
* paginate through it until the focus is found or we exhaust the pages. The
|
|
36
|
-
* page size is generous; the page cap is a defensive ceiling.
|
|
37
|
-
*
|
|
38
|
-
* A lookup failure or genuinely missing focus falls back to 'planning' AND
|
|
39
|
-
* emits a console.warn so the fallback is visible in the daemon log -- the
|
|
40
|
-
* silent fallback was the harmful part of the prior behavior.
|
|
41
|
-
*/
|
|
42
|
-
async function resolveDefaultExecutionStatus(focusId, productId, callApi) {
|
|
43
|
-
if (!focusId)
|
|
44
|
-
return 'planning';
|
|
45
|
-
let pagesWalked = 0;
|
|
46
|
-
try {
|
|
47
|
-
for (let offset = 0; pagesWalked < FOCUS_LOOKUP_MAX_PAGES; offset += FOCUS_LOOKUP_PAGE_SIZE) {
|
|
48
|
-
const response = (await callApi({
|
|
49
|
-
action: 'focus_list',
|
|
50
|
-
productId,
|
|
51
|
-
detail: 'summary',
|
|
52
|
-
limit: FOCUS_LOOKUP_PAGE_SIZE,
|
|
53
|
-
offset,
|
|
54
|
-
}));
|
|
55
|
-
const focuses = response.focuses ?? [];
|
|
56
|
-
pagesWalked += 1;
|
|
57
|
-
const focus = focuses.find((f) => f.id === focusId);
|
|
58
|
-
if (focus) {
|
|
59
|
-
const stage = typeof focus.stage === 'string' ? focus.stage : null;
|
|
60
|
-
if (stage && isPostPlanning(stage))
|
|
61
|
-
return 'queued';
|
|
62
|
-
return 'planning';
|
|
63
|
-
}
|
|
64
|
-
// Last page reached -- no more pages to walk.
|
|
65
|
-
if (focuses.length < FOCUS_LOOKUP_PAGE_SIZE)
|
|
66
|
-
break;
|
|
67
|
-
}
|
|
68
|
-
const exhausted = pagesWalked >= FOCUS_LOOKUP_MAX_PAGES;
|
|
69
|
-
console.warn(`[delivery_create] resolveDefaultExecutionStatus: focus ${focusId} not found in product ${productId} ` +
|
|
70
|
-
`after scanning ${pagesWalked} page(s) of focus_list` +
|
|
71
|
-
(exhausted ? ` (hit ${FOCUS_LOOKUP_MAX_PAGES}-page safety cap)` : '') +
|
|
72
|
-
`. Falling back to executionStatus='planning'. If the focus is past planning stage, ` +
|
|
73
|
-
`pass executionStatus explicitly to override.`);
|
|
74
|
-
return 'planning';
|
|
75
|
-
}
|
|
76
|
-
catch (err) {
|
|
77
|
-
console.warn(`[delivery_create] resolveDefaultExecutionStatus: focus_list lookup failed for focus ${focusId} ` +
|
|
78
|
-
`in product ${productId}: ${err.message}. Falling back to executionStatus='planning'.`);
|
|
79
|
-
return 'planning';
|
|
80
|
-
}
|
|
81
|
-
}
|
|
9
|
+
// Field keys this tool forwards to product-api on create/update. Exported so
|
|
10
|
+
// the wire-contract drift test can bind them to the generated manifest
|
|
11
|
+
// projection (../wire-contract.generated.ts) -- an MCP key the manifest does
|
|
12
|
+
// not declare fails that test.
|
|
13
|
+
export const DELIVERY_CREATE_FIELD_KEYS = [
|
|
14
|
+
'name', 'description', 'targetDate', 'acceptanceCriteria', 'techContext', 'workFacing',
|
|
15
|
+
];
|
|
16
|
+
export const DELIVERY_UPDATE_FIELD_KEYS = [
|
|
17
|
+
'name', 'description', 'targetDate', 'acceptanceCriteria', 'techContext', 'focusId', 'executionStatus', 'workFacing',
|
|
18
|
+
];
|
|
82
19
|
export async function handleDeliveryCreate(params, callApi) {
|
|
83
20
|
if (!params.productId)
|
|
84
21
|
return validationError("productId required for create");
|
|
85
22
|
if (!params.name)
|
|
86
23
|
return validationError("name required for create");
|
|
87
|
-
const fields = buildFields(params, [
|
|
24
|
+
const fields = buildFields(params, [...DELIVERY_CREATE_FIELD_KEYS]);
|
|
25
|
+
// Pass executionStatus through ONLY when the caller supplied it. The
|
|
26
|
+
// stage-aware default ('queued' when the parent focus is past planning,
|
|
27
|
+
// else 'planning') is resolved SERVER-SIDE by the product-api
|
|
28
|
+
// delivery_create handler, which already holds the focus row -- the old
|
|
29
|
+
// client-side focus_list pagination walk (and its silent 'planning'
|
|
30
|
+
// fallback) is gone.
|
|
88
31
|
if (typeof params.executionStatus === 'string' && params.executionStatus.length > 0) {
|
|
89
32
|
fields.executionStatus = params.executionStatus;
|
|
90
33
|
}
|
|
91
|
-
else {
|
|
92
|
-
fields.executionStatus = await resolveDefaultExecutionStatus(params.focusId, params.productId, callApi);
|
|
93
|
-
}
|
|
94
34
|
const body = {
|
|
95
35
|
action: "delivery_create",
|
|
96
36
|
productId: params.productId,
|
|
@@ -196,7 +136,7 @@ export function registerDeliveryTools(server, getCreds, profile = 'full') {
|
|
|
196
136
|
case "update": {
|
|
197
137
|
if (!params.deliveryId)
|
|
198
138
|
return validationError("deliveryId required for update");
|
|
199
|
-
const fields = buildFields(params, [
|
|
139
|
+
const fields = buildFields(params, [...DELIVERY_UPDATE_FIELD_KEYS]);
|
|
200
140
|
const hasInjectionAnchor = params.injectionNodeId !== undefined;
|
|
201
141
|
if (Object.keys(fields).length === 0 && !hasInjectionAnchor) {
|
|
202
142
|
return validationError("Provide at least one field to update (or injectionNodeId to anchor)");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deliveryHandlers.js","sourceRoot":"","sources":["../../src/handlers/deliveryHandlers.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wCAAwC;AACxC,yFAAyF;AACzF,8EAA8E;AAE9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"deliveryHandlers.js","sourceRoot":"","sources":["../../src/handlers/deliveryHandlers.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wCAAwC;AACxC,yFAAyF;AACzF,8EAA8E;AAE9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,EACf,WAAW,EACX,WAAW,EACX,aAAa,EACb,eAAe,GAGhB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAqB7E,6EAA6E;AAC7E,uEAAuE;AACvE,6EAA6E;AAC7E,+BAA+B;AAC/B,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY;CAC9E,CAAC;AACX,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,YAAY;CAC5G,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAA4B,EAC5B,OAA4D;IAE5D,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,OAAO,eAAe,CAAC,+BAA+B,CAAC,CAAC;IAC/E,IAAI,CAAC,MAAM,CAAC,IAAI;QAAE,OAAO,eAAe,CAAC,0BAA0B,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,WAAW,CACxB,MAA4C,EAC5C,CAAC,GAAG,0BAA0B,CAAC,CAChC,CAAC;IACF,qEAAqE;IACrE,wEAAwE;IACxE,8DAA8D;IAC9D,wEAAwE;IACxE,oEAAoE;IACpE,qBAAqB;IACrB,IAAI,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpF,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;IAClD,CAAC;IACD,MAAM,IAAI,GAA4B;QACpC,MAAM,EAAE,iBAAiB;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,MAAM;KACP,CAAC;IACF,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;QAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAChE,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS;QAAE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;IACxF,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS;QAAE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;IACxF,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS;QAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAC3F,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAIhC,CAAC;IACF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IACvF,MAAM,GAAG,GAA4B,EAAE,GAAG,OAAO,EAAE,CAAC;IACpD,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAClF,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;QAAE,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACxE,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,QAAkB,EAAE,UAAuB,MAAM;IACxG,sFAAsF;IACtF,MAAM,WAAW,GAAG,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,OAAO,CAAC;IAC9D,MAAM,OAAO,GAAG,WAAW;QACzB,CAAC,CAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,CAAW;QAChF,CAAC,CAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,CAAW,CAAC;IACzE,MAAM,UAAU,GAAG,WAAW;QAC5B,CAAC,CAAC,wHAAwH;QAC1H,CAAC,CAAC,gHAAgH,CAAC;IAErH,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,wGAAwG;QACxG,yDAAyD;QACzD,0GAA0G;QAC1G,0GAA0G;QAC1G,mGAAmG;QACnG,mHAAmH;QACnH,mGAAmG;QACnG,+HAA+H;QAC/H,UAAU;QACV,eAAe,EACf;QACE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACrD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QACrG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;QAChH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QACpF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACpF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACpE,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QACrG,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;QACvH,OAAO,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2GAA2G,CAAC;QACnK,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,ycAAyc,CAAC;QAC5gB,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,ucAAuc,CAAC;QACzf,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yOAAyO,CAAC;QAClS,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,kBAAkB,CAA0B,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uLAAuL,CAAC;QACtR,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,YAAY,CAA0B,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qfAAqf,CAAC;QACzkB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;QAC3G,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iFAAiF,CAAC;QAC9I,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;QAC/G,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAC9F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAC5F,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC1F,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KACrF,EACD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAC3B,yEAAyE;QACzE,2EAA2E;QAC3E,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC;gBACH,MAAM,GAAG;oBACP,GAAG,MAAM;oBACT,OAAO,EAAE,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;iBAC7G,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,eAAe,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,IAAI,CAAC,MAAM,CAAC,SAAS;oBAAE,OAAO,eAAe,CAAC,6BAA6B,CAAC,CAAC;gBAC7E,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;gBAC/D,MAAM,IAAI,GAA4B;oBACpC,MAAM,EAAE,eAAe;oBACvB,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;iBAC5D,CAAC;gBACF,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;oBAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBAChE,IAAI,MAAM,CAAC,kBAAkB,KAAK,SAAS;oBAAE,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;gBACjG,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;oBAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;oBAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;oBAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC7D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAuE,CAAC;gBAC5H,OAAO,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7G,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,OAAO,oBAAoB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;YAClF,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,MAAM,CAAC,UAAU;oBAAE,OAAO,eAAe,CAAC,gCAAgC,CAAC,CAAC;gBACjF,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,0BAA0B,CAAC,CAAC,CAAC;gBACpE,MAAM,kBAAkB,GAAG,MAAM,CAAC,eAAe,KAAK,SAAS,CAAC;gBAChE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC5D,OAAO,eAAe,CAAC,qEAAqE,CAAC,CAAC;gBAChG,CAAC;gBACD,MAAM,IAAI,GAA4B;oBACpC,MAAM,EAAE,iBAAiB;oBACzB,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,MAAM;iBACP,CAAC;gBACF,IAAI,kBAAkB;oBAAE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;gBACtE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,IAAI,CAA0C,CAAC;gBAC/F,MAAM,SAAS,GAAG,kBAAkB;oBAClC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;oBACzC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACxB,OAAO,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YACrF,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,UAAU;oBAAE,OAAO,eAAe,CAAC,wCAAwC,CAAC,CAAC;gBACzF,IAAI,CAAC,MAAM,CAAC,YAAY;oBAAE,OAAO,eAAe,CAAC,0CAA0C,CAAC,CAAC;gBAC7F,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE;oBAC9C,MAAM,EAAE,yBAAyB;oBACjC,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;iBAClC,CAA0C,CAAC;gBAC5C,OAAO,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YAC9E,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,MAAM,CAAC,UAAU;oBAAE,OAAO,eAAe,CAAC,gCAAgC,CAAC,CAAC;gBACjF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE;oBAC9C,MAAM,EAAE,iBAAiB;oBACzB,UAAU,EAAE,MAAM,CAAC,UAAU;iBAC9B,CAA0B,CAAC;gBAC5B,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,SAAS;oBAAE,OAAO,eAAe,CAAC,gCAAgC,CAAC,CAAC;gBAChF,IAAI,CAAC,MAAM,CAAC,WAAW;oBAAE,OAAO,eAAe,CAAC,kCAAkC,CAAC,CAAC;gBACpF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE;oBAC9C,MAAM,EAAE,kBAAkB;oBAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;iBAChC,CAAmD,CAAC;gBACrD,OAAO,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1C,CAAC;YACD;gBACE,OAAO,eAAe,CAAC,mBAAmB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// External data source (unit-scoped ticketing connection) tool (consolidated):
|
|
3
|
+
// telora_external_data_source (list | create | update | delete | resolve | test)
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
//
|
|
6
|
+
// Manages read-only connections to an external ticketing system (first adapter:
|
|
7
|
+
// Linear). A connection attaches to an ORG UNIT and is inherited by every
|
|
8
|
+
// product under that unit or any descendant unit; resolution walks a product's
|
|
9
|
+
// unit up the org tree to the nearest active source.
|
|
10
|
+
//
|
|
11
|
+
// MODEL (stated in the tool description so an agent understands the contract):
|
|
12
|
+
// - The connection is a SOURCE for determining intent, not intent itself.
|
|
13
|
+
// Telora owns intent; Linear is read as context. The connection is
|
|
14
|
+
// READ-ONLY -- nothing is imported into Telora's issue tables.
|
|
15
|
+
// - The API key is WRITE-ONLY: supplied once at create/rotate, stored in
|
|
16
|
+
// Vault server-side, and never returned. Only a hasCredentials boolean is
|
|
17
|
+
// surfaced.
|
|
18
|
+
import { z } from "zod";
|
|
19
|
+
import { callProductApi, successResult, validationError, buildFields, wrapHandler, compactEntity, LIST_INDEX_NOTE, } from "../shared.js";
|
|
20
|
+
export function registerExternalDataSourceTools(server, getCreds, profile = 'full') {
|
|
21
|
+
const canWrite = profile === 'full' || profile === 'human';
|
|
22
|
+
server.tool("telora_external_data_source", "Unit-scoped connection registry for an external ticketing system (first adapter: Linear). A connection attaches to an ORG UNIT " +
|
|
23
|
+
"and is inherited by every product under that unit or any descendant unit. The connection is a SOURCE for determining intent, " +
|
|
24
|
+
"NOT intent itself: it is READ-ONLY and nothing is imported into Telora's issue tables -- Telora owns intent; the tracker is the " +
|
|
25
|
+
"client's system of record. The API key is WRITE-ONLY (supplied once at create or rotate via apiKey, stored in Vault, never " +
|
|
26
|
+
"returned); only a hasCredentials boolean is surfaced. " +
|
|
27
|
+
"Actions: list connections (optionally by orgNodeId), create (orgNodeId required; adapterType defaults 'linear', baseUrl defaults " +
|
|
28
|
+
"the Linear GraphQL endpoint), update (baseUrl/config/isActive/name, or rotate apiKey), delete, resolve (productId -> the nearest " +
|
|
29
|
+
"active ancestor-unit connection, or an explicit no-connection result), test (a live authenticated probe of the connection)." +
|
|
30
|
+
LIST_INDEX_NOTE, {
|
|
31
|
+
action: z.enum(["list", "create", "update", "delete", "resolve", "test"]).describe("Action to perform"),
|
|
32
|
+
externalDataSourceId: z.string().uuid().optional().describe("Connection UUID (required for update/delete/test)"),
|
|
33
|
+
orgNodeId: z.string().uuid().optional().describe("Org UNIT UUID the connection attaches to (required for create; optional filter for list)"),
|
|
34
|
+
productId: z.string().uuid().optional().describe("Product UUID to resolve a connection for (required for resolve)"),
|
|
35
|
+
adapterType: z.string().max(100).optional().describe("Adapter/provider key; defaults to 'linear' on create and resolve"),
|
|
36
|
+
name: z.string().max(200).optional().describe("Human-facing connection name (optional on create; defaults to '<adapter> connection')"),
|
|
37
|
+
baseUrl: z.string().max(2000).optional().describe("Provider API base URL; defaults to https://api.linear.app/graphql on create"),
|
|
38
|
+
config: z.record(z.string(), z.unknown()).optional().describe("Non-secret adapter config (JSON object)"),
|
|
39
|
+
isActive: z.boolean().optional().describe("Whether the connection is active (update only)"),
|
|
40
|
+
apiKey: z.string().max(4000).optional().describe("API key VALUE, write-only. Supplied at create or to rotate on update; stored in Vault, never returned."),
|
|
41
|
+
limit: z.number().int().min(1).max(500).optional().describe("Max results (1-500, default 50)"),
|
|
42
|
+
offset: z.number().int().min(0).optional().describe("Number of results to skip (default 0)"),
|
|
43
|
+
returnFull: z.boolean().optional().describe("Return full entity (default: compact)"),
|
|
44
|
+
}, wrapHandler(async (params) => {
|
|
45
|
+
switch (params.action) {
|
|
46
|
+
case "list": {
|
|
47
|
+
const result = await callProductApi(getCreds(), {
|
|
48
|
+
action: "external_data_source_list",
|
|
49
|
+
orgNodeId: params.orgNodeId,
|
|
50
|
+
limit: params.limit,
|
|
51
|
+
offset: params.offset,
|
|
52
|
+
});
|
|
53
|
+
return successResult({
|
|
54
|
+
items: result.externalDataSources,
|
|
55
|
+
totalCount: result.externalDataSources.length,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
case "create": {
|
|
59
|
+
if (!canWrite)
|
|
60
|
+
return validationError("create is not available in this profile");
|
|
61
|
+
if (!params.orgNodeId)
|
|
62
|
+
return validationError("orgNodeId required for create");
|
|
63
|
+
const result = await callProductApi(getCreds(), {
|
|
64
|
+
action: "external_data_source_create",
|
|
65
|
+
orgNodeId: params.orgNodeId,
|
|
66
|
+
adapterType: params.adapterType,
|
|
67
|
+
name: params.name,
|
|
68
|
+
baseUrl: params.baseUrl,
|
|
69
|
+
config: params.config,
|
|
70
|
+
apiKey: params.apiKey,
|
|
71
|
+
});
|
|
72
|
+
return successResult(compactEntity(result.externalDataSource, ["name", "adapterType", "hasCredentials"], params.returnFull));
|
|
73
|
+
}
|
|
74
|
+
case "update": {
|
|
75
|
+
if (!canWrite)
|
|
76
|
+
return validationError("update is not available in this profile");
|
|
77
|
+
if (!params.externalDataSourceId)
|
|
78
|
+
return validationError("externalDataSourceId required for update");
|
|
79
|
+
const fields = buildFields({
|
|
80
|
+
name: params.name,
|
|
81
|
+
baseUrl: params.baseUrl,
|
|
82
|
+
config: params.config,
|
|
83
|
+
isActive: params.isActive,
|
|
84
|
+
apiKey: params.apiKey,
|
|
85
|
+
});
|
|
86
|
+
const result = await callProductApi(getCreds(), {
|
|
87
|
+
action: "external_data_source_update",
|
|
88
|
+
externalDataSourceId: params.externalDataSourceId,
|
|
89
|
+
...fields,
|
|
90
|
+
});
|
|
91
|
+
return successResult(compactEntity(result.externalDataSource, Object.keys(fields), params.returnFull));
|
|
92
|
+
}
|
|
93
|
+
case "delete": {
|
|
94
|
+
if (!canWrite)
|
|
95
|
+
return validationError("delete is not available in this profile");
|
|
96
|
+
if (!params.externalDataSourceId)
|
|
97
|
+
return validationError("externalDataSourceId required for delete");
|
|
98
|
+
const result = await callProductApi(getCreds(), {
|
|
99
|
+
action: "external_data_source_delete",
|
|
100
|
+
externalDataSourceId: params.externalDataSourceId,
|
|
101
|
+
});
|
|
102
|
+
return successResult(result);
|
|
103
|
+
}
|
|
104
|
+
case "resolve": {
|
|
105
|
+
if (!params.productId)
|
|
106
|
+
return validationError("productId required for resolve");
|
|
107
|
+
const result = await callProductApi(getCreds(), {
|
|
108
|
+
action: "external_data_source_resolve",
|
|
109
|
+
productId: params.productId,
|
|
110
|
+
adapterType: params.adapterType,
|
|
111
|
+
});
|
|
112
|
+
return successResult(result);
|
|
113
|
+
}
|
|
114
|
+
case "test": {
|
|
115
|
+
if (!canWrite)
|
|
116
|
+
return validationError("test is not available in this profile");
|
|
117
|
+
if (!params.externalDataSourceId)
|
|
118
|
+
return validationError("externalDataSourceId required for test");
|
|
119
|
+
const result = await callProductApi(getCreds(), {
|
|
120
|
+
action: "external_data_source_test",
|
|
121
|
+
externalDataSourceId: params.externalDataSourceId,
|
|
122
|
+
});
|
|
123
|
+
return successResult(result);
|
|
124
|
+
}
|
|
125
|
+
default:
|
|
126
|
+
return validationError(`Unknown action: ${params.action}`);
|
|
127
|
+
}
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=externalDataSourceHandlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"externalDataSourceHandlers.js","sourceRoot":"","sources":["../../src/handlers/externalDataSourceHandlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// External reference (provenance) tool (consolidated):
|
|
3
|
+
// telora_external_reference (create | list | delete)
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
//
|
|
6
|
+
// Records structural provenance from a Telora entity to an external tracker item
|
|
7
|
+
// (e.g. a Linear issue). Whenever external tracker content SHAPED a Telora entity
|
|
8
|
+
// -- a focus, delivery, issue, reality-tree node, loop question, or PRD node --
|
|
9
|
+
// record an informed_by reference with a one-line note on HOW it informed the
|
|
10
|
+
// entity. A reference is a POINTER (identifier + url + note), never a copy; the
|
|
11
|
+
// tracker is a source for determining intent, not intent, and is never written
|
|
12
|
+
// back to.
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
import { callProductApi, successResult, validationError, wrapHandler, compactEntity, LIST_INDEX_NOTE, } from "../shared.js";
|
|
15
|
+
const ENTITY_TYPES = ["focus", "delivery", "issue", "reality_tree_node", "loop_question", "prd_node"];
|
|
16
|
+
export function registerExternalReferenceTools(server, getCreds, profile = 'full') {
|
|
17
|
+
const canWrite = profile === 'full' || profile === 'human';
|
|
18
|
+
server.tool("telora_external_reference", "Structural provenance from a Telora entity to an external tracker item. Record an informed_by reference WHENEVER external tracker " +
|
|
19
|
+
"content (e.g. a Linear issue like TIN-5) shaped a focus, delivery, issue, reality-tree node, loop question, or PRD node, with a " +
|
|
20
|
+
"one-line note on HOW it informed the entity. A reference is a POINTER (identifier + url + note), never a copy -- the tracker is a " +
|
|
21
|
+
"source for determining intent, not intent, and is never written back to. " +
|
|
22
|
+
"Actions: create (entityType + entityId + externalIdentifier; externalDataSourceId OR productId names the connection; relation " +
|
|
23
|
+
"defaults 'informed_by'), list (by entityType+entityId to see an entity's references, OR by externalDataSourceId+externalIdentifier " +
|
|
24
|
+
"to see which Telora entities cite an item), delete (externalReferenceId)." +
|
|
25
|
+
LIST_INDEX_NOTE, {
|
|
26
|
+
action: z.enum(["create", "list", "delete"]).describe("Action to perform"),
|
|
27
|
+
externalReferenceId: z.string().uuid().optional().describe("Reference UUID (required for delete)"),
|
|
28
|
+
entityType: z.enum(ENTITY_TYPES).optional().describe("Telora entity kind the reference hangs off (create; or list by entity)"),
|
|
29
|
+
entityId: z.string().uuid().optional().describe("Telora entity UUID (create; or list by entity)"),
|
|
30
|
+
externalDataSourceId: z.string().uuid().optional().describe("Connection UUID naming the source (create; or list by item)"),
|
|
31
|
+
productId: z.string().uuid().optional().describe("Product UUID to resolve the unit-scoped connection on create (alternative to externalDataSourceId)"),
|
|
32
|
+
externalIdentifier: z.string().max(200).optional().describe("External item identifier, e.g. TIN-5 (create; or list by item)"),
|
|
33
|
+
externalUrl: z.string().max(2000).optional().describe("URL of the external item (create)"),
|
|
34
|
+
relation: z.string().max(100).optional().describe("How the item relates to the entity; defaults 'informed_by'"),
|
|
35
|
+
note: z.string().max(4000).optional().describe("One-line human note on HOW the item informed the entity"),
|
|
36
|
+
limit: z.number().int().min(1).max(500).optional().describe("Max results (1-500, default 50)"),
|
|
37
|
+
offset: z.number().int().min(0).optional().describe("Number of results to skip (default 0)"),
|
|
38
|
+
returnFull: z.boolean().optional().describe("Return full entity (default: compact)"),
|
|
39
|
+
}, wrapHandler(async (params) => {
|
|
40
|
+
switch (params.action) {
|
|
41
|
+
case "create": {
|
|
42
|
+
if (!canWrite)
|
|
43
|
+
return validationError("create is not available in this profile");
|
|
44
|
+
if (!params.entityType)
|
|
45
|
+
return validationError("entityType required for create");
|
|
46
|
+
if (!params.entityId)
|
|
47
|
+
return validationError("entityId required for create");
|
|
48
|
+
if (!params.externalIdentifier)
|
|
49
|
+
return validationError("externalIdentifier required for create");
|
|
50
|
+
if (!params.externalDataSourceId && !params.productId)
|
|
51
|
+
return validationError("externalDataSourceId or productId required for create");
|
|
52
|
+
const result = await callProductApi(getCreds(), {
|
|
53
|
+
action: "external_reference_create",
|
|
54
|
+
entityType: params.entityType,
|
|
55
|
+
entityId: params.entityId,
|
|
56
|
+
externalDataSourceId: params.externalDataSourceId,
|
|
57
|
+
productId: params.productId,
|
|
58
|
+
externalIdentifier: params.externalIdentifier,
|
|
59
|
+
externalUrl: params.externalUrl,
|
|
60
|
+
relation: params.relation,
|
|
61
|
+
note: params.note,
|
|
62
|
+
});
|
|
63
|
+
if (result.externalReference) {
|
|
64
|
+
return successResult(compactEntity(result.externalReference, ["entityType", "externalIdentifier", "relation"], params.returnFull));
|
|
65
|
+
}
|
|
66
|
+
return successResult(result);
|
|
67
|
+
}
|
|
68
|
+
case "list": {
|
|
69
|
+
const result = await callProductApi(getCreds(), {
|
|
70
|
+
action: "external_reference_list",
|
|
71
|
+
entityType: params.entityType,
|
|
72
|
+
entityId: params.entityId,
|
|
73
|
+
externalDataSourceId: params.externalDataSourceId,
|
|
74
|
+
externalIdentifier: params.externalIdentifier,
|
|
75
|
+
limit: params.limit,
|
|
76
|
+
offset: params.offset,
|
|
77
|
+
});
|
|
78
|
+
return successResult({ items: result.externalReferences, totalCount: result.externalReferences.length });
|
|
79
|
+
}
|
|
80
|
+
case "delete": {
|
|
81
|
+
if (!canWrite)
|
|
82
|
+
return validationError("delete is not available in this profile");
|
|
83
|
+
if (!params.externalReferenceId)
|
|
84
|
+
return validationError("externalReferenceId required for delete");
|
|
85
|
+
const result = await callProductApi(getCreds(), {
|
|
86
|
+
action: "external_reference_delete",
|
|
87
|
+
externalReferenceId: params.externalReferenceId,
|
|
88
|
+
});
|
|
89
|
+
return successResult(result);
|
|
90
|
+
}
|
|
91
|
+
default:
|
|
92
|
+
return validationError(`Unknown action: ${params.action}`);
|
|
93
|
+
}
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=externalReferenceHandlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"externalReferenceHandlers.js","sourceRoot":"","sources":["../../src/handlers/externalReferenceHandlers.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uDAAuD;AACvD,uDAAuD;AACvD,8EAA8E;AAC9E,EAAE;AACF,iFAAiF;AACjF,kFAAkF;AAClF,gFAAgF;AAChF,8EAA8E;AAC9E,gFAAgF;AAChF,+EAA+E;AAC/E,WAAW;AAEX,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,EACf,WAAW,EACX,aAAa,EACb,eAAe,GAGhB,MAAM,cAAc,CAAC;AAEtB,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,CAAU,CAAC;AAE/G,MAAM,UAAU,8BAA8B,CAC5C,MAAiB,EACjB,QAAkB,EAClB,UAAuB,MAAM;IAE7B,MAAM,QAAQ,GAAG,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,OAAO,CAAC;IAE3D,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,oIAAoI;QACpI,kIAAkI;QAClI,oIAAoI;QACpI,2EAA2E;QAC3E,gIAAgI;QAChI,qIAAqI;QACrI,2EAA2E;QAC3E,eAAe,EACf;QACE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC1E,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAClG,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wEAAwE,CAAC;QAC9H,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;QACjG,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;QAC1H,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oGAAoG,CAAC;QACtJ,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;QAC7H,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAC1F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;QAC/G,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;QACzG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAC9F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAC5F,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KACrF,EACD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAC3B,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,QAAQ;oBAAE,OAAO,eAAe,CAAC,yCAAyC,CAAC,CAAC;gBACjF,IAAI,CAAC,MAAM,CAAC,UAAU;oBAAE,OAAO,eAAe,CAAC,gCAAgC,CAAC,CAAC;gBACjF,IAAI,CAAC,MAAM,CAAC,QAAQ;oBAAE,OAAO,eAAe,CAAC,8BAA8B,CAAC,CAAC;gBAC7E,IAAI,CAAC,MAAM,CAAC,kBAAkB;oBAAE,OAAO,eAAe,CAAC,wCAAwC,CAAC,CAAC;gBACjG,IAAI,CAAC,MAAM,CAAC,oBAAoB,IAAI,CAAC,MAAM,CAAC,SAAS;oBAAE,OAAO,eAAe,CAAC,uDAAuD,CAAC,CAAC;gBACvI,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE;oBAC9C,MAAM,EAAE,2BAA2B;oBACnC,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;oBACjD,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;oBAC7C,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;iBAClB,CAAwF,CAAC;gBAC1F,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBAC7B,OAAO,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,YAAY,EAAE,oBAAoB,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;gBACrI,CAAC;gBACD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE;oBAC9C,MAAM,EAAE,yBAAyB;oBACjC,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;oBACjD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;oBAC7C,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;iBACtB,CAA2D,CAAC;gBAC7D,OAAO,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,kBAAkB,EAAE,UAAU,EAAE,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3G,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,QAAQ;oBAAE,OAAO,eAAe,CAAC,yCAAyC,CAAC,CAAC;gBACjF,IAAI,CAAC,MAAM,CAAC,mBAAmB;oBAAE,OAAO,eAAe,CAAC,yCAAyC,CAAC,CAAC;gBACnG,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE;oBAC9C,MAAM,EAAE,2BAA2B;oBACnC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;iBAChD,CAAqC,CAAC;gBACvC,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;YACD;gBACE,OAAO,eAAe,CAAC,mBAAmB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -3,6 +3,8 @@ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
3
3
|
import { type GetCreds, type ToolProfile } from "../shared.js";
|
|
4
4
|
/** True when `ref` is a focus UUID (vs. an ephemeral focusKey like "f3"). */
|
|
5
5
|
export declare function isUuid(ref: string): boolean;
|
|
6
|
+
export declare const FOCUS_CREATE_FIELD_KEYS: readonly ["name", "description", "acceptanceCriteria", "targetDate", "readOnly"];
|
|
7
|
+
export declare const FOCUS_UPDATE_FIELD_KEYS: readonly ["name", "description", "acceptanceCriteria", "targetDate", "status", "readOnly", "assignedAgentRoleId", "armNote", "pipelineConfig"];
|
|
6
8
|
/**
|
|
7
9
|
* Zod validator for a focus reference: a UUID OR an ordinal focusKey ("f3").
|
|
8
10
|
* Used wherever a focusId param previously demanded a strict UUID, so a terse
|