@ffschrattenecker/tm1-mcp-server 6.0.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 (475) hide show
  1. package/CHANGELOG.md +1211 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE +34 -0
  4. package/README.md +276 -0
  5. package/dist/config.d.ts +35 -0
  6. package/dist/config.js +238 -0
  7. package/dist/http-transport.d.ts +8 -0
  8. package/dist/http-transport.js +132 -0
  9. package/dist/index.d.ts +18 -0
  10. package/dist/index.js +164 -0
  11. package/dist/lib/callgraph/callGraph.d.ts +124 -0
  12. package/dist/lib/callgraph/callGraph.js +334 -0
  13. package/dist/lib/callgraph/choreGraph.d.ts +23 -0
  14. package/dist/lib/callgraph/choreGraph.js +102 -0
  15. package/dist/lib/callgraph/dataFlow.d.ts +74 -0
  16. package/dist/lib/callgraph/dataFlow.js +271 -0
  17. package/dist/lib/callgraph/datasourceMembership.d.ts +31 -0
  18. package/dist/lib/callgraph/datasourceMembership.js +142 -0
  19. package/dist/lib/callgraph/lintTypes.d.ts +28 -0
  20. package/dist/lib/callgraph/lintTypes.js +2 -0
  21. package/dist/lib/callgraph/mdxMembers.d.ts +29 -0
  22. package/dist/lib/callgraph/mdxMembers.js +97 -0
  23. package/dist/lib/callgraph/referenceIndex.d.ts +179 -0
  24. package/dist/lib/callgraph/referenceIndex.js +584 -0
  25. package/dist/lib/callgraph/rulesLinter.d.ts +55 -0
  26. package/dist/lib/callgraph/rulesLinter.js +776 -0
  27. package/dist/lib/callgraph/rulesParser.d.ts +26 -0
  28. package/dist/lib/callgraph/rulesParser.js +71 -0
  29. package/dist/lib/callgraph/subsetUsage.d.ts +16 -0
  30. package/dist/lib/callgraph/subsetUsage.js +134 -0
  31. package/dist/lib/callgraph/tiParser.d.ts +21 -0
  32. package/dist/lib/callgraph/tiParser.js +672 -0
  33. package/dist/lib/callgraph/tiSignatures.d.ts +32 -0
  34. package/dist/lib/callgraph/tiSignatures.js +6185 -0
  35. package/dist/lib/callgraph/tm1-adapter.d.ts +32 -0
  36. package/dist/lib/callgraph/tm1-adapter.js +159 -0
  37. package/dist/lib/callgraph/types.d.ts +53 -0
  38. package/dist/lib/callgraph/types.js +2 -0
  39. package/dist/lib/callgraph/variableEnv.d.ts +86 -0
  40. package/dist/lib/callgraph/variableEnv.js +214 -0
  41. package/dist/lib/cell-address.d.ts +12 -0
  42. package/dist/lib/cell-address.js +71 -0
  43. package/dist/lib/complexity/antipatterns.d.ts +22 -0
  44. package/dist/lib/complexity/antipatterns.js +302 -0
  45. package/dist/lib/complexity/comment-classifier.d.ts +24 -0
  46. package/dist/lib/complexity/comment-classifier.js +43 -0
  47. package/dist/lib/complexity/cross-process.d.ts +78 -0
  48. package/dist/lib/complexity/cross-process.js +114 -0
  49. package/dist/lib/complexity/process-metrics.d.ts +78 -0
  50. package/dist/lib/complexity/process-metrics.js +278 -0
  51. package/dist/lib/complexity/rules-metrics.d.ts +31 -0
  52. package/dist/lib/complexity/rules-metrics.js +99 -0
  53. package/dist/lib/concurrency.d.ts +11 -0
  54. package/dist/lib/concurrency.js +27 -0
  55. package/dist/lib/control-name.d.ts +10 -0
  56. package/dist/lib/control-name.js +10 -0
  57. package/dist/lib/coordinate-error.d.ts +3 -0
  58. package/dist/lib/coordinate-error.js +29 -0
  59. package/dist/lib/credential-format.d.ts +23 -0
  60. package/dist/lib/credential-format.js +25 -0
  61. package/dist/lib/cube-stats/fetcher.d.ts +106 -0
  62. package/dist/lib/cube-stats/fetcher.js +194 -0
  63. package/dist/lib/feeders/brackets.d.ts +47 -0
  64. package/dist/lib/feeders/brackets.js +195 -0
  65. package/dist/lib/feeders/element-type-cache.d.ts +42 -0
  66. package/dist/lib/feeders/element-type-cache.js +86 -0
  67. package/dist/lib/feeders/static-heuristics.d.ts +101 -0
  68. package/dist/lib/feeders/static-heuristics.js +202 -0
  69. package/dist/lib/git-process.d.ts +67 -0
  70. package/dist/lib/git-process.js +243 -0
  71. package/dist/lib/mask-secrets.d.ts +10 -0
  72. package/dist/lib/mask-secrets.js +99 -0
  73. package/dist/lib/mdx.d.ts +3 -0
  74. package/dist/lib/mdx.js +13 -0
  75. package/dist/lib/naming/odata-filter.d.ts +15 -0
  76. package/dist/lib/naming/odata-filter.js +81 -0
  77. package/dist/lib/naming/rules.d.ts +34 -0
  78. package/dist/lib/naming/rules.js +215 -0
  79. package/dist/lib/pro-parser.d.ts +19 -0
  80. package/dist/lib/pro-parser.js +260 -0
  81. package/dist/lib/pro-serializer.d.ts +19 -0
  82. package/dist/lib/pro-serializer.js +170 -0
  83. package/dist/lib/process-parts-schema.d.ts +45 -0
  84. package/dist/lib/process-parts-schema.js +46 -0
  85. package/dist/lib/process-refs.d.ts +88 -0
  86. package/dist/lib/process-refs.js +441 -0
  87. package/dist/lib/rules-outline.d.ts +29 -0
  88. package/dist/lib/rules-outline.js +68 -0
  89. package/dist/lib/rules-patch.d.ts +6 -0
  90. package/dist/lib/rules-patch.js +59 -0
  91. package/dist/lib/safe-regex.d.ts +15 -0
  92. package/dist/lib/safe-regex.js +37 -0
  93. package/dist/lib/sample-cells.d.ts +48 -0
  94. package/dist/lib/sample-cells.js +146 -0
  95. package/dist/lib/slim-json-schema.d.ts +20 -0
  96. package/dist/lib/slim-json-schema.js +68 -0
  97. package/dist/lib/strip-comments.d.ts +23 -0
  98. package/dist/lib/strip-comments.js +61 -0
  99. package/dist/lib/tm1-events.d.ts +16 -0
  100. package/dist/lib/tm1-events.js +29 -0
  101. package/dist/lib/v12-compat/deprecated-ti.d.ts +17 -0
  102. package/dist/lib/v12-compat/deprecated-ti.js +257 -0
  103. package/dist/lib/v12-compat/scanner.d.ts +10 -0
  104. package/dist/lib/v12-compat/scanner.js +43 -0
  105. package/dist/lib/variables-ui-data.d.ts +26 -0
  106. package/dist/lib/variables-ui-data.js +77 -0
  107. package/dist/load-env.d.ts +2 -0
  108. package/dist/load-env.js +29 -0
  109. package/dist/logger.d.ts +4 -0
  110. package/dist/logger.js +60 -0
  111. package/dist/prompts/index.d.ts +3 -0
  112. package/dist/prompts/index.js +141 -0
  113. package/dist/resources/index.d.ts +5 -0
  114. package/dist/resources/index.js +237 -0
  115. package/dist/resources/list-handler.d.ts +40 -0
  116. package/dist/resources/list-handler.js +86 -0
  117. package/dist/resources/subscriptions.d.ts +19 -0
  118. package/dist/resources/subscriptions.js +80 -0
  119. package/dist/schemas/cells.d.ts +17 -0
  120. package/dist/schemas/cells.js +13 -0
  121. package/dist/schemas/common.d.ts +16 -0
  122. package/dist/schemas/common.js +14 -0
  123. package/dist/schemas/index.d.ts +10 -0
  124. package/dist/schemas/index.js +23 -0
  125. package/dist/schemas/metadata.d.ts +70 -0
  126. package/dist/schemas/metadata.js +47 -0
  127. package/dist/schemas/monitoring.d.ts +95 -0
  128. package/dist/schemas/monitoring.js +69 -0
  129. package/dist/schemas/processes.d.ts +74 -0
  130. package/dist/schemas/processes.js +66 -0
  131. package/dist/schemas/scheduling.d.ts +13 -0
  132. package/dist/schemas/scheduling.js +13 -0
  133. package/dist/schemas/security.d.ts +19 -0
  134. package/dist/schemas/security.js +16 -0
  135. package/dist/schemas/subsets.d.ts +12 -0
  136. package/dist/schemas/subsets.js +12 -0
  137. package/dist/schemas/views.d.ts +9 -0
  138. package/dist/schemas/views.js +9 -0
  139. package/dist/session-manager.d.ts +79 -0
  140. package/dist/session-manager.js +281 -0
  141. package/dist/tm1-client/connection/profile.d.ts +13 -0
  142. package/dist/tm1-client/connection/profile.js +99 -0
  143. package/dist/tm1-client/dispatcher.d.ts +5 -0
  144. package/dist/tm1-client/dispatcher.js +31 -0
  145. package/dist/tm1-client/http.d.ts +81 -0
  146. package/dist/tm1-client/http.js +547 -0
  147. package/dist/tm1-client/services/batch-service.d.ts +123 -0
  148. package/dist/tm1-client/services/batch-service.js +455 -0
  149. package/dist/tm1-client/services/cell-service.d.ts +71 -0
  150. package/dist/tm1-client/services/cell-service.js +333 -0
  151. package/dist/tm1-client/services/cellset-transform.d.ts +26 -0
  152. package/dist/tm1-client/services/cellset-transform.js +80 -0
  153. package/dist/tm1-client/services/chore-service.d.ts +68 -0
  154. package/dist/tm1-client/services/chore-service.js +179 -0
  155. package/dist/tm1-client/services/chore-status.d.ts +11 -0
  156. package/dist/tm1-client/services/chore-status.js +127 -0
  157. package/dist/tm1-client/services/cube-service.d.ts +134 -0
  158. package/dist/tm1-client/services/cube-service.js +294 -0
  159. package/dist/tm1-client/services/dimension-service.d.ts +118 -0
  160. package/dist/tm1-client/services/dimension-service.js +249 -0
  161. package/dist/tm1-client/services/element-service.d.ts +245 -0
  162. package/dist/tm1-client/services/element-service.js +809 -0
  163. package/dist/tm1-client/services/fallback.d.ts +44 -0
  164. package/dist/tm1-client/services/fallback.js +72 -0
  165. package/dist/tm1-client/services/file-service.d.ts +53 -0
  166. package/dist/tm1-client/services/file-service.js +218 -0
  167. package/dist/tm1-client/services/hierarchy-service.d.ts +129 -0
  168. package/dist/tm1-client/services/hierarchy-service.js +332 -0
  169. package/dist/tm1-client/services/monitoring-service.d.ts +34 -0
  170. package/dist/tm1-client/services/monitoring-service.js +123 -0
  171. package/dist/tm1-client/services/odata-page.d.ts +71 -0
  172. package/dist/tm1-client/services/odata-page.js +87 -0
  173. package/dist/tm1-client/services/process-service.d.ts +278 -0
  174. package/dist/tm1-client/services/process-service.js +874 -0
  175. package/dist/tm1-client/services/process-status.d.ts +21 -0
  176. package/dist/tm1-client/services/process-status.js +89 -0
  177. package/dist/tm1-client/services/security-service.d.ts +50 -0
  178. package/dist/tm1-client/services/security-service.js +93 -0
  179. package/dist/tm1-client/services/server-service.d.ts +116 -0
  180. package/dist/tm1-client/services/server-service.js +504 -0
  181. package/dist/tm1-client/services/subset-service.d.ts +37 -0
  182. package/dist/tm1-client/services/subset-service.js +122 -0
  183. package/dist/tm1-client/services/view-service.d.ts +46 -0
  184. package/dist/tm1-client/services/view-service.js +287 -0
  185. package/dist/tm1-client.d.ts +56 -0
  186. package/dist/tm1-client.js +126 -0
  187. package/dist/tools/analysis/analyze-callgraph.d.ts +28 -0
  188. package/dist/tools/analysis/analyze-callgraph.js +350 -0
  189. package/dist/tools/analysis/analyze-chore-graph.d.ts +2 -0
  190. package/dist/tools/analysis/analyze-chore-graph.js +148 -0
  191. package/dist/tools/analysis/analyze-object-usage.d.ts +2 -0
  192. package/dist/tools/analysis/analyze-object-usage.js +143 -0
  193. package/dist/tools/analysis/audit-complexity.d.ts +2 -0
  194. package/dist/tools/analysis/audit-complexity.js +255 -0
  195. package/dist/tools/analysis/audit-feeders.d.ts +2 -0
  196. package/dist/tools/analysis/audit-feeders.js +417 -0
  197. package/dist/tools/analysis/audit-naming.d.ts +2 -0
  198. package/dist/tools/analysis/audit-naming.js +379 -0
  199. package/dist/tools/analysis/check-v12-readiness.d.ts +2 -0
  200. package/dist/tools/analysis/check-v12-readiness.js +136 -0
  201. package/dist/tools/analysis/find-orphan-dimensions.d.ts +2 -0
  202. package/dist/tools/analysis/find-orphan-dimensions.js +55 -0
  203. package/dist/tools/analysis/invalidate-callgraph-cache.d.ts +2 -0
  204. package/dist/tools/analysis/invalidate-callgraph-cache.js +40 -0
  205. package/dist/tools/analysis/trace-data-flow.d.ts +2 -0
  206. package/dist/tools/analysis/trace-data-flow.js +138 -0
  207. package/dist/tools/annotations.d.ts +12 -0
  208. package/dist/tools/annotations.js +61 -0
  209. package/dist/tools/celldata/check-feeders.d.ts +2 -0
  210. package/dist/tools/celldata/check-feeders.js +48 -0
  211. package/dist/tools/celldata/check-writable-coords.d.ts +2 -0
  212. package/dist/tools/celldata/check-writable-coords.js +126 -0
  213. package/dist/tools/celldata/execute-mdx.d.ts +17 -0
  214. package/dist/tools/celldata/execute-mdx.js +126 -0
  215. package/dist/tools/celldata/get-cell-value.d.ts +2 -0
  216. package/dist/tools/celldata/get-cell-value.js +30 -0
  217. package/dist/tools/celldata/get-view-definition.d.ts +2 -0
  218. package/dist/tools/celldata/get-view-definition.js +29 -0
  219. package/dist/tools/celldata/get-view.d.ts +2 -0
  220. package/dist/tools/celldata/get-view.js +55 -0
  221. package/dist/tools/celldata/sample-cells.d.ts +2 -0
  222. package/dist/tools/celldata/sample-cells.js +101 -0
  223. package/dist/tools/celldata/trace-cell-calculation.d.ts +2 -0
  224. package/dist/tools/celldata/trace-cell-calculation.js +53 -0
  225. package/dist/tools/celldata/trace-feeders.d.ts +2 -0
  226. package/dist/tools/celldata/trace-feeders.js +44 -0
  227. package/dist/tools/celldata/write-cells.d.ts +2 -0
  228. package/dist/tools/celldata/write-cells.js +65 -0
  229. package/dist/tools/confirm.d.ts +10 -0
  230. package/dist/tools/confirm.js +64 -0
  231. package/dist/tools/define-tool.d.ts +51 -0
  232. package/dist/tools/define-tool.js +49 -0
  233. package/dist/tools/dimension-management/bulk-upsert-elements.d.ts +2 -0
  234. package/dist/tools/dimension-management/bulk-upsert-elements.js +103 -0
  235. package/dist/tools/dimension-management/create-dimension.d.ts +2 -0
  236. package/dist/tools/dimension-management/create-dimension.js +22 -0
  237. package/dist/tools/dimension-management/create-element-attribute.d.ts +2 -0
  238. package/dist/tools/dimension-management/create-element-attribute.js +26 -0
  239. package/dist/tools/dimension-management/create-element.d.ts +2 -0
  240. package/dist/tools/dimension-management/create-element.js +31 -0
  241. package/dist/tools/dimension-management/create-hierarchy.d.ts +2 -0
  242. package/dist/tools/dimension-management/create-hierarchy.js +22 -0
  243. package/dist/tools/dimension-management/delete-dimension.d.ts +2 -0
  244. package/dist/tools/dimension-management/delete-dimension.js +25 -0
  245. package/dist/tools/dimension-management/delete-element.d.ts +2 -0
  246. package/dist/tools/dimension-management/delete-element.js +26 -0
  247. package/dist/tools/dimension-management/delete-elements.d.ts +2 -0
  248. package/dist/tools/dimension-management/delete-elements.js +44 -0
  249. package/dist/tools/dimension-management/delete-hierarchy.d.ts +2 -0
  250. package/dist/tools/dimension-management/delete-hierarchy.js +35 -0
  251. package/dist/tools/dimension-management/get-element-attribute-values.d.ts +2 -0
  252. package/dist/tools/dimension-management/get-element-attribute-values.js +77 -0
  253. package/dist/tools/dimension-management/list-element-attributes.d.ts +2 -0
  254. package/dist/tools/dimension-management/list-element-attributes.js +31 -0
  255. package/dist/tools/dimension-management/move-element.d.ts +2 -0
  256. package/dist/tools/dimension-management/move-element.js +28 -0
  257. package/dist/tools/dimension-management/update-element-attribute-value.d.ts +2 -0
  258. package/dist/tools/dimension-management/update-element-attribute-value.js +80 -0
  259. package/dist/tools/dimension-management/update-element.d.ts +2 -0
  260. package/dist/tools/dimension-management/update-element.js +35 -0
  261. package/dist/tools/error-format.d.ts +22 -0
  262. package/dist/tools/error-format.js +130 -0
  263. package/dist/tools/fileops/delete-file.d.ts +2 -0
  264. package/dist/tools/fileops/delete-file.js +32 -0
  265. package/dist/tools/fileops/get-file-content.d.ts +2 -0
  266. package/dist/tools/fileops/get-file-content.js +76 -0
  267. package/dist/tools/fileops/list-files.d.ts +2 -0
  268. package/dist/tools/fileops/list-files.js +43 -0
  269. package/dist/tools/fileops/search-files.d.ts +2 -0
  270. package/dist/tools/fileops/search-files.js +76 -0
  271. package/dist/tools/fileops/upload-file.d.ts +2 -0
  272. package/dist/tools/fileops/upload-file.js +69 -0
  273. package/dist/tools/format.d.ts +57 -0
  274. package/dist/tools/format.js +157 -0
  275. package/dist/tools/hierarchy.d.ts +6 -0
  276. package/dist/tools/hierarchy.js +27 -0
  277. package/dist/tools/index.d.ts +4 -0
  278. package/dist/tools/index.js +263 -0
  279. package/dist/tools/local-file.d.ts +16 -0
  280. package/dist/tools/local-file.js +88 -0
  281. package/dist/tools/metadata/get-ancestors.d.ts +2 -0
  282. package/dist/tools/metadata/get-ancestors.js +36 -0
  283. package/dist/tools/metadata/get-descendants.d.ts +2 -0
  284. package/dist/tools/metadata/get-descendants.js +64 -0
  285. package/dist/tools/metadata/get-hierarchy.d.ts +2 -0
  286. package/dist/tools/metadata/get-hierarchy.js +130 -0
  287. package/dist/tools/metadata/list-chores.d.ts +2 -0
  288. package/dist/tools/metadata/list-chores.js +62 -0
  289. package/dist/tools/metadata/list-cubes.d.ts +2 -0
  290. package/dist/tools/metadata/list-cubes.js +128 -0
  291. package/dist/tools/metadata/list-dimensions.d.ts +2 -0
  292. package/dist/tools/metadata/list-dimensions.js +131 -0
  293. package/dist/tools/metadata/list-processes-grouped.d.ts +2 -0
  294. package/dist/tools/metadata/list-processes-grouped.js +96 -0
  295. package/dist/tools/metadata/list-processes.d.ts +2 -0
  296. package/dist/tools/metadata/list-processes.js +108 -0
  297. package/dist/tools/metadata/resolve-default-members.d.ts +2 -0
  298. package/dist/tools/metadata/resolve-default-members.js +46 -0
  299. package/dist/tools/model-building/check-cube-rule.d.ts +2 -0
  300. package/dist/tools/model-building/check-cube-rule.js +51 -0
  301. package/dist/tools/model-building/clear-cube.d.ts +2 -0
  302. package/dist/tools/model-building/clear-cube.js +46 -0
  303. package/dist/tools/model-building/create-cube.d.ts +2 -0
  304. package/dist/tools/model-building/create-cube.js +34 -0
  305. package/dist/tools/model-building/delete-cube.d.ts +2 -0
  306. package/dist/tools/model-building/delete-cube.js +27 -0
  307. package/dist/tools/model-building/get-all-cube-rules.d.ts +2 -0
  308. package/dist/tools/model-building/get-all-cube-rules.js +149 -0
  309. package/dist/tools/model-building/get-cube-rules.d.ts +2 -0
  310. package/dist/tools/model-building/get-cube-rules.js +69 -0
  311. package/dist/tools/model-building/rules-source.d.ts +21 -0
  312. package/dist/tools/model-building/rules-source.js +49 -0
  313. package/dist/tools/model-building/search-rules.d.ts +2 -0
  314. package/dist/tools/model-building/search-rules.js +132 -0
  315. package/dist/tools/model-building/set-cube-rules.d.ts +2 -0
  316. package/dist/tools/model-building/set-cube-rules.js +81 -0
  317. package/dist/tools/model-building/unload-cube.d.ts +2 -0
  318. package/dist/tools/model-building/unload-cube.js +23 -0
  319. package/dist/tools/operations/diagnose-process-error.d.ts +2 -0
  320. package/dist/tools/operations/diagnose-process-error.js +178 -0
  321. package/dist/tools/operations/error-log-helpers.d.ts +25 -0
  322. package/dist/tools/operations/error-log-helpers.js +57 -0
  323. package/dist/tools/operations/get-audit-log.d.ts +2 -0
  324. package/dist/tools/operations/get-audit-log.js +70 -0
  325. package/dist/tools/operations/get-cube-stats.d.ts +2 -0
  326. package/dist/tools/operations/get-cube-stats.js +107 -0
  327. package/dist/tools/operations/get-error-log-content.d.ts +2 -0
  328. package/dist/tools/operations/get-error-log-content.js +164 -0
  329. package/dist/tools/operations/get-jobs.d.ts +3 -0
  330. package/dist/tools/operations/get-jobs.js +51 -0
  331. package/dist/tools/operations/get-message-log.d.ts +2 -0
  332. package/dist/tools/operations/get-message-log.js +63 -0
  333. package/dist/tools/operations/get-server-info.d.ts +2 -0
  334. package/dist/tools/operations/get-server-info.js +180 -0
  335. package/dist/tools/operations/get-server-state.d.ts +2 -0
  336. package/dist/tools/operations/get-server-state.js +129 -0
  337. package/dist/tools/operations/get-sessions.d.ts +2 -0
  338. package/dist/tools/operations/get-sessions.js +76 -0
  339. package/dist/tools/operations/get-threads.d.ts +3 -0
  340. package/dist/tools/operations/get-threads.js +50 -0
  341. package/dist/tools/operations/get-transaction-log.d.ts +2 -0
  342. package/dist/tools/operations/get-transaction-log.js +63 -0
  343. package/dist/tools/operations/list-error-logs.d.ts +8 -0
  344. package/dist/tools/operations/list-error-logs.js +157 -0
  345. package/dist/tools/operations/save-data.d.ts +2 -0
  346. package/dist/tools/operations/save-data.js +50 -0
  347. package/dist/tools/pagination.d.ts +32 -0
  348. package/dist/tools/pagination.js +116 -0
  349. package/dist/tools/scheduling/create-chore.d.ts +2 -0
  350. package/dist/tools/scheduling/create-chore.js +93 -0
  351. package/dist/tools/scheduling/delete-chore.d.ts +2 -0
  352. package/dist/tools/scheduling/delete-chore.js +22 -0
  353. package/dist/tools/scheduling/execute-chore.d.ts +2 -0
  354. package/dist/tools/scheduling/execute-chore.js +52 -0
  355. package/dist/tools/scheduling/toggle-chore.d.ts +2 -0
  356. package/dist/tools/scheduling/toggle-chore.js +22 -0
  357. package/dist/tools/scheduling/update-chore.d.ts +2 -0
  358. package/dist/tools/scheduling/update-chore.js +71 -0
  359. package/dist/tools/schemas/common.d.ts +10 -0
  360. package/dist/tools/schemas/common.js +23 -0
  361. package/dist/tools/schemas/items-analysis.d.ts +394 -0
  362. package/dist/tools/schemas/items-analysis.js +419 -0
  363. package/dist/tools/schemas/items-cells.d.ts +70 -0
  364. package/dist/tools/schemas/items-cells.js +65 -0
  365. package/dist/tools/schemas/items-common.d.ts +18 -0
  366. package/dist/tools/schemas/items-common.js +39 -0
  367. package/dist/tools/schemas/items-fileops.d.ts +11 -0
  368. package/dist/tools/schemas/items-fileops.js +13 -0
  369. package/dist/tools/schemas/items-metadata.d.ts +262 -0
  370. package/dist/tools/schemas/items-metadata.js +184 -0
  371. package/dist/tools/schemas/items-monitoring.d.ts +79 -0
  372. package/dist/tools/schemas/items-monitoring.js +78 -0
  373. package/dist/tools/schemas/items-processes.d.ts +279 -0
  374. package/dist/tools/schemas/items-processes.js +235 -0
  375. package/dist/tools/schemas/items-scheduling.d.ts +25 -0
  376. package/dist/tools/schemas/items-scheduling.js +26 -0
  377. package/dist/tools/schemas/items-security.d.ts +19 -0
  378. package/dist/tools/schemas/items-security.js +12 -0
  379. package/dist/tools/schemas/items-subsets.d.ts +2 -0
  380. package/dist/tools/schemas/items-subsets.js +4 -0
  381. package/dist/tools/schemas/items-views.d.ts +38 -0
  382. package/dist/tools/schemas/items-views.js +26 -0
  383. package/dist/tools/schemas/items.d.ts +12 -0
  384. package/dist/tools/schemas/items.js +23 -0
  385. package/dist/tools/schemas/markdown-capable.d.ts +21 -0
  386. package/dist/tools/schemas/markdown-capable.js +58 -0
  387. package/dist/tools/schemas/output-schema.d.ts +24 -0
  388. package/dist/tools/schemas/output-schema.js +25 -0
  389. package/dist/tools/security/assign-client-group.d.ts +2 -0
  390. package/dist/tools/security/assign-client-group.js +20 -0
  391. package/dist/tools/security/create-client.d.ts +2 -0
  392. package/dist/tools/security/create-client.js +28 -0
  393. package/dist/tools/security/delete-client.d.ts +2 -0
  394. package/dist/tools/security/delete-client.js +22 -0
  395. package/dist/tools/security/get-client.d.ts +2 -0
  396. package/dist/tools/security/get-client.js +20 -0
  397. package/dist/tools/security/list-clients.d.ts +2 -0
  398. package/dist/tools/security/list-clients.js +86 -0
  399. package/dist/tools/security/list-groups.d.ts +2 -0
  400. package/dist/tools/security/list-groups.js +43 -0
  401. package/dist/tools/security/remove-client-group.d.ts +2 -0
  402. package/dist/tools/security/remove-client-group.js +27 -0
  403. package/dist/tools/security/update-client.d.ts +2 -0
  404. package/dist/tools/security/update-client.js +22 -0
  405. package/dist/tools/subsets/create-subset.d.ts +2 -0
  406. package/dist/tools/subsets/create-subset.js +44 -0
  407. package/dist/tools/subsets/delete-subset.d.ts +2 -0
  408. package/dist/tools/subsets/delete-subset.js +26 -0
  409. package/dist/tools/subsets/get-subset.d.ts +2 -0
  410. package/dist/tools/subsets/get-subset.js +29 -0
  411. package/dist/tools/subsets/list-subsets.d.ts +2 -0
  412. package/dist/tools/subsets/list-subsets.js +36 -0
  413. package/dist/tools/subsets/update-subset.d.ts +2 -0
  414. package/dist/tools/subsets/update-subset.js +33 -0
  415. package/dist/tools/ti-development/check-process-code.d.ts +2 -0
  416. package/dist/tools/ti-development/check-process-code.js +96 -0
  417. package/dist/tools/ti-development/compile-process.d.ts +2 -0
  418. package/dist/tools/ti-development/compile-process.js +32 -0
  419. package/dist/tools/ti-development/copy-process.d.ts +2 -0
  420. package/dist/tools/ti-development/copy-process.js +32 -0
  421. package/dist/tools/ti-development/delete-process.d.ts +2 -0
  422. package/dist/tools/ti-development/delete-process.js +26 -0
  423. package/dist/tools/ti-development/diff-process-with-file.d.ts +2 -0
  424. package/dist/tools/ti-development/diff-process-with-file.js +208 -0
  425. package/dist/tools/ti-development/diff-processes.d.ts +2 -0
  426. package/dist/tools/ti-development/diff-processes.js +312 -0
  427. package/dist/tools/ti-development/execute-process.d.ts +8 -0
  428. package/dist/tools/ti-development/execute-process.js +109 -0
  429. package/dist/tools/ti-development/export-process-to-git.d.ts +2 -0
  430. package/dist/tools/ti-development/export-process-to-git.js +113 -0
  431. package/dist/tools/ti-development/export-process-to-pro.d.ts +2 -0
  432. package/dist/tools/ti-development/export-process-to-pro.js +117 -0
  433. package/dist/tools/ti-development/get-all-processes-code.d.ts +2 -0
  434. package/dist/tools/ti-development/get-all-processes-code.js +131 -0
  435. package/dist/tools/ti-development/get-process-code.d.ts +2 -0
  436. package/dist/tools/ti-development/get-process-code.js +100 -0
  437. package/dist/tools/ti-development/get-process-datasource.d.ts +2 -0
  438. package/dist/tools/ti-development/get-process-datasource.js +20 -0
  439. package/dist/tools/ti-development/get-process-parameters.d.ts +2 -0
  440. package/dist/tools/ti-development/get-process-parameters.js +25 -0
  441. package/dist/tools/ti-development/get-process-variables.d.ts +2 -0
  442. package/dist/tools/ti-development/get-process-variables.js +38 -0
  443. package/dist/tools/ti-development/get-process.d.ts +2 -0
  444. package/dist/tools/ti-development/get-process.js +163 -0
  445. package/dist/tools/ti-development/import-pro-file.d.ts +2 -0
  446. package/dist/tools/ti-development/import-pro-file.js +153 -0
  447. package/dist/tools/ti-development/import-process-from-git.d.ts +2 -0
  448. package/dist/tools/ti-development/import-process-from-git.js +198 -0
  449. package/dist/tools/ti-development/install-pro-bundle.d.ts +2 -0
  450. package/dist/tools/ti-development/install-pro-bundle.js +288 -0
  451. package/dist/tools/ti-development/preflight.d.ts +39 -0
  452. package/dist/tools/ti-development/preflight.js +56 -0
  453. package/dist/tools/ti-development/process-backup.d.ts +29 -0
  454. package/dist/tools/ti-development/process-backup.js +118 -0
  455. package/dist/tools/ti-development/search-code.d.ts +2 -0
  456. package/dist/tools/ti-development/search-code.js +208 -0
  457. package/dist/tools/ti-development/upsert-process.d.ts +2 -0
  458. package/dist/tools/ti-development/upsert-process.js +167 -0
  459. package/dist/tools/ti-development/validate-process-refs.d.ts +2 -0
  460. package/dist/tools/ti-development/validate-process-refs.js +73 -0
  461. package/dist/tools/views/create-mdx-view.d.ts +2 -0
  462. package/dist/tools/views/create-mdx-view.js +21 -0
  463. package/dist/tools/views/create-native-view.d.ts +2 -0
  464. package/dist/tools/views/create-native-view.js +81 -0
  465. package/dist/tools/views/delete-view.d.ts +2 -0
  466. package/dist/tools/views/delete-view.js +23 -0
  467. package/dist/tools/views/list-views.d.ts +2 -0
  468. package/dist/tools/views/list-views.js +32 -0
  469. package/dist/tools/with-annotations.d.ts +6 -0
  470. package/dist/tools/with-annotations.js +339 -0
  471. package/dist/types.d.ts +409 -0
  472. package/dist/types.js +91 -0
  473. package/dist/version.d.ts +4 -0
  474. package/dist/version.js +18 -0
  475. package/package.json +107 -0
