@osva-ai/connector-jira 0.1.0 → 0.1.1

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.
@@ -1,6 +1,6 @@
1
1
  export declare const CONNECTOR_KEY = "osva-connector-jira";
2
2
  export declare const CONNECTOR_NAME = "OSVA Jira Connector";
3
- export declare const CONNECTOR_VERSION = "0.1.0";
3
+ export declare const CONNECTOR_VERSION = "0.1.1";
4
4
  export declare const JIRA_PROJECT_LIST_TOOL = "jira.project.list";
5
5
  export declare const JIRA_PROJECT_GET_TOOL = "jira.project.get";
6
6
  export declare const JIRA_ISSUE_SEARCH_TOOL = "jira.issue.search";
package/dist/constants.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export const CONNECTOR_KEY = "osva-connector-jira";
2
2
  export const CONNECTOR_NAME = "OSVA Jira Connector";
3
- export const CONNECTOR_VERSION = "0.1.0";
3
+ export const CONNECTOR_VERSION = "0.1.1";
4
4
  export const JIRA_PROJECT_LIST_TOOL = "jira.project.list";
5
5
  export const JIRA_PROJECT_GET_TOOL = "jira.project.get";
6
6
  export const JIRA_ISSUE_SEARCH_TOOL = "jira.issue.search";
@@ -1,3 +1,7 @@
1
+ export declare function splitJqlOrderBy(jql: string): {
2
+ readonly predicate: string;
3
+ readonly orderBy?: string;
4
+ };
1
5
  export declare function assertJqlRespectsProjectAllowlist(jql: string, allowedKeys: ReadonlySet<string>): void;
2
6
  export declare function wrapJqlWithProjectAllowlist(jql: string, allowedKeys: ReadonlySet<string>): string;
3
7
  //# sourceMappingURL=jql-allowlist.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jql-allowlist.d.ts","sourceRoot":"","sources":["../src/jql-allowlist.ts"],"names":[],"mappings":"AAkBA,wBAAgB,iCAAiC,CAC/C,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAC/B,IAAI,CAqCN;AAED,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAC/B,MAAM,CAcR"}
1
+ {"version":3,"file":"jql-allowlist.d.ts","sourceRoot":"","sources":["../src/jql-allowlist.ts"],"names":[],"mappings":"AASA,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAcA;AAcD,wBAAgB,iCAAiC,CAC/C,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAC/B,IAAI,CA6CN;AAED,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAC/B,MAAM,CAiBR"}
@@ -2,6 +2,20 @@ import { ConnectorSdkError } from "@osva-ai/connector-sdk";
2
2
  const PROJECT_EQ = /\bproject\s*=\s*["']?([A-Za-z][A-Za-z0-9_]*)["']?/gi;
3
3
  const PROJECT_IN = /\bproject\s+in\s*\(\s*([^)]+)\)/gi;
4
4
  const PROJECT_NOT_IN = /\bproject\s+not\s+in\s*\(\s*([^)]+)\)/gi;
