epa-testeprojetoia 0.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 (100) hide show
  1. package/.idea/epa_mcp.iml +8 -0
  2. package/.idea/modules.xml +8 -0
  3. package/.idea/php.xml +19 -0
  4. package/.idea/vcs.xml +6 -0
  5. package/AGENTS.md +10 -0
  6. package/README.md +339 -0
  7. package/dist/agent/agentHelpers.js +21 -0
  8. package/dist/agent/openaiAgent.js +170 -0
  9. package/dist/agent/slidingWindow.js +13 -0
  10. package/dist/api/epaApiClient.js +59 -0
  11. package/dist/cli/index.js +47 -0
  12. package/dist/config/credentialStore.js +92 -0
  13. package/dist/config/ensureCliAuth.js +127 -0
  14. package/dist/config/loadConfig.js +40 -0
  15. package/dist/config/setup.js +23 -0
  16. package/dist/core/createReferenceTool.js +12 -0
  17. package/dist/core/createTool.js +32 -0
  18. package/dist/mocks/requestMocks.js +47 -0
  19. package/dist/server/server.js +41 -0
  20. package/dist/server/stdioServer.js +3 -0
  21. package/dist/services/request/requestFilters.js +1 -0
  22. package/dist/services/requestService.js +81 -0
  23. package/dist/services/teamService.js +18 -0
  24. package/dist/sql/createSqlConnection.js +13 -0
  25. package/dist/sql/fetchSchemaSummary.js +38 -0
  26. package/dist/sql/generateSqlFromQuestion.js +83 -0
  27. package/dist/sql/generateSqlPlan.js +111 -0
  28. package/dist/sql/getSqlAgentErrorMessage.js +15 -0
  29. package/dist/sql/loadSqlAgentConfig.js +24 -0
  30. package/dist/sql/loadSqlConfig.js +43 -0
  31. package/dist/sql/parseSqlQuestionHints.js +29 -0
  32. package/dist/sql/runSqlAgentCli.js +163 -0
  33. package/dist/sql/runSqlCli.js +34 -0
  34. package/dist/sql/selectRelevantTables.js +136 -0
  35. package/dist/sql/sqlGuard.js +21 -0
  36. package/dist/sql/sqlPlan.js +16 -0
  37. package/dist/tests/requestService.test.js +110 -0
  38. package/dist/tools/analytics/teamReport.draft.js +16 -0
  39. package/dist/tools/loadTools.js +40 -0
  40. package/dist/tools/requests/assignees.js +50 -0
  41. package/dist/tools/requests/clients.draft.js +10 -0
  42. package/dist/tools/requests/create.draft.js +51 -0
  43. package/dist/tools/requests/list.js +50 -0
  44. package/dist/tools/requests/priorities.js +2 -0
  45. package/dist/tools/requests/services.draft.js +20 -0
  46. package/dist/tools/requests/types.js +16 -0
  47. package/dist/tools/requests/units.draft.js +10 -0
  48. package/dist/tools/requests/view.draft.js +20 -0
  49. package/dist/utils/buildDateRange.js +18 -0
  50. package/dist/utils/findIdByDescription.js +4 -0
  51. package/dist/utils/resolveAssigneeId.js +14 -0
  52. package/dist/utils/toolNameMaps.js +23 -0
  53. package/package.json +31 -0
  54. package/src/agent/agentHelpers.ts +25 -0
  55. package/src/agent/openaiAgent.ts +205 -0
  56. package/src/agent/slidingWindow.ts +17 -0
  57. package/src/api/epaApiClient.ts +82 -0
  58. package/src/cli/index.ts +61 -0
  59. package/src/config/credentialStore.ts +130 -0
  60. package/src/config/ensureCliAuth.ts +152 -0
  61. package/src/config/loadConfig.ts +62 -0
  62. package/src/config/setup.ts +35 -0
  63. package/src/core/createReferenceTool.ts +17 -0
  64. package/src/core/createTool.ts +51 -0
  65. package/src/mocks/requestMocks.ts +52 -0
  66. package/src/server/server.ts +61 -0
  67. package/src/server/stdioServer.ts +5 -0
  68. package/src/services/request/requestFilters.ts +12 -0
  69. package/src/services/requestService.ts +126 -0
  70. package/src/services/teamService.ts +27 -0
  71. package/src/sql/createSqlConnection.ts +15 -0
  72. package/src/sql/fetchSchemaSummary.ts +64 -0
  73. package/src/sql/generateSqlFromQuestion.ts +105 -0
  74. package/src/sql/generateSqlPlan.ts +133 -0
  75. package/src/sql/getSqlAgentErrorMessage.ts +24 -0
  76. package/src/sql/loadSqlAgentConfig.ts +33 -0
  77. package/src/sql/loadSqlConfig.ts +75 -0
  78. package/src/sql/parseSqlQuestionHints.ts +46 -0
  79. package/src/sql/runSqlAgentCli.ts +204 -0
  80. package/src/sql/runSqlCli.ts +40 -0
  81. package/src/sql/selectRelevantTables.ts +184 -0
  82. package/src/sql/sqlGuard.ts +28 -0
  83. package/src/sql/sqlPlan.ts +28 -0
  84. package/src/tests/requestService.test.ts +152 -0
  85. package/src/tools/analytics/teamReport.draft.ts +25 -0
  86. package/src/tools/loadTools.ts +59 -0
  87. package/src/tools/requests/assignees.ts +59 -0
  88. package/src/tools/requests/clients.draft.ts +18 -0
  89. package/src/tools/requests/create.draft.ts +59 -0
  90. package/src/tools/requests/list.ts +57 -0
  91. package/src/tools/requests/priorities.ts +6 -0
  92. package/src/tools/requests/services.draft.ts +24 -0
  93. package/src/tools/requests/types.ts +18 -0
  94. package/src/tools/requests/units.draft.ts +18 -0
  95. package/src/tools/requests/view.draft.ts +27 -0
  96. package/src/utils/buildDateRange.ts +22 -0
  97. package/src/utils/findIdByDescription.ts +10 -0
  98. package/src/utils/resolveAssigneeId.ts +24 -0
  99. package/src/utils/toolNameMaps.ts +33 -0
  100. package/tsconfig.json +11 -0
