@lucern/sdk 0.3.0-alpha.1 → 0.3.0-alpha.11

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 (221) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/README.md +51 -4
  3. package/dist/accessControl.d.ts +78 -0
  4. package/dist/accessControl.js +1118 -0
  5. package/dist/accessControl.js.map +1 -0
  6. package/dist/adminClient.d.ts +10 -8
  7. package/dist/adminClient.js +242 -39
  8. package/dist/adminClient.js.map +1 -1
  9. package/dist/answersClient.d.ts +2 -0
  10. package/dist/answersClient.js +221 -11
  11. package/dist/answersClient.js.map +1 -1
  12. package/dist/audience/index.d.ts +2 -1
  13. package/dist/audience/index.js +1 -3
  14. package/dist/audience/index.js.map +1 -1
  15. package/dist/audiencesClient.d.ts +18 -16
  16. package/dist/audiencesClient.js +297 -90
  17. package/dist/audiencesClient.js.map +1 -1
  18. package/dist/auditClient.d.ts +2 -0
  19. package/dist/auditClient.js +227 -15
  20. package/dist/auditClient.js.map +1 -1
  21. package/dist/authContext.d.ts +56 -0
  22. package/dist/authContext.js +170 -0
  23. package/dist/authContext.js.map +1 -0
  24. package/dist/authDeviceClient.d.ts +49 -0
  25. package/dist/authDeviceClient.js +121 -0
  26. package/dist/authDeviceClient.js.map +1 -0
  27. package/dist/beliefs/index.d.ts +26 -5
  28. package/dist/beliefs/index.js +3625 -1140
  29. package/dist/beliefs/index.js.map +1 -1
  30. package/dist/beliefsClient.d.ts +4 -2
  31. package/dist/beliefsClient.js +230 -26
  32. package/dist/beliefsClient.js.map +1 -1
  33. package/dist/boundaryClientSurface.d.ts +20 -0
  34. package/dist/boundaryClientSurface.js +73 -0
  35. package/dist/boundaryClientSurface.js.map +1 -0
  36. package/dist/client.d.ts +2988 -27
  37. package/dist/client.js +3625 -1140
  38. package/dist/client.js.map +1 -1
  39. package/dist/clientHelpers.d.ts +48 -0
  40. package/dist/clientHelpers.js +137 -0
  41. package/dist/clientHelpers.js.map +1 -0
  42. package/dist/contextClient.d.ts +6 -3
  43. package/dist/contextClient.js +252 -30
  44. package/dist/contextClient.js.map +1 -1
  45. package/dist/contextFacade.js +25 -16
  46. package/dist/contextFacade.js.map +1 -1
  47. package/dist/contextPackCompiler.js +19 -30
  48. package/dist/contextPackCompiler.js.map +1 -1
  49. package/dist/contextPackPolicy.js +7 -17
  50. package/dist/contextPackPolicy.js.map +1 -1
  51. package/dist/contextTypes.d.ts +2 -0
  52. package/dist/contracts/api-enums.contract.d.ts +2 -2
  53. package/dist/contracts/api-enums.contract.js +6 -1
  54. package/dist/contracts/api-enums.contract.js.map +1 -1
  55. package/dist/contracts/index.d.ts +1 -0
  56. package/dist/contracts/index.js +120 -5
  57. package/dist/contracts/index.js.map +1 -1
  58. package/dist/contracts/lens-filter.contract.js +4 -3
  59. package/dist/contracts/lens-filter.contract.js.map +1 -1
  60. package/dist/contracts/lens-workflow.contract.js +4 -3
  61. package/dist/contracts/lens-workflow.contract.js.map +1 -1
  62. package/dist/contracts/lensFilter.js +4 -3
  63. package/dist/contracts/lensFilter.js.map +1 -1
  64. package/dist/contracts/lensWorkflow.js +4 -3
  65. package/dist/contracts/lensWorkflow.js.map +1 -1
  66. package/dist/contracts/mcpTools.d.ts +46 -1
  67. package/dist/contracts/mcpTools.js +108 -0
  68. package/dist/contracts/mcpTools.js.map +1 -1
  69. package/dist/contradictions/index.d.ts +25 -4
  70. package/dist/contradictions/index.js +3625 -1140
  71. package/dist/contradictions/index.js.map +1 -1
  72. package/dist/coreClient.d.ts +11 -1
  73. package/dist/coreClient.js +222 -14
  74. package/dist/coreClient.js.map +1 -1
  75. package/dist/decisions/index.d.ts +35 -14
  76. package/dist/decisions/index.js +3625 -1140
  77. package/dist/decisions/index.js.map +1 -1
  78. package/dist/decisionsClient.d.ts +6 -12
  79. package/dist/decisionsClient.js +235 -37
  80. package/dist/decisionsClient.js.map +1 -1
  81. package/dist/edges/index.d.ts +48 -87
  82. package/dist/edges/index.js +3625 -1140
  83. package/dist/edges/index.js.map +1 -1
  84. package/dist/embeddingsClient.d.ts +106 -0
  85. package/dist/embeddingsClient.js +731 -0
  86. package/dist/embeddingsClient.js.map +1 -0
  87. package/dist/eventingClient.d.ts +96 -0
  88. package/dist/eventingClient.js +728 -0
  89. package/dist/eventingClient.js.map +1 -0
  90. package/dist/events.js +6 -3
  91. package/dist/events.js.map +1 -1
  92. package/dist/eventsCore.d.ts +3 -1
  93. package/dist/eventsCore.js +222 -14
  94. package/dist/eventsCore.js.map +1 -1
  95. package/dist/evidence/index.d.ts +25 -4
  96. package/dist/evidence/index.js +3625 -1140
  97. package/dist/evidence/index.js.map +1 -1
  98. package/dist/evidenceClient.d.ts +2 -0
  99. package/dist/evidenceClient.js +222 -14
  100. package/dist/evidenceClient.js.map +1 -1
  101. package/dist/facade/context.d.ts +2 -1
  102. package/dist/facade/context.js +25 -16
  103. package/dist/facade/context.js.map +1 -1
  104. package/dist/functionSurface.d.ts +143 -0
  105. package/dist/functionSurface.js +1204 -0
  106. package/dist/functionSurface.js.map +1 -0
  107. package/dist/functionSurfaceClient.d.ts +8 -0
  108. package/dist/functionSurfaceClient.js +1204 -0
  109. package/dist/functionSurfaceClient.js.map +1 -0
  110. package/dist/gatewayFacades.d.ts +64 -46
  111. package/dist/gatewayFacades.js +461 -128
  112. package/dist/gatewayFacades.js.map +1 -1
  113. package/dist/graphAnalysisClient.d.ts +192 -0
  114. package/dist/graphAnalysisClient.js +799 -0
  115. package/dist/graphAnalysisClient.js.map +1 -0
  116. package/dist/graphClient.d.ts +8 -13
  117. package/dist/graphClient.js +244 -45
  118. package/dist/graphClient.js.map +1 -1
  119. package/dist/graphIntel.d.ts +4 -0
  120. package/dist/graphIntel.js +3 -0
  121. package/dist/graphIntel.js.map +1 -0
  122. package/dist/graphIntelligence.d.ts +2 -0
  123. package/dist/graphIntelligence.js +47 -0
  124. package/dist/graphIntelligence.js.map +1 -0
  125. package/dist/graphRecommendationsClient.d.ts +56 -0
  126. package/dist/graphRecommendationsClient.js +664 -0
  127. package/dist/graphRecommendationsClient.js.map +1 -0
  128. package/dist/graphStateClassifierClient.d.ts +73 -0
  129. package/dist/graphStateClassifierClient.js +716 -0
  130. package/dist/graphStateClassifierClient.js.map +1 -0
  131. package/dist/harnessClient.d.ts +15 -24
  132. package/dist/harnessClient.js +235 -42
  133. package/dist/harnessClient.js.map +1 -1
  134. package/dist/identityClient.d.ts +97 -11
  135. package/dist/identityClient.js +409 -33
  136. package/dist/identityClient.js.map +1 -1
  137. package/dist/index.d.ts +30 -5
  138. package/dist/index.js +4272 -1225
  139. package/dist/index.js.map +1 -1
  140. package/dist/infisicalRuntime.d.ts +43 -0
  141. package/dist/infisicalRuntime.js +346 -0
  142. package/dist/infisicalRuntime.js.map +1 -0
  143. package/dist/jobsClient.d.ts +98 -0
  144. package/dist/jobsClient.js +726 -0
  145. package/dist/jobsClient.js.map +1 -0
  146. package/dist/learningClient.d.ts +8 -6
  147. package/dist/learningClient.js +252 -44
  148. package/dist/learningClient.js.map +1 -1
  149. package/dist/lenses/index.d.ts +77 -38
  150. package/dist/lenses/index.js +3625 -1140
  151. package/dist/lenses/index.js.map +1 -1
  152. package/dist/mcpClient.d.ts +28 -0
  153. package/dist/mcpClient.js +669 -0
  154. package/dist/mcpClient.js.map +1 -0
  155. package/dist/modelRuntimeClient.d.ts +72 -0
  156. package/dist/modelRuntimeClient.js +704 -0
  157. package/dist/modelRuntimeClient.js.map +1 -0
  158. package/dist/nodes/index.d.ts +64 -21
  159. package/dist/nodes/index.js +3625 -1140
  160. package/dist/nodes/index.js.map +1 -1
  161. package/dist/ontologies/index.d.ts +54 -32
  162. package/dist/ontologies/index.js +3625 -1140
  163. package/dist/ontologies/index.js.map +1 -1
  164. package/dist/ontologyClient.d.ts +19 -25
  165. package/dist/ontologyClient.js +258 -40
  166. package/dist/ontologyClient.js.map +1 -1
  167. package/dist/ontologyLinksClient.d.ts +71 -0
  168. package/dist/ontologyLinksClient.js +697 -0
  169. package/dist/ontologyLinksClient.js.map +1 -0
  170. package/dist/orgGraphSearchClient.d.ts +85 -0
  171. package/dist/orgGraphSearchClient.js +672 -0
  172. package/dist/orgGraphSearchClient.js.map +1 -0
  173. package/dist/packsClient.d.ts +11 -23
  174. package/dist/packsClient.js +234 -46
  175. package/dist/packsClient.js.map +1 -1
  176. package/dist/policyClient.d.ts +13 -10
  177. package/dist/policyClient.js +243 -25
  178. package/dist/policyClient.js.map +1 -1
  179. package/dist/questions/index.d.ts +25 -4
  180. package/dist/questions/index.js +3625 -1140
  181. package/dist/questions/index.js.map +1 -1
  182. package/dist/realtime/index.d.ts +1 -1
  183. package/dist/reportsClient.d.ts +9 -7
  184. package/dist/reportsClient.js +281 -53
  185. package/dist/reportsClient.js.map +1 -1
  186. package/dist/schemaClient.d.ts +5 -3
  187. package/dist/schemaClient.js +235 -29
  188. package/dist/schemaClient.js.map +1 -1
  189. package/dist/sdkSurface.d.ts +8 -3
  190. package/dist/sdkSurface.js +10 -6
  191. package/dist/sdkSurface.js.map +1 -1
  192. package/dist/secrets.d.ts +1 -0
  193. package/dist/secrets.js +3 -0
  194. package/dist/secrets.js.map +1 -0
  195. package/dist/sourcesClient.d.ts +2 -0
  196. package/dist/sourcesClient.js +222 -14
  197. package/dist/sourcesClient.js.map +1 -1
  198. package/dist/telemetryClient.d.ts +94 -0
  199. package/dist/telemetryClient.js +741 -0
  200. package/dist/telemetryClient.js.map +1 -0
  201. package/dist/toolRegistryClient.d.ts +115 -0
  202. package/dist/toolRegistryClient.js +767 -0
  203. package/dist/toolRegistryClient.js.map +1 -0
  204. package/dist/topics/index.d.ts +36 -9
  205. package/dist/topics/index.js +3627 -1140
  206. package/dist/topics/index.js.map +1 -1
  207. package/dist/topicsClient.d.ts +4 -0
  208. package/dist/topicsClient.js +237 -24
  209. package/dist/topicsClient.js.map +1 -1
  210. package/dist/types.d.ts +5 -0
  211. package/dist/version.d.ts +1 -1
  212. package/dist/version.js +1 -1
  213. package/dist/version.js.map +1 -1
  214. package/dist/workflowClient.d.ts +58 -40
  215. package/dist/workflowClient.js +243 -58
  216. package/dist/workflowClient.js.map +1 -1
  217. package/dist/worktrees/index.d.ts +70 -33
  218. package/dist/worktrees/index.js +3625 -1140
  219. package/dist/worktrees/index.js.map +1 -1
  220. package/package.json +13 -3
  221. package/dist/client-B6aWUUwp.d.ts +0 -2552
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/contracts/lens-filter.contract.ts"],"names":[],"mappings":"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","file":"lensFilter.js","sourcesContent":["/**\n * Lens Filter Criteria Contract\n *\n * Version-discriminated filter DSL for lenses. Each filter criteria document\n * carries a `version` and `kind` discriminator so future shapes can coexist\n * without schema migrations. The Convex `filterCriteria` field remains v.any()\n * — all type enforcement happens here at the TypeScript contract layer.\n *\n * Forward-compatibility guarantees:\n * - `version` field: new versions add fields, never remove or rename existing ones\n * - `kind` field: new filter kinds (temporal, confidence-range) can be added\n * without touching taxonomy code paths\n * - `entityTypeFilters` array items are open to extension in future versions\n * - Resolution logic switches on `version` + `kind` to select the right resolver\n *\n * @module lucern/contracts/src/lens-filter\n */\n\n// ---------------------------------------------------------------------------\n// V1: Taxonomy Filter — entity type + subtype matching\n// ---------------------------------------------------------------------------\n\n/**\n * A single entity type filter entry. Matches nodes whose `nodeType` equals\n * `entityTypeValue`, optionally further narrowed by subtype membership.\n *\n * V2 will add `propertyMatchers` here for arbitrary JSON Schema facet queries.\n */\nexport type EntityTypeFilterV1 = {\n /** References ontologyVersion.entityTypes[].value, e.g. \"company\" */\n entityTypeValue: string;\n\n /** Optional subtype narrowing. If omitted or empty, all subtypes match. */\n subtypeValues?: string[];\n};\n\n/**\n * Optional scope to restrict which ontology the filter resolves against.\n * If omitted, resolution uses whatever ontology is active in the workspace.\n */\nexport type OntologyScope = {\n /** Restrict to a specific ontology by key, e.g. \"vc-investment\" */\n ontologyKey?: string;\n};\n\n/**\n * Taxonomy filter criteria v1: entity type + subtype matching over ontology.\n */\nexport type TaxonomyFilterCriteriaV1 = {\n version: 1;\n kind: \"taxonomy\";\n entityTypeFilters: EntityTypeFilterV1[];\n ontologyScope?: OntologyScope;\n};\n\n// ---------------------------------------------------------------------------\n// Union: All filter criteria versions and kinds\n// ---------------------------------------------------------------------------\n\n/**\n * Discriminated union of all supported filter criteria.\n * Resolution logic switches on `version` + `kind`.\n *\n * To add a new filter kind:\n * 1. Define a new type (e.g., TemporalFilterCriteriaV1)\n * 2. Add it to this union\n * 3. Add a resolver in taxonomy-filter.ts\n * 4. No schema migration needed — filterCriteria is v.any()\n */\nexport type LensFilterCriteria = TaxonomyFilterCriteriaV1;\n// Future: | TemporalFilterCriteriaV1 | ConfidenceRangeFilterCriteriaV1 | ...\n\n// ---------------------------------------------------------------------------\n// Type guards\n// ---------------------------------------------------------------------------\n\nexport function isLensFilterCriteria(\n value: unknown\n): value is LensFilterCriteria {\n if (!value || typeof value !== \"object\") return false;\n const obj = value as Record<string, unknown>;\n return typeof obj.version === \"number\" && typeof obj.kind === \"string\";\n}\n\nexport function isTaxonomyFilterCriteriaV1(\n value: unknown\n): value is TaxonomyFilterCriteriaV1 {\n if (!isLensFilterCriteria(value)) return false;\n return value.version === 1 && value.kind === \"taxonomy\";\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nexport type FilterValidationResult =\n | { valid: true }\n | { valid: false; errors: string[] };\n\n/**\n * Validate a filter criteria document at the contract layer.\n * This runs before persisting to Convex.\n */\nexport function validateFilterCriteria(\n value: unknown\n): FilterValidationResult {\n if (value === undefined || value === null) {\n return { valid: true }; // filterCriteria is optional\n }\n\n if (!isLensFilterCriteria(value)) {\n return {\n valid: false,\n errors: [\n 'filterCriteria must have numeric \"version\" and string \"kind\" fields',\n ],\n };\n }\n\n if (isTaxonomyFilterCriteriaV1(value)) {\n return validateTaxonomyFilterV1(value);\n }\n\n // Cast to access properties — TypeScript narrows to `never` when all union\n // members are exhausted, but at runtime unknown version/kind combos are possible.\n const raw = value as { version: number; kind: string };\n return {\n valid: false,\n errors: [\n `Unsupported filter criteria: version=${raw.version}, kind=${raw.kind}`,\n ],\n };\n}\n\nfunction validateTaxonomyFilterV1(\n criteria: TaxonomyFilterCriteriaV1\n): FilterValidationResult {\n const errors: string[] = [];\n\n if (!Array.isArray(criteria.entityTypeFilters)) {\n errors.push(\"entityTypeFilters must be an array\");\n return { valid: false, errors };\n }\n\n if (criteria.entityTypeFilters.length === 0) {\n errors.push(\"entityTypeFilters must contain at least one entry\");\n return { valid: false, errors };\n }\n\n for (let i = 0; i < criteria.entityTypeFilters.length; i++) {\n const filter = criteria.entityTypeFilters[i];\n if (!filter || typeof filter.entityTypeValue !== \"string\") {\n errors.push(\n `entityTypeFilters[${i}].entityTypeValue must be a non-empty string`\n );\n continue;\n }\n if (filter.entityTypeValue.trim().length === 0) {\n errors.push(\n `entityTypeFilters[${i}].entityTypeValue must be a non-empty string`\n );\n }\n if (\n filter.subtypeValues !== undefined &&\n !Array.isArray(filter.subtypeValues)\n ) {\n errors.push(`entityTypeFilters[${i}].subtypeValues must be an array`);\n }\n }\n\n if (criteria.ontologyScope !== undefined) {\n if (\n typeof criteria.ontologyScope !== \"object\" ||\n criteria.ontologyScope === null\n ) {\n errors.push(\"ontologyScope must be an object\");\n }\n }\n\n return errors.length === 0\n ? { valid: true }\n : { valid: false, errors };\n}\n"]}
1
+ {"version":3,"sources":["../../src/contracts/lens-filter.contract.ts"],"names":[],"mappings":"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","file":"lensFilter.js","sourcesContent":["/**\n * Lens Filter Criteria Contract\n *\n * Version-discriminated filter DSL for lenses. Each filter criteria document\n * carries a `version` and `kind` discriminator so future shapes can coexist\n * without schema migrations. The Convex `filterCriteria` field remains v.any()\n * — all type enforcement happens here at the TypeScript contract layer.\n *\n * Forward-compatibility guarantees:\n * - `version` field: new versions add fields, never remove or rename existing ones\n * - `kind` field: new filter kinds (temporal, confidence-range) can be added\n * without touching taxonomy code paths\n * - `entityTypeFilters` array items are open to extension in future versions\n * - Resolution logic switches on `version` + `kind` to select the right resolver\n *\n * @module lucern/contracts/src/lens-filter\n */\n\n// ---------------------------------------------------------------------------\n// V1: Taxonomy Filter — entity type + subtype matching\n// ---------------------------------------------------------------------------\n\n/**\n * A single entity type filter entry. Matches nodes whose `nodeType` equals\n * `entityTypeValue`, optionally further narrowed by subtype membership.\n *\n * V2 will add `propertyMatchers` here for arbitrary JSON Schema facet queries.\n */\nexport type EntityTypeFilterV1 = {\n /** References ontologyVersion.entityTypes[].value, e.g. \"company\" */\n entityTypeValue: string;\n\n /** Optional subtype narrowing. If omitted or empty, all subtypes match. */\n subtypeValues?: string[];\n};\n\n/**\n * Optional scope to restrict which ontology the filter resolves against.\n * If omitted, resolution uses whatever ontology is active in the workspace.\n */\nexport type OntologyScope = {\n /** Restrict to a specific ontology by key, e.g. \"vc-investment\" */\n ontologyKey?: string;\n};\n\n/**\n * Taxonomy filter criteria v1: entity type + subtype matching over ontology.\n */\nexport type TaxonomyFilterCriteriaV1 = {\n version: 1;\n kind: \"taxonomy\";\n entityTypeFilters: EntityTypeFilterV1[];\n ontologyScope?: OntologyScope;\n};\n\n// ---------------------------------------------------------------------------\n// Union: All filter criteria versions and kinds\n// ---------------------------------------------------------------------------\n\n/**\n * Discriminated union of all supported filter criteria.\n * Resolution logic switches on `version` + `kind`.\n *\n * To add a new filter kind:\n * 1. Define a new type (e.g., TemporalFilterCriteriaV1)\n * 2. Add it to this union\n * 3. Add a resolver in taxonomy-filter.ts\n * 4. No schema migration needed — filterCriteria is v.any()\n */\nexport type LensFilterCriteria = TaxonomyFilterCriteriaV1;\n// Future: | TemporalFilterCriteriaV1 | ConfidenceRangeFilterCriteriaV1 | ...\n\n// ---------------------------------------------------------------------------\n// Type guards\n// ---------------------------------------------------------------------------\n\nexport function isLensFilterCriteria(\n value: unknown\n): value is LensFilterCriteria {\n return isRecord(value) && typeof value.version === \"number\" && typeof value.kind === \"string\";\n}\n\nexport function isTaxonomyFilterCriteriaV1(\n value: unknown\n): value is TaxonomyFilterCriteriaV1 {\n if (!isLensFilterCriteria(value)) return false;\n return value.version === 1 && value.kind === \"taxonomy\";\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nexport type FilterValidationResult =\n | { valid: true }\n | { valid: false; errors: string[] };\n\n/**\n * Validate a filter criteria document at the contract layer.\n * This runs before persisting to Convex.\n */\nexport function validateFilterCriteria(\n value: unknown\n): FilterValidationResult {\n if (value === undefined || value === null) {\n return { valid: true }; // filterCriteria is optional\n }\n\n if (!isLensFilterCriteria(value)) {\n return {\n valid: false,\n errors: [\n 'filterCriteria must have numeric \"version\" and string \"kind\" fields',\n ],\n };\n }\n\n if (isTaxonomyFilterCriteriaV1(value)) {\n return validateTaxonomyFilterV1(value);\n }\n\n // Cast to access properties — TypeScript narrows to `never` when all union\n // members are exhausted, but at runtime unknown version/kind combos are possible.\n const raw = value as { version: number; kind: string };\n return {\n valid: false,\n errors: [\n `Unsupported filter criteria: version=${raw.version}, kind=${raw.kind}`,\n ],\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction validateTaxonomyFilterV1(\n criteria: TaxonomyFilterCriteriaV1\n): FilterValidationResult {\n const errors: string[] = [];\n\n if (!Array.isArray(criteria.entityTypeFilters)) {\n errors.push(\"entityTypeFilters must be an array\");\n return { valid: false, errors };\n }\n\n if (criteria.entityTypeFilters.length === 0) {\n errors.push(\"entityTypeFilters must contain at least one entry\");\n return { valid: false, errors };\n }\n\n for (let i = 0; i < criteria.entityTypeFilters.length; i++) {\n const filter = criteria.entityTypeFilters[i];\n if (!filter || typeof filter.entityTypeValue !== \"string\") {\n errors.push(\n `entityTypeFilters[${i}].entityTypeValue must be a non-empty string`\n );\n continue;\n }\n if (filter.entityTypeValue.trim().length === 0) {\n errors.push(\n `entityTypeFilters[${i}].entityTypeValue must be a non-empty string`\n );\n }\n if (\n filter.subtypeValues !== undefined &&\n !Array.isArray(filter.subtypeValues)\n ) {\n errors.push(`entityTypeFilters[${i}].subtypeValues must be an array`);\n }\n }\n\n if (criteria.ontologyScope !== undefined) {\n if (\n typeof criteria.ontologyScope !== \"object\" ||\n criteria.ontologyScope === null\n ) {\n errors.push(\"ontologyScope must be an object\");\n }\n }\n\n return errors.length === 0\n ? { valid: true }\n : { valid: false, errors };\n}\n"]}
@@ -1,8 +1,6 @@
1
1
  // src/contracts/lens-filter.contract.ts
