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

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 (206) hide show
  1. package/.turbo/turbo-build.log +7 -0
  2. package/.turbo/turbo-typecheck.log +4 -0
  3. package/CHANGELOG.md +13 -0
  4. package/examples/README.md +69 -0
  5. package/examples/contradiction.ts +94 -0
  6. package/examples/investigation-context.ts +118 -0
  7. package/examples/questions-and-tasks.ts +55 -0
  8. package/examples/quickstart.ts +97 -0
  9. package/examples/shared.ts +318 -0
  10. package/examples/strict-public-types.ts +143 -0
  11. package/examples/worktree-lifecycle.ts +79 -0
  12. package/package.json +16 -58
  13. package/src/README.md +6 -0
  14. package/src/adminClient.ts +789 -0
  15. package/{dist/lib/platform/sdk/answersClient.d.ts → src/answersClient.ts} +17 -4
  16. package/src/audiencesClient.ts +209 -0
  17. package/src/auditClient.ts +50 -0
  18. package/src/beliefsClient.ts +319 -0
  19. package/src/client.ts +2647 -0
  20. package/src/contextClient.ts +130 -0
  21. package/{dist/lib/platform/sdk/contextFacade.d.ts → src/contextFacade.ts} +6 -1
  22. package/src/contextPackCompiler.ts +828 -0
  23. package/src/contextPackSchema.ts +251 -0
  24. package/src/contextTypes.ts +153 -0
  25. package/src/contracts/api-enums.contract.ts +202 -0
  26. package/src/contracts/auth-session.contract.ts +109 -0
  27. package/src/contracts/context-pack.contract.ts +700 -0
  28. package/src/contracts/contextPack.ts +1 -0
  29. package/src/contracts/index.ts +10 -0
  30. package/src/contracts/lens-filter.contract.ts +183 -0
  31. package/src/contracts/lens-workflow.contract.ts +162 -0
  32. package/src/contracts/lensFilter.ts +1 -0
  33. package/src/contracts/lensWorkflow.ts +1 -0
  34. package/src/contracts/mcp-tools.contract.ts +3636 -0
  35. package/src/contracts/mcpTools.ts +1 -0
  36. package/src/contracts/prompt.contract.ts +50 -0
  37. package/src/contracts/prompt.ts +1 -0
  38. package/src/contracts/sdk-tools.contract.ts +1457 -0
  39. package/src/contracts/sdkTools.ts +1 -0
  40. package/src/contracts/workflow-runtime.contract.ts +440 -0
  41. package/src/contracts/workflowRuntime.ts +1 -0
  42. package/src/controlObjectOwnership.ts +286 -0
  43. package/src/coreClient.ts +570 -0
  44. package/src/customTools.ts +398 -0
  45. package/src/decisionsClient.ts +286 -0
  46. package/src/domainContext.ts +15 -0
  47. package/src/events.ts +531 -0
  48. package/src/eventsCore.ts +168 -0
  49. package/src/facade/beliefs.ts +83 -0
  50. package/src/facade/context.ts +110 -0
  51. package/src/facade/contradictions.ts +29 -0
  52. package/src/facade/edges.ts +30 -0
  53. package/src/facade/events.ts +23 -0
  54. package/src/facade/evidence.ts +41 -0
  55. package/src/facade/graph.ts +38 -0
  56. package/src/facade/identity.ts +16 -0
  57. package/src/facade/ontologies.ts +34 -0
  58. package/src/facade/questions.ts +59 -0
  59. package/src/facade/search.ts +16 -0
  60. package/src/facade/tasks.ts +37 -0
  61. package/src/facade/topics.ts +42 -0
  62. package/src/facade/webhooks.ts +58 -0
  63. package/src/facade/worktrees.ts +51 -0
  64. package/src/gatewayFacades.ts +1666 -0
  65. package/src/graphClient.ts +529 -0
  66. package/src/harnessClient.ts +585 -0
  67. package/src/identityClient.ts +278 -0
  68. package/src/learningClient.ts +95 -0
  69. package/src/mcpParityClient.ts +240 -0
  70. package/src/mcpParitySurface.ts +70 -0
  71. package/src/ontologyClient.ts +275 -0
  72. package/src/packRuntime.ts +3 -0
  73. package/src/packsClient.ts +260 -0
  74. package/src/policyClient.ts +572 -0
  75. package/src/realtime/index.ts +51 -0
  76. package/src/realtime/refs.ts +17 -0
  77. package/src/reportsClient.ts +99 -0
  78. package/src/schemaClient.ts +129 -0
  79. package/src/sdkSurface.ts +190 -0
  80. package/src/topicsClient.ts +243 -0
  81. package/src/types.ts +807 -0
  82. package/src/workflowClient.ts +826 -0
  83. package/tsconfig.json +9 -0
  84. package/dist/.generated +0 -2
  85. package/dist/index.d.ts +0 -3
  86. package/dist/index.js +0 -3
  87. package/dist/lib/platform/auth/credentials.d.ts +0 -5
  88. package/dist/lib/platform/auth/credentials.js +0 -40
  89. package/dist/lib/platform/sdk/adminClient.d.ts +0 -404
  90. package/dist/lib/platform/sdk/adminClient.js +0 -384
  91. package/dist/lib/platform/sdk/answersClient.js +0 -21
  92. package/dist/lib/platform/sdk/audiencesClient.d.ts +0 -93
  93. package/dist/lib/platform/sdk/audiencesClient.js +0 -111
  94. package/dist/lib/platform/sdk/auditClient.d.ts +0 -24
  95. package/dist/lib/platform/sdk/auditClient.js +0 -21
  96. package/dist/lib/platform/sdk/beliefsClient.d.ts +0 -157
  97. package/dist/lib/platform/sdk/beliefsClient.js +0 -124
  98. package/dist/lib/platform/sdk/client.d.ts +0 -2369
  99. package/dist/lib/platform/sdk/client.js +0 -1831
  100. package/dist/lib/platform/sdk/contextClient.d.ts +0 -21
  101. package/dist/lib/platform/sdk/contextClient.js +0 -86
  102. package/dist/lib/platform/sdk/contextFacade.js +0 -10
  103. package/dist/lib/platform/sdk/contextPackCompiler.d.ts +0 -100
  104. package/dist/lib/platform/sdk/contextPackCompiler.js +0 -534
  105. package/dist/lib/platform/sdk/contextTypes.d.ts +0 -133
  106. package/dist/lib/platform/sdk/contextTypes.js +0 -1
  107. package/dist/lib/platform/sdk/controlObjectOwnership.d.ts +0 -308
  108. package/dist/lib/platform/sdk/controlObjectOwnership.js +0 -220
  109. package/dist/lib/platform/sdk/coreClient.d.ts +0 -139
  110. package/dist/lib/platform/sdk/coreClient.js +0 -366
  111. package/dist/lib/platform/sdk/customTools.d.ts +0 -83
  112. package/dist/lib/platform/sdk/customTools.js +0 -247
  113. package/dist/lib/platform/sdk/decisionsClient.d.ts +0 -106
  114. package/dist/lib/platform/sdk/decisionsClient.js +0 -129
  115. package/dist/lib/platform/sdk/domainContext.d.ts +0 -1
  116. package/dist/lib/platform/sdk/domainContext.js +0 -1
  117. package/dist/lib/platform/sdk/events.d.ts +0 -176
  118. package/dist/lib/platform/sdk/events.js +0 -261
  119. package/dist/lib/platform/sdk/eventsCore.d.ts +0 -13
  120. package/dist/lib/platform/sdk/eventsCore.js +0 -13
  121. package/dist/lib/platform/sdk/gatewayFacades.d.ts +0 -586
  122. package/dist/lib/platform/sdk/gatewayFacades.js +0 -845
  123. package/dist/lib/platform/sdk/graphClient.d.ts +0 -266
  124. package/dist/lib/platform/sdk/graphClient.js +0 -235
  125. package/dist/lib/platform/sdk/harnessClient.d.ts +0 -309
  126. package/dist/lib/platform/sdk/harnessClient.js +0 -219
  127. package/dist/lib/platform/sdk/identityClient.d.ts +0 -134
  128. package/dist/lib/platform/sdk/identityClient.js +0 -131
  129. package/dist/lib/platform/sdk/index.js +0 -49
  130. package/dist/lib/platform/sdk/learningClient.d.ts +0 -40
  131. package/dist/lib/platform/sdk/learningClient.js +0 -53
  132. package/dist/lib/platform/sdk/mcpParityClient.d.ts +0 -69
  133. package/dist/lib/platform/sdk/mcpParityClient.js +0 -196
  134. package/dist/lib/platform/sdk/mcpParitySurface.d.ts +0 -10
  135. package/dist/lib/platform/sdk/mcpParitySurface.js +0 -57
  136. package/dist/lib/platform/sdk/ontologyClient.d.ts +0 -131
  137. package/dist/lib/platform/sdk/ontologyClient.js +0 -161
  138. package/dist/lib/platform/sdk/packRuntime.d.ts +0 -1
  139. package/dist/lib/platform/sdk/packRuntime.js +0 -1
  140. package/dist/lib/platform/sdk/packsClient.d.ts +0 -126
  141. package/dist/lib/platform/sdk/packsClient.js +0 -157
  142. package/dist/lib/platform/sdk/policyClient.d.ts +0 -293
  143. package/dist/lib/platform/sdk/policyClient.js +0 -277
  144. package/dist/lib/platform/sdk/promptCatalog.js +0 -1
  145. package/dist/lib/platform/sdk/reportsClient.d.ts +0 -34
  146. package/dist/lib/platform/sdk/reportsClient.js +0 -64
  147. package/dist/lib/platform/sdk/schemaClient.d.ts +0 -59
  148. package/dist/lib/platform/sdk/schemaClient.js +0 -71
  149. package/dist/lib/platform/sdk/sdkSurface.d.ts +0 -56
  150. package/dist/lib/platform/sdk/sdkSurface.js +0 -140
  151. package/dist/lib/platform/sdk/topicsClient.d.ts +0 -78
  152. package/dist/lib/platform/sdk/topicsClient.js +0 -118
  153. package/dist/lib/platform/sdk/types.d.ts +0 -692
  154. package/dist/lib/platform/sdk/types.js +0 -1
  155. package/dist/lib/platform/sdk/version.d.ts +0 -2
  156. package/dist/lib/platform/sdk/workflowClient.d.ts +0 -313
  157. package/dist/lib/platform/sdk/workflowClient.js +0 -366
  158. package/dist/lucern/contracts/src/api-enums.contract.d.ts +0 -58
  159. package/dist/lucern/contracts/src/api-enums.contract.js +0 -147
  160. package/dist/lucern/contracts/src/auth-context.contract.d.ts +0 -8
  161. package/dist/lucern/contracts/src/auth-context.contract.js +0 -8
  162. package/dist/lucern/contracts/src/auth-session.contract.d.ts +0 -8
  163. package/dist/lucern/contracts/src/auth-session.contract.js +0 -8
  164. package/dist/lucern/contracts/src/auth.contract.d.ts +0 -88
  165. package/dist/lucern/contracts/src/auth.contract.js +0 -57
  166. package/dist/lucern/contracts/src/context-pack.contract.d.ts +0 -494
  167. package/dist/lucern/contracts/src/context-pack.contract.js +0 -169
  168. package/dist/lucern/contracts/src/convex-admin.contract.d.ts +0 -5
  169. package/dist/lucern/contracts/src/convex-admin.contract.js +0 -1
  170. package/dist/lucern/contracts/src/events-types.contract.d.ts +0 -8
  171. package/dist/lucern/contracts/src/events-types.contract.js +0 -8
  172. package/dist/lucern/contracts/src/events.contract.d.ts +0 -176
  173. package/dist/lucern/contracts/src/events.contract.js +0 -159
  174. package/dist/lucern/contracts/src/gateway.contract.d.ts +0 -74
  175. package/dist/lucern/contracts/src/gateway.contract.js +0 -19
  176. package/dist/lucern/contracts/src/ids.contract.d.ts +0 -7
  177. package/dist/lucern/contracts/src/ids.contract.js +0 -24
  178. package/dist/lucern/contracts/src/index.d.ts +0 -29
  179. package/dist/lucern/contracts/src/index.js +0 -29
  180. package/dist/lucern/contracts/src/lens-filter.contract.d.ts +0 -70
  181. package/dist/lucern/contracts/src/lens-filter.contract.js +0 -95
  182. package/dist/lucern/contracts/src/lens-workflow.contract.d.ts +0 -84
  183. package/dist/lucern/contracts/src/lens-workflow.contract.js +0 -54
  184. package/dist/lucern/contracts/src/mcp-tools.contract.d.ts +0 -151
  185. package/dist/lucern/contracts/src/mcp-tools.contract.js +0 -3281
  186. package/dist/lucern/contracts/src/ontology-matching.contract.d.ts +0 -8
  187. package/dist/lucern/contracts/src/ontology-matching.contract.js +0 -8
  188. package/dist/lucern/contracts/src/prompt.contract.d.ts +0 -24
  189. package/dist/lucern/contracts/src/prompt.contract.js +0 -24
  190. package/dist/lucern/contracts/src/sdk-methods.contract.d.ts +0 -358
  191. package/dist/lucern/contracts/src/sdk-methods.contract.js +0 -19
  192. package/dist/lucern/contracts/src/sdk-tools.contract.d.ts +0 -92
  193. package/dist/lucern/contracts/src/sdk-tools.contract.js +0 -1398
  194. package/dist/lucern/contracts/src/text-matching.contract.d.ts +0 -53
  195. package/dist/lucern/contracts/src/text-matching.contract.js +0 -277
  196. package/dist/lucern/contracts/src/topic-scope.contract.d.ts +0 -8
  197. package/dist/lucern/contracts/src/topic-scope.contract.js +0 -8
  198. package/dist/lucern/contracts/src/workflow-runtime.contract.d.ts +0 -161
  199. package/dist/lucern/contracts/src/workflow-runtime.contract.js +0 -257
  200. package/dist/realtime-refs.d.ts +0 -1
  201. package/dist/realtime-refs.js +0 -1
  202. package/dist/realtime.d.ts +0 -1
  203. package/dist/realtime.js +0 -1
  204. /package/{dist/lib/platform/sdk/index.d.ts → src/index.ts} +0 -0
  205. /package/{dist/lib/platform/sdk/promptCatalog.d.ts → src/promptCatalog.ts} +0 -0
  206. /package/{dist/lib/platform/sdk/version.js → src/version.ts} +0 -0
