@happyvertical/smrt-core 0.54.1 → 0.54.3

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 (138) hide show
  1. package/AGENTS.md +6 -1
  2. package/README.md +8 -0
  3. package/agents/change-feed.md +7 -12
  4. package/agents/generators.md +13 -0
  5. package/agents/object-runtime.md +8 -0
  6. package/agents/schema-paths.md +14 -0
  7. package/dist/audit-context.d.ts +4 -0
  8. package/dist/audit-context.d.ts.map +1 -0
  9. package/dist/audit-context.js +16 -0
  10. package/dist/audit-context.js.map +1 -0
  11. package/dist/audit.d.ts +34 -0
  12. package/dist/audit.d.ts.map +1 -0
  13. package/dist/audit.js +63 -0
  14. package/dist/audit.js.map +1 -0
  15. package/dist/browser.d.ts +2 -1
  16. package/dist/browser.d.ts.map +1 -1
  17. package/dist/browser.js +4 -3
  18. package/dist/cascade.d.ts +1 -1
  19. package/dist/cascade.d.ts.map +1 -1
  20. package/dist/cascade.js +10 -7
  21. package/dist/cascade.js.map +1 -1
  22. package/dist/change-feed.js +1 -1
  23. package/dist/collection.d.ts +9 -2
  24. package/dist/collection.d.ts.map +1 -1
  25. package/dist/collection.js +59 -4
  26. package/dist/collection.js.map +1 -1
  27. package/dist/embedded-write-queue.d.ts +2 -0
  28. package/dist/embedded-write-queue.d.ts.map +1 -1
  29. package/dist/embedded-write-queue.js +12 -5
  30. package/dist/embedded-write-queue.js.map +1 -1
  31. package/dist/generators/changes-route.js +1 -1
  32. package/dist/generators/mcp-runtime-template.d.ts +2 -0
  33. package/dist/generators/mcp-runtime-template.d.ts.map +1 -1
  34. package/dist/generators/mcp-runtime-template.js +18 -16
  35. package/dist/generators/mcp-runtime-template.js.map +1 -1
  36. package/dist/generators/mcp-tool-name.d.ts +6 -0
  37. package/dist/generators/mcp-tool-name.d.ts.map +1 -1
  38. package/dist/generators/mcp-tool-name.js.map +1 -1
  39. package/dist/generators/mcp.d.ts +34 -1
  40. package/dist/generators/mcp.d.ts.map +1 -1
  41. package/dist/generators/mcp.js +148 -110
  42. package/dist/generators/mcp.js.map +1 -1
  43. package/dist/generators/rest.d.ts.map +1 -1
  44. package/dist/generators/rest.js +16 -7
  45. package/dist/generators/rest.js.map +1 -1
  46. package/dist/index.d.ts +3 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +9 -7
  49. package/dist/junction.d.ts +29 -10
  50. package/dist/junction.d.ts.map +1 -1
  51. package/dist/junction.js +31 -12
  52. package/dist/junction.js.map +1 -1
  53. package/dist/knowledge.js +1 -1
  54. package/dist/knowledge.js.map +1 -1
  55. package/dist/manifest/manifest-loader.d.ts.map +1 -1
  56. package/dist/manifest/manifest-loader.js +1 -1
  57. package/dist/manifest/manifest-loader.js.map +1 -1
  58. package/dist/manifest/static-manifest.d.ts.map +1 -1
  59. package/dist/manifest/static-manifest.js +106 -9
  60. package/dist/manifest/static-manifest.js.map +1 -1
  61. package/dist/manifest/store.d.ts +8 -0
  62. package/dist/manifest/store.d.ts.map +1 -1
  63. package/dist/manifest/store.js +12 -2
  64. package/dist/manifest/store.js.map +1 -1
  65. package/dist/manifest.json +119 -9
  66. package/dist/migrations/differ.d.ts +3 -3
  67. package/dist/migrations/differ.d.ts.map +1 -1
  68. package/dist/migrations/differ.js +8 -4
  69. package/dist/migrations/differ.js.map +1 -1
  70. package/dist/object.d.ts +1 -0
  71. package/dist/object.d.ts.map +1 -1
  72. package/dist/object.js +19 -7
  73. package/dist/object.js.map +1 -1
  74. package/dist/registry/class-registration.d.ts.map +1 -1
  75. package/dist/registry/class-registration.js +75 -10
  76. package/dist/registry/class-registration.js.map +1 -1
  77. package/dist/registry/collection-resolution.d.ts +2 -2
  78. package/dist/registry/collection-resolution.d.ts.map +1 -1
  79. package/dist/registry/collection-resolution.js +2 -1
  80. package/dist/registry/collection-resolution.js.map +1 -1
  81. package/dist/registry/collision-policy.d.ts +8 -0
  82. package/dist/registry/collision-policy.d.ts.map +1 -1
  83. package/dist/registry/collision-policy.js +2 -2
  84. package/dist/registry/collision-policy.js.map +1 -1
  85. package/dist/registry/framework-base-classes.d.ts.map +1 -1
  86. package/dist/registry/framework-base-classes.js +2 -1
  87. package/dist/registry/framework-base-classes.js.map +1 -1
  88. package/dist/registry/schema-builder.d.ts.map +1 -1
  89. package/dist/registry/schema-builder.js +33 -4
  90. package/dist/registry/schema-builder.js.map +1 -1
  91. package/dist/registry/shared-state.d.ts +6 -0
  92. package/dist/registry/shared-state.d.ts.map +1 -1
  93. package/dist/registry/shared-state.js +12 -1
  94. package/dist/registry/shared-state.js.map +1 -1
  95. package/dist/registry/types.d.ts +7 -1
  96. package/dist/registry/types.d.ts.map +1 -1
  97. package/dist/registry.d.ts +7 -1
  98. package/dist/registry.d.ts.map +1 -1
  99. package/dist/registry.js +25 -3
  100. package/dist/registry.js.map +1 -1
  101. package/dist/scanner/manifest-generator.d.ts.map +1 -1
  102. package/dist/scanner/manifest-generator.js +5 -1
  103. package/dist/scanner/manifest-generator.js.map +1 -1
  104. package/dist/scanner/types.d.ts +8 -0
  105. package/dist/scanner/types.d.ts.map +1 -1
  106. package/dist/scanner/types.js.map +1 -1
  107. package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -1
  108. package/dist/schema/ddl/duckdb-strategy.js +1 -0
  109. package/dist/schema/ddl/duckdb-strategy.js.map +1 -1
  110. package/dist/schema/ddl/null-equal-index.d.ts.map +1 -1
  111. package/dist/schema/ddl/null-equal-index.js +4 -2
  112. package/dist/schema/ddl/null-equal-index.js.map +1 -1
  113. package/dist/schema/generator.d.ts +3 -0
  114. package/dist/schema/generator.d.ts.map +1 -1
  115. package/dist/schema/generator.js +38 -0
  116. package/dist/schema/generator.js.map +1 -1
  117. package/dist/smrt-knowledge.json +74 -20
  118. package/dist/sync/apply.d.ts +2 -0
  119. package/dist/sync/apply.d.ts.map +1 -1
  120. package/dist/sync/apply.js +7 -3
  121. package/dist/sync/apply.js.map +1 -1
  122. package/dist/utils/scanner-module.d.ts +9 -0
  123. package/dist/utils/scanner-module.d.ts.map +1 -1
  124. package/dist/vite-plugin/index.d.ts +14 -0
  125. package/dist/vite-plugin/index.d.ts.map +1 -1
  126. package/dist/vite-plugin/index.js +58 -18
  127. package/dist/vite-plugin/index.js.map +1 -1
  128. package/dist/vite-plugin/package-stamp.d.ts +41 -0
  129. package/dist/vite-plugin/package-stamp.d.ts.map +1 -0
  130. package/dist/vite-plugin/package-stamp.js +33 -0
  131. package/dist/vite-plugin/package-stamp.js.map +1 -0
  132. package/dist/vite-plugin/sveltekit-generator.js +5 -3
  133. package/dist/vite-plugin/sveltekit-generator.js.map +1 -1
  134. package/dist/vite-plugin/sync-apply-route.d.ts.map +1 -1
  135. package/dist/vite-plugin/sync-apply-route.js +10 -0
  136. package/dist/vite-plugin/sync-apply-route.js.map +1 -1
  137. package/dist/vite-plugin.js +2 -2
  138. package/package.json +10 -10
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/generators/mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/generators/mcp.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,OAAO,EAGL,KAAK,oBAAoB,EAQzB,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAiB5B,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,yBAAyB,EACzB,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC;AAqB1B;;;GAGG;AACH,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AASxC,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE;QACN,SAAS,CAAC,EAAE,uBAAuB,CAAC;KACrC,CAAC;IACF,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,eAAO,MAAM,yBAAyB,WAAa,CAAC;AAEpD,MAAM,WAAW,uBAAuB;IACtC,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,UAAU,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAClC;;;;OAIG;IACH,aAAa,CAAC,EAAE,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;CAClC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,uBAAuB,GAAG,SAAS,EAC5C,oBAAoB,EAAE,OAAO,GAC5B,oBAAoB,CAyBtB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,oDAAoD;IACpD,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,YAAY,CAAC;CAC1B;AAED,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,KAAK,EAAE;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,cAAc,EAAE,OAAO,EAAE,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtB;AAED,kFAAkF;AAClF,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,gBAAgB,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC5E,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,CAAC;IAC5B,6DAA6D;IAC7D,YAAY,EAAE,cAAc,CAAC;IAC7B,8EAA8E;IAC9E,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,oBAAoB,GAClC,kBAAkB,CAOpB;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,GACjB,kBAAkB,CAOpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAI7E;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,QAAQ,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA0ED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyC;IAErE,OAAO,CAAC,UAAU;IAMlB,kFAAkF;IAClF,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe;IAa/C,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,WAAW,CAAiD;gBAExD,MAAM,GAAE,SAAc,EAAE,OAAO,GAAE,UAAe;IAc5D;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,GAAG,SAAS,CAEhC;IAED;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAuEzC;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA6BzB,iEAAiE;IACjE,OAAO,CAAC,SAAS;IAQjB;;;OAGG;YACW,mBAAmB;IA0QjC,OAAO,CAAC,qBAAqB;IAgC7B,OAAO,CAAC,2BAA2B;IAcnC,OAAO,CAAC,qBAAqB;IAM7B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoC5B,0EAA0E;IAC1E,OAAO,CAAC,YAAY;IAmBpB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAkDxB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAyFzB,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,0BAA0B;IAmBlC;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;IA+CtB;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA2E/D,+EAA+E;IACzE,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOtD;;;;OAIG;IACG,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;YA8B7C,iBAAiB;IAmE/B,+EAA+E;IAC/E,OAAO,CAAC,WAAW;IAKnB,gFAAgF;IAChF,OAAO,CAAC,mBAAmB;IAiB3B;;OAEG;YACW,aAAa;IAoD3B;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,oBAAoB;IAI5B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAiD3B;;OAEG;IACH;;;;;OAKG;IACH,OAAO,CAAC,eAAe;YAmBT,aAAa;IAgD3B;;;;;;;;;;;;;OAaG;YACW,uBAAuB;IA6CrC;;;;;;;OAOG;YACW,oBAAoB;IA0BlC;;;OAGG;YACW,SAAS;IAoJvB;;OAEG;YACW,mBAAmB;IA4GjC;;OAEG;IACH,aAAa;;;;;IAQb;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACG,cAAc,CAClB,OAAO,GAAE;QACP;;;;;;WAMG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;QAEpB,oCAAoC;QACpC,UAAU,CAAC,EAAE,MAAM,CAAC;QAEpB,qBAAqB;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QAEvB,2BAA2B;QAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;QAEhB,oDAAoD;QACpD,wBAAwB,CAAC,EAAE,OAAO,CAAC;QAEnC,oCAAoC;QACpC,cAAc,CAAC,EAAE,OAAO,CAAC;QAEzB,uEAAuE;QACvE,OAAO,CAAC,EAAE,OAAO,CAAC;KACd,GACL,OAAO,CAAC,IAAI,CAAC;YA4FF,oBAAoB;IA0ClC,4EAA4E;YAC9D,kBAAkB;IAmBhC;;;;;OAKG;IACH;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IAejC;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,iBAAiB;IAyBzB;;;;;;;;;;;;;;;OAeG;YACW,qBAAqB;IA0DnC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;OAEG;YACW,uBAAuB;IA6MrC;;OAEG;YACW,oBAAoB;IA4LlC;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;CAsH7B"}
@@ -1,8 +1,9 @@
1
1
  import { buildDefaultListOrderBy, resolveListLimit, resolveListOffset } from "../query-bounds.js";