2
2
  function isLensFilterCriteria(value) {
3
- if (!value || typeof value !== "object") return false;
4
- const obj = value;
5
- return typeof obj.version === "number" && typeof obj.kind === "string";
3
+ return isRecord(value) && typeof value.version === "number" && typeof value.kind === "string";
6
4
  }
7
5
  function isTaxonomyFilterCriteriaV1(value) {
8
6
  if (!isLensFilterCriteria(value)) return false;
@@ -31,6 +29,9 @@ function validateFilterCriteria(value) {
31
29
  ]
32
30
  };
33
31
  }
32
+ function isRecord(value) {
33
+ return value !== null && typeof value === "object" && !Array.isArray(value);
34
+ }
34
35
  function validateTaxonomyFilterV1(criteria) {
35
36
  const errors = [];
36
37
  if (!Array.isArray(criteria.entityTypeFilters)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/contracts/lens-filter.contract.ts","../../src/contracts/lens-workflow.contract.ts"],"names":[],"mappings":"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","file":"lensWorkflow.js","sourcesContent":["/**\n * Lens Filter Criteria Contract\n *\n * Version-discriminated filter DSL for lenses. Each filter criteria document\n * carries a `version` and `kind` discriminator so future shapes can coexist\n * without schema migrations. The Convex `filterCriteria` field remains v.any()\n * — all type enforcement happens here at the TypeScript contract layer.\n *\n * Forward-compatibility guarantees:\n * - `version` field: new versions add fields, never remove or rename existing ones\n * - `kind` field: new filter kinds (temporal, confidence-range) can be added\n * without touching taxonomy code paths\n * - `entityTypeFilters` array items are open to extension in future versions\n * - Resolution logic switches on `version` + `kind` to select the right resolver\n *\n * @module lucern/contracts/src/lens-filter\n */\n\n// ---------------------------------------------------------------------------\n// V1: Taxonomy Filter — entity type + subtype matching\n// ---------------------------------------------------------------------------\n\n/**\n * A single entity type filter entry. Matches nodes whose `nodeType` equals\n * `entityTypeValue`, optionally further narrowed by subtype membership.\n *\n * V2 will add `propertyMatchers` here for arbitrary JSON Schema facet queries.\n */\nexport type EntityTypeFilterV1 = {\n /** References ontologyVersion.entityTypes[].value, e.g. \"company\" */\n entityTypeValue: string;\n\n /** Optional subtype narrowing. If omitted or empty, all subtypes match. */\n subtypeValues?: string[];\n};\n\n/**\n * Optional scope to restrict which ontology the filter resolves against.\n * If omitted, resolution uses whatever ontology is active in the workspace.\n */\nexport type OntologyScope = {\n /** Restrict to a specific ontology by key, e.g. \"vc-investment\" */\n ontologyKey?: string;\n};\n\n/**\n * Taxonomy filter criteria v1: entity type + subtype matching over ontology.\n */\nexport type TaxonomyFilterCriteriaV1 = {\n version: 1;\n kind: \"taxonomy\";\n entityTypeFilters: EntityTypeFilterV1[];\n ontologyScope?: OntologyScope;\n};\n\n// ---------------------------------------------------------------------------\n// Union: All filter criteria versions and kinds\n// ---------------------------------------------------------------------------\n\n/**\n * Discriminated union of all supported filter criteria.\n * Resolution logic switches on `version` + `kind`.\n *\n * To add a new filter kind:\n * 1. Define a new type (e.g., TemporalFilterCriteriaV1)\n * 2. Add it to this union\n * 3. Add a resolver in taxonomy-filter.ts\n * 4. No schema migration needed — filterCriteria is v.any()\n */\nexport type LensFilterCriteria = TaxonomyFilterCriteriaV1;\n// Future: | TemporalFilterCriteriaV1 | ConfidenceRangeFilterCriteriaV1 | ...\n\n// ---------------------------------------------------------------------------\n// Type guards\n// ---------------------------------------------------------------------------\n\nexport function isLensFilterCriteria(\n value: unknown\n): value is LensFilterCriteria {\n if (!value || typeof value !== \"object\") return false;\n const obj = value as Record<string, unknown>;\n return typeof obj.version === \"number\" && typeof obj.kind === \"string\";\n}\n\nexport function isTaxonomyFilterCriteriaV1(\n value: unknown\n): value is TaxonomyFilterCriteriaV1 {\n if (!isLensFilterCriteria(value)) return false;\n return value.version === 1 && value.kind === \"taxonomy\";\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nexport type FilterValidationResult =\n | { valid: true }\n | { valid: false; errors: string[] };\n\n/**\n * Validate a filter criteria document at the contract layer.\n * This runs before persisting to Convex.\n */\nexport function validateFilterCriteria(\n value: unknown\n): FilterValidationResult {\n if (value === undefined || value === null) {\n return { valid: true }; // filterCriteria is optional\n }\n\n if (!isLensFilterCriteria(value)) {\n return {\n valid: false,\n errors: [\n 'filterCriteria must have numeric \"version\" and string \"kind\" fields',\n ],\n };\n }\n\n if (isTaxonomyFilterCriteriaV1(value)) {\n return validateTaxonomyFilterV1(value);\n }\n\n // Cast to access properties — TypeScript narrows to `never` when all union\n // members are exhausted, but at runtime unknown version/kind combos are possible.\n const raw = value as { version: number; kind: string };\n return {\n valid: false,\n errors: [\n `Unsupported filter criteria: version=${raw.version}, kind=${raw.kind}`,\n ],\n };\n}\n\nfunction validateTaxonomyFilterV1(\n criteria: TaxonomyFilterCriteriaV1\n): FilterValidationResult {\n const errors: string[] = [];\n\n if (!Array.isArray(criteria.entityTypeFilters)) {\n errors.push(\"entityTypeFilters must be an array\");\n return { valid: false, errors };\n }\n\n if (criteria.entityTypeFilters.length === 0) {\n errors.push(\"entityTypeFilters must contain at least one entry\");\n return { valid: false, errors };\n }\n\n for (let i = 0; i < criteria.entityTypeFilters.length; i++) {\n const filter = criteria.entityTypeFilters[i];\n if (!filter || typeof filter.entityTypeValue !== \"string\") {\n errors.push(\n `entityTypeFilters[${i}].entityTypeValue must be a non-empty string`\n );\n continue;\n }\n if (filter.entityTypeValue.trim().length === 0) {\n errors.push(\n `entityTypeFilters[${i}].entityTypeValue must be a non-empty string`\n );\n }\n if (\n filter.subtypeValues !== undefined &&\n !Array.isArray(filter.subtypeValues)\n ) {\n errors.push(`entityTypeFilters[${i}].subtypeValues must be an array`);\n }\n }\n\n if (criteria.ontologyScope !== undefined) {\n if (\n typeof criteria.ontologyScope !== \"object\" ||\n criteria.ontologyScope === null\n ) {\n errors.push(\"ontologyScope must be an object\");\n }\n }\n\n return errors.length === 0\n ? { valid: true }\n : { valid: false, errors };\n}\n","/**\n * Canonical lens workflow contract shared across schema, SDK, and MCP surfaces.\n */\n\n// Re-export filter criteria types for consumers who import from lens-workflow\nexport type {\n LensFilterCriteria,\n TaxonomyFilterCriteriaV1,\n EntityTypeFilterV1,\n OntologyScope,\n FilterValidationResult,\n} from \"./lens-filter.contract\";\nexport {\n validateFilterCriteria,\n isLensFilterCriteria,\n isTaxonomyFilterCriteriaV1,\n} from \"./lens-filter.contract\";\n\nexport const LENS_PERSPECTIVE_TYPES = [\n \"investigation\",\n \"monitoring\",\n \"analysis\",\n \"comparison\",\n \"taxonomy\",\n] as const;\n\nexport type LensPerspectiveType = (typeof LENS_PERSPECTIVE_TYPES)[number];\n\nexport const LENS_STATUSES = [\"draft\", \"active\", \"archived\"] as const;\n\nexport type LensStatus = (typeof LENS_STATUSES)[number];\n\nexport const LENS_TASK_TEMPLATE_PRIORITIES = [\n \"critical\",\n \"high\",\n \"medium\",\n \"low\",\n] as const;\n\nexport type LensTaskTemplatePriority =\n (typeof LENS_TASK_TEMPLATE_PRIORITIES)[number];\n\nexport type LensLooseMetadata = Record<string, unknown>;\n\nexport type LensPromptTemplateReference = {\n key: string;\n promptRef: string;\n phase?: string;\n role?: string;\n version?: string;\n required?: boolean;\n metadata?: LensLooseMetadata;\n};\n\nexport type LensWorkflowStepTemplate = {\n key: string;\n title: string;\n description?: string;\n promptTemplateKey?: string;\n taskTemplateKeys?: string[];\n metadata?: LensLooseMetadata;\n};\n\nexport type LensWorkflowTemplate = {\n key: string;\n name: string;\n description?: string;\n steps: LensWorkflowStepTemplate[];\n metadata?: LensLooseMetadata;\n};\n\nexport type LensTaskTemplate = {\n key: string;\n title: string;\n description?: string;\n priority?: LensTaskTemplatePriority;\n phase?: string;\n metadata?: LensLooseMetadata;\n};\n\nexport type LensQuestionTemplate = {\n key: string;\n text: string;\n priority?: LensTaskTemplatePriority;\n linkedBeliefKey?: string;\n metadata?: LensLooseMetadata;\n};\n\nexport type LensBranchMigrationSuggestion = {\n recommendedTool: \"create_lens\";\n perspectiveType: LensPerspectiveType;\n message: string;\n suggestedPayload: {\n name: string;\n description?: string;\n topicId?: string;\n workspaceId?: string;\n perspectiveType: LensPerspectiveType;\n };\n};\n\nexport const BRANCH_DEPRECATION_MESSAGE =\n \"Branches are deprecated for operational framing. Create a workspace-scoped lens instead.\";\n\nexport type DeprecatedBranchMetadata = {\n deprecated: true;\n deprecationMessage: string;\n lensSuggestion: LensBranchMigrationSuggestion;\n};\n\nexport function inferLensPerspectiveTypeFromBranchSchema(\n schema?: string | null\n): LensPerspectiveType {\n const normalized = schema?.trim().toLowerCase();\n if (normalized === \"phase\") {\n return \"monitoring\";\n }\n if (normalized === \"axis\" || normalized === \"dimension\") {\n return \"comparison\";\n }\n if (normalized === \"track\") {\n return \"investigation\";\n }\n return \"analysis\";\n}\n\nexport function migrateBranchToLens(args: {\n name: string;\n description?: string;\n topicId?: string;\n workspaceId?: string;\n schema?: string | null;\n}): LensBranchMigrationSuggestion {\n const perspectiveType = inferLensPerspectiveTypeFromBranchSchema(args.schema);\n return {\n recommendedTool: \"create_lens\",\n perspectiveType,\n message:\n \"Branches are deprecated for operational framing. Create a workspace-scoped lens with the suggested payload instead.\",\n suggestedPayload: {\n name: args.name,\n description: args.description,\n topicId: args.topicId,\n workspaceId: args.workspaceId,\n perspectiveType,\n },\n };\n}\n\nexport function buildDeprecatedBranchMetadata(args: {\n name: string;\n description?: string;\n topicId?: string;\n workspaceId?: string;\n schema?: string | null;\n}): DeprecatedBranchMetadata {\n return {\n deprecated: true,\n deprecationMessage: BRANCH_DEPRECATION_MESSAGE,\n lensSuggestion: migrateBranchToLens(args),\n };\n}\n"]}
1
+ {"version":3,"sources":["../../src/contracts/lens-filter.contract.ts","../../src/contracts/lens-workflow.contract.ts"],"names":[],"mappings":"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","file":"lensWorkflow.js","sourcesContent":["/**\n * Lens Filter Criteria Contract\n *\n * Version-discriminated filter DSL for lenses. Each filter criteria document\n * carries a `version` and `kind` discriminator so future shapes can coexist\n * without schema migrations. The Convex `filterCriteria` field remains v.any()\n * — all type enforcement happens here at the TypeScript contract layer.\n *\n * Forward-compatibility guarantees:\n * - `version` field: new versions add fields, never remove or rename existing ones\n * - `kind` field: new filter kinds (temporal, confidence-range) can be added\n * without touching taxonomy code paths\n * - `entityTypeFilters` array items are open to extension in future versions\n * - Resolution logic switches on `version` + `kind` to select the right resolver\n *\n * @module lucern/contracts/src/lens-filter\n */\n\n// ---------------------------------------------------------------------------\n// V1: Taxonomy Filter — entity type + subtype matching\n// ---------------------------------------------------------------------------\n\n/**\n * A single entity type filter entry. Matches nodes whose `nodeType` equals\n * `entityTypeValue`, optionally further narrowed by subtype membership.\n *\n * V2 will add `propertyMatchers` here for arbitrary JSON Schema facet queries.\n */\nexport type EntityTypeFilterV1 = {\n /** References ontologyVersion.entityTypes[].value, e.g. \"company\" */\n entityTypeValue: string;\n\n /** Optional subtype narrowing. If omitted or empty, all subtypes match. */\n subtypeValues?: string[];\n};\n\n/**\n * Optional scope to restrict which ontology the filter resolves against.\n * If omitted, resolution uses whatever ontology is active in the workspace.\n */\nexport type OntologyScope = {\n /** Restrict to a specific ontology by key, e.g. \"vc-investment\" */\n ontologyKey?: string;\n};\n\n/**\n * Taxonomy filter criteria v1: entity type + subtype matching over ontology.\n */\nexport type TaxonomyFilterCriteriaV1 = {\n version: 1;\n kind: \"taxonomy\";\n entityTypeFilters: EntityTypeFilterV1[];\n ontologyScope?: OntologyScope;\n};\n\n// ---------------------------------------------------------------------------\n// Union: All filter criteria versions and kinds\n// ---------------------------------------------------------------------------\n\n/**\n * Discriminated union of all supported filter criteria.\n * Resolution logic switches on `version` + `kind`.\n *\n * To add a new filter kind:\n * 1. Define a new type (e.g., TemporalFilterCriteriaV1)\n * 2. Add it to this union\n * 3. Add a resolver in taxonomy-filter.ts\n * 4. No schema migration needed — filterCriteria is v.any()\n */\nexport type LensFilterCriteria = TaxonomyFilterCriteriaV1;\n// Future: | TemporalFilterCriteriaV1 | ConfidenceRangeFilterCriteriaV1 | ...\n\n// ---------------------------------------------------------------------------\n// Type guards\n// ---------------------------------------------------------------------------\n\nexport function isLensFilterCriteria(\n value: unknown\n): value is LensFilterCriteria {\n return isRecord(value) && typeof value.version === \"number\" && typeof value.kind === \"string\";\n}\n\nexport function isTaxonomyFilterCriteriaV1(\n value: unknown\n): value is TaxonomyFilterCriteriaV1 {\n if (!isLensFilterCriteria(value)) return false;\n return value.version === 1 && value.kind === \"taxonomy\";\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nexport type FilterValidationResult =\n | { valid: true }\n | { valid: false; errors: string[] };\n\n/**\n * Validate a filter criteria document at the contract layer.\n * This runs before persisting to Convex.\n */\nexport function validateFilterCriteria(\n value: unknown\n): FilterValidationResult {\n if (value === undefined || value === null) {\n return { valid: true }; // filterCriteria is optional\n }\n\n if (!isLensFilterCriteria(value)) {\n return {\n valid: false,\n errors: [\n 'filterCriteria must have numeric \"version\" and string \"kind\" fields',\n ],\n };\n }\n\n if (isTaxonomyFilterCriteriaV1(value)) {\n return validateTaxonomyFilterV1(value);\n }\n\n // Cast to access properties — TypeScript narrows to `never` when all union\n // members are exhausted, but at runtime unknown version/kind combos are possible.\n const raw = value as { version: number; kind: string };\n return {\n valid: false,\n errors: [\n `Unsupported filter criteria: version=${raw.version}, kind=${raw.kind}`,\n ],\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction validateTaxonomyFilterV1(\n criteria: TaxonomyFilterCriteriaV1\n): FilterValidationResult {\n const errors: string[] = [];\n\n if (!Array.isArray(criteria.entityTypeFilters)) {\n errors.push(\"entityTypeFilters must be an array\");\n return { valid: false, errors };\n }\n\n if (criteria.entityTypeFilters.length === 0) {\n errors.push(\"entityTypeFilters must contain at least one entry\");\n return { valid: false, errors };\n }\n\n for (let i = 0; i < criteria.entityTypeFilters.length; i++) {\n const filter = criteria.entityTypeFilters[i];\n if (!filter || typeof filter.entityTypeValue !== \"string\") {\n errors.push(\n `entityTypeFilters[${i}].entityTypeValue must be a non-empty string`\n );\n continue;\n }\n if (filter.entityTypeValue.trim().length === 0) {\n errors.push(\n `entityTypeFilters[${i}].entityTypeValue must be a non-empty string`\n );\n }\n if (\n filter.subtypeValues !== undefined &&\n !Array.isArray(filter.subtypeValues)\n ) {\n errors.push(`entityTypeFilters[${i}].subtypeValues must be an array`);\n }\n }\n\n if (criteria.ontologyScope !== undefined) {\n if (\n typeof criteria.ontologyScope !== \"object\" ||\n criteria.ontologyScope === null\n ) {\n errors.push(\"ontologyScope must be an object\");\n }\n }\n\n return errors.length === 0\n ? { valid: true }\n : { valid: false, errors };\n}\n","/**\n * Canonical lens workflow contract shared across schema, SDK, and MCP surfaces.\n */\n\n// Re-export filter criteria types for consumers who import from lens-workflow\nexport type {\n LensFilterCriteria,\n TaxonomyFilterCriteriaV1,\n EntityTypeFilterV1,\n OntologyScope,\n FilterValidationResult,\n} from \"./lens-filter.contract\";\nexport {\n validateFilterCriteria,\n isLensFilterCriteria,\n isTaxonomyFilterCriteriaV1,\n} from \"./lens-filter.contract\";\n\nexport const LENS_PERSPECTIVE_TYPES = [\n \"investigation\",\n \"monitoring\",\n \"analysis\",\n \"comparison\",\n \"taxonomy\",\n] as const;\n\nexport type LensPerspectiveType = (typeof LENS_PERSPECTIVE_TYPES)[number];\n\nexport const LENS_STATUSES = [\"draft\", \"active\", \"archived\"] as const;\n\nexport type LensStatus = (typeof LENS_STATUSES)[number];\n\nexport const LENS_TASK_TEMPLATE_PRIORITIES = [\n \"critical\",\n \"high\",\n \"medium\",\n \"low\",\n] as const;\n\nexport type LensTaskTemplatePriority =\n (typeof LENS_TASK_TEMPLATE_PRIORITIES)[number];\n\nexport type LensLooseMetadata = Record<string, unknown>;\n\nexport type LensPromptTemplateReference = {\n key: string;\n promptRef: string;\n phase?: string;\n role?: string;\n version?: string;\n required?: boolean;\n metadata?: LensLooseMetadata;\n};\n\nexport type LensWorkflowStepTemplate = {\n key: string;\n title: string;\n description?: string;\n promptTemplateKey?: string;\n taskTemplateKeys?: string[];\n metadata?: LensLooseMetadata;\n};\n\nexport type LensWorkflowTemplate = {\n key: string;\n name: string;\n description?: string;\n steps: LensWorkflowStepTemplate[];\n metadata?: LensLooseMetadata;\n};\n\nexport type LensTaskTemplate = {\n key: string;\n title: string;\n description?: string;\n priority?: LensTaskTemplatePriority;\n phase?: string;\n metadata?: LensLooseMetadata;\n};\n\nexport type LensQuestionTemplate = {\n key: string;\n text: string;\n priority?: LensTaskTemplatePriority;\n linkedBeliefKey?: string;\n metadata?: LensLooseMetadata;\n};\n\nexport type LensBranchMigrationSuggestion = {\n recommendedTool: \"create_lens\";\n perspectiveType: LensPerspectiveType;\n message: string;\n suggestedPayload: {\n name: string;\n description?: string;\n topicId?: string;\n workspaceId?: string;\n perspectiveType: LensPerspectiveType;\n };\n};\n\nexport const BRANCH_DEPRECATION_MESSAGE =\n \"Branches are deprecated for operational framing. Create a workspace-scoped lens instead.\";\n\nexport type DeprecatedBranchMetadata = {\n deprecated: true;\n deprecationMessage: string;\n lensSuggestion: LensBranchMigrationSuggestion;\n};\n\nexport function inferLensPerspectiveTypeFromBranchSchema(\n schema?: string | null\n): LensPerspectiveType {\n const normalized = schema?.trim().toLowerCase();\n if (normalized === \"phase\") {\n return \"monitoring\";\n }\n if (normalized === \"axis\" || normalized === \"dimension\") {\n return \"comparison\";\n }\n if (normalized === \"track\") {\n return \"investigation\";\n }\n return \"analysis\";\n}\n\nexport function migrateBranchToLens(args: {\n name: string;\n description?: string;\n topicId?: string;\n workspaceId?: string;\n schema?: string | null;\n}): LensBranchMigrationSuggestion {\n const perspectiveType = inferLensPerspectiveTypeFromBranchSchema(args.schema);\n return {\n recommendedTool: \"create_lens\",\n perspectiveType,\n message:\n \"Branches are deprecated for operational framing. Create a workspace-scoped lens with the suggested payload instead.\",\n suggestedPayload: {\n name: args.name,\n description: args.description,\n topicId: args.topicId,\n workspaceId: args.workspaceId,\n perspectiveType,\n },\n };\n}\n\nexport function buildDeprecatedBranchMetadata(args: {\n name: string;\n description?: string;\n topicId?: string;\n workspaceId?: string;\n schema?: string | null;\n}): DeprecatedBranchMetadata {\n return {\n deprecated: true,\n deprecationMessage: BRANCH_DEPRECATION_MESSAGE,\n lensSuggestion: migrateBranchToLens(args),\n };\n}\n"]}
@@ -1,2 +1,47 @@
1
+ import { McpToolContract } from '@lucern/contracts/tool-contracts';
1
2
  export * from '@lucern/contracts/tool-contracts';
2
- import '@lucern/contracts/sdk-tools.contract';
3
+
4
+ declare const MCP_ALWAYS_ALLOWED_TOOL_NAMES: readonly ["identity_whoami"];
5
+ type McpToolInputSchema = {
6
+ type: "object";
7
+ properties: Record<string, unknown>;
8
+ required: string[];
9
+ };
10
+ type McpPermittedTool = {
11
+ toolName: string;
12
+ requiredRole?: string;
13
+ approvalGateId?: string;
14
+ isCore?: boolean;
15
+ category?: string;
16
+ };
17
+ type McpToolManifestEntry = {
18
+ name: string;
19
+ description: string;
20
+ inputSchema: McpToolInputSchema;
21
+ internal: boolean;
22
+ ownerModule: string;
23
+ ontologyPrimitive: McpToolContract["ontologyPrimitive"];
24
+ tier: McpToolContract["tier"];
25
+ };
26
+ type McpToolContractMap = Record<string, McpToolContract>;
27
+ type BuildMcpToolContractsOptions = {
28
+ extensions?: McpToolContractMap;
29
+ };
30
+ type McpToolVisibilityOptions = {
31
+ contracts?: McpToolContractMap;
32
+ sessionType?: "agent" | "user";
33
+ permittedTools?: readonly McpPermittedTool[] | null;
34
+ allowedTools?: readonly string[] | null;
35
+ alwaysAllowedTools?: readonly string[];
36
+ };
37
+ declare function getMcpToolExposure(toolName: string): "public" | "internal" | "none";
38
+ declare function buildMcpToolContracts(options?: BuildMcpToolContractsOptions): McpToolContractMap;
39
+ declare function mcpContractToInputSchema(contract: McpToolContract): McpToolInputSchema;
40
+ declare function mcpContractToManifestEntry(name: string, contract: McpToolContract): McpToolManifestEntry;
41
+ declare function isMcpToolAllowed(toolName: string, options?: McpToolVisibilityOptions): boolean;
42
+ declare function buildMcpToolManifest(args?: {
43
+ contracts?: McpToolContractMap;
44
+ visibility?: McpToolVisibilityOptions;
45
+ }): McpToolManifestEntry[];
46
+
47
+ export { type BuildMcpToolContractsOptions, MCP_ALWAYS_ALLOWED_TOOL_NAMES, type McpPermittedTool, type McpToolContractMap, type McpToolInputSchema, type McpToolManifestEntry, type McpToolVisibilityOptions, buildMcpToolContracts, buildMcpToolManifest, getMcpToolExposure, isMcpToolAllowed, mcpContractToInputSchema, mcpContractToManifestEntry };
@@ -1,9 +1,14 @@
1
1
  import * as tool_contracts_star from '@lucern/contracts/tool-contracts';
2
+ import { LUCERN_OPERATION_MANIFEST } from '@lucern/contracts/function-registry/manifest';
2
3
 
3
4
  var __defProp = Object.defineProperty;
4
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
7
12
  var __copyProps = (to, from, except, desc) => {
8
13
  if (from && typeof from === "object" || typeof from === "function") {
9
14
  for (let key of __getOwnPropNames(from))
@@ -16,6 +21,15 @@ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "defau
16
21
 
17
22
  // src/contracts/mcpTools.ts
18
23
  var mcpTools_exports = {};
24
+ __export(mcpTools_exports, {
25
+ MCP_ALWAYS_ALLOWED_TOOL_NAMES: () => MCP_ALWAYS_ALLOWED_TOOL_NAMES,
26
+ buildMcpToolContracts: () => buildMcpToolContracts,
27
+ buildMcpToolManifest: () => buildMcpToolManifest,
28
+ getMcpToolExposure: () => getMcpToolExposure,
29
+ isMcpToolAllowed: () => isMcpToolAllowed,
30
+ mcpContractToInputSchema: () => mcpContractToInputSchema,
31
+ mcpContractToManifestEntry: () => mcpContractToManifestEntry
32
+ });
19
33
 
20
34
  // src/contracts/tool-contracts.ts
21
35
  var tool_contracts_exports = {};
@@ -23,5 +37,99 @@ __reExport(tool_contracts_exports, tool_contracts_star);
23
37
 
24
38
  // src/contracts/mcpTools.ts
25
39
  __reExport(mcpTools_exports, tool_contracts_exports);
40
+ var OPERATION_MANIFEST = LUCERN_OPERATION_MANIFEST;
41
+ var MCP_ALWAYS_ALLOWED_TOOL_NAMES = ["identity_whoami"];
42
+ function getMcpToolExposure(toolName) {
43
+ return OPERATION_MANIFEST[toolName]?.surfaces.mcp ?? "none";
44
+ }
45
+ function decorateMcpToolContract(toolName, contract) {
46
+ const exposure = getMcpToolExposure(toolName);
47
+ if (exposure === "none") {
48
+ return null;
49
+ }
50
+ return exposure === "internal" || contract.internal ? { ...contract, internal: true } : contract;
51
+ }
52
+ function buildMcpToolContracts(options = {}) {
53
+ const merged = {
54
+ ...tool_contracts_exports.MCP_TOOL_CONTRACTS,
55
+ ...options.extensions ?? {}
56
+ };
57
+ return Object.fromEntries(
58
+ Object.entries(merged).flatMap(([toolName, contract]) => {
59
+ const decorated = decorateMcpToolContract(toolName, contract);
60
+ return decorated ? [[toolName, decorated]] : [];
61
+ })
62
+ );
63
+ }
64
+ function mcpContractToInputSchema(contract) {
65
+ const properties = {};
66
+ for (const [paramName, paramDef] of Object.entries(contract.parameters)) {
67
+ const prop = {
68
+ type: paramDef.type,
69
+ description: paramDef.description
70
+ };
71
+ if (paramDef.enum) {
72
+ prop.enum = paramDef.enum;
73
+ }
74
+ properties[paramName] = prop;
75
+ }
76
+ return {
77
+ type: "object",
78
+ properties,
79
+ required: contract.required
80
+ };
81
+ }
82
+ function mcpContractToManifestEntry(name, contract) {
83
+ return {
84
+ name,
85
+ description: contract.description,
86
+ inputSchema: mcpContractToInputSchema(contract),
87
+ internal: Boolean(contract.internal),
88
+ ownerModule: contract.ownerModule,
89
+ ontologyPrimitive: contract.ontologyPrimitive,
90
+ tier: contract.tier
91
+ };
92
+ }
93
+ function isMcpToolAllowed(toolName, options = {}) {
94
+ const contracts = options.contracts ?? buildMcpToolContracts();
95
+ const contract = contracts[toolName];
96
+ const alwaysAllowed = /* @__PURE__ */ new Set([
97
+ ...MCP_ALWAYS_ALLOWED_TOOL_NAMES,
98
+ ...options.alwaysAllowedTools ?? []
99
+ ]);
100
+ if (alwaysAllowed.has(toolName)) {
101
+ return true;
102
+ }
103
+ if (options.sessionType === "user" && contract?.internal) {
104
+ return false;
105
+ }
106
+ if (options.permittedTools !== void 0 && options.permittedTools !== null) {
107
+ return options.permittedTools.some((tool) => tool.toolName === toolName);
108
+ }
109
+ if (options.sessionType === "agent") {
110
+ if (options.allowedTools === null || options.allowedTools === void 0) {
111
+ return false;
112
+ }
113
+ return options.allowedTools.includes(toolName);
114
+ }
115
+ if (options.allowedTools === null || options.allowedTools === void 0) {
116
+ return true;
117
+ }
118
+ return options.allowedTools.includes(toolName);
119
+ }
120
+ function buildMcpToolManifest(args = {}) {
121
+ const contracts = args.contracts ?? buildMcpToolContracts();
122
+ return Object.entries(contracts).filter(([name, contract]) => {
123
+ if (args.visibility?.sessionType === "user" && contract.internal) {
124
+ return false;
125
+ }
126
+ return isMcpToolAllowed(name, {
127
+ ...args.visibility,
128
+ contracts
129
+ });
130
+ }).map(([name, contract]) => mcpContractToManifestEntry(name, contract));
131
+ }
132
+
133
+ export { MCP_ALWAYS_ALLOWED_TOOL_NAMES, buildMcpToolContracts, buildMcpToolManifest, getMcpToolExposure, isMcpToolAllowed, mcpContractToInputSchema, mcpContractToManifestEntry };
26
134
  //# sourceMappingURL=mcpTools.js.map
27
135
  //# sourceMappingURL=mcpTools.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/contracts/mcpTools.ts","../../src/contracts/tool-contracts.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAA,gBAAA,GAAA,EAAA;;;ACAA,IAAA,sBAAA,GAAA,EAAA;AAAA,UAAA,CAAA,sBAAA,EAAA,mBAAA,CAAA;;;ADAA,UAAA,CAAA,gBAAA,EAAc,sBAAA,CAAA","file":"mcpTools.js","sourcesContent":["export * from \"./tool-contracts\";\n","export * from \"@lucern/contracts/tool-contracts\";\n\n"]}
1
+ {"version":3,"sources":["../../src/contracts/mcpTools.ts","../../src/contracts/tool-contracts.ts"],"names":[],"mappings":"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","file":"mcpTools.js","sourcesContent":["export * from \"./tool-contracts\";\n\nimport { LUCERN_OPERATION_MANIFEST } from \"@lucern/contracts/function-registry/manifest\";\nimport {\n MCP_TOOL_CONTRACTS,\n type McpToolContract,\n} from \"./tool-contracts\";\n\ntype OperationManifestEntry =\n (typeof LUCERN_OPERATION_MANIFEST)[keyof typeof LUCERN_OPERATION_MANIFEST];\n\nconst OPERATION_MANIFEST = LUCERN_OPERATION_MANIFEST as Record<\n string,\n OperationManifestEntry | undefined\n>;\n\nexport const MCP_ALWAYS_ALLOWED_TOOL_NAMES = [\"identity_whoami\"] as const;\n\nexport type McpToolInputSchema = {\n type: \"object\";\n properties: Record<string, unknown>;\n required: string[];\n};\n\nexport type McpPermittedTool = {\n toolName: string;\n requiredRole?: string;\n approvalGateId?: string;\n isCore?: boolean;\n category?: string;\n};\n\nexport type McpToolManifestEntry = {\n name: string;\n description: string;\n inputSchema: McpToolInputSchema;\n internal: boolean;\n ownerModule: string;\n ontologyPrimitive: McpToolContract[\"ontologyPrimitive\"];\n tier: McpToolContract[\"tier\"];\n};\n\nexport type McpToolContractMap = Record<string, McpToolContract>;\n\nexport type BuildMcpToolContractsOptions = {\n extensions?: McpToolContractMap;\n};\n\nexport type McpToolVisibilityOptions = {\n contracts?: McpToolContractMap;\n sessionType?: \"agent\" | \"user\";\n permittedTools?: readonly McpPermittedTool[] | null;\n allowedTools?: readonly string[] | null;\n alwaysAllowedTools?: readonly string[];\n};\n\nexport function getMcpToolExposure(\n toolName: string\n): \"public\" | \"internal\" | \"none\" {\n return OPERATION_MANIFEST[toolName]?.surfaces.mcp ?? \"none\";\n}\n\nfunction decorateMcpToolContract(\n toolName: string,\n contract: McpToolContract\n): McpToolContract | null {\n const exposure = getMcpToolExposure(toolName);\n if (exposure === \"none\") {\n return null;\n }\n return exposure === \"internal\" || contract.internal\n ? { ...contract, internal: true }\n : contract;\n}\n\nexport function buildMcpToolContracts(\n options: BuildMcpToolContractsOptions = {}\n): McpToolContractMap {\n const merged = {\n ...MCP_TOOL_CONTRACTS,\n ...(options.extensions ?? {}),\n };\n\n return Object.fromEntries(\n Object.entries(merged).flatMap(([toolName, contract]) => {\n const decorated = decorateMcpToolContract(toolName, contract);\n return decorated ? [[toolName, decorated]] : [];\n })\n );\n}\n\nexport function mcpContractToInputSchema(\n contract: McpToolContract\n): McpToolInputSchema {\n const properties: Record<string, unknown> = {};\n\n for (const [paramName, paramDef] of Object.entries(contract.parameters)) {\n const prop: Record<string, unknown> = {\n type: paramDef.type,\n description: paramDef.description,\n };\n if (paramDef.enum) {\n prop.enum = paramDef.enum;\n }\n properties[paramName] = prop;\n }\n\n return {\n type: \"object\",\n properties,\n required: contract.required,\n };\n}\n\nexport function mcpContractToManifestEntry(\n name: string,\n contract: McpToolContract\n): McpToolManifestEntry {\n return {\n name,\n description: contract.description,\n inputSchema: mcpContractToInputSchema(contract),\n internal: Boolean(contract.internal),\n ownerModule: contract.ownerModule,\n ontologyPrimitive: contract.ontologyPrimitive,\n tier: contract.tier,\n };\n}\n\nexport function isMcpToolAllowed(\n toolName: string,\n options: McpToolVisibilityOptions = {}\n): boolean {\n const contracts = options.contracts ?? buildMcpToolContracts();\n const contract = contracts[toolName];\n const alwaysAllowed = new Set([\n ...MCP_ALWAYS_ALLOWED_TOOL_NAMES,\n ...(options.alwaysAllowedTools ?? []),\n ]);\n\n if (alwaysAllowed.has(toolName)) {\n return true;\n }\n if (options.sessionType === \"user\" && contract?.internal) {\n return false;\n }\n\n if (options.permittedTools !== undefined && options.permittedTools !== null) {\n return options.permittedTools.some((tool) => tool.toolName === toolName);\n }\n\n if (options.sessionType === \"agent\") {\n if (options.allowedTools === null || options.allowedTools === undefined) {\n return false;\n }\n return options.allowedTools.includes(toolName);\n }\n\n if (options.allowedTools === null || options.allowedTools === undefined) {\n return true;\n }\n return options.allowedTools.includes(toolName);\n}\n\nexport function buildMcpToolManifest(args: {\n contracts?: McpToolContractMap;\n visibility?: McpToolVisibilityOptions;\n} = {}): McpToolManifestEntry[] {\n const contracts = args.contracts ?? buildMcpToolContracts();\n return Object.entries(contracts)\n .filter(([name, contract]) => {\n if (args.visibility?.sessionType === \"user\" && contract.internal) {\n return false;\n }\n return isMcpToolAllowed(name, {\n ...args.visibility,\n contracts,\n });\n })\n .map(([name, contract]) => mcpContractToManifestEntry(name, contract));\n}\n","export * from \"@lucern/contracts/tool-contracts\";\n\n"]}
@@ -1,11 +1,13 @@
1
1
  import { PlatformGatewaySuccess } from '../coreClient.js';
2
- import { L as LucernClientConfig } from '../client-B6aWUUwp.js';
2
+ import { LucernClientConfig } from '../client.js';
3
3
  import * as v1 from '@lucern/contracts/graph/v1';
4
4
  export { v1 as graphContracts };
5
5
  import * as sdkMethods_contract from '@lucern/contracts/sdk-methods.contract';
6
6
  export { sdkMethods_contract as methodSchemas };
7
7
  import * as toolContracts from '@lucern/contracts/tool-contracts';
8
8
  export { toolContracts as toolSchemas };
9
+ import '../authContext.js';
10
+ import '../contracts/auth-session.contract.js';
9
11
  import '../types.js';
10
12
  import '../contracts/workflow-runtime.contract.js';
11
13
  import '../contracts/lens-workflow.contract.js';
@@ -13,28 +15,47 @@ import '../contracts/lens-filter.contract.js';
13
15
  import '../audiencesClient.js';
14
16
  import '../schemaClient.js';
15
17
  import '../harnessClient.js';
16
- import '../identityClient.js';
17
18
  import '../adminClient.js';
18
19
  import '../controlObjectOwnership.js';
19
20
  import '../beliefsClient.js';
20
21
  import '../opinion.js';
22
+ import '../authDeviceClient.js';
23
+ import '../mcpClient.js';
24
+ import '@lucern/contracts/mcp-gateway-boundary.contract';
25
+ import '../identityClient.js';
26
+ import '../accessControl.js';
21
27
  import '../packsClient.js';
22
- import '../customTools.js';
23
- import 'zod';
28
+ import '../toolRegistryClient.js';
29
+ import '../telemetryClient.js';
30
+ import '../jobsClient.js';
31
+ import '../modelRuntimeClient.js';
32
+ import '../graphStateClassifierClient.js';
33
+ import '../boundaryClientSurface.js';
34
+ import '../ontologyLinksClient.js';
35
+ import '../orgGraphSearchClient.js';
36
+ import '../graphRecommendationsClient.js';
37
+ import '../graphAnalysisClient.js';
38
+ import '@lucern/contracts';
39
+ import '../embeddingsClient.js';
24
40
  import '../policyClient.js';
25
41
  import '../ontologyClient.js';
26
42
  import '../contextTypes.js';
27
43
  import '../topicsClient.js';
44
+ import '../functionSurface.js';
28
45
  import '../answersClient.js';
29
46
  import '../auditClient.js';
30
47
  import '../contextClient.js';
48
+ import '../customTools.js';
49
+ import 'zod';
31
50
  import '../decisionsClient.js';
32
51
  import '../evidenceClient.js';
52
+ import '../eventingClient.js';
33
53
  import '../graphClient.js';
34
54
  import '../learningClient.js';
35
55
  import '../reportsClient.js';
36
56
  import '../sourcesClient.js';
37
57
  import '../workflowClient.js';
58
+ import '../clientHelpers.js';
38
59
 
39
60
  type ContradictionsClientConfig = LucernClientConfig;
40
61
  type ContradictionsClient = ReturnType<typeof createContradictionsClient>;