@wilnertech/halopsa-mcp-server 1.0.2 → 1.1.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 (72) hide show
  1. package/.env.example +18 -18
  2. package/LICENSE +21 -21
  3. package/README.md +252 -205
  4. package/dist/api/client.d.ts +7 -2
  5. package/dist/api/client.d.ts.map +1 -1
  6. package/dist/api/client.js +35 -8
  7. package/dist/api/client.js.map +1 -1
  8. package/dist/cache/memory-cache.d.ts +7 -0
  9. package/dist/cache/memory-cache.d.ts.map +1 -1
  10. package/dist/cache/memory-cache.js +7 -0
  11. package/dist/cache/memory-cache.js.map +1 -1
  12. package/dist/cache/prewarm.d.ts +3 -1
  13. package/dist/cache/prewarm.d.ts.map +1 -1
  14. package/dist/cache/prewarm.js +17 -1
  15. package/dist/cache/prewarm.js.map +1 -1
  16. package/dist/schemas/common.d.ts +30 -99
  17. package/dist/schemas/common.d.ts.map +1 -1
  18. package/dist/schemas/common.js +2 -2
  19. package/dist/schemas/common.js.map +1 -1
  20. package/dist/tools/assets.d.ts +69 -297
  21. package/dist/tools/assets.d.ts.map +1 -1
  22. package/dist/tools/batch-operations.d.ts +49 -81
  23. package/dist/tools/batch-operations.d.ts.map +1 -1
  24. package/dist/tools/batch-operations.js +62 -0
  25. package/dist/tools/batch-operations.js.map +1 -1
  26. package/dist/tools/clients.d.ts +24 -92
  27. package/dist/tools/clients.d.ts.map +1 -1
  28. package/dist/tools/reference-data.d.ts +44 -72
  29. package/dist/tools/reference-data.d.ts.map +1 -1
  30. package/dist/tools/reference-data.js +27 -0
  31. package/dist/tools/reference-data.js.map +1 -1
  32. package/dist/tools/registrations.d.ts +7 -1
  33. package/dist/tools/registrations.d.ts.map +1 -1
  34. package/dist/tools/registrations.js +43 -7
  35. package/dist/tools/registrations.js.map +1 -1
  36. package/dist/tools/registry.d.ts +12 -5
  37. package/dist/tools/registry.d.ts.map +1 -1
  38. package/dist/tools/registry.js +26 -2
  39. package/dist/tools/registry.js.map +1 -1
  40. package/dist/tools/sites.d.ts +19 -111
  41. package/dist/tools/sites.d.ts.map +1 -1
  42. package/dist/tools/ticket-actions.d.ts +41 -0
  43. package/dist/tools/ticket-actions.d.ts.map +1 -0
  44. package/dist/tools/ticket-actions.js +222 -0
  45. package/dist/tools/ticket-actions.js.map +1 -0
  46. package/dist/tools/ticket-custom-fields.d.ts +33 -0
  47. package/dist/tools/ticket-custom-fields.d.ts.map +1 -0
  48. package/dist/tools/ticket-custom-fields.js +155 -0
  49. package/dist/tools/ticket-custom-fields.js.map +1 -0
  50. package/dist/tools/ticket-reference-data.d.ts +88 -0
  51. package/dist/tools/ticket-reference-data.d.ts.map +1 -0
  52. package/dist/tools/ticket-reference-data.js +185 -0
  53. package/dist/tools/ticket-reference-data.js.map +1 -0
  54. package/dist/tools/tickets.d.ts +168 -0
  55. package/dist/tools/tickets.d.ts.map +1 -0
  56. package/dist/tools/tickets.js +572 -0
  57. package/dist/tools/tickets.js.map +1 -0
  58. package/dist/tools/users.d.ts +37 -193
  59. package/dist/tools/users.d.ts.map +1 -1
  60. package/dist/types/tickets.d.ts +193 -0
  61. package/dist/types/tickets.d.ts.map +1 -0
  62. package/dist/types/tickets.js +14 -0
  63. package/dist/types/tickets.js.map +1 -0
  64. package/dist/utils/formatter.d.ts +15 -1
  65. package/dist/utils/formatter.d.ts.map +1 -1
  66. package/dist/utils/formatter.js +52 -6
  67. package/dist/utils/formatter.js.map +1 -1
  68. package/package.json +68 -61
  69. package/dist/utils/zod-to-schema.d.ts +0 -29
  70. package/dist/utils/zod-to-schema.d.ts.map +0 -1
  71. package/dist/utils/zod-to-schema.js +0 -182
  72. package/dist/utils/zod-to-schema.js.map +0 -1