@@ -0,0 +1,24 @@
1
+ import { createTool } from "../../core/createTool.js"
2
+ import { RequestService } from "../../services/requestService.js"
3
+
4
+ const service = new RequestService()
5
+
6
+ export default createTool({
7
+ name: "requests.services",
8
+ description: `
9
+ Lista serviços disponíveis para um tipo de solicitação.
10
+
11
+ Este endpoint depende de um tipo_id retornado
12
+ pela ferramenta "requests.types".
13
+ `,
14
+ schema: {
15
+ tipo_id: {
16
+ type: "number"
17
+ }
18
+ },
19
+
20
+ handler: async ({ tipo_id }) => {
21
+ return service.getServices(tipo_id)
22
+ }
23
+
24
+ })
@@ -0,0 +1,18 @@
1
+ import { createTool } from "../../core/createTool.js"
2
+ import { RequestService } from "../../services/requestService.js"
3
+
4
+ const service = new RequestService()
5
+
6
+ export default createTool({
7
+ name: "requests.types",
8
+ description: `
9
+ Lista os tipos de solicitação disponíveis no EPA.
10
+
11
+ Este é o primeiro passo para criar uma solicitação.
12
+ Após escolher um tipo, use o tipo_id retornado
13
+ para buscar os serviços usando "requests.services".
14
+ `,
15
+ handler: async () => {
16
+ return service.getTypes()
17
+ }
18
+ })
@@ -0,0 +1,18 @@
1
+ import { createTool } from "../../core/createTool.js"
2
+ import { RequestService } from "../../services/requestService.js"
3
+
4
+ const service = new RequestService()
5
+
6
+ export default createTool({
7
+
8
+ name: "requests.units",
9
+
10
+ description: "Lista unidades gerenciais executoras",
11
+
12
+ handler: async () => {
13
+
14
+ return service.getUnits()
15
+
16
+ }
17
+
18
+ })
@@ -0,0 +1,27 @@
1
+ import { z } from "zod"
2
+ import { createTool } from "../../core/createTool.js"
3
+ import { RequestService } from "../../services/requestService.js"
4
+
5
+ const service = new RequestService()
6
+
7
+ export default createTool({
8
+
9
+ name: "requests.view",
10
+
11
+ description: "Visualiza uma solicitacao especifica",
12
+
13
+ schema: {
14
+ id: {
15
+ type: "number",
16
+ description: "ID da solicitacao"
17
+ }
18
+ },
19
+ validator: z.object({
20
+ id: z.number().int().positive()
21
+ }).strict(),
22
+
23
+ handler: async ({ id }) => {
24
+ return service.view(id)
25
+ }
26
+
27
+ })
@@ -0,0 +1,22 @@
1
+ import type { ListPeriod } from "../services/request/requestFilters.js"
2
+
3
+ function formatDateTime(date: Date, endOfDay = false): string {
4
+ const year = date.getFullYear()
5
+ const month = String(date.getMonth() + 1).padStart(2, "0")
6
+ const day = String(date.getDate()).padStart(2, "0")
7
+ const hours = endOfDay ? "23" : String(date.getHours()).padStart(2, "0")
8
+ const minutes = endOfDay ? "59" : String(date.getMinutes()).padStart(2, "0")
9
+ const seconds = endOfDay ? "59" : String(date.getSeconds()).padStart(2, "0")
10
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
11
+ }
12
+
13
+ export function buildDateRange(period: ListPeriod = "current_year", now = new Date()): string {
14
+ if (period === "last_12_months") {
15
+ const start = new Date(now)
16
+ start.setFullYear(now.getFullYear() - 1)
17
+ return `${formatDateTime(start)}to${formatDateTime(now, true)}`
18
+ }
19
+
20
+ const year = now.getFullYear()
21
+ return `${year}-01-01 00:00:00to${year}-12-31 23:59:59`
22
+ }
@@ -0,0 +1,10 @@
1
+ export function findIdByDescription(list: any[], description: string) {
2
+
3
+ const item = list.find(
4
+ (i) =>
5
+ i.descricao.toLowerCase() === description.toLowerCase()
6
+ )
7
+
8
+ return item ? item.id : null
9
+
10
+ }
@@ -0,0 +1,24 @@
1
+ type AssigneeSearchItem = {
2
+ id?: unknown
3
+ text?: unknown
4
+ }
5
+
6
+ export function resolveAssigneeId(
7
+ assignees: unknown,
8
+ assigneeName: string
9
+ ): number | null {
10
+ if (!Array.isArray(assignees) || assignees.length === 0) {
11
+ return null
12
+ }
13
+
14
+ const normalizedName = assigneeName.trim().toLowerCase()
15
+ const exact = assignees.find((item: AssigneeSearchItem) => {
16
+ const text = String(item?.text ?? "").toLowerCase()
17
+ const login = text.split(" - ")[0]?.trim()
18
+ return login === normalizedName || text.startsWith(`${normalizedName} -`)
19
+ })
20
+
21
+ const selected = exact ?? assignees[0]
22
+ const id = Number((selected as AssigneeSearchItem)?.id)
23
+ return Number.isFinite(id) && id > 0 ? id : null
24
+ }
@@ -0,0 +1,33 @@
1
+ type ToolNameMapOptions = {
2
+ maxLength?: number
3
+ }
4
+
5
+ function sanitizeToolName(name: string, maxLength: number): string {
6
+ const sanitized = name.replace(/[^a-zA-Z0-9_-]/g, "_")
7
+ return sanitized.slice(0, maxLength)
8
+ }
9
+
10
+ export function buildToolNameMaps(toolNames: string[], options: ToolNameMapOptions = {}) {
11
+ const maxLength = Number.isFinite(options.maxLength) && (options.maxLength ?? 0) > 0
12
+ ? Number(options.maxLength)
13
+ : 64
14
+
15
+ const internalToExternal = new Map<string, string>()
16
+ const externalToInternal = new Map<string, string>()
17
+ const usageCount = new Map<string, number>()
18
+
19
+ for (const internalName of toolNames) {
20
+ const base = sanitizeToolName(internalName, maxLength)
21
+ const count = usageCount.get(base) ?? 0
22
+ usageCount.set(base, count + 1)
23
+
24
+ const suffix = count === 0 ? "" : `_${count + 1}`
25
+ const maxBaseLength = Math.max(1, maxLength - suffix.length)
26
+ const externalName = `${base.slice(0, maxBaseLength)}${suffix}`
27
+
28
+ internalToExternal.set(internalName, externalName)
29
+ externalToInternal.set(externalName, internalName)
30
+ }
31
+
32
+ return { internalToExternal, externalToInternal }
33
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "outDir": "dist",
7
+ "rootDir": "src",
8
+ "strict": true,
9
+ "esModuleInterop": true
10
+ }
11
+ }