5
+ const ORDER_BY = /\border\s+by\b/i;
6
+ const UNSUPPORTED_JQL = /\b(?:issueFunction|membersOf|openSprints|closedSprints|linkedIssues|subtaskIssues|portfolioChildIssuesOf)\s*\(/i;
7
+ export function splitJqlOrderBy(jql) {
8
+ const match = jql.match(ORDER_BY);
9
+ if (match === null || match.index === undefined) {
10
+ return { predicate: jql.trim() };
11
+ }
12
+ const predicate = jql.slice(0, match.index).trim();
13
+ const orderBy = jql.slice(match.index).trim();
14
+ if (predicate.length === 0) {
15
+ throw new ConnectorSdkError("INVALID_INPUT", "JQL ORDER BY must follow a search predicate.");
16
+ }
17
+ return { predicate, orderBy };
18
+ }
5
19
  function parseKeyList(inner) {
6
20
  const keys = [];
7
21
  const parts = inner.split(",");
@@ -17,14 +31,18 @@ export function assertJqlRespectsProjectAllowlist(jql, allowedKeys) {
17
31
  if (allowedKeys.size === 0) {
18
32
  return;
19
33
  }
34
+ const { predicate } = splitJqlOrderBy(jql);
35
+ if (UNSUPPORTED_JQL.test(predicate)) {
36
+ throw new ConnectorSdkError("FORBIDDEN", "This JQL form is not permitted when a project allowlist is configured.");
37
+ }
20
38
  const referenced = new Set();
21
- for (const match of jql.matchAll(PROJECT_EQ)) {
39
+ for (const match of predicate.matchAll(PROJECT_EQ)) {
22
40
  const key = match[1];
23
41
  if (key !== undefined) {
24
42
  referenced.add(key.toUpperCase());
25
43
  }
26
44
  }
27
- for (const match of jql.matchAll(PROJECT_IN)) {
45
+ for (const match of predicate.matchAll(PROJECT_IN)) {
28
46
  const inner = match[1];
29
47
  if (inner !== undefined) {
30
48
  for (const key of parseKeyList(inner)) {
@@ -32,7 +50,7 @@ export function assertJqlRespectsProjectAllowlist(jql, allowedKeys) {
32
50
  }
33
51
  }
34
52
  }
35
- if (PROJECT_NOT_IN.test(jql)) {
53
+ if (PROJECT_NOT_IN.test(predicate)) {
36
54
  PROJECT_NOT_IN.lastIndex = 0;
37
55
  throw new ConnectorSdkError("FORBIDDEN", "Cross-project JQL is not permitted when a project allowlist is configured.");
38
56
  }
@@ -48,10 +66,13 @@ export function wrapJqlWithProjectAllowlist(jql, allowedKeys) {
48
66
  }
49
67
  assertJqlRespectsProjectAllowlist(jql, allowedKeys);
50
68
  const list = [...allowedKeys].sort().join(", ");
51
- const trimmed = jql.trim();
52
- if (trimmed.length === 0) {
53
- return `project in (${list})`;
69
+ const { predicate, orderBy } = splitJqlOrderBy(jql);
70
+ if (predicate.length === 0) {
71
+ return orderBy !== undefined
72
+ ? `project in (${list}) ${orderBy}`
73
+ : `project in (${list})`;
54
74
  }
55
- return `(${trimmed}) AND project in (${list})`;
75
+ const scoped = `(${predicate}) AND project in (${list})`;
76
+ return orderBy !== undefined ? `${scoped} ${orderBy}` : scoped;
56
77
  }
57
78
  //# sourceMappingURL=jql-allowlist.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jql-allowlist.js","sourceRoot":"","sources":["../src/jql-allowlist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,UAAU,GAAG,qDAAqD,CAAC;AACzE,MAAM,UAAU,GAAG,mCAAmC,CAAC;AACvD,MAAM,cAAc,GAAG,yCAAyC,CAAC;AAEjE,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACxD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,GAAW,EACX,WAAgC;IAEhC,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC;QAC7B,MAAM,IAAI,iBAAiB,CACzB,WAAW,EACX,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,iBAAiB,CACzB,WAAW,EACX,4EAA4E,CAC7E,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,GAAW,EACX,WAAgC;IAEhC,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,iBAAiB,CACzB,WAAW,EACX,uEAAuE,CACxE,CAAC;IACJ,CAAC;IACD,iCAAiC,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,eAAe,IAAI,GAAG,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,OAAO,qBAAqB,IAAI,GAAG,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"jql-allowlist.js","sourceRoot":"","sources":["../src/jql-allowlist.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@osva-ai/connector-jira",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "OSVA Connector Profile V1 Jira Cloud MCP connector (bounded project/issue reads; controlled issue mutations when explicitly enabled)",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/Osva-AI/osva-connectors/tree/main/packages/jira",