@@ -7,7 +7,7 @@
7
7
  * - registerZod() : Zod-first registration with automatic schema conversion
8
8
  * and input parsing (replaces coerceArgs per-tool)
9
9
  */
10
- import { zodToJsonSchema } from '../utils/zod-to-schema.js';
10
+ import { z } from 'zod';
11
11
  export class ToolRegistry {
12
12
  tools = new Map();
13
13
  /**
@@ -24,9 +24,33 @@ export class ToolRegistry {
24
24
  * Register a tool using a Zod schema.
25
25
  * Converts the schema to JSON Schema for MCP and wraps the handler
26
26
  * to parse/coerce input before dispatching.
27
+ *
28
+ * Strips two categories of wire noise that Zod 4's native z.toJSONSchema()
29
+ * emits but MCP clients neither validate nor act on:
30
+ * 1. The top-level `$schema` URI — Zod attaches this to the final result
31
+ * object AFTER override callbacks fire (see zod/v4/core/to-json-schema.js
32
+ * line 299-313), so override cannot reach it; we delete it post-conversion.
33
+ * 2. Safe-integer minimum/maximum on integer nodes where the user did NOT
34
+ * call .min()/.max() (i.e., bounds equal Number.MIN/MAX_SAFE_INTEGER).
35
+ * Explicit user constraints (e.g., count.min(1).max(100)) are preserved.
36
+ * All other correctness-bearing additions — additionalProperties: false,
37
+ * propertyNames on records, anyOf for nullables, type: integer — are kept.
27
38
  */
28
39
  registerZod(tool) {
29
- const inputSchema = zodToJsonSchema(tool.schema);
40
+ const inputSchema = z.toJSONSchema(tool.schema, {
41
+ target: 'draft-07',
42
+ override: (ctx) => {
43
+ if (ctx.jsonSchema.type === 'integer') {
44
+ if (ctx.jsonSchema.minimum === Number.MIN_SAFE_INTEGER) {
45
+ delete ctx.jsonSchema.minimum;
46
+ }
47
+ if (ctx.jsonSchema.maximum === Number.MAX_SAFE_INTEGER) {
48
+ delete ctx.jsonSchema.maximum;
49
+ }
50
+ }
51
+ },
52
+ });
53
+ delete inputSchema.$schema;
30
54
  this.register({
31
55
  name: tool.name,
32
56
  description: tool.description,
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA8B5D,MAAM,OAAO,YAAY;IACf,KAAK,GAAgC,IAAI,GAAG,EAAE,CAAC;IAEvD;;;OAGG;IACH,QAAQ,CAAC,IAAoB;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,IAAuB;QACjC,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEjD,IAAI,CAAC,QAAQ,CAAC;YACZ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW;YACX,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;gBACxB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACtC,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,cAAc;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YAClF,IAAI;YACJ,WAAW;YACX,WAAW;SACZ,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAwB,EAAE,IAAY,EAAE,IAA6B;QAClF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2BxB,MAAM,OAAO,YAAY;IACf,KAAK,GAAgC,IAAI,GAAG,EAAE,CAAC;IAEvD;;;OAGG;IACH,QAAQ,CAAC,IAAoB;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,WAAW,CAAC,IAAuB;QACjC,MAAM,WAAW,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE;YAC9C,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;gBAChB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBACtC,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,KAAK,MAAM,CAAC,gBAAgB,EAAE,CAAC;wBACvD,OAAO,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;oBAChC,CAAC;oBACD,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,KAAK,MAAM,CAAC,gBAAgB,EAAE,CAAC;wBACvD,OAAO,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;oBAChC,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAA4B,CAAC;QAC9B,OAAO,WAAW,CAAC,OAAO,CAAC;QAE3B,IAAI,CAAC,QAAQ,CAAC;YACZ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW;YACX,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;gBACxB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACtC,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,cAAc;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YAClF,IAAI;YACJ,WAAW;YACX,WAAW;SACZ,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAwB,EAAE,IAAY,EAAE,IAA6B;QAClF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF"}
@@ -14,72 +14,30 @@ export declare const ListSitesArgsSchema: z.ZodObject<{
14
14
  count: z.ZodOptional<z.ZodNumber>;
15
15
  page_no: z.ZodOptional<z.ZodNumber>;
16
16
  format_options: z.ZodOptional<z.ZodObject<{
17
- format: z.ZodOptional<z.ZodEnum<["compact", "standard", "detailed"]>>;
18
- fields: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
17
+ format: z.ZodOptional<z.ZodEnum<{
18
+ compact: "compact";
19
+ standard: "standard";
20
+ detailed: "detailed";
21
+ }>>;
22
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
19
23
  omit_empty: z.ZodOptional<z.ZodBoolean>;
20
- }, "strip", z.ZodTypeAny, {
21
- format?: "compact" | "standard" | "detailed" | undefined;
22
- fields?: string[] | undefined;
23
- omit_empty?: boolean | undefined;
24
- }, {
25
- format?: "compact" | "standard" | "detailed" | undefined;
26
- fields?: string[] | undefined;
27
- omit_empty?: boolean | undefined;
28
- }>>;
29
- }, "strip", z.ZodTypeAny, {
30
- client_id?: number | undefined;
31
- count?: number | undefined;
32
- page_no?: number | undefined;
33
- search?: string | undefined;
34
- format_options?: {
35
- format?: "compact" | "standard" | "detailed" | undefined;
36
- fields?: string[] | undefined;
37
- omit_empty?: boolean | undefined;
38
- } | undefined;
39
- }, {
40
- client_id?: number | undefined;
41
- count?: number | undefined;
42
- page_no?: number | undefined;
43
- search?: string | undefined;
44
- format_options?: {
45
- format?: "compact" | "standard" | "detailed" | undefined;
46
- fields?: string[] | undefined;
47
- omit_empty?: boolean | undefined;
48
- } | undefined;
49
- }>;
24
+ }, z.core.$strip>>;
25
+ }, z.core.$strip>;
50
26
  /**
51
27
  * Get single site schema
52
28
  */
53
29
  export declare const GetSiteArgsSchema: z.ZodObject<{
54
30
  site_id: z.ZodNumber;
55
31
  format_options: z.ZodOptional<z.ZodObject<{
56
- format: z.ZodOptional<z.ZodEnum<["compact", "standard", "detailed"]>>;
57
- fields: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
32
+ format: z.ZodOptional<z.ZodEnum<{
33
+ compact: "compact";
34
+ standard: "standard";
35
+ detailed: "detailed";
36
+ }>>;
37
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
58
38
  omit_empty: z.ZodOptional<z.ZodBoolean>;
59
- }, "strip", z.ZodTypeAny, {
60
- format?: "compact" | "standard" | "detailed" | undefined;
61
- fields?: string[] | undefined;
62
- omit_empty?: boolean | undefined;
63
- }, {
64
- format?: "compact" | "standard" | "detailed" | undefined;
65
- fields?: string[] | undefined;
66
- omit_empty?: boolean | undefined;
67
- }>>;
68
- }, "strip", z.ZodTypeAny, {
69
- site_id: number;
70
- format_options?: {
71
- format?: "compact" | "standard" | "detailed" | undefined;
72
- fields?: string[] | undefined;
73
- omit_empty?: boolean | undefined;
74
- } | undefined;
75
- }, {
76
- site_id: number;
77
- format_options?: {
78
- format?: "compact" | "standard" | "detailed" | undefined;
79
- fields?: string[] | undefined;
80
- omit_empty?: boolean | undefined;
81
- } | undefined;
82
- }>;
39
+ }, z.core.$strip>>;
40
+ }, z.core.$strip>;
83
41
  /**
84
42
  * Create site schema
85
43
  */