@@ -0,0 +1,826 @@
1
+ import {
2
+ createGatewayRequestClient,
3
+ type GatewayClientConfig,
4
+ LucernApiError,
5
+ randomIdempotencyKey,
6
+ toQueryString,
7
+ } from "./coreClient";
8
+ import {
9
+ asListItems,
10
+ createListResult,
11
+ mapAliasedList,
12
+ mapGatewayData,
13
+ normalizeTopicQuery,
14
+ resolveTopicId,
15
+ withTopicAlias,
16
+ } from "./sdkSurface";
17
+ import type {
18
+ LensPerspectiveType,
19
+ LensPromptTemplateReference,
20
+ LensStatus,
21
+ LensTaskTemplate,
22
+ LensWorkflowTemplate,
23
+ } from "./contracts/lensWorkflow";
24
+ import type {
25
+ WorkflowAutoFixPolicy,
26
+ WorkflowProofArtifact,
27
+ WorkflowStaffingHint,
28
+ } from "./contracts/workflowRuntime";
29
+ import type {
30
+ AddWorktreeResponse,
31
+ CompleteTaskResponse,
32
+ CreateBranchResponse,
33
+ CreateLensResponse,
34
+ CreateTaskResponse,
35
+ JsonObject,
36
+ JsonValue,
37
+ LensTopicBindingResponse,
38
+ ListBranchesResponse,
39
+ ListLensesResponse,
40
+ ListTopicsResponse,
41
+ ListWorktreesResponse,
42
+ MergeWorktreeResponse,
43
+ OpenPullRequestResponse,
44
+ PushWorktreeResponse,
45
+ SwitchTopicContextResponse,
46
+ TopicIdentifierInput,
47
+ UpdateTaskResponse,
48
+ WorkflowBranchRecord,
49
+ WorkflowLensRecord,
50
+ WorkflowTopicRecord,
51
+ WorkflowWorktreeRecord,
52
+ } from "./types";
53
+
54
+ export { LucernApiError };
55
+ export type { PlatformGatewaySuccess } from "./coreClient";
56
+ export type {
57
+ AddWorktreeResponse,
58
+ CompleteTaskResponse,
59
+ CreateBranchResponse,
60
+ CreateLensResponse,
61
+ CreateTaskResponse,
62
+ LensTopicBindingResponse,
63
+ ListBranchesResponse,
64
+ ListLensesResponse,
65
+ ListTopicsResponse,
66
+ ListWorktreesResponse,
67
+ MergeWorktreeResponse,
68
+ OpenPullRequestResponse,
69
+ PushWorktreeResponse,
70
+ SwitchTopicContextResponse,
71
+ UpdateTaskResponse,
72
+ } from "./types";
73
+
74
+ /** Configuration for the workflow client. */
75
+ export type WorkflowClientConfig = GatewayClientConfig;
76
+
77
+ /** Lifecycle status of a workflow branch. */
78
+ export type WorkflowBranchStatus = "dormant" | "active" | "archived";
79
+
80
+ /** Lifecycle status of a workflow lens. */
81
+ export type WorkflowLensStatus = LensStatus;
82
+
83
+ /** Analytical perspective type for a lens overlay. */
84
+ export type WorkflowLensPerspectiveType = LensPerspectiveType;
85
+
86
+ /** Lifecycle status of a workflow worktree. */
87
+ export type WorkflowWorktreeStatus =
88
+ | "planning"
89
+ | "active"
90
+ | "paused"
91
+ | "completed"
92
+ | "merged"
93
+ | "failed"
94
+ | "archived";
95
+
96
+ /** Possible outcomes when merging worktree findings into the main belief line. */
97
+ export type WorkflowMergeOutcome =
98
+ | "validated"
99
+ | "invalidated"
100
+ | "forked"
101
+ | "inconclusive";
102
+
103
+ /** Input for creating a new workflow worktree. */
104
+ export type AddWorktreeInput = {
105
+ title: string;
106
+ topicId?: string;
107
+ branchId?: string;
108
+ objective?: string;
109
+ hypothesis?: string;
110
+ beliefIds?: string[];
111
+ autoShape?: boolean;
112
+ domainPackId?: string;
113
+ executionOrder?: number;
114
+ dependsOn?: string[];
115
+ blocks?: string[];
116
+ gate?: string;
117
+ proofArtifacts?: WorkflowProofArtifact[];
118
+ staffingHint?: WorkflowStaffingHint | string;
119
+ lastReconciledAt?: number;
120
+ autoFixPolicy?: WorkflowAutoFixPolicy;
121
+ } & TopicIdentifierInput;
122
+
123
+ /** Input for merging worktree findings with belief confidence outcomes. */
124
+ export type MergeInput = {
125
+ outcomes: Array<{
126
+ beliefId: string;
127
+ confidence: number;
128
+ rationale: string;
129
+ }>;
130
+ summary?: string;
131
+ };
132
+
133
+ /** Input for updating the beliefs and questions tracked by a worktree. */
134
+ export type UpdateWorktreeTargetsInput = {
135
+ worktreeId: string;
136
+ addBeliefIds?: string[];
137
+ addQuestionIds?: string[];
138
+ removeBeliefIds?: string[];
139
+ removeQuestionIds?: string[];
140
+ };
141
+
142
+ /** Input for marking a worktree complete with recorded outcomes. */
143
+ export type CompleteWorktreeInput = {
144
+ worktreeId: string;
145
+ keyFindings?: string[];
146
+ decisionsReached?: string[];
147
+ nextSteps?: string[];
148
+ };
149
+
150
+ /** Input for moving a worktree forward to its next phase. */
151
+ export type AdvanceWorktreePhaseInput = {
152
+ worktreeId: string;
153
+ };
154
+
155
+ /** Input for forcing a worktree into a specific phase. */
156
+ export type SetWorktreePhaseInput = {
157
+ worktreeId: string;
158
+ phase: string;
159
+ };
160
+
161
+ /** Input for patching arbitrary structured worktree state. */
162
+ export type PatchWorktreeStateInput = {
163
+ worktreeId: string;
164
+ patch: JsonObject;
165
+ };
166
+
167
+ /** Input for batch-creating worktrees through the workflow surface. */
168
+ export type BulkCreateWorktreesInput = {
169
+ worktrees: unknown[];
170
+ };
171
+
172
+ /** Input for listing accessible topic contexts. */
173
+ export type ListTopicsInput = {
174
+ includeShared?: boolean;
175
+ limit?: number;
176
+ };
177
+
178
+ /** Input for switching the active topic context by name. */
179
+ export type SwitchTopicContextInput = {
180
+ targetTopicName: string;
181
+ };
182
+
183
+ /** Input for creating a workflow task linked to a question or worktree. */
184
+ export type CreateTaskInput = {
185
+ title: string;
186
+ topicId?: string;
187
+ taskType?: "research" | "interview" | "analysis" | "data_collection";
188
+ linkedQuestionId?: string;
189
+ linkedWorktreeId?: string;
190
+ linkedBeliefId?: string;
191
+ description?: string;
192
+ priority?: "low" | "medium" | "high" | "urgent";
193
+ } & TopicIdentifierInput;
194
+
195
+ /** Input for marking a workflow task as completed with an output summary. */
196
+ export type CompleteTaskInput = {
197
+ outputSummary: string;
198
+ evidenceCreated?: boolean;
199
+ };
200
+
201
+ /** Input for partially updating an existing workflow task. */
202
+ export type UpdateTaskInput = {
203
+ title?: string;
204
+ description?: string;
205
+ linkedBeliefId?: string;
206
+ linkedQuestionId?: string;
207
+ linkedWorktreeId?: string;
208
+ priority?: "critical" | "high" | "medium" | "low";
209
+ status?: "todo" | "in_progress" | "blocked" | "done";
210
+ };
211
+
212
+ function normalizeLensQuery<T extends { topicId?: string }>(
213
+ value: T
214
+ ) {
215
+ const topicId = resolveTopicId(value);
216
+ return {
217
+ ...value,
218
+ ...(topicId ? { topicId } : {}),
219
+ };
220
+ }
221
+
222
+ /**
223
+ * Create the workflow client for lenses, legacy branches, worktrees, context,
224
+ * and tasks.
225
+ * @param config - Gateway transport configuration.
226
+ * @returns An object with methods to manage branches, lenses, worktrees, topics, and tasks.
227
+ */
228
+ export function createWorkflowClient(config: WorkflowClientConfig = {}) {
229
+ const gateway = createGatewayRequestClient(config);
230
+ const client = {
231
+ /**
232
+ * List workflow branches for a topic scope.
233
+ */
234
+ async listBranches(query: {
235
+ topicId?: string;
236
+ status?: WorkflowBranchStatus;
237
+ limit?: number;
238
+ } & TopicIdentifierInput) {
239
+ return gateway.request<ListBranchesResponse>({
240
+ path: `/api/platform/v1/workflow/branches${toQueryString(
241
+ normalizeTopicQuery(query)
242
+ )}`,
243
+ }).then((response) =>
244
+ mapGatewayData(response, (data) =>
245
+ mapAliasedList<WorkflowBranchRecord, "branches">(data, "branches")
246
+ )
247
+ );
248
+ },
249
+
250
+ /**
251
+ * Create a workflow branch.
252
+ */
253
+ async createBranch(
254
+ input: {
255
+ name: string;
256
+ topicId?: string;
257
+ description?: string;
258
+ metadata?: JsonObject;
259
+ } & TopicIdentifierInput,
260
+ idempotencyKey?: string
261
+ ) {
262
+ return gateway.request<CreateBranchResponse>({
263
+ path: "/api/platform/v1/workflow/branches",
264
+ method: "POST",
265
+ body: normalizeTopicQuery(input),
266
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
267
+ }).then((response) =>
268
+ mapGatewayData(response, (data) =>
269
+ withTopicAlias(data as Record<string, unknown>) as CreateBranchResponse
270
+ )
271
+ );
272
+ },
273
+
274
+ /**
275
+ * List reusable lenses for a workspace or topic scope.
276
+ */
277
+ async listLenses(query: {
278
+ workspaceId?: string;
279
+ topicId?: string;
280
+ status?: WorkflowLensStatus;
281
+ perspectiveType?: WorkflowLensPerspectiveType;
282
+ } & TopicIdentifierInput) {
283
+ return gateway.request<ListLensesResponse>({
284
+ path: `/api/platform/v1/workflow/lenses${toQueryString(
285
+ normalizeLensQuery(query)
286
+ )}`,
287
+ }).then((response) =>
288
+ mapGatewayData(response, (data) =>
289
+ mapAliasedList<WorkflowLensRecord, "lenses">(data, "lenses")
290
+ )
291
+ );
292
+ },
293
+
294
+ /**
295
+ * Create a reusable workflow lens.
296
+ */
297
+ async createLens(
298
+ input: {
299
+ name: string;
300
+ workspaceId?: string;
301
+ topicId?: string;
302
+ description?: string;
303
+ perspectiveType: WorkflowLensPerspectiveType;
304
+ promptTemplates?: LensPromptTemplateReference[];
305
+ workflowTemplates?: LensWorkflowTemplate[];
306
+ taskTemplates?: LensTaskTemplate[];
307
+ filterCriteria?: JsonObject;
308
+ } & TopicIdentifierInput,
309
+ idempotencyKey?: string
310
+ ) {
311
+ const payload = normalizeLensQuery(input);
312
+ return gateway.request<CreateLensResponse>({
313
+ path: "/api/platform/v1/workflow/lenses",
314
+ method: "POST",
315
+ body: payload as JsonObject,
316
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
317
+ }).then((response) =>
318
+ mapGatewayData(response, (data) =>
319
+ withTopicAlias(data as Record<string, unknown>) as CreateLensResponse
320
+ )
321
+ );
322
+ },
323
+
324
+ /**
325
+ * Apply an existing lens to a topic.
326
+ */
327
+ async applyLensToTopic(
328
+ input: {
329
+ lensId: string;
330
+ topicId?: string;
331
+ metadata?: JsonObject;
332
+ } & TopicIdentifierInput,
333
+ idempotencyKey?: string
334
+ ) {
335
+ const payload = normalizeLensQuery(input);
336
+ return gateway.request<LensTopicBindingResponse>({
337
+ path: "/api/platform/v1/workflow/lens-bindings",
338
+ method: "POST",
339
+ body: payload,
340
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
341
+ }).then((response) =>
342
+ mapGatewayData(response, (data) =>
343
+ withTopicAlias(data as Record<string, unknown>) as LensTopicBindingResponse
344
+ )
345
+ );
346
+ },
347
+
348
+ /**
349
+ * Remove an applied lens from a topic.
350
+ */
351
+ async removeLensFromTopic(
352
+ input: {
353
+ lensId: string;
354
+ topicId?: string;
355
+ } & TopicIdentifierInput,
356
+ idempotencyKey?: string
357
+ ) {
358
+ const topicId = resolveTopicId(input);
359
+ if (!topicId) {
360
+ throw new LucernApiError({
361
+ code: "INVALID_REQUEST",
362
+ message: "topicId is required",
363
+ status: 400,
364
+ });
365
+ }
366
+
367
+ return gateway.request<LensTopicBindingResponse>({
368
+ path: `/api/platform/v1/workflow/lens-bindings${toQueryString({
369
+ lensId: input.lensId,
370
+ topicId,
371
+ })}`,
372
+ method: "DELETE",
373
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
374
+ }).then((response) =>
375
+ mapGatewayData(response, (data) =>
376
+ withTopicAlias(data as Record<string, unknown>) as LensTopicBindingResponse
377
+ )
378
+ );
379
+ },
380
+
381
+ /**
382
+ * List worktrees for a topic scope.
383
+ */
384
+ async listWorktrees(query: {
385
+ topicId?: string;
386
+ branchId?: string;
387
+ status?: WorkflowWorktreeStatus;
388
+ track?: string;
389
+ executionBand?: number;
390
+ limit?: number;
391
+ } & TopicIdentifierInput) {
392
+ const normalized = normalizeTopicQuery(query);
393
+ return gateway.request<ListWorktreesResponse>({
394
+ path: `/api/platform/v1/worktrees${toQueryString({
395
+ ...normalized,
396
+ track: query.track,
397
+ executionBand: query.executionBand,
398
+ })}`,
399
+ }).then((response) =>
400
+ mapGatewayData(response, (data) =>
401
+ mapAliasedList<WorkflowWorktreeRecord, "worktrees">(
402
+ data,
403
+ "worktrees"
404
+ )
405
+ )
406
+ );
407
+ },
408
+
409
+ /**
410
+ * List all worktrees across accessible topics.
411
+ */
412
+ async listAllWorktrees(query: {
413
+ status?: WorkflowWorktreeStatus;
414
+ track?: string;
415
+ executionBand?: number;
416
+ limit?: number;
417
+ } = {}) {
418
+ return gateway.request<ListWorktreesResponse>({
419
+ path: `/api/platform/v1/worktrees${toQueryString({
420
+ status: query.status,
421
+ track: query.track,
422
+ executionBand: query.executionBand,
423
+ limit: query.limit,
424
+ })}`,
425
+ }).then((response) =>
426
+ mapGatewayData(response, (data) => {
427
+ const record =
428
+ data && typeof data === "object" && !Array.isArray(data)
429
+ ? (data as Record<string, unknown>)
430
+ : {};
431
+ const list = mapAliasedList<WorkflowWorktreeRecord, "worktrees">(
432
+ data,
433
+ "worktrees"
434
+ );
435
+ return {
436
+ ...list,
437
+ ...(record.tracks &&
438
+ typeof record.tracks === "object" &&
439
+ !Array.isArray(record.tracks)
440
+ ? { tracks: record.tracks as Record<string, number> }
441
+ : {}),
442
+ ...(record.bands &&
443
+ typeof record.bands === "object" &&
444
+ !Array.isArray(record.bands)
445
+ ? { bands: record.bands as Record<string, number> }
446
+ : {}),
447
+ } as ListWorktreesResponse;
448
+ })
449
+ );
450
+ },
451
+
452
+ /**
453
+ * Create a workflow worktree.
454
+ */
455
+ async createWorktree(input: AddWorktreeInput, idempotencyKey?: string) {
456
+ return gateway.request<AddWorktreeResponse>({
457
+ path: "/api/platform/v1/worktrees",
458
+ method: "POST",
459
+ body: normalizeTopicQuery(input),
460
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
461
+ }).then((response) =>
462
+ mapGatewayData(response, (data) =>
463
+ withTopicAlias(data as Record<string, unknown>) as AddWorktreeResponse
464
+ )
465
+ );
466
+ },
467
+
468
+ /**
469
+ * @deprecated Use createWorktree.
470
+ */
471
+ async addWorktree(input: AddWorktreeInput, idempotencyKey?: string) {
472
+ return client.createWorktree(input, idempotencyKey);
473
+ },
474
+
475
+ /**
476
+ * Merge a worktree into the main belief line.
477
+ */
478
+ async merge(
479
+ worktreeId: string,
480
+ input: MergeInput,
481
+ idempotencyKey?: string
482
+ ) {
483
+ return gateway.request<MergeWorktreeResponse>({
484
+ path: `/api/platform/v1/worktrees/${encodeURIComponent(worktreeId)}/merge`,
485
+ method: "POST",
486
+ body: input,
487
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
488
+ });
489
+ },
490
+
491
+ /**
492
+ * Activate a planning worktree.
493
+ */
494
+ async activateWorktree(worktreeId: string, idempotencyKey?: string) {
495
+ return gateway.request<AddWorktreeResponse>({
496
+ path: `/api/platform/v1/worktrees/${encodeURIComponent(worktreeId)}/activate`,
497
+ method: "POST",
498
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
499
+ }).then((response) =>
500
+ mapGatewayData(response, (data) =>
501
+ withTopicAlias(data as Record<string, unknown>) as AddWorktreeResponse
502
+ )
503
+ );
504
+ },
505
+
506
+ /**
507
+ * Update targeted beliefs/questions for a worktree.
508
+ */
509
+ async updateWorktreeTargets(
510
+ input: UpdateWorktreeTargetsInput,
511
+ idempotencyKey?: string
512
+ ) {
513
+ const { worktreeId, ...body } = input;
514
+ return gateway.request<AddWorktreeResponse>({
515
+ path: `/api/platform/v1/worktrees/${encodeURIComponent(worktreeId)}/targets`,
516
+ method: "POST",
517
+ body,
518
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
519
+ }).then((response) =>
520
+ mapGatewayData(response, (data) =>
521
+ withTopicAlias(data as Record<string, unknown>) as AddWorktreeResponse
522
+ )
523
+ );
524
+ },
525
+
526
+ /**
527
+ * Mark a worktree record complete.
528
+ */
529
+ async completeWorktree(
530
+ input: CompleteWorktreeInput,
531
+ idempotencyKey?: string
532
+ ) {
533
+ return gateway.request<Record<string, unknown>>({
534
+ path: "/api/platform/v1/worktrees/complete",
535
+ method: "POST",
536
+ body: input,
537
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
538
+ });
539
+ },
540
+
541
+ /**
542
+ * Advance a worktree to its next lifecycle phase.
543
+ */
544
+ async advanceWorktreePhase(
545
+ input: AdvanceWorktreePhaseInput,
546
+ idempotencyKey?: string
547
+ ) {
548
+ return gateway.request<Record<string, unknown>>({
549
+ path: "/api/platform/v1/worktrees/advance-phase",
550
+ method: "POST",
551
+ body: input,
552
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
553
+ });
554
+ },
555
+
556
+ /**
557
+ * Force a worktree into a specific lifecycle phase.
558
+ */
559
+ async setWorktreePhase(
560
+ input: SetWorktreePhaseInput,
561
+ idempotencyKey?: string
562
+ ) {
563
+ return gateway.request<Record<string, unknown>>({
564
+ path: "/api/platform/v1/worktrees/set-phase",
565
+ method: "POST",
566
+ body: input,
567
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
568
+ });
569
+ },
570
+
571
+ /**
572
+ * Patch opaque worktree state for orchestration flows.
573
+ */
574
+ async patchWorktreeState(
575
+ input: PatchWorktreeStateInput,
576
+ idempotencyKey?: string
577
+ ) {
578
+ return gateway.request<Record<string, unknown>>({
579
+ path: "/api/platform/v1/worktrees/patch-state",
580
+ method: "POST",
581
+ body: input,
582
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
583
+ });
584
+ },
585
+
586
+ /**
587
+ * Batch create worktree records.
588
+ */
589
+ async bulkCreateWorktrees(
590
+ input: BulkCreateWorktreesInput,
591
+ idempotencyKey?: string
592
+ ) {
593
+ return gateway.request<Record<string, unknown>>({
594
+ path: "/api/platform/v1/worktrees/bulk",
595
+ method: "POST",
596
+ body: input as unknown as JsonObject,
597
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
598
+ });
599
+ },
600
+
601
+ /**
602
+ * Open a pull request for a worktree.
603
+ */
604
+ async openPullRequest(
605
+ worktreeId: string,
606
+ input: {
607
+ summary: string;
608
+ reviewers?: string[];
609
+ status?:
610
+ | "pending_review"
611
+ | "changes_requested"
612
+ | "approved"
613
+ | "blocked";
614
+ },
615
+ idempotencyKey?: string
616
+ ) {
617
+ return gateway.request<OpenPullRequestResponse>({
618
+ path: `/api/platform/v1/workflow/worktrees/${encodeURIComponent(worktreeId)}/pull-request`,
619
+ method: "POST",
620
+ body: input,
621
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
622
+ });
623
+ },
624
+
625
+ /**
626
+ * Push scored worktree findings into another context.
627
+ */
628
+ async push(
629
+ worktreeId: string,
630
+ input: {
631
+ targetContext: string;
632
+ beliefIds?: string[];
633
+ metadata?: JsonObject;
634
+ },
635
+ idempotencyKey?: string
636
+ ) {
637
+ return gateway.request<PushWorktreeResponse>({
638
+ path: `/api/platform/v1/workflow/worktrees/${encodeURIComponent(worktreeId)}/push`,
639
+ method: "POST",
640
+ body: input,
641
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
642
+ });
643
+ },
644
+
645
+ /**
646
+ * List accessible topic contexts.
647
+ */
648
+ async listTopics(query: ListTopicsInput = {}) {
649
+ return gateway.request<ListTopicsResponse>({
650
+ path: `/api/platform/v1/workflow/topics${toQueryString({
651
+ includeShared:
652
+ typeof query.includeShared === "boolean"
653
+ ? query.includeShared
654
+ ? "true"
655
+ : "false"
656
+ : undefined,
657
+ limit: query.limit,
658
+ })}`,
659
+ }).then((response) =>
660
+ mapGatewayData(response, (data) => {
661
+ const items = asListItems<WorkflowTopicRecord>(data, "topics").map(
662
+ (item) =>
663
+ withTopicAlias(
664
+ item as Record<string, unknown>
665
+ ) as WorkflowTopicRecord
666
+ );
667
+ const record =
668
+ data && typeof data === "object"
669
+ ? (data as Record<string, unknown>)
670
+ : {};
671
+ return {
672
+ ...record,
673
+ ...createListResult(items, "topics"),
674
+ total:
675
+ typeof record.total === "number" ? record.total : items.length,
676
+ } as ListTopicsResponse;
677
+ })
678
+ );
679
+ },
680
+
681
+ /**
682
+ * Switch the active context by topic or project name.
683
+ */
684
+ async switchTopicContext(
685
+ input: SwitchTopicContextInput,
686
+ idempotencyKey?: string
687
+ ) {
688
+ return gateway.request<SwitchTopicContextResponse>({
689
+ path: "/api/platform/v1/workflow/topics/switch",
690
+ method: "POST",
691
+ body: {
692
+ targetTopicName: input.targetTopicName,
693
+ },
694
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
695
+ }).then((response) =>
696
+ mapGatewayData(response, (data) =>
697
+ withTopicAlias(
698
+ data as Record<string, unknown>
699
+ ) as SwitchTopicContextResponse
700
+ )
701
+ );
702
+ },
703
+
704
+ /**
705
+ * Create a workflow task.
706
+ */
707
+ async createTask(input: CreateTaskInput, idempotencyKey?: string) {
708
+ return gateway.request<CreateTaskResponse>({
709
+ path: "/api/platform/v1/workflow/tasks",
710
+ method: "POST",
711
+ body: normalizeTopicQuery(input),
712
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
713
+ });
714
+ },
715
+
716
+ /**
717
+ * Complete a workflow task.
718
+ */
719
+ async completeTask(
720
+ taskId: string,
721
+ input: CompleteTaskInput,
722
+ idempotencyKey?: string
723
+ ) {
724
+ return gateway.request<CompleteTaskResponse>({
725
+ path: `/api/platform/v1/workflow/tasks/${encodeURIComponent(taskId)}/complete`,
726
+ method: "POST",
727
+ body: input,
728
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
729
+ });
730
+ },
731
+
732
+ /**
733
+ * Update a workflow task.
734
+ */
735
+ async updateTask(
736
+ taskId: string,
737
+ input: UpdateTaskInput,
738
+ idempotencyKey?: string
739
+ ) {
740
+ return gateway.request<UpdateTaskResponse>({
741
+ path: `/api/platform/v1/workflow/tasks/${encodeURIComponent(taskId)}`,
742
+ method: "PATCH",
743
+ body: input,
744
+ idempotencyKey: idempotencyKey ?? randomIdempotencyKey(),
745
+ });
746
+ },
747
+
748
+ /**
749
+ * @deprecated Use createBranch.
750
+ */
751
+ async createPillar(
752
+ input: {
753
+ name: string;
754
+ topicId?: string;
755
+ description?: string;
756
+ metadata?: JsonObject;
757
+ } & TopicIdentifierInput,
758
+ idempotencyKey?: string
759
+ ) {
760
+ return client.createBranch(input, idempotencyKey);
761
+ },
762
+
763
+ /**
764
+ * @deprecated Use addWorktree.
765
+ */
766
+ async createSprint(
767
+ input: {
768
+ title: string;
769
+ topicId?: string;
770
+ branchId?: string;
771
+ hypothesis?: string;
772
+ beliefIds?: string[];
773
+ } & TopicIdentifierInput,
774
+ idempotencyKey?: string
775
+ ) {
776
+ return client.createWorktree(input, idempotencyKey);
777
+ },
778
+
779
+ /**
780
+ * @deprecated Use merge.
781
+ */
782
+ async completeSprint(
783
+ worktreeId: string,
784
+ input: MergeInput,
785
+ idempotencyKey?: string
786
+ ) {
787
+ return client.merge(worktreeId, input, idempotencyKey);
788
+ },
789
+
790
+ /**
791
+ * @deprecated Use openPullRequest.
792
+ */
793
+ async requestReview(
794
+ worktreeId: string,
795
+ input: {
796
+ summary: string;
797
+ reviewers?: string[];
798
+ status?:
799
+ | "pending_review"
800
+ | "changes_requested"
801
+ | "approved"
802
+ | "blocked";
803
+ },
804
+ idempotencyKey?: string
805
+ ) {
806
+ return client.openPullRequest(worktreeId, input, idempotencyKey);
807
+ },
808
+
809
+ /**
810
+ * @deprecated Use push.
811
+ */
812
+ async publishFindings(
813
+ worktreeId: string,
814
+ input: {
815
+ targetContext: string;
816
+ beliefIds?: string[];
817
+ metadata?: JsonObject;
818
+ },
819
+ idempotencyKey?: string
820
+ ) {
821
+ return client.push(worktreeId, input, idempotencyKey);
822
+ },
823
+ };
824
+
825
+ return client;
826
+ }