@lucern/sdk 0.2.0-alpha.7 → 0.2.0-alpha.9

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 (257) hide show
  1. package/dist/adminClient.d.ts +409 -0
  2. package/dist/adminClient.js +755 -0
  3. package/dist/adminClient.js.map +1 -0
  4. package/dist/answersClient.d.ts +23 -0
  5. package/dist/answersClient.js +333 -0
  6. package/dist/answersClient.js.map +1 -0
  7. package/dist/audiencesClient.d.ts +99 -0
  8. package/dist/audiencesClient.js +472 -0
  9. package/dist/audiencesClient.js.map +1 -0
  10. package/dist/auditClient.d.ts +29 -0
  11. package/dist/auditClient.js +386 -0
  12. package/dist/auditClient.js.map +1 -0
  13. package/dist/beliefsClient.d.ts +162 -0
  14. package/dist/beliefsClient.js +477 -0
  15. package/dist/beliefsClient.js.map +1 -0
  16. package/dist/client.d.ts +2378 -0
  17. package/dist/client.js +6134 -0
  18. package/dist/client.js.map +1 -0
  19. package/dist/contextClient.d.ts +27 -0
  20. package/dist/contextClient.js +396 -0
  21. package/dist/contextClient.js.map +1 -0
  22. package/dist/contextFacade.d.ts +2 -0
  23. package/dist/contextFacade.js +73 -0
  24. package/dist/contextFacade.js.map +1 -0
  25. package/dist/contextPackCompiler.d.ts +102 -0
  26. package/dist/contextPackCompiler.js +1091 -0
  27. package/dist/contextPackCompiler.js.map +1 -0
  28. package/dist/contextPackPolicy.d.ts +84 -0
  29. package/dist/contextPackPolicy.js +347 -0
  30. package/dist/contextPackPolicy.js.map +1 -0
  31. package/dist/contextPackSchema.d.ts +7 -0
  32. package/{src/contextPackSchema.ts → dist/contextPackSchema.js} +22 -70
  33. package/dist/contextPackSchema.js.map +1 -0
  34. package/dist/contextTypes.d.ts +135 -0
  35. package/dist/contextTypes.js +3 -0
  36. package/dist/contextTypes.js.map +1 -0
  37. package/dist/contracts/api-enums.contract.d.ts +81 -0
  38. package/dist/contracts/api-enums.contract.js +92 -0
  39. package/dist/contracts/api-enums.contract.js.map +1 -0
  40. package/dist/contracts/auth-session.contract.d.ts +55 -0
  41. package/dist/contracts/auth-session.contract.js +48 -0
  42. package/dist/contracts/auth-session.contract.js.map +1 -0
  43. package/dist/contracts/context-pack.contract.d.ts +492 -0
  44. package/dist/contracts/context-pack.contract.js +98 -0
  45. package/dist/contracts/context-pack.contract.js.map +1 -0
  46. package/dist/contracts/contextPack.d.ts +1 -0
  47. package/dist/contracts/contextPack.js +98 -0
  48. package/dist/contracts/contextPack.js.map +1 -0
  49. package/dist/contracts/index.d.ts +9 -0
  50. package/dist/contracts/index.js +4892 -0
  51. package/dist/contracts/index.js.map +1 -0
  52. package/dist/contracts/lens-filter.contract.d.ts +72 -0
  53. package/dist/contracts/lens-filter.contract.js +71 -0
  54. package/dist/contracts/lens-filter.contract.js.map +1 -0
  55. package/dist/contracts/lens-workflow.contract.d.ts +87 -0
  56. package/dist/contracts/lens-workflow.contract.js +123 -0
  57. package/dist/contracts/lens-workflow.contract.js.map +1 -0
  58. package/dist/contracts/lensFilter.d.ts +1 -0
  59. package/dist/contracts/lensFilter.js +71 -0
  60. package/dist/contracts/lensFilter.js.map +1 -0
  61. package/dist/contracts/lensWorkflow.d.ts +2 -0
  62. package/dist/contracts/lensWorkflow.js +123 -0
  63. package/dist/contracts/lensWorkflow.js.map +1 -0
  64. package/dist/contracts/mcp-tools.contract.d.ts +1 -0
  65. package/dist/contracts/mcp-tools.contract.js +2986 -0
  66. package/dist/contracts/mcp-tools.contract.js.map +1 -0
  67. package/dist/contracts/mcpTools.d.ts +1 -0
  68. package/dist/contracts/mcpTools.js +2986 -0
  69. package/dist/contracts/mcpTools.js.map +1 -0
  70. package/dist/contracts/prompt.contract.d.ts +26 -0
  71. package/dist/contracts/prompt.contract.js +12 -0
  72. package/dist/contracts/prompt.contract.js.map +1 -0
  73. package/dist/contracts/prompt.d.ts +1 -0
  74. package/dist/contracts/prompt.js +12 -0
  75. package/dist/contracts/prompt.js.map +1 -0
  76. package/dist/contracts/sdk-tools.contract.d.ts +2 -0
  77. package/dist/contracts/sdk-tools.contract.js +4134 -0
  78. package/dist/contracts/sdk-tools.contract.js.map +1 -0
  79. package/dist/contracts/sdkTools.d.ts +2 -0
  80. package/dist/contracts/sdkTools.js +4134 -0
  81. package/dist/contracts/sdkTools.js.map +1 -0
  82. package/dist/contracts/workflow-runtime.contract.d.ts +163 -0
  83. package/dist/contracts/workflow-runtime.contract.js +245 -0
  84. package/dist/contracts/workflow-runtime.contract.js.map +1 -0
  85. package/dist/contracts/workflowRuntime.d.ts +1 -0
  86. package/dist/contracts/workflowRuntime.js +245 -0
  87. package/dist/contracts/workflowRuntime.js.map +1 -0
  88. package/dist/controlObjectOwnership.d.ts +310 -0
  89. package/{src/controlObjectOwnership.ts → dist/controlObjectOwnership.js} +53 -124
  90. package/dist/controlObjectOwnership.js.map +1 -0
  91. package/dist/coreClient.d.ts +144 -0
  92. package/dist/coreClient.js +339 -0
  93. package/dist/coreClient.js.map +1 -0
  94. package/dist/customTools.d.ts +88 -0
  95. package/dist/customTools.js +248 -0
  96. package/dist/customTools.js.map +1 -0
  97. package/dist/decisionsClient.d.ts +111 -0
  98. package/dist/decisionsClient.js +522 -0
  99. package/dist/decisionsClient.js.map +1 -0
  100. package/dist/domainContext.d.ts +1 -0
  101. package/dist/domainContext.js +3 -0
  102. package/dist/domainContext.js.map +1 -0
  103. package/dist/events.d.ts +178 -0
  104. package/dist/events.js +249 -0
  105. package/dist/events.js.map +1 -0
  106. package/dist/eventsCore.d.ts +49 -0
  107. package/dist/eventsCore.js +429 -0
  108. package/dist/eventsCore.js.map +1 -0
  109. package/dist/facade/context.d.ts +18 -0
  110. package/dist/facade/context.js +73 -0
  111. package/dist/facade/context.js.map +1 -0
  112. package/dist/gatewayFacades.d.ts +591 -0
  113. package/dist/gatewayFacades.js +1953 -0
  114. package/dist/gatewayFacades.js.map +1 -0
  115. package/dist/graphClient.d.ts +271 -0
  116. package/dist/graphClient.js +698 -0
  117. package/dist/graphClient.js.map +1 -0
  118. package/dist/harnessClient.d.ts +314 -0
  119. package/dist/harnessClient.js +607 -0
  120. package/dist/harnessClient.js.map +1 -0
  121. package/dist/identityClient.d.ts +140 -0
  122. package/dist/identityClient.js +497 -0
  123. package/dist/identityClient.js.map +1 -0
  124. package/dist/index.d.ts +42 -0
  125. package/dist/index.js +11381 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/learningClient.d.ts +46 -0
  128. package/dist/learningClient.js +409 -0
  129. package/dist/learningClient.js.map +1 -0
  130. package/dist/mcpParityClient.d.ts +74 -0
  131. package/dist/mcpParityClient.js +516 -0
  132. package/dist/mcpParityClient.js.map +1 -0
  133. package/dist/mcpParitySurface.d.ts +12 -0
  134. package/{src/mcpParitySurface.ts → dist/mcpParitySurface.js} +9 -14
  135. package/dist/mcpParitySurface.js.map +1 -0
  136. package/dist/mcpTools-DPZxowDX.d.ts +254 -0
  137. package/dist/ontologyClient.d.ts +137 -0
  138. package/dist/ontologyClient.js +513 -0
  139. package/dist/ontologyClient.js.map +1 -0
  140. package/dist/packRuntime.d.ts +2 -0
  141. package/dist/packRuntime.js +3 -0
  142. package/dist/packRuntime.js.map +1 -0
  143. package/dist/packsClient.d.ts +131 -0
  144. package/dist/packsClient.js +525 -0
  145. package/dist/packsClient.js.map +1 -0
  146. package/dist/policyClient.d.ts +299 -0
  147. package/dist/policyClient.js +625 -0
  148. package/dist/policyClient.js.map +1 -0
  149. package/dist/realtime/index.d.ts +29 -0
  150. package/dist/realtime/index.js +23 -0
  151. package/dist/realtime/index.js.map +1 -0
  152. package/{src/realtime/refs.ts → dist/realtime/refs.d.ts} +5 -5
  153. package/dist/realtime/refs.js +9 -0
  154. package/dist/realtime/refs.js.map +1 -0
  155. package/dist/reportsClient.d.ts +41 -0
  156. package/dist/reportsClient.js +418 -0
  157. package/dist/reportsClient.js.map +1 -0
  158. package/dist/schemaClient.d.ts +64 -0
  159. package/dist/schemaClient.js +434 -0
  160. package/dist/schemaClient.js.map +1 -0
  161. package/dist/sdkSurface.d.ts +61 -0
  162. package/dist/sdkSurface.js +112 -0
  163. package/dist/sdkSurface.js.map +1 -0
  164. package/dist/sdkTools-CwXJDACb.d.ts +150 -0
  165. package/dist/topicsClient.d.ts +84 -0
  166. package/dist/topicsClient.js +492 -0
  167. package/dist/topicsClient.js.map +1 -0
  168. package/dist/types.d.ts +696 -0
  169. package/dist/types.js +3 -0
  170. package/dist/types.js.map +1 -0
  171. package/dist/version.d.ts +4 -0
  172. package/dist/version.js +6 -0
  173. package/dist/version.js.map +1 -0
  174. package/dist/workflowClient.d.ts +316 -0
  175. package/dist/workflowClient.js +830 -0
  176. package/dist/workflowClient.js.map +1 -0
  177. package/package.json +39 -7
  178. package/.turbo/turbo-build.log +0 -7
  179. package/.turbo/turbo-typecheck.log +0 -4
  180. package/examples/README.md +0 -69
  181. package/examples/contradiction.ts +0 -94
  182. package/examples/investigation-context.ts +0 -118
  183. package/examples/questions-and-tasks.ts +0 -55
  184. package/examples/quickstart.ts +0 -97
  185. package/examples/shared.ts +0 -318
  186. package/examples/strict-public-types.ts +0 -143
  187. package/examples/worktree-lifecycle.ts +0 -79
  188. package/src/README.md +0 -6
  189. package/src/adminClient.ts +0 -789
  190. package/src/answersClient.ts +0 -29
  191. package/src/audiencesClient.ts +0 -209
  192. package/src/auditClient.ts +0 -50
  193. package/src/beliefsClient.ts +0 -319
  194. package/src/client.ts +0 -2647
  195. package/src/contextClient.ts +0 -130
  196. package/src/contextFacade.ts +0 -15
  197. package/src/contextPackCompiler.ts +0 -828
  198. package/src/contextTypes.ts +0 -153
  199. package/src/contracts/api-enums.contract.ts +0 -202
  200. package/src/contracts/auth-session.contract.ts +0 -109
  201. package/src/contracts/context-pack.contract.ts +0 -700
  202. package/src/contracts/contextPack.ts +0 -1
  203. package/src/contracts/index.ts +0 -10
  204. package/src/contracts/lens-filter.contract.ts +0 -183
  205. package/src/contracts/lens-workflow.contract.ts +0 -162
  206. package/src/contracts/lensFilter.ts +0 -1
  207. package/src/contracts/lensWorkflow.ts +0 -1
  208. package/src/contracts/mcp-tools.contract.ts +0 -3636
  209. package/src/contracts/mcpTools.ts +0 -1
  210. package/src/contracts/prompt.contract.ts +0 -50
  211. package/src/contracts/prompt.ts +0 -1
  212. package/src/contracts/sdk-tools.contract.ts +0 -1457
  213. package/src/contracts/sdkTools.ts +0 -1
  214. package/src/contracts/workflow-runtime.contract.ts +0 -440
  215. package/src/contracts/workflowRuntime.ts +0 -1
  216. package/src/coreClient.ts +0 -570
  217. package/src/customTools.ts +0 -398
  218. package/src/decisionsClient.ts +0 -286
  219. package/src/domainContext.ts +0 -15
  220. package/src/events.ts +0 -531
  221. package/src/eventsCore.ts +0 -168
  222. package/src/facade/beliefs.ts +0 -83
  223. package/src/facade/context.ts +0 -110
  224. package/src/facade/contradictions.ts +0 -29
  225. package/src/facade/edges.ts +0 -30
  226. package/src/facade/events.ts +0 -23
  227. package/src/facade/evidence.ts +0 -41
  228. package/src/facade/graph.ts +0 -38
  229. package/src/facade/identity.ts +0 -16
  230. package/src/facade/ontologies.ts +0 -34
  231. package/src/facade/questions.ts +0 -59
  232. package/src/facade/search.ts +0 -16
  233. package/src/facade/tasks.ts +0 -37
  234. package/src/facade/topics.ts +0 -42
  235. package/src/facade/webhooks.ts +0 -58
  236. package/src/facade/worktrees.ts +0 -51
  237. package/src/gatewayFacades.ts +0 -1666
  238. package/src/graphClient.ts +0 -529
  239. package/src/harnessClient.ts +0 -585
  240. package/src/identityClient.ts +0 -278
  241. package/src/index.ts +0 -49
  242. package/src/learningClient.ts +0 -95
  243. package/src/mcpParityClient.ts +0 -240
  244. package/src/ontologyClient.ts +0 -275
  245. package/src/packRuntime.ts +0 -3
  246. package/src/packsClient.ts +0 -260
  247. package/src/policyClient.ts +0 -572
  248. package/src/promptCatalog.ts +0 -1
  249. package/src/realtime/index.ts +0 -51
  250. package/src/reportsClient.ts +0 -99
  251. package/src/schemaClient.ts +0 -129
  252. package/src/sdkSurface.ts +0 -190
  253. package/src/topicsClient.ts +0 -243
  254. package/src/types.ts +0 -807
  255. package/src/version.ts +0 -2
  256. package/src/workflowClient.ts +0 -826
  257. package/tsconfig.json +0 -9