@@ -96,50 +54,8 @@ export declare const CreateSiteArgsSchema: z.ZodObject<{
96
54
  state: z.ZodOptional<z.ZodString>;
97
55
  postalcode: z.ZodOptional<z.ZodString>;
98
56
  country: z.ZodOptional<z.ZodString>;
99
- }, "strip", z.ZodTypeAny, {
100
- addressline1?: string | undefined;
101
- addressline2?: string | undefined;
102
- city?: string | undefined;
103
- state?: string | undefined;
104
- postalcode?: string | undefined;
105
- country?: string | undefined;
106
- }, {
107
- addressline1?: string | undefined;
108
- addressline2?: string | undefined;
109
- city?: string | undefined;
110
- state?: string | undefined;
111
- postalcode?: string | undefined;
112
- country?: string | undefined;
113
- }>>;
114
- }, "strip", z.ZodTypeAny, {
115
- client_id: number;
116
- name: string;
117
- notes?: string | undefined;
118
- phonenumber?: string | undefined;
119
- maincontact_name?: string | undefined;
120
- address?: {
121
- addressline1?: string | undefined;
122
- addressline2?: string | undefined;
123
- city?: string | undefined;
124
- state?: string | undefined;
125
- postalcode?: string | undefined;
126
- country?: string | undefined;
127
- } | undefined;
128
- }, {
129
- client_id: number;
130
- name: string;
131
- notes?: string | undefined;
132
- phonenumber?: string | undefined;
133
- maincontact_name?: string | undefined;
134
- address?: {
135
- addressline1?: string | undefined;
136
- addressline2?: string | undefined;
137
- city?: string | undefined;
138
- state?: string | undefined;
139
- postalcode?: string | undefined;
140
- country?: string | undefined;
141
- } | undefined;
142
- }>;
57
+ }, z.core.$strip>>;
58
+ }, z.core.$strip>;
143
59
  /**
144
60
  * Find site match schema (deduplication)
145
61
  */