@@ -0,0 +1,194 @@
1
+ import { TM1Error, TM1ErrorCode } from "../../types.js";
2
+ /** Server-side `}StatsByCube` measure labels mapped to stable typed fields. */
3
+ export const KNOWN_METRICS = {
4
+ "Memory Used for Views": "memoryViews",
5
+ "Memory Used for Input Data": "memoryInput",
6
+ "Memory Used for Feeders": "memoryFeeders",
7
+ "Memory Used for Calculations": "memoryCalculations",
8
+ "Total Memory Used": "memoryTotal",
9
+ "Number of Populated Numeric Cells": "populatedNumeric",
10
+ "Number of Populated String Cells": "populatedString",
11
+ "Number of Stored Calculated Cells": "storedCalculated",
12
+ "Number of Stored Views": "storedViews",
13
+ "Number of Fed Cells": "fedCells",
14
+ "Steps of Average Calculation": "avgCalculationSteps",
15
+ "Rule calculation cache miss rate": "cacheMissRate",
16
+ };
17
+ /**
18
+ * Thrown by `fetchCubeStats` when `}StatsByCube` cannot be read for a reason
19
+ * that is a property of the *server or the account*, not of the cube being
20
+ * asked about. Callers should surface `message` verbatim and branch on
21
+ * `reason`; anything else that fails still propagates unchanged.
22
+ */
23
+ export class CubeStatsUnavailableError extends Error {
24
+ reason;
25
+ constructor(reason, message) {
26
+ super(message);
27
+ this.name = "CubeStatsUnavailableError";
28
+ this.reason = reason;
29
+ }
30
+ }
31
+ /** The cube the MDX reads. Probed by name when the query fails. */
32
+ export const STATS_CUBE = "}StatsByCube";
33
+ /**
34
+ * The one string this module compares against, and it is not prose: TM1's
35
+ * object-level denial identifier. It is an error code — it appears verbatim
36
+ * in the payload on a German or Japanese server exactly as it does on an
37
+ * English one, which is precisely why it is safe to match and a sentence
38
+ * is not.
39
+ */
40
+ const DENIAL_IDENTIFIER = "ObjectSecurityNoReadRights";
41
+ /**
42
+ * Connection-scoped capability verdict, same idea as `BatchService.supported`:
43
+ * once the server has answered whether `}StatsByCube` exists, that is fixed
44
+ * for the connection, so an audit over 200 cubes neither fires 200 doomed MDX
45
+ * queries nor 200 existence probes. A denial is deliberately NOT cached — an
46
+ * administrator can grant rights mid-session, so it is re-probed every time.
47
+ */
48
+ const statsCubeVerdict = new WeakMap();
49
+ function isDenial(err) {
50
+ if (err instanceof TM1Error) {
51
+ if (err.code === TM1ErrorCode.PERMISSION_DENIED)
52
+ return true;
53
+ if ((err.details ?? "").includes(DENIAL_IDENTIFIER))
54
+ return true;
55
+ }
56
+ // Non-TM1Error wrappers: the identifier still travels in the text.
57
+ return err instanceof Error && err.message.includes(DENIAL_IDENTIFIER);
58
+ }
59
+ function deniedError() {
60
+ return new CubeStatsUnavailableError("denied", `Reading the ${STATS_CUBE} control cube was refused for the current TM1 user ` +
61
+ `(${DENIAL_IDENTIFIER}), so cube statistics are unavailable. The statistics cubes ` +
62
+ `are present on this server — this is a rights issue, not a missing feature. ` +
63
+ `Control-object read access is normally admin-only; ask an administrator for read ` +
64
+ `rights on ${STATS_CUBE}, or run this with an admin account.`);
65
+ }
66
+ function absentError(version) {
67
+ const versionNote = version === 12
68
+ ? "This server reports TM1 v12, which is the known case: Planning Analytics Engine " +
69
+ "ships no }Stats* performance control cubes (verified on 12.5.9)."
70
+ : "Known case: TM1 v12 / Planning Analytics Engine ships no }Stats* performance " +
71
+ "control cubes (verified on 12.5.9); TM1 v11 exposes them.";
72
+ return new CubeStatsUnavailableError("absent", `The ${STATS_CUBE} control cube does not exist on this server, so cube statistics ` +
73
+ `cannot be read. ${versionNote} Nothing is wrong with your model, and no account ` +
74
+ `can read these numbers here — use rule/feeder static analysis instead.`);
75
+ }
76
+ /**
77
+ * Map a `}StatsByCube` MDX failure onto an unavailability verdict, or `null`
78
+ * when the failure is about something else (a nonexistent target cube, a
79
+ * syntax error, a timeout, a 500) and must propagate untouched.
80
+ *
81
+ * Structural, in two steps, neither of which reads a sentence:
82
+ *
83
+ * 1. Denial by identifier. TM1 refuses a control-object read with HTTP 400
84
+ * carrying `ObjectSecurityNoReadRights` (not 403), which `classifyHttpError`
85
+ * already turns into `PERMISSION_DENIED`. Checked first, because "you may
86
+ * not read it" must never be reported as "this server does not have it".
87
+ * 2. Existence, asked of the server: `GET /api/v1/Cubes('}StatsByCube')`.
88
+ * 404 → the cube is genuinely not there → `absent`. 200 → the cube is
89
+ * there and the MDX failed for some other reason entirely → `null`, and
90
+ * the original error propagates. One cheap request, only on the failure
91
+ * path, answering the actual question instead of inferring it.
92
+ *
93
+ * The probe's own failure never masks the real error: if the probe cannot
94
+ * answer, the original error wins.
95
+ *
96
+ * `version` feeds the wording only; nothing branches on it.
97
+ */
98
+ export async function classifyCubeStatsFailure(tm1Client, err) {
99
+ if (isDenial(err))
100
+ return deniedError();
101
+ const cached = statsCubeVerdict.get(tm1Client);
102
+ if (cached)
103
+ return cached === "present" ? null : cached;
104
+ let present;
105
+ try {
106
+ present = await tm1Client.cubes.exists(STATS_CUBE);
107
+ }
108
+ catch (probeErr) {
109
+ // Probing is itself a control-object read, so it can be refused where the
110
+ // MDX was refused for a different reason. Any other probe failure means
111
+ // we simply do not know — say nothing and let the original error stand.
112
+ return isDenial(probeErr) ? deniedError() : null;
113
+ }
114
+ if (present) {
115
+ statsCubeVerdict.set(tm1Client, "present");
116
+ return null;
117
+ }
118
+ const verdict = absentError(tm1Client.version);
119
+ statsCubeVerdict.set(tm1Client, verdict);
120
+ return verdict;
121
+ }
122
+ export async function fetchCubeStats(tm1Client, cubeName) {
123
+ const known = statsCubeVerdict.get(tm1Client);
124
+ if (known && known !== "present")
125
+ throw known;
126
+ const safe = cubeName.replace(/]/g, "]]");
127
+ const mdx = [
128
+ "SELECT",
129
+ ` {[}PerfCubes].[}PerfCubes].[${safe}]} ON 0,`,
130
+ " {TM1FILTERBYLEVEL({TM1SUBSETALL([}StatsStatsByCube].[}StatsStatsByCube])}, 0)} ON 1",
131
+ "FROM [}StatsByCube]",
132
+ "WHERE ([}TimeIntervals].[LATEST])",
133
+ ].join("\n");
134
+ let result;
135
+ try {
136
+ result = await tm1Client.cells.executeMdx(mdx);
137
+ }
138
+ catch (err) {
139
+ const unavailable = await classifyCubeStatsFailure(tm1Client, err);
140
+ if (!unavailable)
141
+ throw err;
142
+ throw unavailable;
143
+ }
144
+ const raw = {};
145
+ const tuples = result.axes[1]?.tuples ?? [];
146
+ for (let i = 0; i < tuples.length; i++) {
147
+ const memberName = tuples[i].members[0]?.name ?? `unknown_${i}`;
148
+ const cell = result.cells[i];
149
+ raw[memberName] = typeof cell?.value === "number" ? cell.value : null;
150
+ }
151
+ const item = { cubeName, raw };
152
+ for (const [src, target] of Object.entries(KNOWN_METRICS)) {
153
+ const v = raw[src];
154
+ if (typeof v === "number")
155
+ item[target] = v;
156
+ }
157
+ // Derived metric: feederEfficiency = fedCells / populatedNumeric.
158
+ const fed = item.fedCells;
159
+ const populated = item.populatedNumeric;
160
+ if (typeof fed === "number" &&
161
+ typeof populated === "number" &&
162
+ populated > 0) {
163
+ item.feederEfficiency = Number((fed / populated).toFixed(3));
164
+ }
165
+ return item;
166
+ }
167
+ /**
168
+ * Fed-to-populated ratio: `fedCells / populatedNumeric` — the community-
169
+ * standard }StatsByCube overfeeding indicator (tm1forum t=13110, Cubewise).
170
+ * Rule of thumb: ≥ 50× suspicious, ≥ 100× definite overfeeding. Returns
171
+ * `null` when either input is missing or `populatedNumeric` is zero — a
172
+ * cube fed purely cross-cube can legitimately hold no input data, so a
173
+ * missing denominator is "insufficient signal", not overfeeding.
174
+ */
175
+ export function computeFedToPopulatedRatio(stats) {
176
+ const pop = stats.populatedNumeric;
177
+ const fed = stats.fedCells;
178
+ if (typeof pop !== "number" || typeof fed !== "number" || pop <= 0)
179
+ return null;
180
+ return fed / pop;
181
+ }
182
+ /**
183
+ * Feeder-memory ratio: `memoryFeeders / memoryInput` — secondary overfeeding
184
+ * signal (feeder flags dwarfing the data they feed from). No community
185
+ * threshold established; reported as context only, never flagged.
186
+ */
187
+ export function computeFeederMemoryRatio(stats) {
188
+ const feeders = stats.memoryFeeders;
189
+ const input = stats.memoryInput;
190
+ if (typeof feeders !== "number" || typeof input !== "number" || input <= 0)
191
+ return null;
192
+ return feeders / input;
193
+ }
194
+ //# sourceMappingURL=fetcher.js.map
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Bracket-list parser for TM1 rules / feeders.
3
+ *
4
+ * Handles both syntactic forms found in real cube rules:
5
+ * - **Qualified**: `['Dim':'Elem']`, `['Dim':{'E1','E2'}]`
6
+ * - **Positional** (most common in feeders): `['Elem1','Elem2','Elem3']`
7
+ * - **Mixed**: `['Year':'2026', 'Sales']`
8
+ *
9
+ * Why a new parser instead of `parseBracketDimRefs` in rulesLinter.ts:
10
+ * the existing one only matches the `'Dim':'Elem'` regex form and silently
11
+ * skips bare positional element lists, which dominate real feeder code
12
+ * (probe on 2026-05-18 found 92 / 125 feeder lines miss the existing parser).
13
+ *
14
+ * String escaping follows TM1 SQL-style: a literal single quote is written
15
+ * as two consecutive single quotes (`'It''s'` → `It's`).
16
+ */
17
+ export interface BracketEntry {
18
+ /** Set when the entry is qualified (`'Dim':...`). */
19
+ dim?: string;
20
+ /** Single-element value (positional or `'Dim':'Elem'`). */
21
+ elem?: string;
22
+ /** Multi-element set: `'Dim':{'E1','E2'}`. */
23
+ elems?: string[];
24
+ }
25
+ export interface BracketList {
26
+ entries: BracketEntry[];
27
+ /** True iff every entry is unqualified (`{ elem }` only). Empty bracket = true. */
28
+ isPositional: boolean;
29
+ /** True iff entries contain both qualified and positional forms. */
30
+ isMixed: boolean;
31
+ /** Byte offsets in the source line — useful for diagnostic messages. */
32
+ startIndex: number;
33
+ endIndex: number;
34
+ }
35
+ /**
36
+ * Parse the first complete `[...]` list found in `text`. Returns `null` if
37
+ * no opening bracket exists outside string literals or the bracket is
38
+ * malformed / unterminated.
39
+ */
40
+ export declare function parseBracketList(text: string): BracketList | null;
41
+ /**
42
+ * Scan `line` for every complete top-level `[...]` list and return them in
43
+ * source order. Brackets inside single-quoted string literals are ignored.
44
+ * Malformed lists are skipped silently — extraction is best-effort.
45
+ */
46
+ export declare function extractBracketLists(line: string): BracketList[];
47
+ //# sourceMappingURL=brackets.d.ts.map
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Bracket-list parser for TM1 rules / feeders.
3
+ *
4
+ * Handles both syntactic forms found in real cube rules:
5
+ * - **Qualified**: `['Dim':'Elem']`, `['Dim':{'E1','E2'}]`
6
+ * - **Positional** (most common in feeders): `['Elem1','Elem2','Elem3']`
7
+ * - **Mixed**: `['Year':'2026', 'Sales']`
8
+ *
9
+ * Why a new parser instead of `parseBracketDimRefs` in rulesLinter.ts:
10
+ * the existing one only matches the `'Dim':'Elem'` regex form and silently
11
+ * skips bare positional element lists, which dominate real feeder code
12
+ * (probe on 2026-05-18 found 92 / 125 feeder lines miss the existing parser).
13
+ *
14
+ * String escaping follows TM1 SQL-style: a literal single quote is written
15
+ * as two consecutive single quotes (`'It''s'` → `It's`).
16
+ */
17
+ function readQuotedString(src, i) {
18
+ if (src[i] !== "'")
19
+ return null;
20
+ let j = i + 1;
21
+ let out = "";
22
+ while (j < src.length) {
23
+ const c = src[j];
24
+ if (c === "'") {
25
+ if (src[j + 1] === "'") {
26
+ out += "'";
27
+ j += 2;
28
+ continue;
29
+ }
30
+ return { value: out, next: j + 1 };
31
+ }
32
+ out += c;
33
+ j++;
34
+ }
35
+ return null;
36
+ }
37
+ function skipWs(src, i) {
38
+ while (i < src.length && /\s/.test(src[i]))
39
+ i++;
40
+ return i;
41
+ }
42
+ function readSet(src, i) {
43
+ if (src[i] !== "{")
44
+ return null;
45
+ let j = i + 1;
46
+ const values = [];
47
+ while (j < src.length) {
48
+ j = skipWs(src, j);
49
+ if (src[j] === "}")
50
+ return { values, next: j + 1 };
51
+ const s = readQuotedString(src, j);
52
+ if (!s)
53
+ return null;
54
+ values.push(s.value);
55
+ j = skipWs(src, s.next);
56
+ if (src[j] === ",") {
57
+ j++;
58
+ continue;
59
+ }
60
+ if (src[j] === "}")
61
+ return { values, next: j + 1 };
62
+ return null;
63
+ }
64
+ return null;
65
+ }
66
+ function readEntry(src, i) {
67
+ const first = readQuotedString(src, i);
68
+ if (!first)
69
+ return null;
70
+ let j = skipWs(src, first.next);
71
+ if (src[j] === ":") {
72
+ j = skipWs(src, j + 1);
73
+ if (src[j] === "{") {
74
+ const set = readSet(src, j);
75
+ if (!set)
76
+ return null;
77
+ return { entry: { dim: first.value, elems: set.values }, next: set.next };
78
+ }
79
+ const rhs = readQuotedString(src, j);
80
+ if (!rhs)
81
+ return null;
82
+ return { entry: { dim: first.value, elem: rhs.value }, next: rhs.next };
83
+ }
84
+ return { entry: { elem: first.value }, next: first.next };
85
+ }
86
+ function parseBracketAt(src, start) {
87
+ if (src[start] !== "[")
88
+ return null;
89
+ const entries = [];
90
+ let j = skipWs(src, start + 1);
91
+ if (src[j] === "]") {
92
+ return {
93
+ list: {
94
+ entries,
95
+ isPositional: true,
96
+ isMixed: false,
97
+ startIndex: start,
98
+ endIndex: j,
99
+ },
100
+ next: j + 1,
101
+ };
102
+ }
103
+ while (j < src.length) {
104
+ const e = readEntry(src, j);
105
+ if (!e)
106
+ return null;
107
+ entries.push(e.entry);
108
+ j = skipWs(src, e.next);
109
+ if (src[j] === ",") {
110
+ j = skipWs(src, j + 1);
111
+ continue;
112
+ }
113
+ if (src[j] === "]") {
114
+ let qualifiedCount = 0;
115
+ let positionalCount = 0;
116
+ for (const en of entries) {
117
+ if (en.dim !== undefined)
118
+ qualifiedCount++;
119
+ else
120
+ positionalCount++;
121
+ }
122
+ const isPositional = qualifiedCount === 0;
123
+ const isMixed = qualifiedCount > 0 && positionalCount > 0;
124
+ return {
125
+ list: {
126
+ entries,
127
+ isPositional,
128
+ isMixed,
129
+ startIndex: start,
130
+ endIndex: j,
131
+ },
132
+ next: j + 1,
133
+ };
134
+ }
135
+ return null;
136
+ }
137
+ return null;
138
+ }
139
+ /**
140
+ * Parse the first complete `[...]` list found in `text`. Returns `null` if
141
+ * no opening bracket exists outside string literals or the bracket is
142
+ * malformed / unterminated.
143
+ */
144
+ export function parseBracketList(text) {
145
+ let i = 0;
146
+ while (i < text.length) {
147
+ const c = text[i];
148
+ if (c === "'") {
149
+ const s = readQuotedString(text, i);
150
+ if (!s)
151
+ return null;
152
+ i = s.next;
153
+ continue;
154
+ }
155
+ if (c === "[") {
156
+ const r = parseBracketAt(text, i);
157
+ return r ? r.list : null;
158
+ }
159
+ i++;
160
+ }
161
+ return null;
162
+ }
163
+ /**
164
+ * Scan `line` for every complete top-level `[...]` list and return them in
165
+ * source order. Brackets inside single-quoted string literals are ignored.
166
+ * Malformed lists are skipped silently — extraction is best-effort.
167
+ */
168
+ export function extractBracketLists(line) {
169
+ const out = [];
170
+ let i = 0;
171
+ while (i < line.length) {
172
+ const c = line[i];
173
+ if (c === "'") {
174
+ const s = readQuotedString(line, i);
175
+ if (!s)
176
+ break;
177
+ i = s.next;
178
+ continue;
179
+ }
180
+ if (c === "[") {
181
+ const r = parseBracketAt(line, i);
182
+ if (r) {
183
+ out.push(r.list);
184
+ i = r.next;
185
+ }
186
+ else {
187
+ i++;
188
+ }
189
+ continue;
190
+ }
191
+ i++;
192
+ }
193
+ return out;
194
+ }
195
+ //# sourceMappingURL=brackets.js.map
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Element-type cache for feeder audit heuristics.
3
+ *
4
+ * Looks up `(dim, hierarchy, element) → "Numeric" | "Consolidated" | "String"`
5
+ * via the hierarchy service. One REST call per `(dim, hier)` pair; subsequent
6
+ * lookups hit the in-memory map.
7
+ *
8
+ * Failure handling is bounded-retry, not cache-the-failure: the first
9
+ * `MAX_CONSECUTIVE_LOAD_FAILURES - 1` failed loads leave the slot unset so a
10
+ * later lookup retries and a transient timeout can heal; once that many
11
+ * consecutive failures pile up the slot is pinned to `null` and no further
12
+ * requests are issued for it. Concurrent lookups share the single in-flight
13
+ * attempt, and a shared failing attempt counts as one failure — the budget is
14
+ * spent per attempt, not per waiting caller.
15
+ *
16
+ * The read goes through `getElementTypes` (`$select=Name,Type`), not the full
17
+ * `get()` — the latter drags `$expand=Parents` plus an Edges scan along for a
18
+ * lookup that only needs the type.
19
+ *
20
+ * TM1 element name comparison is case-insensitive; normalize on both store and
21
+ * lookup paths so positional/qualified mixing in feeders resolves correctly.
22
+ */
23
+ import type { HierarchyElement } from "../../types.js";
24
+ export type ElementType = "Numeric" | "Consolidated" | "String";
25
+ interface HierarchyLike {
26
+ getElementTypes(dimensionName: string, hierarchyName: string): Promise<Array<{
27
+ name: string;
28
+ type: HierarchyElement["type"];
29
+ }>>;
30
+ }
31
+ export declare class ElementTypeCache {
32
+ private readonly hierarchy;
33
+ private readonly slots;
34
+ private readonly pending;
35
+ /** Consecutive failed loads per slot; cleared on success, see load(). */
36
+ private readonly failures;
37
+ constructor(hierarchy: HierarchyLike);
38
+ getType(dim: string, hier: string, elem: string): Promise<ElementType | null>;
39
+ private load;
40
+ }
41
+ export {};
42
+ //# sourceMappingURL=element-type-cache.d.ts.map
@@ -0,0 +1,86 @@
1
+ const VALID_TYPES = new Set(["Numeric", "Consolidated", "String"]);
2
+ /**
3
+ * Consecutive failed loads of one `(dim, hier)` slot before the cache stops
4
+ * asking and pins that slot to `null` for its remaining lifetime.
5
+ *
6
+ * Balances two failure modes. Too low (1 = cache the failure) and a single
7
+ * transient timeout marks every element of that dimension "type unknown" for
8
+ * the whole audit run. Too high (unbounded retry) and a *deterministic*
9
+ * failure — the common case, since TM1 reports a security denial as HTTP 400
10
+ * `ObjectSecurityNoReadRights`, which any non-admin auditing a model with one
11
+ * restricted dimension hits — costs one failing REST call per feeder entry,
12
+ * serially, each able to run to the request timeout.
13
+ *
14
+ * No TTL on purpose: this cache is built fresh per tool invocation, so wall
15
+ * clock buys nothing and would only drag `Date.now()` into the tests.
16
+ */
17
+ const MAX_CONSECUTIVE_LOAD_FAILURES = 3;
18
+ function normalize(s) {
19
+ return s.toLowerCase();
20
+ }
21
+ export class ElementTypeCache {
22
+ hierarchy;
23
+ slots = new Map();
24
+ pending = new Map();
25
+ /** Consecutive failed loads per slot; cleared on success, see load(). */
26
+ failures = new Map();
27
+ constructor(hierarchy) {
28
+ this.hierarchy = hierarchy;
29
+ }
30
+ async getType(dim, hier, elem) {
31
+ const slotKey = `${normalize(dim)}|${normalize(hier)}`;
32
+ let slot = this.slots.get(slotKey);
33
+ if (slot === undefined) {
34
+ slot = await this.load(slotKey, dim, hier);
35
+ }
36
+ if (slot === null)
37
+ return null;
38
+ return slot.get(normalize(elem)) ?? null;
39
+ }
40
+ async load(slotKey, dim, hier) {
41
+ const inflight = this.pending.get(slotKey);
42
+ if (inflight)
43
+ return inflight;
44
+ // Resolver is created and registered eagerly so the in-flight slot is
45
+ // populated before any await hands control back to other callers; the
46
+ // actual REST work runs inside the returned promise.
47
+ let resolve;
48
+ const p = new Promise((r) => {
49
+ resolve = r;
50
+ });
51
+ this.pending.set(slotKey, p);
52
+ void (async () => {
53
+ try {
54
+ const elements = await this.hierarchy.getElementTypes(dim, hier);
55
+ const m = new Map();
56
+ for (const e of elements) {
57
+ if (VALID_TYPES.has(e.type)) {
58
+ m.set(normalize(e.name), e.type);
59
+ }
60
+ }
61
+ this.slots.set(slotKey, m);
62
+ this.failures.delete(slotKey);
63
+ resolve(m);
64
+ }
65
+ catch {
66
+ // One attempt = one failure, however many callers awaited it.
67
+ const failed = (this.failures.get(slotKey) ?? 0) + 1;
68
+ this.failures.set(slotKey, failed);
69
+ if (failed >= MAX_CONSECUTIVE_LOAD_FAILURES) {
70
+ // Budget spent: pin the slot so a deterministically broken or
71
+ // access-denied dimension costs a bounded number of REST calls
72
+ // instead of one per feeder entry.
73
+ this.slots.set(slotKey, null);
74
+ }
75
+ // Below the threshold the slot stays unset, so the *next* getType()
76
+ // issues a fresh attempt and a transient error can still heal.
77
+ resolve(null);
78
+ }
79
+ finally {
80
+ this.pending.delete(slotKey);
81
+ }
82
+ })();
83
+ return p;
84
+ }
85
+ }
86
+ //# sourceMappingURL=element-type-cache.js.map
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Static (rule-text only) overfeeding heuristics.
3
+ *
4
+ * Each detector takes already-parsed bracket lists (LHS of a single feeder or
5
+ * rule line) and returns a verdict. The tool layer composes these into
6
+ * findings with severity = "hint" since no runtime evidence is observed.
7
+ *
8
+ * Heuristic IDs match docs/internal/feeders-audit-spec.md:
9
+ * S1 — feeder_broader_than_rule (needs cubeTotalDims)
10
+ * S2 — feeder_to_consolidated (needs element-type cache)
11
+ * S3 — wildcard_bracket
12
+ * S4 — db_feeder_without_skipcheck
13
+ * S5 — orphan_feeder
14
+ */
15
+ import type { BracketList } from "./brackets.js";
16
+ import type { ElementTypeCache } from "./element-type-cache.js";
17
+ /**
18
+ * Pull every concrete element name out of a bracket list into a flat set.
19
+ * Positional, qualified, and set-form entries all contribute their element
20
+ * value(s). Dimension qualifiers are NOT bagged — only the element side.
21
+ */
22
+ export declare function collectElementBag(list: BracketList): Set<string>;
23
+ /**
24
+ * S3 · Wildcard / unscoped bracket — bracket has no concrete element
25
+ * constraints. Either an empty bracket or every entry lacks both `elem` and
26
+ * `elems`. Such feeders fire across every dim member.
27
+ */
28
+ export declare function detectWildcardBracket(list: BracketList): boolean;
29
+ /**
30
+ * S1 · Feeder broader than rule — feeder LHS pins a small fraction of the
31
+ * cube's dimensions. Ratio-based to scale across cube widths: an absolute
32
+ * "2 dims unpinned" threshold flooded findings on 13-dim cubes where
33
+ * positional feeders idiomatically pin 7–8 dims (live test 2026-05-19:
34
+ * 114/116 ≈ 98 % noise). The ratio gate restores precision because TM1
35
+ * fills the unpinned dims with default members — only when the feeder
36
+ * leaves most of the cube unconstrained is it genuinely too broad.
37
+ *
38
+ * Flags when `pinned / cubeTotalDims < minPinnedRatio` (default 0.5).
39
+ *
40
+ * Returns false on:
41
+ * - empty bracket (S4 territory)
42
+ * - missing cube dim count (resolver failure → cubeTotalDims ≤ 0)
43
+ * - feeder pinning more entries than cube has dims (malformed; skip)
44
+ */
45
+ export declare function detectBroaderThanRule(feeder: BracketList, cubeTotalDims: number, minPinnedRatio?: number): boolean;
46
+ /**
47
+ * Pair a feeder LHS with the rule LHS that shares the most element-bag
48
+ * elements. Returns the best-match rule (overlap ≥ 1) or null. Ties go to
49
+ * the first match for determinism. Used by S1 so we can compare feeder
50
+ * pinning against the rule it actually feeds rather than against the
51
+ * cube-width ratio fallback.
52
+ */
53
+ export declare function findMatchingRule(feederLhs: BracketList, ruleLhsList: readonly BracketList[]): BracketList | null;
54
+ /**
55
+ * S1 (rule-paired variant) · Feeder broader than its matched rule.
56
+ *
57
+ * Strict comparison: flag iff `feeder.pinned < matchedRule.pinned`. Equal
58
+ * pinning is the idiomatic 1:1 TM1 N: pattern (e.g. `[M:A] => [M:B]`
59
+ * feeding `[M:B] = N: [M:A] - ...;`) and must NOT be flagged — empirical
60
+ * audits showed ~92 % FP rate before pairing was introduced.
61
+ */
62
+ export declare function detectBroaderThanMatchedRule(feeder: BracketList, matchedRule: BracketList): boolean;
63
+ /**
64
+ * S2 · Feeder targets consolidated element.
65
+ *
66
+ * For each entry in the feeder LHS, resolve `(dim, hier, elem)` and look up
67
+ * the element type via the cache. Flag on the first consolidated element
68
+ * encountered. Resolution rules:
69
+ * - positional entry at index `i` → `dim = hier = cubeDimNames[i]`
70
+ * - qualified entry `'Dim':'Elem'` → `dim = hier = Dim`
71
+ * - qualified entry `'Dim:Hier':'Elem'` → split on `:` (only for the dim slot)
72
+ * - set entries `'Dim':{'A','B'}` → check each element of the set
73
+ *
74
+ * Returns the matching `{dim, elem}` or `null`. The tool layer turns a
75
+ * non-null result into a finding with severity `hint`.
76
+ */
77
+ export declare function detectFeederToConsolidated(feeder: BracketList, cubeDimNames: readonly string[], cache: ElementTypeCache): Promise<{
78
+ dim: string;
79
+ elem: string;
80
+ } | null>;
81
+ /**
82
+ * S4 · `DB()` feeder without skipcheck on target. Cross-cube feeders fan out
83
+ * through the target cube's consolidations; without `skipcheck;` on the
84
+ * target's rules the engine evaluates every cell. Walk every `DB(...)` call
85
+ * on the feeder line, ask the lookup whether the target cube has skipcheck.
86
+ *
87
+ * Returns the first target-cube name that lacks skipcheck, or `null` on:
88
+ * - no `DB()` call on the line
89
+ * - dynamic cube name (not a string literal — can't resolve statically)
90
+ * - lookup returns `null` (target outside scan scope — be conservative)
91
+ * - lookup returns `true` (skipcheck present)
92
+ */
93
+ export declare function detectDbFeederWithoutSkipcheck(line: string, hasSkipcheck: (cubeName: string) => boolean | null): string | null;
94
+ /**
95
+ * S5 · Orphan feeder — the feeder LHS shares no element name with any rule
96
+ * LHS in the cube. Pure overhead: it flags cells that no rule populates.
97
+ * Element comparison is bag-equality on the element-side only (dim
98
+ * qualifiers ignored), so positional and qualified syntax intermix.
99
+ */
100
+ export declare function detectOrphanFeeder(feeder: BracketList, ruleLhsList: ReadonlyArray<BracketList>): boolean;
101
+ //# sourceMappingURL=static-heuristics.d.ts.map