@@ -0,0 +1,248 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/customTools.ts
4
+ var DEFAULT_CUSTOM_NAMESPACE = "custom";
5
+ var RESERVED_NAMESPACES = /* @__PURE__ */ new Set(["lucern"]);
6
+ var CustomToolRegistryError = class extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "CustomToolRegistryError";
10
+ }
11
+ };
12
+ var customToolRegistry = /* @__PURE__ */ new Map();
13
+ function normalizeSegment(value, field) {
14
+ const normalized = value.trim();
15
+ if (!normalized) {
16
+ throw new CustomToolRegistryError(`Custom tool ${field} is required.`);
17
+ }
18
+ if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(normalized)) {
19
+ throw new CustomToolRegistryError(
20
+ `Invalid custom tool ${field}: "${value}". Use letters, numbers, "_" or "-".`
21
+ );
22
+ }
23
+ return normalized;
24
+ }
25
+ function normalizeNamespace(namespace) {
26
+ const resolved = normalizeSegment(
27
+ namespace ?? DEFAULT_CUSTOM_NAMESPACE,
28
+ "namespace"
29
+ );
30
+ if (RESERVED_NAMESPACES.has(resolved.toLowerCase())) {
31
+ throw new CustomToolRegistryError(
32
+ `Namespace "${resolved}" is reserved for platform tools.`
33
+ );
34
+ }
35
+ return resolved;
36
+ }
37
+ function normalizeName(name) {
38
+ if (name.includes(".")) {
39
+ throw new CustomToolRegistryError(
40
+ `Custom tool name "${name}" must not include "."; use namespace + name.`
41
+ );
42
+ }
43
+ return normalizeSegment(name, "name");
44
+ }
45
+ function buildFullName(namespace, shortName) {
46
+ return `${namespace}.${shortName}`;
47
+ }
48
+ function unwrapSchema(schema) {
49
+ if (schema instanceof z.ZodOptional) {
50
+ return { schema: schema.unwrap(), required: false };
51
+ }
52
+ if (schema instanceof z.ZodDefault) {
53
+ const removeDefault = schema.removeDefault;
54
+ if (typeof removeDefault === "function") {
55
+ return { schema: removeDefault.call(schema), required: false };
56
+ }
57
+ const inner = schema._def?.innerType;
58
+ return { schema: inner ?? schema, required: false };
59
+ }
60
+ return { schema, required: true };
61
+ }
62
+ function resolveParameterType(schema) {
63
+ if (schema instanceof z.ZodString) {
64
+ return { type: "string" };
65
+ }
66
+ if (schema instanceof z.ZodEnum) {
67
+ return { type: "string", enum: schema.options };
68
+ }
69
+ if (schema instanceof z.ZodNativeEnum) {
70
+ const values = Object.values(schema.enum).filter(
71
+ (value) => typeof value === "string"
72
+ );
73
+ return values.length > 0 ? { type: "string", enum: values } : { type: "string" };
74
+ }
75
+ if (schema instanceof z.ZodLiteral) {
76
+ const literalValue = schema.value;
77
+ if (typeof literalValue === "string") {
78
+ return { type: "string", enum: [literalValue] };
79
+ }
80
+ if (typeof literalValue === "number") {
81
+ return { type: "number" };
82
+ }
83
+ if (typeof literalValue === "boolean") {
84
+ return { type: "boolean" };
85
+ }
86
+ return { type: "object" };
87
+ }
88
+ if (schema instanceof z.ZodNumber) {
89
+ return { type: "number" };
90
+ }
91
+ if (schema instanceof z.ZodBoolean) {
92
+ return { type: "boolean" };
93
+ }
94
+ if (schema instanceof z.ZodArray) {
95
+ return { type: "array" };
96
+ }
97
+ return { type: "object" };
98
+ }
99
+ function schemaTypeLabel(schema) {
100
+ if (schema instanceof z.ZodString || schema instanceof z.ZodEnum) {
101
+ return "string";
102
+ }
103
+ if (schema instanceof z.ZodNumber) {
104
+ return "number";
105
+ }
106
+ if (schema instanceof z.ZodBoolean) {
107
+ return "boolean";
108
+ }
109
+ if (schema instanceof z.ZodArray) {
110
+ return "array";
111
+ }
112
+ if (schema instanceof z.ZodObject) {
113
+ return "object";
114
+ }
115
+ return "unknown";
116
+ }
117
+ function parseObjectSchema(value, fieldName) {
118
+ if (!(value instanceof z.ZodObject)) {
119
+ throw new CustomToolRegistryError(
120
+ `${fieldName} must be a Zod object schema.`
121
+ );
122
+ }
123
+ return value;
124
+ }
125
+ function deriveParameters(schema) {
126
+ const shape = schema.shape;
127
+ const parameters = {};
128
+ const required = [];
129
+ for (const [key, raw] of Object.entries(shape)) {
130
+ const { schema: unwrapped, required: isRequired } = unwrapSchema(
131
+ raw
132
+ );
133
+ const parameterType = resolveParameterType(unwrapped);
134
+ parameters[key] = {
135
+ type: parameterType.type,
136
+ description: raw.description ?? `${key} parameter`,
137
+ ...parameterType.enum ? { enum: parameterType.enum } : {}
138
+ };
139
+ if (isRequired) {
140
+ required.push(key);
141
+ }
142
+ }
143
+ return { parameters, required };
144
+ }
145
+ function deriveResponse(schema) {
146
+ if (schema instanceof z.ZodObject) {
147
+ const fields = Object.fromEntries(
148
+ Object.entries(schema.shape).map(([key, value]) => {
149
+ const zodValue = value;
150
+ const label = schemaTypeLabel(unwrapSchema(zodValue).schema);
151
+ const description = zodValue.description ?? "custom output field";
152
+ return [key, `${label} \u2014 ${description}`];
153
+ })
154
+ );
155
+ return {
156
+ description: "Custom tool result payload",
157
+ fields
158
+ };
159
+ }
160
+ return {
161
+ description: "Custom tool result payload",
162
+ fields: {
163
+ result: `${schemaTypeLabel(schema)} \u2014 custom output payload`
164
+ }
165
+ };
166
+ }
167
+ function buildContract(fullName, namespace, registration, inputSchema) {
168
+ const { parameters, required } = deriveParameters(inputSchema);
169
+ return {
170
+ name: fullName,
171
+ description: registration.description,
172
+ parameters,
173
+ required,
174
+ response: deriveResponse(registration.outputSchema),
175
+ ownerModule: registration.ownerModule ?? `${namespace}-extension`,
176
+ ontologyPrimitive: registration.ontologyPrimitive ?? "task",
177
+ tier: registration.tier ?? "workhorse"
178
+ };
179
+ }
180
+ function registerCustomTool(registration, options = {}) {
181
+ const namespace = normalizeNamespace(registration.namespace);
182
+ const shortName = normalizeName(registration.name);
183
+ const fullName = buildFullName(namespace, shortName);
184
+ if (customToolRegistry.has(fullName) && !options.replace) {
185
+ throw new CustomToolRegistryError(
186
+ `Custom tool "${fullName}" is already registered.`
187
+ );
188
+ }
189
+ const inputSchema = parseObjectSchema(
190
+ registration.inputSchema,
191
+ "inputSchema"
192
+ );
193
+ const outputSchema = registration.outputSchema;
194
+ const contract = buildContract(
195
+ fullName,
196
+ namespace,
197
+ registration,
198
+ inputSchema
199
+ );
200
+ const metadata = {
201
+ category: registration.metadata?.category,
202
+ tags: registration.metadata?.tags ?? [],
203
+ requiredScopes: registration.metadata?.requiredScopes ?? ["custom:execute"]
204
+ };
205
+ const registered = {
206
+ fullName,
207
+ namespace,
208
+ shortName,
209
+ metadata,
210
+ contract,
211
+ inputSchema,
212
+ outputSchema,
213
+ invoke: async (input, context) => {
214
+ const parsedInput = inputSchema.parse(input);
215
+ const rawOutput = await registration.handler(parsedInput, context);
216
+ return outputSchema.parse(rawOutput);
217
+ }
218
+ };
219
+ customToolRegistry.set(fullName, registered);
220
+ return registered;
221
+ }
222
+ function unregisterCustomTool(fullName) {
223
+ return customToolRegistry.delete(fullName.trim());
224
+ }
225
+ function getRegisteredCustomTool(fullName) {
226
+ return customToolRegistry.get(fullName.trim());
227
+ }
228
+ function listRegisteredCustomTools() {
229
+ return [...customToolRegistry.values()].sort(
230
+ (left, right) => left.fullName.localeCompare(right.fullName)
231
+ );
232
+ }
233
+ function clearRegisteredCustomTools() {
234
+ customToolRegistry.clear();
235
+ }
236
+ async function invokeRegisteredCustomTool(fullName, params, context) {
237
+ const registered = getRegisteredCustomTool(fullName);
238
+ if (!registered) {
239
+ throw new CustomToolRegistryError(
240
+ `Custom tool "${fullName}" is not registered.`
241
+ );
242
+ }
243
+ return registered.invoke(params, context);
244
+ }
245
+
246
+ export { CustomToolRegistryError, clearRegisteredCustomTools, getRegisteredCustomTool, invokeRegisteredCustomTool, listRegisteredCustomTools, registerCustomTool, unregisterCustomTool };
247
+ //# sourceMappingURL=customTools.js.map
248
+ //# sourceMappingURL=customTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/customTools.ts"],"names":[],"mappings":"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","file":"customTools.js","sourcesContent":["import { z } from \"zod\";\nimport type {\n McpParameterDef,\n McpResponseDef,\n McpToolContract,\n} from \"./contracts/mcpTools\";\nimport type { JsonObject } from \"./types\";\n\n/** Default namespace assigned to custom tools when none is specified. */\nconst DEFAULT_CUSTOM_NAMESPACE = \"custom\";\n\n/** Namespace strings reserved for platform-internal tools. */\nconst RESERVED_NAMESPACES = new Set([\"lucern\"]);\n\ntype AnyZodObject = z.ZodObject<z.ZodRawShape>;\n\n/** Origin of a custom tool invocation (SDK call or MCP request). */\nexport type CustomToolInvocationSource = \"sdk\" | \"mcp\";\n\n/** Runtime context passed to a custom tool handler during invocation. */\nexport type CustomToolInvocationContext = {\n source: CustomToolInvocationSource;\n};\n\n/** Optional metadata attached to a custom tool registration. */\nexport type CustomToolMetadata = {\n category?: string;\n tags?: string[];\n requiredScopes?: string[];\n};\n\n/** Input descriptor for registering a custom tool with its schemas and handler. */\nexport type CustomToolRegistration<\n TInput extends AnyZodObject = AnyZodObject,\n TOutput extends z.ZodTypeAny = z.ZodTypeAny,\n> = {\n namespace?: string;\n name: string;\n description: string;\n inputSchema: TInput;\n outputSchema: TOutput;\n handler: (\n input: z.infer<TInput>,\n context: CustomToolInvocationContext\n ) => Promise<z.infer<TOutput>> | z.infer<TOutput>;\n metadata?: CustomToolMetadata;\n ownerModule?: string;\n ontologyPrimitive?: McpToolContract[\"ontologyPrimitive\"];\n tier?: McpToolContract[\"tier\"];\n};\n\n/** A fully resolved custom tool entry stored in the in-memory registry. */\nexport type RegisteredCustomTool = {\n fullName: string;\n namespace: string;\n shortName: string;\n metadata: CustomToolMetadata;\n contract: McpToolContract;\n inputSchema: AnyZodObject;\n outputSchema: z.ZodTypeAny;\n invoke: (\n input: JsonObject,\n context: CustomToolInvocationContext\n ) => Promise<unknown>;\n};\n\n/** Error thrown when custom tool registration or invocation fails validation. */\nexport class CustomToolRegistryError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CustomToolRegistryError\";\n }\n}\n\nconst customToolRegistry = new Map<string, RegisteredCustomTool>();\n\nfunction normalizeSegment(value: string, field: \"namespace\" | \"name\"): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new CustomToolRegistryError(`Custom tool ${field} is required.`);\n }\n if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(normalized)) {\n throw new CustomToolRegistryError(\n `Invalid custom tool ${field}: \"${value}\". Use letters, numbers, \"_\" or \"-\".`\n );\n }\n return normalized;\n}\n\nfunction normalizeNamespace(namespace?: string): string {\n const resolved = normalizeSegment(\n namespace ?? DEFAULT_CUSTOM_NAMESPACE,\n \"namespace\"\n );\n if (RESERVED_NAMESPACES.has(resolved.toLowerCase())) {\n throw new CustomToolRegistryError(\n `Namespace \"${resolved}\" is reserved for platform tools.`\n );\n }\n return resolved;\n}\n\nfunction normalizeName(name: string): string {\n if (name.includes(\".\")) {\n throw new CustomToolRegistryError(\n `Custom tool name \"${name}\" must not include \".\"; use namespace + name.`\n );\n }\n return normalizeSegment(name, \"name\");\n}\n\nfunction buildFullName(namespace: string, shortName: string): string {\n return `${namespace}.${shortName}`;\n}\n\nfunction unwrapSchema(schema: z.ZodTypeAny): {\n schema: z.ZodTypeAny;\n required: boolean;\n} {\n if (schema instanceof z.ZodOptional) {\n return { schema: schema.unwrap(), required: false };\n }\n if (schema instanceof z.ZodDefault) {\n const removeDefault = (\n schema as unknown as { removeDefault?: () => z.ZodTypeAny }\n ).removeDefault;\n if (typeof removeDefault === \"function\") {\n return { schema: removeDefault.call(schema), required: false };\n }\n const inner = (schema as unknown as { _def?: { innerType?: z.ZodTypeAny } })\n ._def?.innerType;\n return { schema: inner ?? schema, required: false };\n }\n return { schema, required: true };\n}\n\nfunction resolveParameterType(schema: z.ZodTypeAny): {\n type: McpParameterDef[\"type\"];\n enum?: string[];\n} {\n if (schema instanceof z.ZodString) {\n return { type: \"string\" };\n }\n if (schema instanceof z.ZodEnum) {\n return { type: \"string\", enum: schema.options };\n }\n if (schema instanceof z.ZodNativeEnum) {\n const values = Object.values(schema.enum).filter(\n (value): value is string => typeof value === \"string\"\n );\n return values.length > 0\n ? { type: \"string\", enum: values }\n : { type: \"string\" };\n }\n if (schema instanceof z.ZodLiteral) {\n const literalValue = schema.value;\n if (typeof literalValue === \"string\") {\n return { type: \"string\", enum: [literalValue] };\n }\n if (typeof literalValue === \"number\") {\n return { type: \"number\" };\n }\n if (typeof literalValue === \"boolean\") {\n return { type: \"boolean\" };\n }\n return { type: \"object\" };\n }\n if (schema instanceof z.ZodNumber) {\n return { type: \"number\" };\n }\n if (schema instanceof z.ZodBoolean) {\n return { type: \"boolean\" };\n }\n if (schema instanceof z.ZodArray) {\n return { type: \"array\" };\n }\n return { type: \"object\" };\n}\n\nfunction schemaTypeLabel(schema: z.ZodTypeAny): string {\n if (schema instanceof z.ZodString || schema instanceof z.ZodEnum) {\n return \"string\";\n }\n if (schema instanceof z.ZodNumber) {\n return \"number\";\n }\n if (schema instanceof z.ZodBoolean) {\n return \"boolean\";\n }\n if (schema instanceof z.ZodArray) {\n return \"array\";\n }\n if (schema instanceof z.ZodObject) {\n return \"object\";\n }\n return \"unknown\";\n}\n\nfunction parseObjectSchema<TInput extends AnyZodObject>(\n value: TInput,\n fieldName: string\n): TInput {\n if (!(value instanceof z.ZodObject)) {\n throw new CustomToolRegistryError(\n `${fieldName} must be a Zod object schema.`\n );\n }\n return value;\n}\n\nfunction deriveParameters(schema: AnyZodObject): {\n parameters: Record<string, McpParameterDef>;\n required: string[];\n} {\n const shape = schema.shape;\n const parameters: Record<string, McpParameterDef> = {};\n const required: string[] = [];\n\n for (const [key, raw] of Object.entries(shape)) {\n const { schema: unwrapped, required: isRequired } = unwrapSchema(\n raw as z.ZodTypeAny\n );\n const parameterType = resolveParameterType(unwrapped);\n parameters[key] = {\n type: parameterType.type,\n description: (raw as z.ZodTypeAny).description ?? `${key} parameter`,\n ...(parameterType.enum ? { enum: parameterType.enum } : {}),\n };\n if (isRequired) {\n required.push(key);\n }\n }\n\n return { parameters, required };\n}\n\nfunction deriveResponse(schema: z.ZodTypeAny): McpResponseDef {\n if (schema instanceof z.ZodObject) {\n const fields = Object.fromEntries(\n Object.entries(schema.shape).map(([key, value]) => {\n const zodValue = value as z.ZodTypeAny;\n const label = schemaTypeLabel(unwrapSchema(zodValue).schema);\n const description = zodValue.description ?? \"custom output field\";\n return [key, `${label} — ${description}`];\n })\n );\n return {\n description: \"Custom tool result payload\",\n fields,\n };\n }\n\n return {\n description: \"Custom tool result payload\",\n fields: {\n result: `${schemaTypeLabel(schema)} — custom output payload`,\n },\n };\n}\n\nfunction buildContract<\n TInput extends AnyZodObject,\n TOutput extends z.ZodTypeAny,\n>(\n fullName: string,\n namespace: string,\n registration: CustomToolRegistration<TInput, TOutput>,\n inputSchema: TInput\n): McpToolContract {\n const { parameters, required } = deriveParameters(inputSchema);\n return {\n name: fullName,\n description: registration.description,\n parameters,\n required,\n response: deriveResponse(registration.outputSchema),\n ownerModule: registration.ownerModule ?? `${namespace}-extension`,\n ontologyPrimitive: registration.ontologyPrimitive ?? \"task\",\n tier: registration.tier ?? \"workhorse\",\n };\n}\n\n/**\n * Register a custom SDK tool in the in-memory registry.\n * @param registration - The tool definition including name, schemas, and handler.\n * @param options - Optional flags; set `replace` to overwrite an existing registration.\n * @returns The fully resolved registered tool entry.\n */\nexport function registerCustomTool<\n TInput extends AnyZodObject,\n TOutput extends z.ZodTypeAny,\n>(\n registration: CustomToolRegistration<TInput, TOutput>,\n options: { replace?: boolean } = {}\n): RegisteredCustomTool {\n const namespace = normalizeNamespace(registration.namespace);\n const shortName = normalizeName(registration.name);\n const fullName = buildFullName(namespace, shortName);\n\n if (customToolRegistry.has(fullName) && !options.replace) {\n throw new CustomToolRegistryError(\n `Custom tool \"${fullName}\" is already registered.`\n );\n }\n\n const inputSchema = parseObjectSchema(\n registration.inputSchema,\n \"inputSchema\"\n );\n const outputSchema = registration.outputSchema;\n const contract = buildContract(\n fullName,\n namespace,\n registration,\n inputSchema\n );\n const metadata: CustomToolMetadata = {\n category: registration.metadata?.category,\n tags: registration.metadata?.tags ?? [],\n requiredScopes: registration.metadata?.requiredScopes ?? [\"custom:execute\"],\n };\n\n const registered: RegisteredCustomTool = {\n fullName,\n namespace,\n shortName,\n metadata,\n contract,\n inputSchema,\n outputSchema,\n invoke: async (input, context) => {\n const parsedInput = inputSchema.parse(input);\n const rawOutput = await registration.handler(parsedInput, context);\n return outputSchema.parse(rawOutput);\n },\n };\n\n customToolRegistry.set(fullName, registered);\n return registered;\n}\n\n/**\n * Remove a custom SDK tool from the registry.\n * @param fullName - Fully qualified tool name (`namespace.name`).\n * @returns `true` if the tool was found and removed, `false` otherwise.\n */\nexport function unregisterCustomTool(fullName: string): boolean {\n return customToolRegistry.delete(fullName.trim());\n}\n\n/**\n * Get a custom SDK tool by fully qualified name.\n * @param fullName - Fully qualified tool name (`namespace.name`).\n * @returns The registered tool entry, or `undefined` if not found.\n */\nexport function getRegisteredCustomTool(\n fullName: string\n): RegisteredCustomTool | undefined {\n return customToolRegistry.get(fullName.trim());\n}\n\n/**\n * List all registered custom SDK tools, sorted alphabetically by full name.\n * @returns An array of all registered tool entries.\n */\nexport function listRegisteredCustomTools(): RegisteredCustomTool[] {\n return [...customToolRegistry.values()].sort((left, right) =>\n left.fullName.localeCompare(right.fullName)\n );\n}\n\n/**\n * Clear the registered custom tool registry.\n */\nexport function clearRegisteredCustomTools(): void {\n customToolRegistry.clear();\n}\n\n/**\n * Invoke a registered custom SDK tool by fully qualified name.\n * @param fullName - Fully qualified tool name (`namespace.name`).\n * @param params - JSON-serializable input parameters for the tool handler.\n * @param context - Invocation context indicating the call source.\n * @returns The validated output from the tool handler.\n */\nexport async function invokeRegisteredCustomTool(\n fullName: string,\n params: JsonObject,\n context: CustomToolInvocationContext\n): Promise<unknown> {\n const registered = getRegisteredCustomTool(fullName);\n if (!registered) {\n throw new CustomToolRegistryError(\n `Custom tool \"${fullName}\" is not registered.`\n );\n }\n return registered.invoke(params, context);\n}\n"]}
@@ -0,0 +1,111 @@
1
+ import { TopicIdentifierInput, ListJudgmentsResponse, GetJudgmentResponse, JudgmentReadinessResponse, JudgmentCalibrationResponse, ListResult, PendingJudgmentOutcomeRecord, JudgmentTransitionAuditIntegrityResponse, RecordJudgmentResponse, RecordJudgmentOutcomeResponse } from './types.js';
2
+ export { PendingJudgmentOutcomeReviewResponse } from './types.js';
3
+ import { GatewayClientConfig, PlatformGatewaySuccess } from './coreClient.js';
4
+ export { LucernApiError } from './coreClient.js';
5
+ import './contracts/workflow-runtime.contract.js';
6
+ import './contracts/lens-workflow.contract.js';
7
+ import './contracts/lens-filter.contract.js';
8
+
9
+ /** Configuration for the decisions client. */
10
+ type DecisionsClientConfig = GatewayClientConfig;
11
+ /** Input for recording a new judgment (irreversible decision commitment). */
12
+ type RecordJudgmentInput = {
13
+ title: string;
14
+ summary?: string;
15
+ rationale: string;
16
+ topicId?: string;
17
+ confidence?: number;
18
+ decisionConfidence?: number;
19
+ judgmentType?: string;
20
+ decisionType?: string;
21
+ beliefIds?: string[];
22
+ keyUncertainties?: string[];
23
+ alternativesConsidered?: string[];
24
+ decisionMakers?: string[];
25
+ companyId?: string;
26
+ amount?: number;
27
+ valuation?: number;
28
+ terms?: string;
29
+ themeIds?: string[];
30
+ } & TopicIdentifierInput;
31
+ /** Filter parameters for listing judgments within a topic scope. */
32
+ type ListJudgmentsInput = {
33
+ topicId?: string;
34
+ includeArchived?: boolean;
35
+ limit?: number;
36
+ } & TopicIdentifierInput;
37
+ /** Input for recording the real-world outcome of a judgment. */
38
+ type RecordJudgmentOutcomeInput = {
39
+ outcome: "pending" | "successful" | "unsuccessful" | "mixed" | "unknown" | "too_early";
40
+ outcomeNotes?: string;
41
+ notes?: string;
42
+ };
43
+ /** Input for retrieving judgment calibration analytics. */
44
+ type GetJudgmentCalibrationInput = {
45
+ topicId?: string;
46
+ } & TopicIdentifierInput;
47
+ /** Input for listing judgments still awaiting outcome review. */
48
+ type ListPendingJudgmentOutcomeReviewInput = {
49
+ topicId?: string;
50
+ } & TopicIdentifierInput;
51
+ /** Input for checking audit integrity of judgment state transitions. */
52
+ type GetJudgmentTransitionAuditIntegrityInput = {
53
+ topicId?: string;
54
+ judgmentId?: string;
55
+ includePassing?: boolean;
56
+ } & TopicIdentifierInput;
57
+ /**
58
+ * Create the judgments client for decision lifecycle operations.
59
+ * @param config - Gateway transport configuration.
60
+ * @returns An object with methods to manage judgments, outcomes, readiness, and calibration.
61
+ */
62
+ declare function createDecisionsClient(config?: DecisionsClientConfig): {
63
+ /**
64
+ * List judgments for a topic scope.
65
+ */
66
+ listJudgments(query: ListJudgmentsInput): Promise<PlatformGatewaySuccess<ListJudgmentsResponse>>;
67
+ /**
68
+ * Get a single judgment by identifier.
69
+ */
70
+ getJudgment(judgmentId: string): Promise<PlatformGatewaySuccess<GetJudgmentResponse>>;
71
+ /**
72
+ * Get readiness signals for creating a judgment.
73
+ */
74
+ getJudgmentReadiness(query: {
75
+ topicId?: string;
76
+ } & TopicIdentifierInput): Promise<PlatformGatewaySuccess<JudgmentReadinessResponse>>;
77
+ /**
78
+ * Get calibration analytics for judgment outcomes.
79
+ */
80
+ getJudgmentCalibration(query: GetJudgmentCalibrationInput): Promise<PlatformGatewaySuccess<JudgmentCalibrationResponse>>;
81
+ /**
82
+ * List judgments still awaiting outcome review.
83
+ */
84
+ listPendingOutcomeReviews(query: ListPendingJudgmentOutcomeReviewInput): Promise<PlatformGatewaySuccess<ListResult<PendingJudgmentOutcomeRecord, "reviews">>>;
85
+ /**
86
+ * @deprecated Use listPendingOutcomeReviews.
87
+ */
88
+ listPendingJudgmentOutcomeReview(query: ListPendingJudgmentOutcomeReviewInput): Promise<PlatformGatewaySuccess<ListResult<PendingJudgmentOutcomeRecord, "reviews">>>;
89
+ /**
90
+ * Get audit integrity checks for judgment transitions.
91
+ */
92
+ getJudgmentTransitionAuditIntegrity(query: GetJudgmentTransitionAuditIntegrityInput): Promise<PlatformGatewaySuccess<JudgmentTransitionAuditIntegrityResponse>>;
93
+ /**
94
+ * Create a judgment.
95
+ */
96
+ createJudgment(input: RecordJudgmentInput, idempotencyKey?: string): Promise<PlatformGatewaySuccess<RecordJudgmentResponse>>;
97
+ /**
98
+ * @deprecated Use createJudgment.
99
+ */
100
+ recordJudgment(input: RecordJudgmentInput, idempotencyKey?: string): Promise<PlatformGatewaySuccess<RecordJudgmentResponse>>;
101
+ /**
102
+ * Update the outcome for an existing judgment.
103
+ */
104
+ updateJudgmentOutcome(judgmentId: string, input: RecordJudgmentOutcomeInput, idempotencyKey?: string): Promise<PlatformGatewaySuccess<RecordJudgmentOutcomeResponse>>;
105
+ /**
106
+ * @deprecated Use updateJudgmentOutcome.
107
+ */
108
+ recordJudgmentOutcome(judgmentId: string, input: RecordJudgmentOutcomeInput, idempotencyKey?: string): Promise<PlatformGatewaySuccess<RecordJudgmentOutcomeResponse>>;
109
+ };
110
+
111
+ export { type DecisionsClientConfig, type GetJudgmentCalibrationInput, GetJudgmentResponse, type GetJudgmentTransitionAuditIntegrityInput, JudgmentCalibrationResponse, JudgmentReadinessResponse, JudgmentTransitionAuditIntegrityResponse, type ListJudgmentsInput, ListJudgmentsResponse, type ListPendingJudgmentOutcomeReviewInput, PlatformGatewaySuccess, type RecordJudgmentInput, type RecordJudgmentOutcomeInput, RecordJudgmentOutcomeResponse, RecordJudgmentResponse, createDecisionsClient };