@@ -147,15 +63,7 @@ export declare const FindSiteMatchArgsSchema: z.ZodObject<{
147
63
  name: z.ZodString;
148
64
  address: z.ZodOptional<z.ZodString>;
149
65
  client_id: z.ZodNumber;
150
- }, "strip", z.ZodTypeAny, {
151
- client_id: number;
152
- name: string;
153
- address?: string | undefined;
154
- }, {
155
- client_id: number;
156
- name: string;
157
- address?: string | undefined;
158
- }>;
66
+ }, z.core.$strip>;
159
67
  /**
160
68
  * List sites with optional filtering and token optimization
161
69
  * Uses 5-minute cache TTL
@@ -1 +1 @@
1
- {"version":3,"file":"sites.d.ts","sourceRoot":"","sources":["../../src/tools/sites.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAcvD;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoB/B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;EAOlC,CAAC;AAMH;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GACxC,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,GACzC,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,GAC5C,OAAO,CAAC,MAAM,CAAC,CAqGjB;AAMD,eAAO,MAAM,aAAa,EAAE,iBAK3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,iBAKzB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,iBAK5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,iBAK/B,CAAC"}
1
+ {"version":3,"file":"sites.d.ts","sourceRoot":"","sources":["../../src/tools/sites.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAcvD;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;iBAU9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;iBAI5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;iBAoB/B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;iBAOlC,CAAC;AAMH;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GACxC,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,GACzC,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,GAC5C,OAAO,CAAC,MAAM,CAAC,CAqGjB;AAMD,eAAO,MAAM,aAAa,EAAE,iBAK3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,iBAKzB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,iBAK5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,iBAK/B,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * HaloPSA Ticket Action tools.
3
+ *
4
+ * Actions are the journal entries on a ticket — notes, email replies,
5
+ * status changes, time entries, etc. Halo's create endpoint is
6
+ * `POST /api/Actions` with an **array body** (mirrors Tickets/Asset
7
+ * convention). The list endpoint is `GET /api/Actions?ticket_id={id}`.
8
+ *
9
+ * The list response is cached briefly (1min) because action lists update
10
+ * any time someone touches the ticket; staleness > 1min would mislead
11
+ * agents reading the journal.
12
+ */
13
+ import { z } from 'zod';
14
+ import type { HaloPSAAPIClient } from '../api/client.js';
15
+ import type { ZodToolDefinition } from './registry.js';
16
+ export declare const AddTicketActionArgsSchema: z.ZodObject<{
17
+ ticket_id: z.ZodNumber;
18
+ note: z.ZodString;
19
+ outcome_id: z.ZodOptional<z.ZodNumber>;
20
+ email_reply: z.ZodOptional<z.ZodBoolean>;
21
+ hiddenfromuser: z.ZodOptional<z.ZodBoolean>;
22
+ }, z.core.$strip>;
23
+ export declare const ListTicketActionsArgsSchema: z.ZodObject<{
24
+ ticket_id: z.ZodNumber;
25
+ count: z.ZodOptional<z.ZodNumber>;
26
+ page_no: z.ZodOptional<z.ZodNumber>;
27
+ format_options: z.ZodOptional<z.ZodObject<{
28
+ format: z.ZodOptional<z.ZodEnum<{
29
+ compact: "compact";
30
+ standard: "standard";
31
+ detailed: "detailed";
32
+ }>>;
33
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
34
+ omit_empty: z.ZodOptional<z.ZodBoolean>;
35
+ }, z.core.$strip>>;
36
+ }, z.core.$strip>;
37
+ export declare function addTicketAction(client: HaloPSAAPIClient, args: z.infer<typeof AddTicketActionArgsSchema>): Promise<string>;
38
+ export declare function listTicketActions(client: HaloPSAAPIClient, args: z.infer<typeof ListTicketActionsArgsSchema>): Promise<string>;
39
+ export declare const addTicketActionTool: ZodToolDefinition;
40
+ export declare const listTicketActionsTool: ZodToolDefinition;
41
+ //# sourceMappingURL=ticket-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-actions.d.ts","sourceRoot":"","sources":["../../src/tools/ticket-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAevD,eAAO,MAAM,yBAAyB;;;;;;iBAWpC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;iBAQtC,CAAC;AA2IH,wBAAsB,eAAe,CACnC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,GAC9C,OAAO,CAAC,MAAM,CAAC,CA0CjB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,GAChD,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAMD,eAAO,MAAM,mBAAmB,EAAE,iBAKjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,iBAKnC,CAAC"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * HaloPSA Ticket Action tools.
3
+ *
4
+ * Actions are the journal entries on a ticket — notes, email replies,
5
+ * status changes, time entries, etc. Halo's create endpoint is
6
+ * `POST /api/Actions` with an **array body** (mirrors Tickets/Asset
7
+ * convention). The list endpoint is `GET /api/Actions?ticket_id={id}`.
8
+ *
9
+ * The list response is cached briefly (1min) because action lists update
10
+ * any time someone touches the ticket; staleness > 1min would mislead
11
+ * agents reading the journal.
12
+ */
13
+ import { z } from 'zod';
14
+ import { HaloPSAError } from '../api/errors.js';
15
+ import { formatResponse } from '../utils/formatter.js';
16
+ import { TTL } from '../cache/memory-cache.js';
17
+ import { FormatOptionsSchema } from '../schemas/common.js';
18
+ // =============================================================================
19
+ // Schemas
20
+ // =============================================================================
21
+ export const AddTicketActionArgsSchema = z.object({
22
+ ticket_id: z.number().int()
23
+ .describe('HaloPSA ticket ID to attach the action to'),
24
+ note: z.string().min(1)
25
+ .describe('Note body (plain text or HTML)'),
26
+ outcome_id: z.number().int().optional()
27
+ .describe('Outcome enum ID (Public Note, Private Note, Email Reply, etc.). Halo REQUIRES this on most tenants — without it, POST /Actions returns 400 "An Outcome must be entered for this Action". Look up valid outcomes for your agent in Halo admin → Configuration → Tickets → Outcomes.'),
28
+ email_reply: z.boolean().optional()
29
+ .describe('If true, sends the note as an email reply to the ticket requester'),
30
+ hiddenfromuser: z.boolean().optional()
31
+ .describe('If true, hides the action from the customer portal'),
32
+ });
33
+ export const ListTicketActionsArgsSchema = z.object({
34
+ ticket_id: z.number().int()
35
+ .describe('Filter actions to a single ticket'),
36
+ count: z.number().int().min(1).max(100).optional()
37
+ .describe('Results per page (max 100)'),
38
+ page_no: z.number().int().min(1).optional()
39
+ .describe('Page number (1-indexed)'),
40
+ format_options: FormatOptionsSchema,
41
+ });
42
+ // =============================================================================
43
+ // Helpers
44
+ // =============================================================================
45
+ const ACTION_PREVIEW_LEN = 200;
46
+ /**
47
+ * Regex to detect Halo 400 messages that indicate a missing or invalid
48
+ * outcome_id — covers both "An Outcome must be entered for this Action"
49
+ * and "You do not have access to this Action at the moment."
50
+ */
51
+ const OUTCOME_ERROR_RE = /Outcome must be entered|access to this Action/i;
52
+ /**
53
+ * Scan an arbitrary object for any key whose name contains "outcome"
54
+ * (case-insensitive) and whose value is an array. Returns that array,
55
+ * or an empty array if nothing is found.
56
+ */
57
+ function extractOutcomeHint(obj) {
58
+ for (const key of Object.keys(obj)) {
59
+ if (/outcome/i.test(key)) {
60
+ const val = obj[key];
61
+ if (Array.isArray(val)) {
62
+ return val;
63
+ }
64
+ }
65
+ }
66
+ return [];
67
+ }
68
+ /**
69
+ * When POST /Actions returns a 400 matching the outcome-required pattern,
70
+ * fetch the parent ticket and its tickettype config, then return a structured
71
+ * "refusal" object (not a thrown error) so the caller sees discovery info.
72
+ */
73
+ async function buildOutcomeDiscoveryRefusal(client, ticketId, haloError) {
74
+ const discoveryWarnings = [];
75
+ // --- Step 1: fetch the parent ticket ---
76
+ let tickettypeId;
77
+ let tickettypeName;
78
+ try {
79
+ const ticket = await client.get(`/Tickets/${ticketId}`, { includedetails: true });
80
+ tickettypeId = ticket.tickettype_id;
81
+ tickettypeName = ticket.tickettype_name;
82
+ }
83
+ catch (innerErr) {
84
+ const msg = innerErr instanceof Error ? innerErr.message : String(innerErr);
85
+ discoveryWarnings.push('ticket lookup failed: ' + msg);
86
+ return {
87
+ action_created: false,
88
+ halo_error: haloError,
89
+ diagnosis: 'outcome_id is required for this tickettype and was either missing or invalid',
90
+ tickettype_id: null,
91
+ tickettype_name: null,
92
+ valid_outcomes_hint: [],
93
+ discovery_warning: discoveryWarnings.join('; '),
94
+ remediation: 'Either retry with a valid outcome_id (check Halo admin: Configuration > Tickets > Outcomes), ' +
95
+ 'or fall back to update_halopsa_ticket to set details_html / status_id without going through the Actions surface.',
96
+ };
97
+ }
98
+ // --- Step 2: fetch the tickettype config ---
99
+ let validOutcomesHint = [];
100
+ if (tickettypeId !== undefined) {
101
+ try {
102
+ const ttConfig = await client.get(`/TicketType/${tickettypeId}`, { includedetails: true });
103
+ validOutcomesHint = extractOutcomeHint(ttConfig);
104
+ }
105
+ catch (innerErr) {
106
+ const msg = innerErr instanceof Error ? innerErr.message : String(innerErr);
107
+ discoveryWarnings.push('tickettype lookup failed: ' + msg);
108
+ }
109
+ }
110
+ const result = {
111
+ action_created: false,
112
+ halo_error: haloError,
113
+ diagnosis: 'outcome_id is required for this tickettype and was either missing or invalid',
114
+ tickettype_id: tickettypeId ?? null,
115
+ tickettype_name: tickettypeName ?? null,
116
+ valid_outcomes_hint: validOutcomesHint,
117
+ remediation: 'Either retry with a valid outcome_id from the list above, ' +
118
+ 'or fall back to update_halopsa_ticket to set details_html / status_id without going through the Actions surface.',
119
+ };
120
+ if (discoveryWarnings.length > 0) {
121
+ result['discovery_warning'] = discoveryWarnings.join('; ');
122
+ }
123
+ return result;
124
+ }
125
+ /**
126
+ * Compact action shape — id/who/datetime/outcome plus a `note_preview`
127
+ * truncated to 200 chars so list responses stay LLM-friendly.
128
+ */
129
+ function compactAction(action) {
130
+ const note = action.note ?? action.note_html ?? '';
131
+ return {
132
+ id: action.id,
133
+ ticket_id: action.ticket_id,
134
+ who: action.who,
135
+ datetime: action.datetime,
136
+ outcome: action.outcome,
137
+ note_preview: note.length > ACTION_PREVIEW_LEN
138
+ ? note.slice(0, ACTION_PREVIEW_LEN) + '…'
139
+ : note,
140
+ };
141
+ }
142
+ function unwrapActionList(response) {
143
+ if (Array.isArray(response)) {
144
+ return { actions: response, record_count: response.length };
145
+ }
146
+ return {
147
+ actions: response.actions ?? [],
148
+ record_count: response.record_count ?? response.actions?.length ?? 0,
149
+ };
150
+ }
151
+ // =============================================================================
152
+ // Implementations
153
+ // =============================================================================
154
+ export async function addTicketAction(client, args) {
155
+ const payload = {
156
+ ticket_id: args.ticket_id,
157
+ note: args.note,
158
+ };
159
+ if (args.outcome_id !== undefined)
160
+ payload.outcome_id = args.outcome_id;
161
+ if (args.email_reply !== undefined)
162
+ payload.email_reply = args.email_reply;
163
+ if (args.hiddenfromuser !== undefined)
164
+ payload.hiddenfromuser = args.hiddenfromuser;
165
+ // Halo's array-body write may return `[{...}]` or `{...}` depending on
166
+ // tenant — normalize to a single object before formatting.
167
+ let raw;
168
+ try {
169
+ raw = await client.post('/Actions', [payload]);
170
+ }
171
+ catch (error) {
172
+ // When Halo returns 400 for a missing or invalid outcome_id, surface a
173
+ // structured refusal with discovery info instead of re-throwing the raw
174
+ // error. This lets the caller retry with a valid outcome_id.
175
+ const haloMessage = error instanceof HaloPSAError ? error.message : String(error);
176
+ if (OUTCOME_ERROR_RE.test(haloMessage)) {
177
+ const refusal = await buildOutcomeDiscoveryRefusal(client, args.ticket_id, haloMessage);
178
+ return JSON.stringify(refusal);
179
+ }
180
+ throw error;
181
+ }
182
+ const created = Array.isArray(raw) ? raw[0] : raw;
183
+ client.invalidateCache(`ticket-actions:${args.ticket_id}*`);
184
+ client.invalidateCache(`ticket:${args.ticket_id}*`);
185
+ return formatResponse(created, { format: 'standard' });
186
+ }
187
+ export async function listTicketActions(client, args) {
188
+ const params = { ticket_id: args.ticket_id };
189
+ if (args.count !== undefined)
190
+ params.count = args.count;
191
+ if (args.page_no !== undefined)
192
+ params.page_no = args.page_no;
193
+ const formatOpts = args.format_options || { format: 'compact' };
194
+ const response = await client.getCached('/Actions', params, {
195
+ enabled: true,
196
+ ttl: TTL.TICKET_ACTION_LIST,
197
+ keyPrefix: `ticket-actions:${args.ticket_id}`,
198
+ });
199
+ const { actions, record_count } = unwrapActionList(response);
200
+ // Compact mode: substitute the preview-shaped objects so the response
201
+ // never echoes back full HTML bodies on a journal listing.
202
+ const items = formatOpts.format === 'compact'
203
+ ? actions.map(compactAction)
204
+ : actions;
205
+ return formatResponse(items, formatOpts, { record_count });
206
+ }
207
+ // =============================================================================
208
+ // Tool Definitions
209
+ // =============================================================================
210
+ export const addTicketActionTool = {
211
+ name: 'add_halopsa_ticket_action',
212
+ description: 'Append an action (note, email reply, status change journal entry) to a HaloPSA ticket. POST /Actions with array body wrapper. Invalidates ticket and action caches.',
213
+ schema: AddTicketActionArgsSchema,
214
+ handler: addTicketAction,
215
+ };
216
+ export const listTicketActionsTool = {
217
+ name: 'list_halopsa_ticket_actions',
218
+ description: 'List actions/journal entries on a HaloPSA ticket. Compact response includes a 200-char note_preview; pass format_options.format="detailed" for full notes. Cached 1min.',
219
+ schema: ListTicketActionsArgsSchema,
220
+ handler: listTicketActions,
221
+ };
222
+ //# sourceMappingURL=ticket-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-actions.js","sourceRoot":"","sources":["../../src/tools/ticket-actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * HaloPSA Ticket Custom Field tools.
3
+ *
4
+ * Two complementary inspection paths:
5
+ * 1. `list_halopsa_ticket_custom_fields` — preferred. Calls
6
+ * GET /api/FieldInfo?type=1&tickettype_id={id}. If the tenant
7
+ * returns a non-empty field list, that's the canonical schema.
8
+ * 2. `get_halopsa_ticket_field_schema` — fallback. Samples N recent
9
+ * tickets of a given type and derives field shape from their
10
+ * `customfields[]` arrays. Mirrors `getAssetFieldSchemaTool`.
11
+ *
12
+ * The dual approach exists because Halo's `/FieldInfo` endpoint behaves
13
+ * inconsistently across tenants — some installs gate it behind admin
14
+ * scope, others return empty arrays for non-admin agents. The sampling
15
+ * path is robust but lossy (only fields that ARE used on existing
16
+ * tickets show up).
17
+ */
18
+ import { z } from 'zod';
19
+ import type { HaloPSAAPIClient } from '../api/client.js';
20
+ import type { ZodToolDefinition } from './registry.js';
21
+ export declare const ListTicketCustomFieldsArgsSchema: z.ZodObject<{
22
+ tickettype_id: z.ZodNumber;
23
+ }, z.core.$strip>;
24
+ export declare const GetTicketFieldSchemaArgsSchema: z.ZodObject<{
25
+ tickettype_id: z.ZodNumber;
26
+ client_id: z.ZodOptional<z.ZodNumber>;
27
+ sample_size: z.ZodOptional<z.ZodNumber>;
28
+ }, z.core.$strip>;
29
+ export declare function listTicketCustomFields(client: HaloPSAAPIClient, args: z.infer<typeof ListTicketCustomFieldsArgsSchema>): Promise<string>;
30
+ export declare function getTicketFieldSchema(client: HaloPSAAPIClient, args: z.infer<typeof GetTicketFieldSchemaArgsSchema>): Promise<string>;
31
+ export declare const listTicketCustomFieldsTool: ZodToolDefinition;
32
+ export declare const getTicketFieldSchemaTool: ZodToolDefinition;
33
+ //# sourceMappingURL=ticket-custom-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-custom-fields.d.ts","sourceRoot":"","sources":["../../src/tools/ticket-custom-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAWvD,eAAO,MAAM,gCAAgC;;iBAG3C,CAAC;AAEH,eAAO,MAAM,8BAA8B;;;;iBAOzC,CAAC;AAgDH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,gCAAgC,CAAC,GACrD,OAAO,CAAC,MAAM,CAAC,CAmCjB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,GACnD,OAAO,CAAC,MAAM,CAAC,CAyDjB;AAMD,eAAO,MAAM,0BAA0B,EAAE,iBAKxC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,iBAKtC,CAAC"}