2
+ import { SmrtCollection } from "../collection.js";
3
+ import { isQualifiedName } from "../utils/qualified-names.js";
2
4
  import { SMRT_CUSTOM_ACTION_ERROR_METADATA_KEY, buildCustomActionInvocationArgs, customActionParameterInputName, isCrudOperation, isCrudToolAction, isFrameworkLifecycleMethod, normalizeCustomActionFailure, resolveCustomActionMetadata } from "./custom-action.js";
3
5
  import { isFrameworkBaseClass } from "../registry/framework-base-classes.js";
4
6
  import { ObjectRegistry } from "../registry.js";
5
- import { SmrtCollection } from "../collection.js";
6
7
  import { generatedSiblingExtension, renderGeneratedSource, resolveGeneratedSourceLanguage } from "./mcp-emit.js";
7
8
  import { generateClaudeConfig, generateMCPDocumentation, generateMCPScript, generateRuntimeBootstrap } from "./mcp-runtime-template.js";
8
9
  import { canonicalMcpToolNames } from "./mcp-tool-name.js";
@@ -128,10 +129,12 @@ var MCPGenerator = class {
128
129
  /** Return the validated source identity for a tool returned by this generator. */
129
130
  getToolIdentity(tool) {
130
131
  const target = this.toolTarget(tool);
132
+ const owner = this.toolClass(tool);
131
133
  return {
132
134
  objectName: target.objectName,
133
135
  action: target.action,
134
- originalName: target.originalName ?? tool.name
136
+ originalName: target.originalName ?? tool.name,
137
+ ...owner ? { qualifiedName: owner.classInfo.qualifiedName ?? owner.key } : {}
135
138
  };
136
139
  }
137
140
  runtimeToolTargets(tools) {
@@ -171,10 +174,15 @@ var MCPGenerator = class {
171
174
  async generateTools() {
172
175
  const tools = [];
173
176
  const registeredClasses = ObjectRegistry.getAllClasses();
177
+ const scope = this.resolveClassScope(registeredClasses);
178
+ const generated = /* @__PURE__ */ new Set();
174
179
  for (const [key, classInfo] of registeredClasses) {
175
180
  const simpleName = classInfo.name || key;
181
+ if (generated.has(classInfo)) continue;
182
+ generated.add(classInfo);
183
+ if (scope && !scope.has(classInfo)) continue;
176
184
  if (isFrameworkBaseClass(simpleName, classInfo.packageName)) continue;
177
- const mcpConfig = ObjectRegistry.getConfig(simpleName).mcp;
185
+ const mcpConfig = ObjectRegistry.getConfig(key).mcp;
178
186
  if (mcpConfig === false) continue;
179
187
  const excluded = typeof mcpConfig === "object" && mcpConfig?.exclude ? mcpConfig.exclude : [];
180
188
  const included = typeof mcpConfig === "object" ? mcpConfig?.include : void 0;
@@ -183,7 +191,7 @@ var MCPGenerator = class {
183
191
  if (excluded.includes(endpoint)) return false;
184
192
  return true;
185
193
  };
186
- const objectTools = await this.generateObjectTools(simpleName, shouldInclude);
194
+ const objectTools = await this.generateObjectTools(simpleName, shouldInclude, key);
187
195
  tools.push(...objectTools);
188
196
  }
189
197
  const names = canonicalMcpToolNames(tools.map((tool) => ({
@@ -196,44 +204,77 @@ var MCPGenerator = class {
196
204
  return sortMCPTools(tools);
197
205
  }
198
206
  /**
199
- * Generate tools for a specific object
207
+ * The registered classes `MCPConfig.classNames` selects, or undefined when
208
+ * unscoped. A qualified name selects exactly that registration; a simple
209
+ * name must match one class only, so the scope never picks one of several
210
+ * same-named classes on its own (#3490).
200
211
  */
201
- async generateObjectTools(objectName, shouldInclude) {
212
+ resolveClassScope(classes) {
213
+ if (!this.config.classNames) return void 0;
214
+ const scope = /* @__PURE__ */ new Set();
215
+ for (const requested of this.config.classNames) {
216
+ const wanted = requested.toLowerCase();
217
+ const qualified = isQualifiedName(requested);
218
+ const matches = /* @__PURE__ */ new Set();
219
+ for (const [key, info] of classes) if ((qualified ? info.qualifiedName ?? key : info.name || key).toLowerCase() === wanted) matches.add(info);
220
+ if (matches.size > 1) {
221
+ const names = [...matches].map((info) => info.qualifiedName ?? info.name).sort().join(", ");
222
+ throw new Error(`MCP class scope '${requested}' is ambiguous: it matches ${names}. Scope it by qualified name.`);
223
+ }
224
+ for (const info of matches) scope.add(info);
225
+ }
226
+ return scope;
227
+ }
228
+ /** The registry key of the class a generated tool belongs to. */
229
+ toolClass(tool) {
230
+ const key = this.toolTargets.get(tool)?.registryKey;
231
+ const classInfo = key ? ObjectRegistry.getAllClasses().get(key) : void 0;
232
+ return key && classInfo ? {
233
+ key,
234
+ classInfo
235
+ } : void 0;
236
+ }
237
+ /**
238
+ * Generate tools for a specific object. `objectName` names the tools;
239
+ * `registryKey` (the class's registry key) resolves everything else.
240
+ */
241
+ async generateObjectTools(displayName, shouldInclude, registryKey = displayName) {
242
+ const objectName = registryKey;
202
243
  const tools = [];
203
244
  const fields = ObjectRegistry.getFields(objectName);
204
- const lowerName = objectName.toLowerCase();
245
+ const lowerName = displayName.toLowerCase();
205
246
  const classInfo = ObjectRegistry.getClass(objectName);
206
247
  if (shouldInclude("list")) tools.push({
207
248
  name: `${lowerName}_list`,
208
- description: `List ${objectName} objects with optional filtering`,
249
+ description: `List ${displayName} objects with optional filtering`,
209
250
  inputSchema: this.buildInputSchema(objectName, "list", fields),
210
251
  outputSchema: this.buildOutputSchema(objectName, "list", fields),
211
252
  annotations: mcpToolAnnotations("list")
212
253
  });
213
254
  if (shouldInclude("get")) tools.push({
214
255
  name: `${lowerName}_get`,
215
- description: `Get a specific ${objectName} by ID or slug`,
256
+ description: `Get a specific ${displayName} by ID or slug`,
216
257
  inputSchema: this.buildInputSchema(objectName, "get", fields),
217
258
  outputSchema: this.buildOutputSchema(objectName, "get", fields),
218
259
  annotations: mcpToolAnnotations("get")
219
260
  });
220
261
  if (shouldInclude("create")) tools.push({
221
262
  name: `${lowerName}_create`,
222
- description: `Create a new ${objectName}`,
263
+ description: `Create a new ${displayName}`,
223
264
  inputSchema: this.buildInputSchema(objectName, "create", fields),
224
265
  outputSchema: this.buildOutputSchema(objectName, "create", fields),
225
266
  annotations: mcpToolAnnotations("create")
226
267
  });
227
268
  if (shouldInclude("update")) tools.push({
228
269
  name: `${lowerName}_update`,
229
- description: `Update an existing ${objectName}`,
270
+ description: `Update an existing ${displayName}`,
230
271
  inputSchema: this.buildInputSchema(objectName, "update", fields),
231
272
  outputSchema: this.buildOutputSchema(objectName, "update", fields),
232
273
  annotations: mcpToolAnnotations("update")
233
274
  });
234
275
  if (shouldInclude("delete")) tools.push({
235
276
  name: `${lowerName}_delete`,
236
- description: `Delete a ${objectName} by ID`,
277
+ description: `Delete a ${displayName} by ID`,
237
278
  inputSchema: this.buildInputSchema(objectName, "delete", fields),
238
279
  outputSchema: this.buildOutputSchema(objectName, "delete", fields),
239
280
  annotations: mcpToolAnnotations("delete")
@@ -245,7 +286,7 @@ var MCPGenerator = class {
245
286
  const excludedLower = new Set(excluded.map((entry) => entry.toLowerCase()));
246
287
  const customMethodsInInclude = included?.filter((item) => {
247
288
  if (!isCrudToolAction(item)) return true;
248
- if (!isCrudOperation(item)) console.warn(`Warning: MCP include entry '${item}' for ${objectName} resolves to the reserved CRUD tool '${lowerName}_${item.toLowerCase()}' and was ignored; use '${item.toLowerCase()}' to expose that operation`);
289
+ if (!isCrudOperation(item)) console.warn(`Warning: MCP include entry '${item}' for ${displayName} resolves to the reserved CRUD tool '${lowerName}_${item.toLowerCase()}' and was ignored; use '${item.toLowerCase()}' to expose that operation`);
249
290
  return false;
250
291
  }) || [];
251
292
  const hasIncludeList = included !== void 0;
@@ -258,12 +299,12 @@ var MCPGenerator = class {
258
299
  const existsInManifest = methodNames.has(methodName);
259
300
  const existsOnClass = this.validateCustomMethod(classInfo.constructor, methodName);
260
301
  if (!existsInManifest && !existsOnClass) {
261
- console.warn(`Warning: Custom action '${methodName}' specified in MCP config for ${objectName}, but method ${methodName}() not found on class`);
302
+ console.warn(`Warning: Custom action '${methodName}' specified in MCP config for ${displayName}, but method ${methodName}() not found on class`);
262
303
  continue;
263
304
  }
264
305
  const methodDef = methods.get(methodName);
265
306
  if (methodDef && !methodDef.isPublic) continue;
266
- const tool = this.buildCustomActionTool(objectName, lowerName, methodName, methodDef, this.hasCollectionReceiver(classInfo));
307
+ const tool = this.buildCustomActionTool(displayName, lowerName, methodName, methodDef, this.hasCollectionReceiver(classInfo), registryKey);
267
308
  if (emittedToolNames.has(tool.name)) continue;
268
309
  emittedToolNames.add(tool.name);
269
310
  tools.push(tool);
@@ -273,26 +314,27 @@ var MCPGenerator = class {
273
314
  if (isFrameworkLifecycleMethod(methodName)) continue;
274
315
  if (!methodDef.isPublic) continue;
275
316
  if (excludedLower.has(methodName.toLowerCase())) continue;
276
- const tool = this.buildCustomActionTool(objectName, lowerName, methodName, methodDef, this.hasCollectionReceiver(classInfo));
317
+ const tool = this.buildCustomActionTool(displayName, lowerName, methodName, methodDef, this.hasCollectionReceiver(classInfo), registryKey);
277
318
  if (emittedToolNames.has(tool.name)) continue;
278
319
  emittedToolNames.add(tool.name);
279
320
  tools.push(tool);
280
321
  }
281
322
  }
282
323
  for (const tool of tools) this.toolTargets.set(tool, {
283
- objectName,
324
+ objectName: displayName,
284
325
  action: tool.name.slice(lowerName.length + 1),
285
- originalName: tool.name
326
+ originalName: tool.name,
327
+ registryKey
286
328
  });
287
329
  return tools;
288
330
  }
289
- buildCustomActionTool(objectName, lowerName, methodName, methodDef, collectionReceiver = false) {
290
- const metadata = this.resolveCustomActionMetadata(objectName, methodName, methodDef, collectionReceiver);
331
+ buildCustomActionTool(objectName, lowerName, methodName, methodDef, collectionReceiver = false, registryKey = objectName) {
332
+ const metadata = this.resolveCustomActionMetadata(registryKey, methodName, methodDef, collectionReceiver);
291
333
  return {
292
334
  name: `${lowerName}_${methodName}`.toLowerCase(),
293
335
  description: `Execute ${methodName} action on ${objectName}`,
294
- inputSchema: this.buildInputSchema(objectName, methodName, ObjectRegistry.getFields(objectName), metadata),
295
- outputSchema: this.buildOutputSchema(objectName, methodName, ObjectRegistry.getFields(objectName)),
336
+ inputSchema: this.buildInputSchema(registryKey, methodName, ObjectRegistry.getFields(registryKey), metadata),
337
+ outputSchema: this.buildOutputSchema(registryKey, methodName, ObjectRegistry.getFields(registryKey)),
296
338
  annotations: mcpToolAnnotations(methodName, metadata)
297
339
  };
298
340
  }
@@ -482,22 +524,31 @@ var MCPGenerator = class {
482
524
  }
483
525
  return properties;
484
526
  }
527
+ /**
528
+ * The STI subtypes a create may select, each bound to its exact registry
529
+ * entry (`name` is its registry key). A subtype is the base itself or a
530
+ * class whose constructor descends from the base's, or — for manifest-only
531
+ * entries — whose inheritance chain names the base's qualified identity.
532
+ * Never resolved by simple name: two packages may declare same-named
533
+ * subtypes of one base (#3490).
534
+ */
485
535
  getStiVariants(objectName) {
486
536
  if (ObjectRegistry.getTableStrategy(objectName) !== "sti") return [];
487
537
  const base = ObjectRegistry.getClass(objectName);
488
- const baseNames = new Set([
489
- objectName,
490
- base?.name,
491
- base?.qualifiedName
492
- ].filter((name) => typeof name === "string"));
538
+ if (!base) return [];
539
+ const baseKeys = new Set([objectName, base.qualifiedName].filter((name) => typeof name === "string"));
540
+ const isStub = (info) => info.constructor._isManifestStub === true;
493
541
  const variants = /* @__PURE__ */ new Map();
542
+ const seen = /* @__PURE__ */ new Set();
494
543
  for (const [key, info] of ObjectRegistry.getAllClasses()) {
495
- const name = info.name || key;
496
- if (!ObjectRegistry.getInheritanceChain(name).some((ancestor) => baseNames.has(ancestor))) continue;
497
- const discriminator = info.qualifiedName || name;
544
+ if (seen.has(info)) continue;
545
+ seen.add(info);
546
+ if (!(info === base || !isStub(info) && !isStub(base) && info.constructor.prototype instanceof base.constructor || (isStub(info) || isStub(base)) && ObjectRegistry.getInheritanceChain(key).some((ancestor) => baseKeys.has(ancestor)))) continue;
547
+ const discriminator = info.qualifiedName || info.name || key;
498
548
  variants.set(discriminator, {
499
- name,
500
- discriminator
549
+ name: key,
550
+ discriminator,
551
+ classInfo: info
501
552
  });
502
553
  }
503
554
  return Array.from(variants.values()).sort((left, right) => left.discriminator.localeCompare(right.discriminator));
@@ -511,18 +562,9 @@ var MCPGenerator = class {
511
562
  const tool = (await this.generateTools()).find((candidate) => candidate.name === name);
512
563
  if (!tool) throw new Error(`Unknown tool: ${name}`);
513
564
  const { objectName, action } = this.toolTarget(tool);
514
- const registeredClasses = ObjectRegistry.getAllClasses();
515
- let classInfo = null;
516
- let actualObjectName = "";
517
- for (const [_key, info] of registeredClasses) {
518
- const simpleName = info.name || _key;
519
- if (simpleName.toLowerCase() === objectName.toLowerCase()) {
520
- classInfo = info;
521
- actualObjectName = simpleName;
522
- break;
523
- }
524
- }
525
- if (!classInfo) throw new Error(`Object type '${objectName}' not found`);
565
+ const owner = this.toolClass(tool);
566
+ if (!owner) throw new Error(`Object type '${objectName}' not found`);
567
+ const { key: actualObjectName, classInfo } = owner;
526
568
  const collection = await this.getCollection(actualObjectName, classInfo);
527
569
  const result = await this.executeAction(collection, action, args, actualObjectName);
528
570
  const publicResult = this.toJsonValue(result);
@@ -588,12 +630,11 @@ var MCPGenerator = class {
588
630
  const tools = await this.generateTools();
589
631
  const tool = tools.find((candidate) => candidate.name === toolName);
590
632
  if (!tool) return null;
591
- const { objectName: objectPrefix, action } = this.toolTarget(tool);
633
+ const { action } = this.toolTarget(tool);
592
634
  if (isCrudToolAction(action)) return null;
593
- const classEntry = Array.from(ObjectRegistry.getAllClasses().entries()).find(([key, info]) => (info.name || key).toLowerCase() === objectPrefix.toLowerCase());
594
- if (!classEntry) return null;
595
- const [key, classInfo] = classEntry;
596
- const objectName = classInfo.name || key;
635
+ const owner = this.toolClass(tool);
636
+ if (!owner) return null;
637
+ const { key: objectName, classInfo } = owner;
597
638
  const mcpConfig = ObjectRegistry.getConfig(objectName).mcp;
598
639
  const configuredTasks = typeof mcpConfig === "object" ? mcpConfig.tasks : void 0;
599
640
  if (configuredTasks !== true && (!Array.isArray(configuredTasks) || !configuredTasks.some((method) => method.toLowerCase() === action.toLowerCase()))) return null;
@@ -624,6 +665,10 @@ var MCPGenerator = class {
624
665
  * Get or create collection for an object
625
666
  */
626
667
  async getCollection(objectName, classInfo) {
668
+ if (!this.collections.has(objectName) && !classInfo.collectionConstructor) this.collections.set(objectName, await ObjectRegistry.getCollection(classInfo.qualifiedName || objectName, {
669
+ ai: this.context.ai,
670
+ db: this.context.db
671
+ }));
627
672
  if (!this.collections.has(objectName)) {
628
673
  if (!classInfo.collectionConstructor || typeof classInfo.collectionConstructor !== "function") throw new Error(`No valid collection constructor found for ${objectName}`);
629
674
  const collection = new classInfo.collectionConstructor({
@@ -720,8 +765,8 @@ var MCPGenerator = class {
720
765
  if (action === "create" && objectName && typeof args._meta_type === "string") {
721
766
  const variant = this.getStiVariants(objectName).find((candidate) => candidate.discriminator === args._meta_type);
722
767
  if (!variant) throw new Error(`Unknown STI discriminator: ${args._meta_type}`);
723
- const classInfo = ObjectRegistry.getClass(variant.name);
724
- if (!classInfo) throw new Error(`STI subtype '${variant.name}' is not registered`);
768
+ const classInfo = variant.classInfo;
769
+ if (ObjectRegistry.getAllClasses().get(variant.name) !== classInfo) throw new Error(`STI subtype '${variant.name}' is not registered`);
725
770
  targetCollection = await this.getCollection(variant.name, classInfo);
726
771
  targetObjectName = variant.name;
727
772
  }
@@ -763,12 +808,14 @@ var MCPGenerator = class {
763
808
  for (const tool of tools) {
764
809
  const { objectName } = this.toolTarget(tool);
765
810
  if (!objectName) continue;
811
+ const owner = this.toolClass(tool);
812
+ if (owner) {
813
+ if (isTenantScopedClass(owner.key)) scoped.add(objectName.toLowerCase());
814
+ continue;
815
+ }
766
816
  for (const [key, info] of ObjectRegistry.getAllClasses()) {
767
817
  const simpleName = info.name || key;
768
- if (simpleName.toLowerCase() === objectName.toLowerCase()) {
769
- if (isTenantScopedClass(simpleName)) scoped.add(simpleName.toLowerCase());
770
- break;
771
- }
818
+ if (simpleName.toLowerCase() === objectName.toLowerCase() && isTenantScopedClass(key)) scoped.add(simpleName.toLowerCase());
772
819
  }
773
820
  }
774
821
  return Array.from(scoped);
@@ -784,15 +831,14 @@ var MCPGenerator = class {
784
831
  async hasTenantScopedTools(tools) {
785
832
  if ((await this.tenantScopedObjectNames(tools)).length > 0) return true;
786
833
  for (const tool of tools) {
834
+ const owner = this.toolClass(tool);
835
+ if (owner) {
836
+ if (ObjectRegistry.isTenantScoped(owner.key)) return true;
837
+ continue;
838
+ }
787
839
  const { objectName } = this.toolTarget(tool);
788
840
  if (!objectName) continue;
789
- for (const [key, info] of ObjectRegistry.getAllClasses()) {
790
- const simpleName = info.name || key;
791
- if (simpleName.toLowerCase() === objectName.toLowerCase()) {
792
- if (ObjectRegistry.isTenantScoped(simpleName)) return true;
793
- break;
794
- }
795
- }
841
+ for (const [key, info] of ObjectRegistry.getAllClasses()) if ((info.name || key).toLowerCase() === objectName.toLowerCase() && ObjectRegistry.isTenantScoped(key)) return true;
796
842
  }
797
843
  return false;
798
844
  }
@@ -835,7 +881,6 @@ var MCPGenerator = class {
835
881
  createData.owner_id = this.context.user.id;
836
882
  }
837
883
  const newItem = await collection.create(createData);
838
- await newItem.save();
839
884
  return this.toPublicData(newItem);
840
885
  }
841
886
  case "update": {
@@ -844,21 +889,21 @@ var MCPGenerator = class {
844
889
  const existing = await collection.get(id);
845
890
  if (!existing) throw new Error("Object not found");
846
891
  const updateData = this.applyWritablePolicy(objectName, args);
847
- Object.assign(existing, updateData);
848
- if (this.context.user) existing.updated_by = this.context.user.id;
849
- await existing.save();
892
+ await collection.withAuditMutation(existing, "updated", async (bound) => {
893
+ Object.assign(bound, updateData);
894
+ if (this.context.user) bound.updated_by = this.context.user.id;
895
+ await bound.save();
896
+ });
850
897
  return this.toPublicData(existing);
851
898
  }
852
- case "delete": {
899
+ case "delete":
853
900
  if (!args.id) throw new Error("ID is required for delete");
854
- const toDelete = await collection.get(args.id);
855
- if (!toDelete) throw new Error("Object not found");
856
- await toDelete.delete();
901
+ if (!await collection.get(args.id)) throw new Error("Object not found");
902
+ await collection.delete(args.id);
857
903
  return {
858
904
  success: true,
859
905
  message: "Object deleted successfully"
860
906
  };
861
- }
862
907
  default: {
863
908
  const result = await this.executeCustomAction(collection, action, args, objectName);
864
909
  return this.toPublicData(result);
@@ -992,16 +1037,12 @@ var MCPGenerator = class {
992
1037
  }
993
1038
  async runtimeCustomActions(tools) {
994
1039
  const metadata = {};
995
- const classes = ObjectRegistry.getAllClasses();
996
1040
  for (const tool of tools) {
997
- const target = this.toolTarget(tool);
998
- const objectPrefix = target.objectName.toLowerCase();
999
- const action = target.action;
1041
+ const action = this.toolTarget(tool).action;
1000
1042
  if (isCrudToolAction(action)) continue;
1001
- const matched = Array.from(classes.entries()).find(([key, info]) => (info.name || key).toLowerCase() === objectPrefix);
1002
- if (!matched) continue;
1003
- const [key, classInfo] = matched;
1004
- const objectName = classInfo.name || key;
1043
+ const owner = this.toolClass(tool);
1044
+ if (!owner) continue;
1045
+ const { key: objectName, classInfo } = owner;
1005
1046
  const [methodName, method] = resolveCustomActionMethod(await ObjectRegistry.getAllMethods(objectName), action);
1006
1047
  const resolved = this.resolveCustomActionMetadata(objectName, methodName, method, this.hasCollectionReceiver(classInfo));
1007
1048
  metadata[tool.name] = {
@@ -1020,17 +1061,16 @@ var MCPGenerator = class {
1020
1061
  /** Emit only task-enabled item custom actions for the generated runtime. */
1021
1062
  async runtimeTaskActions(tools) {
1022
1063
  const actions = {};
1023
- const classes = ObjectRegistry.getAllClasses();
1024
1064
  for (const tool of tools) {
1025
1065
  if (!await this.supportsTaskTool(tool.name)) continue;
1026
- const objectPrefix = this.toolTarget(tool).objectName.toLowerCase();
1027
- const matched = Array.from(classes.entries()).find(([key, info]) => (info.name || key).toLowerCase() === objectPrefix);
1028
- if (!matched) continue;
1029
- const [key, classInfo] = matched;
1066
+ const owner = this.toolClass(tool);
1067
+ if (!owner) continue;
1068
+ const { key, classInfo } = owner;
1030
1069
  const objectName = classInfo.name || key;
1031
1070
  actions[tool.name] = {
1032
1071
  objectName,
1033
- objectType: classInfo.qualifiedName || objectName
1072
+ objectType: classInfo.qualifiedName || objectName,
1073
+ registryKey: key
1034
1074
  };
1035
1075
  }
1036
1076
  return actions;
@@ -1065,29 +1105,26 @@ var MCPGenerator = class {
1065
1105
  */
1066
1106
  runtimeListOrderBy(tools) {
1067
1107
  const orderings = {};
1068
- const classes = ObjectRegistry.getAllClasses();
1069
1108
  for (const tool of tools) {
1070
1109
  const target = this.toolTarget(tool);
1071
1110
  if (target.action !== "list") continue;
1072
1111
  const objectPrefix = target.objectName.toLowerCase();
1073
1112
  if (orderings[objectPrefix]) continue;
1074
- const matched = Array.from(classes.entries()).find(([key, info]) => (info.name || key).toLowerCase() === objectPrefix);
1075
- if (!matched) continue;
1076
- orderings[objectPrefix] = this.resolveDefaultListOrderBy(matched[1].name || matched[0]);
1113
+ const owner = this.toolClass(tool);
1114
+ if (!owner) continue;
1115
+ orderings[objectPrefix] = this.resolveDefaultListOrderBy(owner.key);
1077
1116
  }
1078
1117
  return orderings;
1079
1118
  }
1080
1119
  runtimeStiTargets(tools) {
1081
1120
  const targets = {};
1082
- const classes = ObjectRegistry.getAllClasses();
1083
1121
  for (const tool of tools) {
1084
1122
  const target = this.toolTarget(tool);
1085
1123
  if (target.action !== "create") continue;
1086
1124
  const objectPrefix = target.objectName.toLowerCase();
1087
- const matched = Array.from(classes.entries()).find(([key, info]) => (info.name || key).toLowerCase() === objectPrefix);
1088
- if (!matched) continue;
1089
- const [key, classInfo] = matched;
1090
- const variants = this.getStiVariants(classInfo.name || key);
1125
+ const owner = this.toolClass(tool);
1126
+ if (!owner) continue;
1127
+ const variants = this.getStiVariants(owner.key);
1091
1128
  if (variants.length === 0) continue;
1092
1129
  targets[objectPrefix] = Object.fromEntries(variants.map((variant) => [variant.discriminator, variant.discriminator]));
1093
1130
  }
@@ -1181,13 +1218,14 @@ export const tools: Array<{
1181
1218
  const target = this.toolTarget(tool);
1182
1219
  const objectName = target.objectName.toLowerCase();
1183
1220
  const action = target.action;
1221
+ const lookup = target.registryKey ?? target.objectName;
1184
1222
  switch (action) {
1185
1223
  case "list": return `${indent}case '${tool.name}': {
1186
1224
  ${indent} const limit = args.limit ?? 50;
1187
1225
  ${indent} const offset = args.offset ?? 0;
1188
1226
  ${indent} const where = args.where ?? {};
1189
1227
 
1190
- ${indent} const collection = await ObjectRegistry.getCollection(${JSON.stringify(target.objectName)}, {
1228
+ ${indent} const collection = await ObjectRegistry.getCollection(${JSON.stringify(lookup)}, {
1191
1229
  ${indent} persistence: { type: process.env.DATABASE_TYPE || 'sqlite', url: process.env.DATABASE_URL || ':memory:' },
1192
1230
  ${indent} ai: aiConfig
1193
1231
  ${indent} });
@@ -1205,7 +1243,7 @@ ${indent} if (!args.id && !args.slug) {
1205
1243
  ${indent} throw new Error('Either id or slug is required');
1206
1244
  ${indent} }
1207
1245
 
1208
- ${indent} const collection = await ObjectRegistry.getCollection(${JSON.stringify(target.objectName)}, {
1246
+ ${indent} const collection = await ObjectRegistry.getCollection(${JSON.stringify(lookup)}, {
1209
1247
  ${indent} persistence: { type: process.env.DATABASE_TYPE || 'sqlite', url: process.env.DATABASE_URL || ':memory:' },
1210
1248
  ${indent} ai: aiConfig
1211
1249
  ${indent} });
@@ -1220,10 +1258,9 @@ ${indent} }
1220
1258
  ${indent} return successResult(item.toPublicJSON(PUBLIC_JSON_OPTIONS));
1221
1259
  ${indent}}`;
1222
1260
  case "create": return `${indent}case '${tool.name}': {
1223
- ${indent} const { collection, objectName: targetObjectName } = await resolveCreateTarget(${JSON.stringify(objectName)}, args, aiConfig);
1261
+ ${indent} const { collection, objectName: targetObjectName } = await resolveCreateTarget(${JSON.stringify(objectName)}, ${JSON.stringify(lookup)}, args, aiConfig);
1224
1262
 
1225
1263
  ${indent} const newItem = await collection.create(applyWritablePolicy(targetObjectName, args));
1226
- ${indent} await newItem.save();
1227
1264
 
1228
1265
  ${indent} return successResult(newItem.toPublicJSON(PUBLIC_JSON_OPTIONS));
1229
1266
  ${indent}}`;
@@ -1233,7 +1270,7 @@ ${indent} if (!id) {
1233
1270
  ${indent} throw new Error('ID is required for update');
1234
1271
  ${indent} }
1235
1272
 
1236
- ${indent} const collection = await ObjectRegistry.getCollection(${JSON.stringify(target.objectName)}, {
1273
+ ${indent} const collection = await ObjectRegistry.getCollection(${JSON.stringify(lookup)}, {
1237
1274
  ${indent} persistence: { type: process.env.DATABASE_TYPE || 'sqlite', url: process.env.DATABASE_URL || ':memory:' },
1238
1275
  ${indent} ai: aiConfig
1239
1276
  ${indent} });
@@ -1243,8 +1280,10 @@ ${indent} if (!existing) {
1243
1280
  ${indent} throw new Error('Object not found');
1244
1281
  ${indent} }
1245
1282
 
1246
- ${indent} Object.assign(existing, applyWritablePolicy(${JSON.stringify(target.objectName)}, updateData));
1247
- ${indent} await existing.save();
1283
+ ${indent} await collection.withAuditMutation(existing, 'updated', async (bound) => {
1284
+ ${indent} Object.assign(bound, applyWritablePolicy(${JSON.stringify(lookup)}, updateData));
1285
+ ${indent} await bound.save();
1286
+ ${indent} });
1248
1287
 
1249
1288
  ${indent} return successResult(existing.toPublicJSON(PUBLIC_JSON_OPTIONS));
1250
1289
  ${indent}}`;
@@ -1253,7 +1292,7 @@ ${indent} if (!args.id) {
1253
1292
  ${indent} throw new Error('ID is required for delete');
1254
1293
  ${indent} }
1255
1294
 
1256
- ${indent} const collection = await ObjectRegistry.getCollection(${JSON.stringify(target.objectName)}, {
1295
+ ${indent} const collection = await ObjectRegistry.getCollection(${JSON.stringify(lookup)}, {
1257
1296
  ${indent} persistence: { type: process.env.DATABASE_TYPE || 'sqlite', url: process.env.DATABASE_URL || ':memory:' },
1258
1297
  ${indent} ai: aiConfig
1259
1298
  ${indent} });
@@ -1263,15 +1302,14 @@ ${indent} if (!toDelete) {
1263
1302
  ${indent} throw new Error('Object not found');
1264
1303
  ${indent} }
1265
1304
 
1266
- ${indent} await toDelete.delete();
1305
+ ${indent} await collection.delete(args.id);
1267
1306
 
1268
1307
  ${indent} return successResult({ success: true, message: 'Object deleted successfully' });
1269
1308
  ${indent}}`;
1270
1309
  default: {
1271
- const matched = Array.from(ObjectRegistry.getAllClasses().entries()).find(([key, info]) => (info.name || key).toLowerCase() === objectName.toLowerCase());
1272
- if (!matched) throw new Error(`Unable to resolve custom-action target for tool '${tool.name}'`);
1273
- const [classKey, classInfo] = matched;
1274
- const registeredName = classInfo.name || classKey;
1310
+ const owner = this.toolClass(tool);
1311
+ if (!owner) throw new Error(`Unable to resolve custom-action target for tool '${tool.name}'`);
1312
+ const { key: registeredName, classInfo } = owner;
1275
1313
  const [methodName, method] = resolveCustomActionMethod(await ObjectRegistry.getAllMethods(registeredName), action);
1276
1314
  const metadata = this.resolveCustomActionMetadata(registeredName, methodName, method, this.hasCollectionReceiver(classInfo));
1277
1315
  const methodArgs = !metadata.parameters ? "Object.keys(options ?? {}).length > 0 ? options : directArgs" : metadata.parameters.length === 1 && metadata.parameters[0]?.name === "options" ? "options" : `[${metadata.parameters.map((parameter) => `args[${JSON.stringify(customActionParameterInputName(metadata, parameter.name))}]`).join(", ")}]`;
@@ -1357,7 +1395,7 @@ const MCP_TENANT_ID = process.env.SMRT_MCP_TENANT_ID || undefined;
1357
1395
  const MCP_ALLOW_CROSS_TENANT = process.env.SMRT_MCP_ALLOW_CROSS_TENANT === 'true';
1358
1396
  ` : ""}
1359
1397
 
1360
- const TOOL_TARGETS: Record<string, { objectName: string; action: string }> = ${JSON.stringify(toolTargets)};
1398
+ const TOOL_TARGETS: Record<string, { objectName: string; action: string; registryKey?: string }> = ${JSON.stringify(toolTargets)};
1361
1399
  const PUBLIC_JSON_OPTIONS = {
1362
1400
  permissions: (process.env.SMRT_MCP_PERMISSIONS || '')
1363
1401
  .split(',')
@@ -1400,10 +1438,10 @@ function applyWritablePolicy(objectName: string, data: any): Record<string, any>
1400
1438
  }
1401
1439
 
1402
1440
  /** Resolve an advertised STI discriminator to its registered subtype collection. */
1403
- async function resolveCreateTarget(baseObjectName: string, args: Record<string, any>, aiConfig: any) {
1441
+ async function resolveCreateTarget(stiKey: string, baseObjectName: string, args: Record<string, any>, aiConfig: any) {
1404
1442
  let objectName = baseObjectName;
1405
1443
  const discriminator = args._meta_type;
1406
- const targets = STI_TARGETS[baseObjectName];
1444
+ const targets = STI_TARGETS[stiKey];
1407
1445
  if (typeof discriminator === 'string' && targets) {
1408
1446
  const target = targets[discriminator];
1409
1447
  if (!target) throw new Error('Unknown STI discriminator: ' + discriminator);