@lucern/contracts 0.3.0-alpha.0 → 0.3.0-alpha.10

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 (237) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/component-boundary.contract.d.ts +14 -0
  3. package/dist/component-boundary.contract.js +155 -0
  4. package/dist/component-boundary.contract.js.map +1 -0
  5. package/dist/component-host-boundary.contract.d.ts +41 -0
  6. package/dist/component-host-boundary.contract.js +54 -0
  7. package/dist/component-host-boundary.contract.js.map +1 -0
  8. package/dist/context-pack.contract.d.ts +5 -3
  9. package/dist/context-pack.contract.js.map +1 -1
  10. package/dist/{dsl-BgpoVOVQ.d.ts → dsl-djCRfuWC.d.ts} +1 -1
  11. package/dist/dsl.d.ts +1 -1
  12. package/dist/dsl.js +4 -4
  13. package/dist/dsl.js.map +1 -1
  14. package/dist/edge-policy-manifest-Dw5IhT1L.d.ts +133 -0
  15. package/dist/function-registry/beliefs.d.ts +42 -82
  16. package/dist/function-registry/beliefs.js +1154 -125
  17. package/dist/function-registry/beliefs.js.map +1 -1
  18. package/dist/function-registry/coding.d.ts +7 -31
  19. package/dist/function-registry/coding.js +958 -112
  20. package/dist/function-registry/coding.js.map +1 -1
  21. package/dist/function-registry/context.d.ts +14 -26
  22. package/dist/function-registry/context.js +923 -97
  23. package/dist/function-registry/context.js.map +1 -1
  24. package/dist/function-registry/contracts.d.ts +4 -16
  25. package/dist/function-registry/contracts.js +860 -82
  26. package/dist/function-registry/contracts.js.map +1 -1
  27. package/dist/function-registry/coordination.d.ts +10 -46
  28. package/dist/function-registry/coordination.js +872 -84
  29. package/dist/function-registry/coordination.js.map +1 -1
  30. package/dist/function-registry/edges.d.ts +166 -18
  31. package/dist/function-registry/edges.js +1188 -97
  32. package/dist/function-registry/edges.js.map +1 -1
  33. package/dist/function-registry/evidence.d.ts +42 -74
  34. package/dist/function-registry/evidence.js +1106 -130
  35. package/dist/function-registry/evidence.js.map +1 -1
  36. package/dist/function-registry/graph.d.ts +132 -106
  37. package/dist/function-registry/graph.js +1006 -100
  38. package/dist/function-registry/graph.js.map +1 -1
  39. package/dist/function-registry/helpers.d.ts +8 -10
  40. package/dist/function-registry/helpers.js +869 -83
  41. package/dist/function-registry/helpers.js.map +1 -1
  42. package/dist/function-registry/identity.d.ts +4 -16
  43. package/dist/function-registry/identity.js +860 -82
  44. package/dist/function-registry/identity.js.map +1 -1
  45. package/dist/function-registry/index.d.ts +322 -8
  46. package/dist/function-registry/index.js +1249 -87
  47. package/dist/function-registry/index.js.map +1 -1
  48. package/dist/function-registry/judgments.d.ts +12 -20
  49. package/dist/function-registry/judgments.js +891 -94
  50. package/dist/function-registry/judgments.js.map +1 -1
  51. package/dist/function-registry/legacy.d.ts +2 -6
  52. package/dist/function-registry/legacy.js +860 -82
  53. package/dist/function-registry/legacy.js.map +1 -1
  54. package/dist/function-registry/lenses.d.ts +18 -34
  55. package/dist/function-registry/lenses.js +928 -88
  56. package/dist/function-registry/lenses.js.map +1 -1
  57. package/dist/function-registry/manifest.d.ts +7 -7
  58. package/dist/function-registry/manifest.js +19 -2
  59. package/dist/function-registry/manifest.js.map +1 -1
  60. package/dist/function-registry/ontologies.d.ts +46 -90
  61. package/dist/function-registry/ontologies.js +908 -109
  62. package/dist/function-registry/ontologies.js.map +1 -1
  63. package/dist/function-registry/pipeline.d.ts +14 -26
  64. package/dist/function-registry/pipeline.js +880 -85
  65. package/dist/function-registry/pipeline.js.map +1 -1
  66. package/dist/function-registry/questions.d.ts +50 -98
  67. package/dist/function-registry/questions.js +1043 -118
  68. package/dist/function-registry/questions.js.map +1 -1
  69. package/dist/function-registry/tasks.d.ts +18 -34
  70. package/dist/function-registry/tasks.js +973 -87
  71. package/dist/function-registry/tasks.js.map +1 -1
  72. package/dist/function-registry/topics.d.ts +100 -42
  73. package/dist/function-registry/topics.js +961 -89
  74. package/dist/function-registry/topics.js.map +1 -1
  75. package/dist/function-registry/types.d.ts +2 -2
  76. package/dist/function-registry/worktrees.d.ts +116 -74
  77. package/dist/function-registry/worktrees.js +1124 -115
  78. package/dist/function-registry/worktrees.js.map +1 -1
  79. package/dist/function-registry-input-audit.d.ts +13 -0
  80. package/dist/function-registry-input-audit.js +166 -0
  81. package/dist/function-registry-input-audit.js.map +1 -0
  82. package/dist/gateway.contract.d.ts +2 -0
  83. package/dist/gateway.contract.js.map +1 -1
  84. package/dist/generated/convexSchemas.js +8 -6
  85. package/dist/generated/convexSchemas.js.map +1 -1
  86. package/dist/generated/schema-manifest.json +103 -5
  87. package/dist/generated/tableOwnership.d.ts +4 -2
  88. package/dist/generated/tableOwnership.js +4 -0
  89. package/dist/generated/tableOwnership.js.map +1 -1
  90. package/dist/generated/tier-expectations.json +9 -4
  91. package/dist/graph-intelligence.contract.d.ts +506 -0
  92. package/dist/graph-intelligence.contract.js +595 -0
  93. package/dist/graph-intelligence.contract.js.map +1 -0
  94. package/dist/graph-types/index.d.ts +5 -1
  95. package/dist/graph-types/index.js +15 -4
  96. package/dist/graph-types/index.js.map +1 -1
  97. package/dist/index-O09U2xHk.d.ts +28 -0
  98. package/dist/index.d.ts +25 -4
  99. package/dist/index.js +3989 -236
  100. package/dist/index.js.map +1 -1
  101. package/dist/infisical-runtime.contract.d.ts +174 -0
  102. package/dist/infisical-runtime.contract.js +317 -0
  103. package/dist/infisical-runtime.contract.js.map +1 -0
  104. package/dist/lens-filter.contract.js +4 -3
  105. package/dist/lens-filter.contract.js.map +1 -1
  106. package/dist/lens-workflow.contract.js +4 -3
  107. package/dist/lens-workflow.contract.js.map +1 -1
  108. package/dist/manifests/edge-policy-manifest.d.ts +2 -0
  109. package/dist/manifests/edge-policy-manifest.data.d.ts +13 -0
  110. package/dist/manifests/edge-policy-manifest.data.js +26 -0
  111. package/dist/manifests/edge-policy-manifest.data.js.map +1 -0
  112. package/dist/manifests/edge-policy-manifest.js +92 -0
  113. package/dist/manifests/edge-policy-manifest.js.map +1 -0
  114. package/dist/manifests/infisical-runtime-manifest.d.ts +151 -0
  115. package/dist/manifests/infisical-runtime-manifest.js +316 -0
  116. package/dist/manifests/infisical-runtime-manifest.js.map +1 -0
  117. package/dist/manifests/invariant-manifest.d.ts +65 -0
  118. package/dist/manifests/invariant-manifest.js +18 -0
  119. package/dist/manifests/invariant-manifest.js.map +1 -0
  120. package/dist/manifests/invariants/ast-utils.d.ts +14 -0
  121. package/dist/manifests/invariants/ast-utils.js +54 -0
  122. package/dist/manifests/invariants/ast-utils.js.map +1 -0
  123. package/dist/manifests/invariants/index.d.ts +15 -0
  124. package/dist/manifests/invariants/index.js +183 -0
  125. package/dist/manifests/invariants/index.js.map +1 -0
  126. package/dist/manifests/invariants/inv-1-beliefs-append-only.d.ts +12 -0
  127. package/dist/manifests/invariants/inv-1-beliefs-append-only.js +94 -0
  128. package/dist/manifests/invariants/inv-1-beliefs-append-only.js.map +1 -0
  129. package/dist/manifests/invariants/inv-14-no-silent-transitions.d.ts +12 -0
  130. package/dist/manifests/invariants/inv-14-no-silent-transitions.js +99 -0
  131. package/dist/manifests/invariants/inv-14-no-silent-transitions.js.map +1 -0
  132. package/dist/manifests/invariants/manifest-1-projections-declare-audit.d.ts +12 -0
  133. package/dist/manifests/invariants/manifest-1-projections-declare-audit.js +42 -0
  134. package/dist/manifests/invariants/manifest-1-projections-declare-audit.js.map +1 -0
  135. package/dist/manifests/tenant-client-manifest.d.ts +322 -0
  136. package/dist/manifests/tenant-client-manifest.js +432 -0
  137. package/dist/manifests/tenant-client-manifest.js.map +1 -0
  138. package/dist/mcp-gateway-boundary.contract.d.ts +181 -0
  139. package/dist/mcp-gateway-boundary.contract.js +43 -0
  140. package/dist/mcp-gateway-boundary.contract.js.map +1 -0
  141. package/dist/projections/check-convex-args-shape.d.ts +3 -0
  142. package/dist/projections/check-convex-args-shape.js +399 -0
  143. package/dist/projections/check-convex-args-shape.js.map +1 -0
  144. package/dist/projections/create-evidence.projection.d.ts +176 -0
  145. package/dist/projections/create-evidence.projection.js +131 -0
  146. package/dist/projections/create-evidence.projection.js.map +1 -0
  147. package/dist/projections/index.d.ts +102 -0
  148. package/dist/projections/index.js +348 -0
  149. package/dist/projections/index.js.map +1 -0
  150. package/dist/projections/list-beliefs.projection.d.ts +36 -0
  151. package/dist/projections/list-beliefs.projection.js +54 -0
  152. package/dist/projections/list-beliefs.projection.js.map +1 -0
  153. package/dist/projections/list-tasks.projection.d.ts +32 -0
  154. package/dist/projections/list-tasks.projection.js +52 -0
  155. package/dist/projections/list-tasks.projection.js.map +1 -0
  156. package/dist/projections/modulate-confidence.projection.d.ts +219 -0
  157. package/dist/projections/modulate-confidence.projection.js +148 -0
  158. package/dist/projections/modulate-confidence.projection.js.map +1 -0
  159. package/dist/projections/projection-dsl.d.ts +11 -0
  160. package/dist/projections/projection-dsl.js +8 -0
  161. package/dist/projections/projection-dsl.js.map +1 -0
  162. package/dist/schema-helpers/enumValidation.js +2 -5
  163. package/dist/schema-helpers/enumValidation.js.map +1 -1
  164. package/dist/schema-helpers/spine/nodes/decision.js +2 -1
  165. package/dist/schema-helpers/spine/nodes/decision.js.map +1 -1
  166. package/dist/schema-helpers/spine/tables/epistemicNodes.js +27 -27
  167. package/dist/schema-helpers/spine/tables/epistemicNodes.js.map +1 -1
  168. package/dist/schema-helpers/validators.d.ts +1 -1
  169. package/dist/schema-helpers/validators.js +1 -1
  170. package/dist/schema-helpers/validators.js.map +1 -1
  171. package/dist/schemas/component-table-manifest.d.ts +74 -0
  172. package/dist/schemas/component-table-manifest.js +26 -0
  173. package/dist/schemas/component-table-manifest.js.map +1 -0
  174. package/dist/schemas/enums.d.ts +5 -2
  175. package/dist/schemas/enums.js +5 -2
  176. package/dist/schemas/enums.js.map +1 -1
  177. package/dist/schemas/index.d.ts +3 -1
  178. package/dist/schemas/index.js +112 -13
  179. package/dist/schemas/index.js.map +1 -1
  180. package/dist/schemas/manifest.d.ts +1154 -949
  181. package/dist/schemas/manifest.js +80 -12
  182. package/dist/schemas/manifest.js.map +1 -1
  183. package/dist/schemas/sl-opinion.d.ts +31 -0
  184. package/dist/schemas/sl-opinion.js +19 -0
  185. package/dist/schemas/sl-opinion.js.map +1 -0
  186. package/dist/schemas/tables/identity/platform.d.ts +10 -10
  187. package/dist/schemas/tables/kernel/epistemic.d.ts +12 -10
  188. package/dist/schemas/tables/kernel/epistemic.js +6 -4
  189. package/dist/schemas/tables/kernel/epistemic.js.map +1 -1
  190. package/dist/schemas/tables/kernel/infra.d.ts +17 -5
  191. package/dist/schemas/tables/kernel/infra.js +23 -1
  192. package/dist/schemas/tables/kernel/infra.js.map +1 -1
  193. package/dist/schemas/tables/kernel/intelligence.d.ts +10 -10
  194. package/dist/schemas/tables/kernel/lens.d.ts +4 -4
  195. package/dist/schemas/tables/kernel/platform.d.ts +12 -12
  196. package/dist/schemas/tables/kernel/spine.d.ts +3 -3
  197. package/dist/schemas/tables/kernel/spine.js +5 -2
  198. package/dist/schemas/tables/kernel/spine.js.map +1 -1
  199. package/dist/schemas/tables/kernel/task.d.ts +42 -42
  200. package/dist/schemas/tables/kernel/topic.js +5 -1
  201. package/dist/schemas/tables/kernel/topic.js.map +1 -1
  202. package/dist/schemas/tables/kernel/worktree.d.ts +62 -62
  203. package/dist/schemas/tables/kernel/worktree.js +6 -4
  204. package/dist/schemas/tables/kernel/worktree.js.map +1 -1
  205. package/dist/schemas/tables/mc/identity.d.ts +26 -3
  206. package/dist/schemas/tables/mc/identity.js +35 -1
  207. package/dist/schemas/tables/mc/identity.js.map +1 -1
  208. package/dist/schemas/tables/mc/pack.d.ts +20 -20
  209. package/dist/schemas/tables/mc/registry.d.ts +4 -4
  210. package/dist/schemas/tables/mc/runtime.d.ts +1 -1
  211. package/dist/schemas/tables/mc/runtime.js +1 -1
  212. package/dist/schemas/tables/mc/runtime.js.map +1 -1
  213. package/dist/schemas/tables/mc/workspace.d.ts +9 -3
  214. package/dist/schemas/tables/mc/workspace.js +3 -1
  215. package/dist/schemas/tables/mc/workspace.js.map +1 -1
  216. package/dist/sdk-methods.contract.d.ts +7 -4
  217. package/dist/{sdk-tools.contract-C2kQN_Xk.d.ts → sdk-tools.contract-BNklQDfB.d.ts} +2 -2
  218. package/dist/sdk-tools.contract.d.ts +2 -2
  219. package/dist/sdk-tools.contract.js +800 -74
  220. package/dist/sdk-tools.contract.js.map +1 -1
  221. package/dist/tenant-bootstrap-seed.contract.d.ts +1101 -0
  222. package/dist/tenant-bootstrap-seed.contract.js +653 -0
  223. package/dist/tenant-bootstrap-seed.contract.js.map +1 -0
  224. package/dist/tenant-bootstrap-seed.defaults.d.ts +16 -0
  225. package/dist/tenant-bootstrap-seed.defaults.js +303 -0
  226. package/dist/tenant-bootstrap-seed.defaults.js.map +1 -0
  227. package/dist/tenant-client.contract.d.ts +349 -0
  228. package/dist/tenant-client.contract.js +488 -0
  229. package/dist/tenant-client.contract.js.map +1 -0
  230. package/dist/{tool-contracts-WCnuE9DW.d.ts → tool-contracts-BevD9Ho2.d.ts} +39 -3
  231. package/dist/tool-contracts.d.ts +1 -1
  232. package/dist/tool-contracts.js +801 -75
  233. package/dist/tool-contracts.js.map +1 -1
  234. package/dist/workflow-runtime.contract.js +1 -1
  235. package/dist/workflow-runtime.contract.js.map +1 -1
  236. package/package.json +27 -1
  237. package/dist/index-DoDXl8KS.d.ts +0 -19
@@ -0,0 +1,13 @@
1
+ import { FunctionContract } from './function-registry/types.js';
2
+
3
+ type FunctionRegistryInputAuditFinding = {
4
+ contractName: string;
5
+ projectionKeys: string[];
6
+ acceptedKeys: string[];
7
+ missingKeys: string[];
8
+ };
9
+ type InputProjection = NonNullable<FunctionContract["convex"]>["inputProjection"];
10
+ declare function projectionReadKeys(projection: InputProjection): string[];
11
+ declare function auditFunctionRegistryInputs(contracts?: readonly FunctionContract[]): FunctionRegistryInputAuditFinding[];
12
+
13
+ export { type FunctionRegistryInputAuditFinding, auditFunctionRegistryInputs, projectionReadKeys };
@@ -0,0 +1,166 @@
1
+ import { z } from 'zod';
2
+ import { ALL_FUNCTION_CONTRACTS } from './function-registry/index.js';
3
+
4
+ // src/function-registry-input-audit.ts
5
+ var INTERNAL_OR_ALIAS_KEYS = /* @__PURE__ */ new Set([
6
+ "__sdkSessionId",
7
+ "actorId",
8
+ "beliefId",
9
+ "createdBy",
10
+ "evidenceId",
11
+ "id",
12
+ "insightId",
13
+ "nodeId",
14
+ "ontologyId",
15
+ "parentNodeId",
16
+ "principalId",
17
+ "projectId",
18
+ "questionId",
19
+ "tenantId",
20
+ "trustedBypassAccessCheck",
21
+ "userId",
22
+ "versionId",
23
+ "workspaceId"
24
+ ]);
25
+ var INTENTIONAL_PROJECTION_READS = {
26
+ add_evidence: ["linkedBeliefNodeId", "targetId"],
27
+ apply_lens_to_topic: ["metadata"],
28
+ archive_belief: ["reason"],
29
+ check_permission: ["principalId", "tenantId", "userId", "workspaceId"],
30
+ claim_files: ["paths", "touchedFiles"],
31
+ complete_task: ["summary"],
32
+ create_belief: ["formulation"],
33
+ discover: ["prompt", "topicHint"],
34
+ filter_by_permission: ["principalId", "tenantId", "userId", "workspaceId"],
35
+ get_change_history: ["status"],
36
+ get_failure_log: ["status"],
37
+ identity_whoami: ["principalId", "tenantId", "userId", "workspaceId"],
38
+ ingest_observation: ["reasoning", "trustedBypassAccessCheck"],
39
+ link_evidence: [
40
+ "beliefId",
41
+ "beliefNodeId",
42
+ "context",
43
+ "evidenceNodeId",
44
+ "globalId",
45
+ "insightId",
46
+ "topicId",
47
+ "trustedBypassAccessCheck",
48
+ "type"
49
+ ],
50
+ link_evidence_to_belief: [
51
+ "beliefNodeId",
52
+ "context",
53
+ "evidenceNodeId",
54
+ "globalId",
55
+ "insightId",
56
+ "targetId",
57
+ "topicId",
58
+ "trustedBypassAccessCheck",
59
+ "type"
60
+ ],
61
+ link_evidence_to_question: [
62
+ "context",
63
+ "evidenceNodeId",
64
+ "globalId",
65
+ "impactScore",
66
+ "insightId",
67
+ "questionNodeId",
68
+ "targetId",
69
+ "topicId",
70
+ "trustedBypassAccessCheck",
71
+ "weight"
72
+ ],
73
+ list_evidence: ["status"],
74
+ manage_write_policy: ["summary"],
75
+ merge: ["decisionsReached", "keyFindings", "nextSteps"],
76
+ record_attempt: ["reasoning", "trustedBypassAccessCheck"],
77
+ record_judgment: ["reasoning", "trustedBypassAccessCheck"],
78
+ record_scope_learning: ["reasoning", "trustedBypassAccessCheck"],
79
+ search_beliefs: ["searchQuery"],
80
+ search_evidence: ["query", "searchQuery"],
81
+ update_question_status: ["answer", "answerStatus", "nodeId", "questionId"],
82
+ update_topic: ["graphScopeProjectId"]
83
+ };
84
+ function unwrapObjectSchema(schema) {
85
+ let current = schema;
86
+ while (true) {
87
+ switch (current._def.typeName) {
88
+ case z.ZodFirstPartyTypeKind.ZodEffects:
89
+ current = current._def.schema;
90
+ continue;
91
+ case z.ZodFirstPartyTypeKind.ZodBranded:
92
+ current = current._def.type;
93
+ continue;
94
+ default:
95
+ return current instanceof z.ZodObject ? current : void 0;
96
+ }
97
+ }
98
+ }
99
+ function objectSchemaKeys(schema) {
100
+ const objectSchema = unwrapObjectSchema(schema);
101
+ if (!objectSchema) {
102
+ return /* @__PURE__ */ new Set();
103
+ }
104
+ const shape = typeof objectSchema._def.shape === "function" ? objectSchema._def.shape() : objectSchema._def.shape;
105
+ return new Set(Object.keys(shape));
106
+ }
107
+ function projectionReadKeys(projection) {
108
+ if (!projection) {
109
+ return [];
110
+ }
111
+ const source = String(projection);
112
+ const keys = /* @__PURE__ */ new Set();
113
+ for (const match of source.matchAll(/\binput\s*\.\s*([A-Za-z_$][\w$]*)/gu)) {
114
+ keys.add(match[1]);
115
+ }
116
+ for (const match of source.matchAll(/\binput\s*\[\s*["']([^"']+)["']\s*\]/gu)) {
117
+ keys.add(match[1]);
118
+ }
119
+ return [...keys].sort();
120
+ }
121
+ function acceptedInputKeys(contract) {
122
+ const keys = [
123
+ .../* @__PURE__ */ new Set([
124
+ ...objectSchemaKeys(contract.args),
125
+ ...objectSchemaKeys(contract.input),
126
+ ...Object.keys(contract.mcp.parameters),
127
+ "__sdkSessionId"
128
+ ])
129
+ ];
130
+ keys.sort();
131
+ return keys;
132
+ }
133
+ function allowedProjectionKeys(contractName) {
134
+ return /* @__PURE__ */ new Set([
135
+ ...INTERNAL_OR_ALIAS_KEYS,
136
+ ...INTENTIONAL_PROJECTION_READS[contractName] ?? []
137
+ ]);
138
+ }
139
+ function auditFunctionRegistryInputs(contracts = ALL_FUNCTION_CONTRACTS) {
140
+ return contracts.flatMap((contract) => {
141
+ const projectionKeys = projectionReadKeys(contract.convex?.inputProjection);
142
+ if (projectionKeys.length === 0) {
143
+ return [];
144
+ }
145
+ const accepted = new Set(acceptedInputKeys(contract));
146
+ const allowed = allowedProjectionKeys(contract.name);
147
+ const missingKeys = projectionKeys.filter(
148
+ (key) => !accepted.has(key) && !allowed.has(key)
149
+ );
150
+ if (missingKeys.length === 0) {
151
+ return [];
152
+ }
153
+ return [
154
+ {
155
+ contractName: contract.name,
156
+ projectionKeys,
157
+ acceptedKeys: [...accepted].sort(),
158
+ missingKeys
159
+ }
160
+ ];
161
+ });
162
+ }
163
+
164
+ export { auditFunctionRegistryInputs, projectionReadKeys };
165
+ //# sourceMappingURL=function-registry-input-audit.js.map
166
+ //# sourceMappingURL=function-registry-input-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/function-registry-input-audit.ts"],"names":[],"mappings":";;;;AAeA,IAAM,sBAAA,uBAA6B,GAAA,CAAI;AAAA,EACrC,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,0BAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,4BAAA,GAAkE;AAAA,EACtE,YAAA,EAAc,CAAC,oBAAA,EAAsB,UAAU,CAAA;AAAA,EAC/C,mBAAA,EAAqB,CAAC,UAAU,CAAA;AAAA,EAChC,cAAA,EAAgB,CAAC,QAAQ,CAAA;AAAA,EACzB,gBAAA,EAAkB,CAAC,aAAA,EAAe,UAAA,EAAY,UAAU,aAAa,CAAA;AAAA,EACrE,WAAA,EAAa,CAAC,OAAA,EAAS,cAAc,CAAA;AAAA,EACrC,aAAA,EAAe,CAAC,SAAS,CAAA;AAAA,EACzB,aAAA,EAAe,CAAC,aAAa,CAAA;AAAA,EAC7B,QAAA,EAAU,CAAC,QAAA,EAAU,WAAW,CAAA;AAAA,EAChC,oBAAA,EAAsB,CAAC,aAAA,EAAe,UAAA,EAAY,UAAU,aAAa,CAAA;AAAA,EACzE,kBAAA,EAAoB,CAAC,QAAQ,CAAA;AAAA,EAC7B,eAAA,EAAiB,CAAC,QAAQ,CAAA;AAAA,EAC1B,eAAA,EAAiB,CAAC,aAAA,EAAe,UAAA,EAAY,UAAU,aAAa,CAAA;AAAA,EACpE,kBAAA,EAAoB,CAAC,WAAA,EAAa,0BAA0B,CAAA;AAAA,EAC5D,aAAA,EAAe;AAAA,IACb,UAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,0BAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,uBAAA,EAAyB;AAAA,IACvB,cAAA;AAAA,IACA,SAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,0BAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,SAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,0BAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,aAAA,EAAe,CAAC,QAAQ,CAAA;AAAA,EACxB,mBAAA,EAAqB,CAAC,SAAS,CAAA;AAAA,EAC/B,KAAA,EAAO,CAAC,kBAAA,EAAoB,aAAA,EAAe,WAAW,CAAA;AAAA,EACtD,cAAA,EAAgB,CAAC,WAAA,EAAa,0BAA0B,CAAA;AAAA,EACxD,eAAA,EAAiB,CAAC,WAAA,EAAa,0BAA0B,CAAA;AAAA,EACzD,qBAAA,EAAuB,CAAC,WAAA,EAAa,0BAA0B,CAAA;AAAA,EAC/D,cAAA,EAAgB,CAAC,aAAa,CAAA;AAAA,EAC9B,eAAA,EAAiB,CAAC,OAAA,EAAS,aAAa,CAAA;AAAA,EACxC,sBAAA,EAAwB,CAAC,QAAA,EAAU,cAAA,EAAgB,UAAU,YAAY,CAAA;AAAA,EACzE,YAAA,EAAc,CAAC,qBAAqB;AACtC,CAAA;AAEA,SAAS,mBACP,MAAA,EACwC;AACxC,EAAA,IAAI,OAAA,GAAU,MAAA;AACd,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,QAAQ,OAAA,CAAQ,KAAK,QAAA;AAAU,MAC7B,KAAK,EAAE,qBAAA,CAAsB,UAAA;AAC3B,QAAA,OAAA,GAAU,QAAQ,IAAA,CAAK,MAAA;AACvB,QAAA;AAAA,MACF,KAAK,EAAE,qBAAA,CAAsB,UAAA;AAC3B,QAAA,OAAA,GAAU,QAAQ,IAAA,CAAK,IAAA;AACvB,QAAA;AAAA,MACF;AACE,QAAA,OAAO,OAAA,YAAmB,CAAA,CAAE,SAAA,GAAY,OAAA,GAAU,MAAA;AAAA;AACtD,EACF;AACF;AAEA,SAAS,iBAAiB,MAAA,EAAmC;AAC3D,EAAA,MAAM,YAAA,GAAe,mBAAmB,MAAM,CAAA;AAC9C,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,2BAAW,GAAA,EAAI;AAAA,EACjB;AACA,EAAA,MAAM,KAAA,GACJ,OAAO,YAAA,CAAa,IAAA,CAAK,KAAA,KAAU,UAAA,GAC/B,YAAA,CAAa,IAAA,CAAK,KAAA,EAAM,GACxB,YAAA,CAAa,IAAA,CAAK,KAAA;AACxB,EAAA,OAAO,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AACnC;AAEO,SAAS,mBACd,UAAA,EACU;AACV,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,MAAA,GAAS,OAAO,UAAU,CAAA;AAChC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,QAAA,CAAS,qCAAqC,CAAA,EAAG;AAC1E,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACnB;AACA,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,QAAA,CAAS,wCAAwC,CAAA,EAAG;AAC7E,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACnB;AAEA,EAAA,OAAO,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA,EAAK;AACxB;AAEA,SAAS,kBAAkB,QAAA,EAAsC;AAC/D,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,uBAAO,GAAA,CAAI;AAAA,MACT,GAAG,gBAAA,CAAiB,QAAA,CAAS,IAAI,CAAA;AAAA,MACjC,GAAG,gBAAA,CAAiB,QAAA,CAAS,KAAK,CAAA;AAAA,MAClC,GAAG,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,UAAU,CAAA;AAAA,MACtC;AAAA,KACD;AAAA,GACH;AACA,EAAA,IAAA,CAAK,IAAA,EAAK;AACV,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,sBAAsB,YAAA,EAAmC;AAChE,EAAA,2BAAW,GAAA,CAAI;AAAA,IACb,GAAG,sBAAA;AAAA,IACH,GAAI,4BAAA,CAA6B,YAAY,CAAA,IAAK;AAAC,GACpD,CAAA;AACH;AAEO,SAAS,2BAAA,CACd,YAAyC,sBAAA,EACJ;AACrC,EAAA,OAAO,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa;AACrC,IAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,QAAA,CAAS,MAAA,EAAQ,eAAe,CAAA;AAC1E,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,iBAAA,CAAkB,QAAQ,CAAC,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,QAAA,CAAS,IAAI,CAAA;AACnD,IAAA,MAAM,cAAc,cAAA,CAAe,MAAA;AAAA,MACjC,CAAC,GAAA,KAAQ,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,IAAK,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG;AAAA,KACjD;AAEA,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,cAAc,QAAA,CAAS,IAAA;AAAA,QACvB,cAAA;AAAA,QACA,YAAA,EAAc,CAAC,GAAG,QAAQ,EAAE,IAAA,EAAK;AAAA,QACjC;AAAA;AACF,KACF;AAAA,EACF,CAAC,CAAA;AACH","file":"function-registry-input-audit.js","sourcesContent":["import { z } from \"zod\";\nimport { ALL_FUNCTION_CONTRACTS } from \"./function-registry/index.js\";\nimport type { FunctionContract } from \"./function-registry/types.js\";\n\nexport type FunctionRegistryInputAuditFinding = {\n contractName: string;\n projectionKeys: string[];\n acceptedKeys: string[];\n missingKeys: string[];\n};\n\ntype InputProjection = NonNullable<\n FunctionContract[\"convex\"]\n>[\"inputProjection\"];\n\nconst INTERNAL_OR_ALIAS_KEYS = new Set([\n \"__sdkSessionId\",\n \"actorId\",\n \"beliefId\",\n \"createdBy\",\n \"evidenceId\",\n \"id\",\n \"insightId\",\n \"nodeId\",\n \"ontologyId\",\n \"parentNodeId\",\n \"principalId\",\n \"projectId\",\n \"questionId\",\n \"tenantId\",\n \"trustedBypassAccessCheck\",\n \"userId\",\n \"versionId\",\n \"workspaceId\",\n]);\n\nconst INTENTIONAL_PROJECTION_READS: Record<string, readonly string[]> = {\n add_evidence: [\"linkedBeliefNodeId\", \"targetId\"],\n apply_lens_to_topic: [\"metadata\"],\n archive_belief: [\"reason\"],\n check_permission: [\"principalId\", \"tenantId\", \"userId\", \"workspaceId\"],\n claim_files: [\"paths\", \"touchedFiles\"],\n complete_task: [\"summary\"],\n create_belief: [\"formulation\"],\n discover: [\"prompt\", \"topicHint\"],\n filter_by_permission: [\"principalId\", \"tenantId\", \"userId\", \"workspaceId\"],\n get_change_history: [\"status\"],\n get_failure_log: [\"status\"],\n identity_whoami: [\"principalId\", \"tenantId\", \"userId\", \"workspaceId\"],\n ingest_observation: [\"reasoning\", \"trustedBypassAccessCheck\"],\n link_evidence: [\n \"beliefId\",\n \"beliefNodeId\",\n \"context\",\n \"evidenceNodeId\",\n \"globalId\",\n \"insightId\",\n \"topicId\",\n \"trustedBypassAccessCheck\",\n \"type\",\n ],\n link_evidence_to_belief: [\n \"beliefNodeId\",\n \"context\",\n \"evidenceNodeId\",\n \"globalId\",\n \"insightId\",\n \"targetId\",\n \"topicId\",\n \"trustedBypassAccessCheck\",\n \"type\",\n ],\n link_evidence_to_question: [\n \"context\",\n \"evidenceNodeId\",\n \"globalId\",\n \"impactScore\",\n \"insightId\",\n \"questionNodeId\",\n \"targetId\",\n \"topicId\",\n \"trustedBypassAccessCheck\",\n \"weight\",\n ],\n list_evidence: [\"status\"],\n manage_write_policy: [\"summary\"],\n merge: [\"decisionsReached\", \"keyFindings\", \"nextSteps\"],\n record_attempt: [\"reasoning\", \"trustedBypassAccessCheck\"],\n record_judgment: [\"reasoning\", \"trustedBypassAccessCheck\"],\n record_scope_learning: [\"reasoning\", \"trustedBypassAccessCheck\"],\n search_beliefs: [\"searchQuery\"],\n search_evidence: [\"query\", \"searchQuery\"],\n update_question_status: [\"answer\", \"answerStatus\", \"nodeId\", \"questionId\"],\n update_topic: [\"graphScopeProjectId\"],\n};\n\nfunction unwrapObjectSchema(\n schema: z.ZodTypeAny,\n): z.ZodObject<z.ZodRawShape> | undefined {\n let current = schema;\n while (true) {\n switch (current._def.typeName) {\n case z.ZodFirstPartyTypeKind.ZodEffects:\n current = current._def.schema;\n continue;\n case z.ZodFirstPartyTypeKind.ZodBranded:\n current = current._def.type;\n continue;\n default:\n return current instanceof z.ZodObject ? current : undefined;\n }\n }\n}\n\nfunction objectSchemaKeys(schema: z.ZodTypeAny): Set<string> {\n const objectSchema = unwrapObjectSchema(schema);\n if (!objectSchema) {\n return new Set();\n }\n const shape =\n typeof objectSchema._def.shape === \"function\"\n ? objectSchema._def.shape()\n : objectSchema._def.shape;\n return new Set(Object.keys(shape));\n}\n\nexport function projectionReadKeys(\n projection: InputProjection,\n): string[] {\n if (!projection) {\n return [];\n }\n const source = String(projection);\n const keys = new Set<string>();\n\n for (const match of source.matchAll(/\\binput\\s*\\.\\s*([A-Za-z_$][\\w$]*)/gu)) {\n keys.add(match[1]);\n }\n for (const match of source.matchAll(/\\binput\\s*\\[\\s*[\"']([^\"']+)[\"']\\s*\\]/gu)) {\n keys.add(match[1]);\n }\n\n return [...keys].sort();\n}\n\nfunction acceptedInputKeys(contract: FunctionContract): string[] {\n const keys = [\n ...new Set([\n ...objectSchemaKeys(contract.args),\n ...objectSchemaKeys(contract.input),\n ...Object.keys(contract.mcp.parameters),\n \"__sdkSessionId\",\n ]),\n ];\n keys.sort();\n return keys;\n}\n\nfunction allowedProjectionKeys(contractName: string): Set<string> {\n return new Set([\n ...INTERNAL_OR_ALIAS_KEYS,\n ...(INTENTIONAL_PROJECTION_READS[contractName] ?? []),\n ]);\n}\n\nexport function auditFunctionRegistryInputs(\n contracts: readonly FunctionContract[] = ALL_FUNCTION_CONTRACTS,\n): FunctionRegistryInputAuditFinding[] {\n return contracts.flatMap((contract) => {\n const projectionKeys = projectionReadKeys(contract.convex?.inputProjection);\n if (projectionKeys.length === 0) {\n return [];\n }\n\n const accepted = new Set(acceptedInputKeys(contract));\n const allowed = allowedProjectionKeys(contract.name);\n const missingKeys = projectionKeys.filter(\n (key) => !accepted.has(key) && !allowed.has(key),\n );\n\n if (missingKeys.length === 0) {\n return [];\n }\n\n return [\n {\n contractName: contract.name,\n projectionKeys,\n acceptedKeys: [...accepted].sort(),\n missingKeys,\n },\n ];\n });\n}\n"]}
@@ -33,6 +33,7 @@ type CutoverFlagState = "legacy" | "cutover" | "disabled";
33
33
  */
34
34
  type GatewayAuthContext = {
35
35
  userId: string;
36
+ clerkId?: string;
36
37
  convexToken?: string;
37
38
  /** Opaque in contract — narrowed to ConvexHttpClient at the gateway. */
38
39
  convex: any;
@@ -42,6 +43,7 @@ type GatewayAuthContext = {
42
43
  tenantId?: string;
43
44
  workspaceId?: string;
44
45
  roles?: string[];
46
+ membershipId?: string;
45
47
  sessionId?: string;
46
48
  sessionAuthMode?: SessionAuthMode;
47
49
  sessionExpiresAt?: number;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/gateway.contract.ts"],"names":[],"mappings":";AA2IO,SAAS,wBACd,WAAA,EACQ;AACR,EAAA,MAAM,WAAA,GACJ,OAAO,WAAA,CAAY,WAAA,KAAgB,WAC/B,WAAA,CAAY,WAAA,CAAY,MAAK,GAC7B,EAAA;AACN,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAO,WAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AACxE","file":"gateway.contract.js","sourcesContent":["/**\n * Gateway contract types — shared between Stack's gateway middleware and\n * Lucern's server-core / gateway route handlers.\n *\n * These types describe the authenticated request context that flows from\n * the gateway into Lucern route handlers. The gateway (Stack-side) creates\n * the context; Lucern consumes it read-only.\n *\n * @module @lucern/contracts/src/gateway\n */\n\nimport type {\n SessionAuthMode,\n SessionDelegationHop,\n SessionPrincipalType,\n} from \"./auth-session.contract\";\n\n// ---------------------------------------------------------------------------\n// Error codes\n// ---------------------------------------------------------------------------\n\nexport type PlatformApiErrorCode =\n | \"AUTH_REQUIRED\"\n | \"AUTHENTICATION_REQUIRED\"\n | \"AUTH_TOKEN_MISSING\"\n | \"INVALID_REQUEST\"\n | \"IDEMPOTENCY_KEY_REQUIRED\"\n | \"FORBIDDEN\"\n | \"SCOPE_INSUFFICIENT\"\n | \"ENVIRONMENT_MISMATCH\"\n | \"KEY_EXPIRED\"\n | \"KEY_REVOKED\"\n | \"RATE_LIMIT_EXCEEDED\"\n | \"NOT_FOUND\"\n | \"CONFLICT\"\n | \"UPSTREAM_ERROR\"\n | \"INTERNAL_ERROR\";\n\n// ---------------------------------------------------------------------------\n// Gateway scope and environment\n// ---------------------------------------------------------------------------\n\nexport type GatewayScope = {\n tenantId?: string;\n workspaceId?: string;\n};\n\nexport type GatewayEnvironment = \"sandbox\" | \"production\";\n\nexport type GatewayAuthMode =\n | \"interactive_user\"\n | \"service_principal\"\n | \"tenant_api_key\"\n | \"session_token\";\n\nexport type KeyLifecycleStatus =\n | \"active\"\n | \"rotating\"\n | \"rotated\"\n | \"expired\"\n | \"revoked\";\n\nexport type CutoverDomain =\n | \"graph\"\n | \"schema\"\n | \"identity\"\n | \"policy\"\n | \"audit\"\n | \"admin\"\n | \"agent\"\n | \"tool\"\n | \"prompt\"\n | \"intelligence\";\n\nexport type CutoverFlagState = \"legacy\" | \"cutover\" | \"disabled\";\n\n// ---------------------------------------------------------------------------\n// Gateway auth context — the canonical authenticated request shape\n// ---------------------------------------------------------------------------\n\n/**\n * Authenticated request context created by the gateway middleware.\n * Lucern route handlers receive this as a read-only parameter.\n *\n * The `convex` field is typed as `unknown` in the contract because Lucern\n * consumers should not use the gateway's Convex client directly — they\n * have their own kernel client. The gateway (Stack-side) narrows this to\n * `ConvexHttpClient` at the construction site.\n */\nexport type GatewayAuthContext = {\n userId: string;\n convexToken?: string;\n /** Opaque in contract — narrowed to ConvexHttpClient at the gateway. */\n convex: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n authMode: GatewayAuthMode;\n principalId?: string;\n principalType?: SessionPrincipalType;\n tenantId?: string;\n workspaceId?: string;\n roles?: string[];\n sessionId?: string;\n sessionAuthMode?: SessionAuthMode;\n sessionExpiresAt?: number;\n delegationChain?: SessionDelegationHop[];\n servicePrincipalId?: string;\n servicePrincipalKeyId?: string;\n servicePrincipalTenantId?: string;\n servicePrincipalWorkspaceId?: string;\n requestEnvironment: GatewayEnvironment;\n keyEnvironment?: GatewayEnvironment;\n keyStatus: KeyLifecycleStatus | \"unknown\";\n grantedScopes: Set<string>;\n cutoverDomain: CutoverDomain;\n cutoverState: CutoverFlagState;\n};\n\n// ---------------------------------------------------------------------------\n// Gateway response helpers — portable (no Next.js dependency)\n// ---------------------------------------------------------------------------\n\nexport type GatewayErrorArgs = {\n code: PlatformApiErrorCode;\n message: string;\n status: number;\n correlationId: string;\n policyTraceId?: string;\n invariant?: string;\n suggestion?: string;\n details?: unknown;\n headers?: HeadersInit;\n};\n\nexport type GatewaySuccessArgs = {\n status?: number;\n correlationId: string;\n policyTraceId?: string;\n idempotentReplay?: boolean;\n};\n\nexport function requireActorPrincipalId(\n authContext: GatewayAuthContext\n): string {\n const principalId =\n typeof authContext.principalId === \"string\"\n ? authContext.principalId.trim()\n : \"\";\n if (principalId.length > 0) {\n return principalId;\n }\n throw new Error(\"Access denied: federated principal context required.\");\n}\n"]}
1
+ {"version":3,"sources":["../src/gateway.contract.ts"],"names":[],"mappings":";AA6IO,SAAS,wBACd,WAAA,EACQ;AACR,EAAA,MAAM,WAAA,GACJ,OAAO,WAAA,CAAY,WAAA,KAAgB,WAC/B,WAAA,CAAY,WAAA,CAAY,MAAK,GAC7B,EAAA;AACN,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAO,WAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AACxE","file":"gateway.contract.js","sourcesContent":["/**\n * Gateway contract types — shared between Stack's gateway middleware and\n * Lucern's server-core / gateway route handlers.\n *\n * These types describe the authenticated request context that flows from\n * the gateway into Lucern route handlers. The gateway (Stack-side) creates\n * the context; Lucern consumes it read-only.\n *\n * @module @lucern/contracts/src/gateway\n */\n\nimport type {\n SessionAuthMode,\n SessionDelegationHop,\n SessionPrincipalType,\n} from \"./auth-session.contract\";\n\n// ---------------------------------------------------------------------------\n// Error codes\n// ---------------------------------------------------------------------------\n\nexport type PlatformApiErrorCode =\n | \"AUTH_REQUIRED\"\n | \"AUTHENTICATION_REQUIRED\"\n | \"AUTH_TOKEN_MISSING\"\n | \"INVALID_REQUEST\"\n | \"IDEMPOTENCY_KEY_REQUIRED\"\n | \"FORBIDDEN\"\n | \"SCOPE_INSUFFICIENT\"\n | \"ENVIRONMENT_MISMATCH\"\n | \"KEY_EXPIRED\"\n | \"KEY_REVOKED\"\n | \"RATE_LIMIT_EXCEEDED\"\n | \"NOT_FOUND\"\n | \"CONFLICT\"\n | \"UPSTREAM_ERROR\"\n | \"INTERNAL_ERROR\";\n\n// ---------------------------------------------------------------------------\n// Gateway scope and environment\n// ---------------------------------------------------------------------------\n\nexport type GatewayScope = {\n tenantId?: string;\n workspaceId?: string;\n};\n\nexport type GatewayEnvironment = \"sandbox\" | \"production\";\n\nexport type GatewayAuthMode =\n | \"interactive_user\"\n | \"service_principal\"\n | \"tenant_api_key\"\n | \"session_token\";\n\nexport type KeyLifecycleStatus =\n | \"active\"\n | \"rotating\"\n | \"rotated\"\n | \"expired\"\n | \"revoked\";\n\nexport type CutoverDomain =\n | \"graph\"\n | \"schema\"\n | \"identity\"\n | \"policy\"\n | \"audit\"\n | \"admin\"\n | \"agent\"\n | \"tool\"\n | \"prompt\"\n | \"intelligence\";\n\nexport type CutoverFlagState = \"legacy\" | \"cutover\" | \"disabled\";\n\n// ---------------------------------------------------------------------------\n// Gateway auth context — the canonical authenticated request shape\n// ---------------------------------------------------------------------------\n\n/**\n * Authenticated request context created by the gateway middleware.\n * Lucern route handlers receive this as a read-only parameter.\n *\n * The `convex` field is typed as `unknown` in the contract because Lucern\n * consumers should not use the gateway's Convex client directly — they\n * have their own kernel client. The gateway (Stack-side) narrows this to\n * `ConvexHttpClient` at the construction site.\n */\nexport type GatewayAuthContext = {\n userId: string;\n clerkId?: string;\n convexToken?: string;\n /** Opaque in contract — narrowed to ConvexHttpClient at the gateway. */\n convex: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n authMode: GatewayAuthMode;\n principalId?: string;\n principalType?: SessionPrincipalType;\n tenantId?: string;\n workspaceId?: string;\n roles?: string[];\n membershipId?: string;\n sessionId?: string;\n sessionAuthMode?: SessionAuthMode;\n sessionExpiresAt?: number;\n delegationChain?: SessionDelegationHop[];\n servicePrincipalId?: string;\n servicePrincipalKeyId?: string;\n servicePrincipalTenantId?: string;\n servicePrincipalWorkspaceId?: string;\n requestEnvironment: GatewayEnvironment;\n keyEnvironment?: GatewayEnvironment;\n keyStatus: KeyLifecycleStatus | \"unknown\";\n grantedScopes: Set<string>;\n cutoverDomain: CutoverDomain;\n cutoverState: CutoverFlagState;\n};\n\n// ---------------------------------------------------------------------------\n// Gateway response helpers — portable (no Next.js dependency)\n// ---------------------------------------------------------------------------\n\nexport type GatewayErrorArgs = {\n code: PlatformApiErrorCode;\n message: string;\n status: number;\n correlationId: string;\n policyTraceId?: string;\n invariant?: string;\n suggestion?: string;\n details?: unknown;\n headers?: HeadersInit;\n};\n\nexport type GatewaySuccessArgs = {\n status?: number;\n correlationId: string;\n policyTraceId?: string;\n idempotentReplay?: boolean;\n};\n\nexport function requireActorPrincipalId(\n authContext: GatewayAuthContext\n): string {\n const principalId =\n typeof authContext.principalId === \"string\"\n ? authContext.principalId.trim()\n : \"\";\n if (principalId.length > 0) {\n return principalId;\n }\n throw new Error(\"Access denied: federated principal context required.\");\n}\n"]}
@@ -8,7 +8,7 @@ var KERNEL_SCHEMA_TABLES = {
8
8
  "autofixJobs": defineTable(v.object({ "allowlistEligible": v.boolean(), "allowlistReason": v.string(), "attemptCount": v.number(), "branchName": v.optional(v.string()), "claimedAt": v.optional(v.number()), "claimedBy": v.optional(v.string()), "commitSha": v.optional(v.string()), "completedAt": v.optional(v.number()), "createdAt": v.number(), "dedupeKey": v.string(), "environment": v.string(), "error": v.optional(v.string()), "errorMessage": v.string(), "errorType": v.string(), "filePaths": v.array(v.string()), "fingerprint": v.string(), "harnessReceipt": v.optional(v.object({ "commitShas": v.array(v.string()), "completedAt": v.number(), "errorSummary": v.optional(v.string()), "filesChanged": v.array(v.string()), "fixDescription": v.optional(v.string()), "prCreated": v.boolean(), "runnerSessionId": v.string(), "startedAt": v.number(), "verificationResults": v.array(v.object({ "command": v.string(), "status": v.union(v.literal("pass"), v.literal("fail"), v.literal("skipped")), "summary": v.optional(v.string()) })) })), "iterationCount": v.optional(v.number()), "iterationPolicy": v.optional(v.object({ "confidenceFloor": v.number(), "flakeThreshold": v.number(), "maxIterations": v.number(), "pollIntervalMs": v.number() })), "iterationReceipts": v.optional(v.array(v.object({ "actionTaken": v.string(), "agentConfidence": v.optional(v.number()), "checkConclusion": v.string(), "commitSha": v.optional(v.string()), "completedAt": v.number(), "errorSignature": v.optional(v.string()), "failureSummary": v.optional(v.string()), "filesChanged": v.optional(v.array(v.string())), "iteration": v.number(), "startedAt": v.number() }))), "lastCheckConclusion": v.optional(v.string()), "maxAttempts": v.number(), "maxIterations": v.optional(v.number()), "prNumber": v.optional(v.number()), "prUrl": v.optional(v.string()), "sentryEventId": v.string(), "sentryIssueId": v.string(), "sentryIssueUrl": v.optional(v.string()), "sentryOrgSlug": v.string(), "sentryPayload": v.record(v.string(), v.any()), "sentryProjectSlug": v.string(), "stackTrace": v.optional(v.string()), "startedAt": v.optional(v.number()), "status": v.union(v.literal("pending"), v.literal("claimed"), v.literal("running"), v.literal("iterating"), v.literal("succeeded"), v.literal("failed"), v.literal("cancelled")), "stopReason": v.optional(v.string()), "triggeredRule": v.string(), "updatedAt": v.number() })).index("by_status", ["status"]).index("by_dedupeKey", ["dedupeKey"]).index("by_sentryIssueId", ["sentryIssueId"]).index("by_status_createdAt", ["status", "createdAt"]).index("by_environment", ["environment"]).index("by_claimedBy", ["claimedBy"]).index("by_createdAt", ["createdAt"]),
9
9
  "backgroundJobRuns": defineTable(v.object({ "completedAt": v.optional(v.number()), "durationMs": v.optional(v.number()), "error": v.optional(v.string()), "jobKey": v.string(), "resultSummary": v.optional(v.string()), "scheduler": v.string(), "startedAt": v.number(), "status": v.union(v.literal("running"), v.literal("completed"), v.literal("failed"), v.literal("skipped")), "triggeredBy": v.string() })).index("by_jobKey", ["jobKey"]).index("by_startedAt", ["startedAt"]).index("by_jobKey_startedAt", ["jobKey", "startedAt"]).index("by_status", ["status"]),
10
10
  "backgroundJobSettings": defineTable(v.object({ "enabled": v.boolean(), "jobKey": v.string(), "notes": v.optional(v.string()), "updatedAt": v.number(), "updatedBy": v.string() })).index("by_jobKey", ["jobKey"]).index("by_enabled", ["enabled"]).index("by_updatedAt", ["updatedAt"]),
11
- "beliefConfidence": defineTable(v.object({ "assessedAt": v.number(), "assessedBy": v.string(), "baseRate": v.number(), "belief": v.optional(v.number()), "beliefId": v.string(), "certainty": v.optional(v.number()), "confidence": v.number(), "confidenceLevel": v.optional(v.union(v.literal("high"), v.literal("medium"), v.literal("low"))), "disbelief": v.optional(v.number()), "isAgentAssessment": v.optional(v.boolean()), "rationale": v.optional(v.string()), "slOperator": v.optional(v.string()), "trigger": v.union(v.literal("initial"), v.literal("evidence_added"), v.literal("evidence_removed"), v.literal("contradiction_detected"), v.literal("contradiction_resolved"), v.literal("manual"), v.literal("decay"), v.literal("propagation"), v.literal("agent_assessment"), v.literal("worktree_outcome"), v.literal("worktree_completed"), v.literal("fusion"), v.literal("discount"), v.literal("deduction"), v.literal("backfill_synthetic")), "triggeringAgentId": v.optional(v.string()), "triggeringContradictionId": v.optional(v.id("contradictions")), "triggeringEvidenceId": v.optional(v.string()), "triggeringEvidenceIds": v.optional(v.array(v.string())), "triggeringWorktreeId": v.optional(v.string()), "uncertainty": v.optional(v.number()), "valence": v.optional(v.number()) })).index("by_beliefId", ["beliefId"]).index("by_beliefId_time", ["beliefId", "assessedAt"]).index("by_trigger", ["trigger"]),
11
+ "beliefConfidence": defineTable(v.object({ "assessedAt": v.number(), "assessedBy": v.string(), "baseRate": v.number(), "belief": v.number(), "beliefId": v.string(), "certainty": v.optional(v.number()), "confidence": v.number(), "confidenceLevel": v.optional(v.union(v.literal("high"), v.literal("medium"), v.literal("low"))), "disbelief": v.number(), "isAgentAssessment": v.optional(v.boolean()), "rationale": v.optional(v.string()), "slOperator": v.optional(v.string()), "trigger": v.union(v.literal("initial"), v.literal("evidence_added"), v.literal("evidence_removed"), v.literal("contradiction_detected"), v.literal("contradiction_resolved"), v.literal("propagation"), v.literal("agent_assessment"), v.literal("worktree_outcome"), v.literal("worktree_completed"), v.literal("fusion"), v.literal("discount"), v.literal("deduction"), v.literal("backfill_synthetic")), "triggeringAgentId": v.optional(v.string()), "triggeringAnswerId": v.optional(v.string()), "triggeringContradictionId": v.optional(v.id("contradictions")), "triggeringEvidenceId": v.optional(v.string()), "triggeringEvidenceIds": v.optional(v.array(v.string())), "triggeringQuestionId": v.optional(v.string()), "triggeringWorktreeId": v.optional(v.string()), "uncertainty": v.number(), "valence": v.optional(v.number()) })).index("by_beliefId", ["beliefId"]).index("by_beliefId_time", ["beliefId", "assessedAt"]).index("by_trigger", ["trigger"]),
12
12
  "beliefEvidenceLinks": defineTable(v.object({ "beliefId": v.string(), "confidence": v.optional(v.number()), "createdAt": v.number(), "createdBy": v.string(), "insightId": v.string(), "rationale": v.optional(v.string()), "relation": v.union(v.literal("supports"), v.literal("contradicts")), "status": v.optional(v.union(v.literal("suggested"), v.literal("approved"), v.literal("dismissed"))) })).index("by_beliefId", ["beliefId"]).index("by_insightId", ["insightId"]).index("by_relation", ["beliefId", "relation"]).index("by_status", ["status"]),
13
13
  "beliefHistory": defineTable(v.object({ "beliefId": v.string(), "justification": v.optional(v.string()), "newStatus": v.string(), "previousStatus": v.optional(v.string()), "timestamp": v.number(), "triggeredByEvidenceIds": v.optional(v.array(v.string())), "triggeredByUserId": v.optional(v.string()) })).index("by_beliefId", ["beliefId"]),
14
14
  "beliefScenarios": defineTable(v.object({ "assumedState": v.union(v.literal("false"), v.literal("true"), v.literal("weakened"), v.literal("strengthened")), "cascadeEffects": v.array(v.object({ "beliefId": v.string(), "beliefText": v.string(), "currentConfidence": v.string(), "projectedConfidence": v.string(), "reason": v.string() })), "createdAt": v.number(), "createdBy": v.string(), "description": v.string(), "keyInsights": v.array(v.string()), "pillarImpacts": v.optional(v.array(v.object({ "impactLevel": v.string(), "pillar": v.string(), "reason": v.string() }))), "recommendedActions": v.optional(v.array(v.object({ "action": v.string(), "priority": v.string(), "rationale": v.string() }))), "scenarioType": v.union(v.literal("falsification"), v.literal("strengthening"), v.literal("alternative"), v.literal("collapse"), v.literal("critical_path")), "sourceChatId": v.optional(v.id("chats")), "sourceMessageId": v.optional(v.id("messages")), "sourceWorktreeId": v.optional(v.string()), "testedBeliefId": v.string(), "thesisImpact": v.union(v.literal("thesis_fails"), v.literal("thesis_weakens"), v.literal("pillar_fails"), v.literal("localized"), v.literal("minimal")), "title": v.string(), "topicId": v.optional(v.string()) })).index("by_topicId", ["topicId"]).index("by_topic_scenarioType", ["topicId", "scenarioType"]).index("by_topic_thesisImpact", ["topicId", "thesisImpact"]).index("by_testedBelief", ["testedBeliefId"]).index("by_sourceWorktreeId", ["sourceWorktreeId"]),
@@ -26,7 +26,7 @@ var KERNEL_SCHEMA_TABLES = {
26
26
  "deliberationSessions": defineTable(v.object({ "completedAt": v.optional(v.number()), "contextBrief": v.optional(v.string()), "contextSnapshot": v.optional(v.any()), "contradictionIds": v.array(v.id("contradictions")), "createdAt": v.number(), "createdBy": v.string(), "error": v.optional(v.string()), "escalationQuestionIds": v.array(v.id("epistemicNodes")), "linkedBeliefNodeId": v.optional(v.id("epistemicNodes")), "modelSlots": v.array(v.string()), "outcomeSummary": v.optional(v.any()), "principalId": v.string(), "question": v.string(), "replayBaseline": v.optional(v.any()), "replayBaselineAt": v.number(), "replayDelta": v.optional(v.any()), "replayHeadAt": v.optional(v.number()), "status": v.union(v.literal("running"), v.literal("completed"), v.literal("failed")), "tenantId": v.optional(v.string()), "topicId": v.optional(v.string()), "traceId": v.optional(v.string()), "uncertaintyZones": v.array(v.object({ "explanation": v.string(), "label": v.string(), "slots": v.array(v.string()) })), "updatedAt": v.number(), "workspaceId": v.optional(v.string()) })).index("by_topicId", ["topicId"]).index("by_status", ["status"]).index("by_topic_status", ["topicId", "status"]).index("by_createdBy", ["createdBy"]),
27
27
  "epistemicAudit": defineTable(v.object({ "agentType": v.optional(v.string()), "changedAt": v.number(), "changedBy": v.string(), "changeType": v.union(v.literal("created"), v.literal("status_changed"), v.literal("confidence_changed"), v.literal("criticality_changed"), v.literal("formulation_modified"), v.literal("forked"), v.literal("superseded"), v.literal("archived"), v.literal("resolved"), v.literal("severity_changed"), v.literal("edge_added"), v.literal("edge_removed"), v.literal("annotated"), v.literal("blocked"), v.literal("unblocked"), v.literal("decision_finalized"), v.literal("proposal_accepted"), v.literal("proposal_rejected"), v.literal("pillar_changed"), v.literal("updated"), v.literal("deleted"), v.literal("entity_merged"), v.literal("entity_attributes_updated"), v.literal("entity_archived"), v.literal("published"), v.literal("deprecated"), v.literal("source_created"), v.literal("source_metadata_updated")), "entityId": v.string(), "entityType": v.union(v.literal("belief"), v.literal("evidence"), v.literal("question"), v.literal("answer"), v.literal("contradiction"), v.literal("decision"), v.literal("proposal"), v.literal("edge"), v.literal("node"), v.literal("entity"), v.literal("source"), v.literal("belief_conditional"), v.literal("belief_scenario"), v.literal("ontologyDefinition"), v.literal("ontologyVersion")), "isAgent": v.boolean(), "mcpSessionId": v.optional(v.string()), "mcpToolName": v.optional(v.string()), "newState": v.optional(v.union(v.record(v.string(), v.any()), v.null())), "previousState": v.optional(v.union(v.record(v.string(), v.any()), v.null())), "proposalId": v.optional(v.string()), "rationale": v.optional(v.string()), "sourceCommit": v.optional(v.string()), "topicId": v.optional(v.string()), "triggeringAction": v.optional(v.string()) })).index("by_entityId", ["entityId"]).index("by_entityType", ["entityType"]).index("by_entityType_id", ["entityType", "entityId"]).index("by_changedAt", ["changedAt"]).index("by_changedBy", ["changedBy"]).index("by_topicId", ["topicId"]).index("by_changeType", ["changeType"]).index("by_mcpSessionId", ["mcpSessionId"]),
28
28
  "epistemicContracts": defineTable(v.object({ "beliefNodeId": v.string(), "compositeOf": v.optional(v.array(v.string())), "compositeOperator": v.optional(v.union(v.literal("all"), v.literal("any"), v.literal("majority"))), "condition": v.object({ "evaluator": v.string(), "evaluatorConfig": v.optional(v.union(v.string(), v.number(), v.boolean(), v.null(), v.record(v.string(), v.any()), v.array(v.any()))), "expression": v.string() }), "conditionType": v.union(v.literal("assertion"), v.literal("temporal"), v.literal("evidential"), v.literal("threshold"), v.literal("composite")), "contractId": v.string(), "createdAt": v.number(), "createdBy": v.string(), "deadline": v.optional(v.number()), "description": v.optional(v.string()), "direction": v.union(v.literal("confirms"), v.literal("falsifies")), "evaluationCount": v.optional(v.number()), "evaluationSchedule": v.union(v.literal("on_demand"), v.literal("on_evidence"), v.literal("periodic"), v.literal("event_driven")), "inheritedAt": v.optional(v.number()), "inheritedFromBeliefNodeId": v.optional(v.string()), "inheritedFromContractId": v.optional(v.string()), "lastEvaluatedAt": v.optional(v.number()), "lineageSource": v.union(v.literal("declared"), v.literal("inherited")), "modulation": v.object({ "onConfirmed": v.object({ "ceiling": v.optional(v.number()), "delta": v.number() }), "onDisconfirmed": v.object({ "delta": v.number(), "floor": v.optional(v.number()) }), "onExpired": v.optional(v.object({ "delta": v.number() })), "onPartial": v.optional(v.object({ "delta": v.number(), "threshold": v.number() })) }), "periodicIntervalMs": v.optional(v.number()), "status": v.union(v.literal("active"), v.literal("satisfied"), v.literal("violated"), v.literal("expired"), v.literal("suspended"), v.literal("archived")), "title": v.string(), "topicId": v.optional(v.string()), "updatedAt": v.number() })).index("by_contractId", ["contractId"]).index("by_belief", ["beliefNodeId"]).index("by_status", ["status"]).index("by_evaluator", ["condition.evaluator"]).index("by_topic", ["topicId"]).index("by_schedule", ["evaluationSchedule"]),
29
- "epistemicEdges": defineTable(v.object({ "analogyBasis": v.optional(v.string()), "analogyStrength": v.optional(v.number()), "anonymizationClass": v.optional(v.union(v.literal("none"), v.literal("standard"), v.literal("strict"))), "audienceLabel": v.optional(v.string()), "blocking": v.optional(v.boolean()), "causal": v.optional(v.boolean()), "conditionalA": v.optional(v.object({ "a": v.number(), "b": v.number(), "d": v.number(), "u": v.number() })), "conditionalNotA": v.optional(v.object({ "a": v.number(), "b": v.number(), "d": v.number(), "u": v.number() })), "confidence": v.optional(v.number()), "constraint": v.optional(v.string()), "containment": v.optional(v.string()), "context": v.optional(v.string()), "createdAt": v.number(), "createdBy": v.string(), "defeatType": v.optional(v.union(v.literal("rebuts"), v.literal("undercuts"), v.literal("undermines"))), "derivation": v.optional(v.string()), "derivationType": v.optional(v.string()), "disanalogies": v.optional(v.array(v.string())), "domainNamespace": v.optional(v.string()), "edgeTier": v.optional(v.string()), "edgeType": v.union(v.literal("supports"), v.literal("informs"), v.literal("depends_on"), v.literal("extracted_from"), v.literal("contains"), v.literal("tests"), v.literal("supersedes"), v.literal("responds_to"), v.literal("belongs_to"), v.literal("relates_to_thesis"), v.literal("works_at"), v.literal("invested_in"), v.literal("competes_with"), v.literal("participates_in"), v.literal("founded_by"), v.literal("evaluates"), v.literal("performs"), v.literal("function_in"), v.literal("impacts"), v.literal("raised_from"), v.literal("mentioned_in"), v.literal("perspective_on"), v.literal("plays_theme"), v.literal("answers"), v.literal("explores"), v.literal("qualifies"), v.literal("based_on"), v.literal("based_on_belief"), v.literal("based_on_question"), v.literal("blocked_by_contradiction"), v.literal("informed_by_theme"), v.literal("same_as"), v.literal("reinforces"), v.literal("parent_of"), v.literal("child_of"), v.literal("falsified_by"), v.literal("exclusive_with"), v.literal("collapses_if"), v.literal("cascade_from"), v.literal("counterfactual_of"), v.literal("cascade_to"), v.literal("mutually_exclusive"), v.literal("correlates_with"), v.literal("amplifies"), v.literal("precondition_for"), v.literal("in_tension_with"), v.literal("strengthened_by"), v.literal("weakened_by"), v.literal("alternative_to"), v.literal("subsumes"), v.literal("validated_by"), v.literal("required_for"), v.literal("blocks"), v.literal("prerequisite_for"), v.literal("parallel_to"), v.literal("corroborates"), v.literal("extends"), v.literal("same_source_as"), v.literal("same_theme_as"), v.literal("assumes"), v.literal("would_predict"), v.literal("analogous_to"), v.literal("independent_of"), v.literal("implements"), v.literal("violates"), v.literal("co_changes_with"), v.literal("migrating_from"), v.literal("migrating_to"), v.literal("scoped_by"), v.literal("about_entity"), v.literal("entity_referenced_in"), v.literal("contradicts"), v.literal("cites"), v.literal("summarizes"), v.literal("related_to"), v.literal("partially_answers"), v.literal("refines"), v.literal("branches_from")), "endDate": v.optional(v.number()), "evidence": v.optional(v.string()), "exportClass": v.optional(v.union(v.literal("internal_only"), v.literal("client_safe"), v.literal("public_safe"), v.literal("restricted"))), "fromLayer": v.optional(v.union(v.literal("L4"), v.literal("L3"), v.literal("L2"), v.literal("L1"), v.literal("ontological"), v.literal("organizational"))), "fromNodeId": v.string(), "fromNodeType": v.optional(v.string()), "globalId": v.string(), "implicit": v.optional(v.boolean()), "interrogation": v.optional(v.string()), "keywords": v.optional(v.array(v.string())), "logicalRole": v.optional(v.union(v.literal("necessary"), v.literal("sufficient"), v.literal("necessary_sufficient"), v.literal("contributory"), v.literal("corroborative"))), "metadata": v.optional(v.record(v.string(), v.any())), "normalization": v.optional(v.string()), "ownerPrincipalId": v.optional(v.string()), "policyTags": v.optional(v.array(v.string())), "predictionFulfilled": v.optional(v.boolean()), "predictionFulfilledAt": v.optional(v.number()), "predictionFulfilledBy": v.optional(v.string()), "projectId": v.optional(v.string()), "propagation": v.optional(v.string()), "reasoningMethod": v.optional(v.union(v.literal("deductive"), v.literal("inductive"), v.literal("abductive"), v.literal("analogical"), v.literal("causal"), v.literal("correlational"), v.literal("testimonial"), v.literal("statistical"), v.literal("implicit"), v.literal("pattern_match"))), "sensitivityTier": v.optional(v.union(v.literal("low"), v.literal("medium"), v.literal("high"), v.literal("restricted"))), "sourceGlobalId": v.optional(v.string()), "startDate": v.optional(v.number()), "surpriseScore": v.optional(v.number()), "targetGlobalId": v.optional(v.string()), "temporalClass": v.optional(v.union(v.literal("structural"), v.literal("cyclical"), v.literal("transient"), v.literal("point_in_time"))), "tenantId": v.optional(v.string()), "toLayer": v.optional(v.union(v.literal("L4"), v.literal("L3"), v.literal("L2"), v.literal("L1"), v.literal("ontological"), v.literal("organizational"))), "toNodeId": v.optional(v.string()), "toNodeType": v.optional(v.string()), "topicId": v.optional(v.string()), "updatedAt": v.optional(v.number()), "validFrom": v.optional(v.number()), "validUntil": v.optional(v.number()), "weight": v.optional(v.number()), "workspaceId": v.optional(v.string()) })).index("by_globalId", ["globalId"]).index("by_from", ["fromNodeId"]).index("by_to", ["toNodeId"]).index("by_from_type", ["fromNodeId", "edgeType"]).index("by_to_type", ["toNodeId", "edgeType"]).index("by_topic", ["topicId"]).index("by_tenantId", ["tenantId"]).index("by_workspaceId", ["workspaceId"]).index("by_tenant_workspace", ["tenantId", "workspaceId"]).index("by_audienceLabel", ["audienceLabel"]).index("by_sensitivityTier", ["sensitivityTier"]).index("by_exportClass", ["exportClass"]).index("by_type", ["edgeType"]).index("by_from_to", ["fromNodeId", "toNodeId"]).index("by_fromLayer", ["fromLayer"]).index("by_toLayer", ["toLayer"]).index("by_layer_pair", ["fromLayer", "toLayer"]).index("by_source_global_id", ["sourceGlobalId"]).index("by_target_global_id", ["targetGlobalId"]).index("by_reasoning_method", ["edgeType", "reasoningMethod"]).index("by_logical_role", ["edgeType", "logicalRole"]).index("by_temporal_class", ["temporalClass", "validUntil"]).index("by_surprise", ["edgeType", "surpriseScore"]),
29
+ "epistemicEdges": defineTable(v.object({ "analogyBasis": v.optional(v.string()), "analogyStrength": v.optional(v.number()), "anonymizationClass": v.optional(v.union(v.literal("none"), v.literal("standard"), v.literal("strict"))), "audienceLabel": v.optional(v.string()), "blocking": v.optional(v.boolean()), "causal": v.optional(v.boolean()), "conditionalA": v.optional(v.object({ "a": v.number(), "b": v.number(), "d": v.number(), "u": v.number() })), "conditionalNotA": v.optional(v.object({ "a": v.number(), "b": v.number(), "d": v.number(), "u": v.number() })), "confidence": v.optional(v.number()), "constraint": v.optional(v.string()), "containment": v.optional(v.string()), "context": v.optional(v.string()), "createdAt": v.number(), "createdBy": v.string(), "defeatType": v.optional(v.union(v.literal("rebuts"), v.literal("undercuts"), v.literal("undermines"))), "derivation": v.optional(v.string()), "derivationType": v.optional(v.string()), "disanalogies": v.optional(v.array(v.string())), "domainNamespace": v.optional(v.string()), "edgeTier": v.optional(v.string()), "edgeType": v.union(v.literal("supports"), v.literal("informs"), v.literal("depends_on"), v.literal("derived_from"), v.literal("contains"), v.literal("tests"), v.literal("supersedes"), v.literal("responds_to"), v.literal("belongs_to"), v.literal("relates_to_thesis"), v.literal("works_at"), v.literal("invested_in"), v.literal("competes_with"), v.literal("participates_in"), v.literal("founded_by"), v.literal("evaluates"), v.literal("performs"), v.literal("function_in"), v.literal("impacts"), v.literal("raised_from"), v.literal("mentioned_in"), v.literal("perspective_on"), v.literal("plays_theme"), v.literal("answers"), v.literal("explores"), v.literal("qualifies"), v.literal("based_on"), v.literal("based_on_belief"), v.literal("based_on_question"), v.literal("blocked_by_contradiction"), v.literal("informed_by_theme"), v.literal("same_as"), v.literal("reinforces"), v.literal("parent_of"), v.literal("child_of"), v.literal("falsified_by"), v.literal("exclusive_with"), v.literal("collapses_if"), v.literal("cascade_from"), v.literal("counterfactual_of"), v.literal("cascade_to"), v.literal("mutually_exclusive"), v.literal("correlates_with"), v.literal("amplifies"), v.literal("precondition_for"), v.literal("in_tension_with"), v.literal("strengthened_by"), v.literal("weakened_by"), v.literal("alternative_to"), v.literal("subsumes"), v.literal("validated_by"), v.literal("required_for"), v.literal("blocks"), v.literal("prerequisite_for"), v.literal("parallel_to"), v.literal("corroborates"), v.literal("extends"), v.literal("same_source_as"), v.literal("same_theme_as"), v.literal("assumes"), v.literal("would_predict"), v.literal("analogous_to"), v.literal("independent_of"), v.literal("implements"), v.literal("violates"), v.literal("co_changes_with"), v.literal("migrating_from"), v.literal("migrating_to"), v.literal("scoped_by"), v.literal("about_entity"), v.literal("entity_referenced_in"), v.literal("contradicts"), v.literal("cites"), v.literal("summarizes"), v.literal("related_to"), v.literal("partially_answers"), v.literal("refines"), v.literal("branches_from"), v.literal("extracted_from")), "endDate": v.optional(v.number()), "evidence": v.optional(v.string()), "exportClass": v.optional(v.union(v.literal("internal_only"), v.literal("client_safe"), v.literal("public_safe"), v.literal("restricted"))), "fromLayer": v.optional(v.union(v.literal("L4"), v.literal("L3"), v.literal("L2"), v.literal("L1"), v.literal("ontological"), v.literal("organizational"))), "fromNodeId": v.string(), "fromNodeType": v.optional(v.string()), "globalId": v.string(), "implicit": v.optional(v.boolean()), "interrogation": v.optional(v.string()), "keywords": v.optional(v.array(v.string())), "logicalRole": v.optional(v.union(v.literal("necessary"), v.literal("sufficient"), v.literal("necessary_sufficient"), v.literal("contributory"), v.literal("corroborative"))), "metadata": v.optional(v.record(v.string(), v.any())), "normalization": v.optional(v.string()), "ownerPrincipalId": v.optional(v.string()), "policyTags": v.optional(v.array(v.string())), "predictionFulfilled": v.optional(v.boolean()), "predictionFulfilledAt": v.optional(v.number()), "predictionFulfilledBy": v.optional(v.string()), "projectId": v.optional(v.string()), "propagation": v.optional(v.string()), "reasoningMethod": v.optional(v.union(v.literal("deductive"), v.literal("inductive"), v.literal("abductive"), v.literal("analogical"), v.literal("causal"), v.literal("correlational"), v.literal("testimonial"), v.literal("statistical"), v.literal("implicit"), v.literal("pattern_match"))), "sensitivityTier": v.optional(v.union(v.literal("low"), v.literal("medium"), v.literal("high"), v.literal("restricted"))), "sourceGlobalId": v.optional(v.string()), "startDate": v.optional(v.number()), "surpriseScore": v.optional(v.number()), "targetGlobalId": v.optional(v.string()), "temporalClass": v.optional(v.union(v.literal("structural"), v.literal("cyclical"), v.literal("transient"), v.literal("point_in_time"))), "tenantId": v.optional(v.string()), "toLayer": v.optional(v.union(v.literal("L4"), v.literal("L3"), v.literal("L2"), v.literal("L1"), v.literal("ontological"), v.literal("organizational"))), "toNodeId": v.optional(v.string()), "toNodeType": v.optional(v.string()), "topicId": v.optional(v.string()), "updatedAt": v.optional(v.number()), "validFrom": v.optional(v.number()), "validUntil": v.optional(v.number()), "weight": v.optional(v.number()), "workspaceId": v.optional(v.string()) })).index("by_globalId", ["globalId"]).index("by_from", ["fromNodeId"]).index("by_to", ["toNodeId"]).index("by_from_type", ["fromNodeId", "edgeType"]).index("by_to_type", ["toNodeId", "edgeType"]).index("by_topic", ["topicId"]).index("by_tenantId", ["tenantId"]).index("by_workspaceId", ["workspaceId"]).index("by_tenant_workspace", ["tenantId", "workspaceId"]).index("by_audienceLabel", ["audienceLabel"]).index("by_sensitivityTier", ["sensitivityTier"]).index("by_exportClass", ["exportClass"]).index("by_type", ["edgeType"]).index("by_from_to", ["fromNodeId", "toNodeId"]).index("by_fromLayer", ["fromLayer"]).index("by_toLayer", ["toLayer"]).index("by_layer_pair", ["fromLayer", "toLayer"]).index("by_source_global_id", ["sourceGlobalId"]).index("by_target_global_id", ["targetGlobalId"]).index("by_reasoning_method", ["edgeType", "reasoningMethod"]).index("by_logical_role", ["edgeType", "logicalRole"]).index("by_temporal_class", ["temporalClass", "validUntil"]).index("by_surprise", ["edgeType", "surpriseScore"]),
30
30
  "epistemicNodeEmbeddings": defineTable(v.object({ "confidence": v.optional(v.number()), "createdAt": v.number(), "createdBy": v.string(), "embedding": v.array(v.number()), "hasAnswer": v.optional(v.boolean()), "importance": v.optional(v.union(v.literal("critical"), v.literal("high"), v.literal("medium"), v.literal("low"))), "nodeId": v.id("epistemicNodes"), "nodeType": v.union(v.literal("belief"), v.literal("question"), v.literal("evidence"), v.literal("answer"), v.literal("synthesis"), v.literal("theme"), v.literal("source")), "topicId": v.optional(v.string()), "updatedAt": v.optional(v.number()) })).index("by_nodeId", ["nodeId"]).index("by_topicId_type", ["topicId", "nodeType"]).index("by_topicId", ["topicId"]).vectorIndex("by_embedding", { vectorField: "embedding", dimensions: 1024, filterFields: ["nodeType", "createdBy"] }),
31
31
  "epistemicNodes": defineTable(v.object({ "aiProvider": v.optional(v.string()), "anonymizationClass": v.optional(v.union(v.literal("none"), v.literal("standard"), v.literal("strict"))), "answerQuality": v.optional(v.union(v.literal("definitive"), v.literal("strong"), v.literal("moderate"), v.literal("weak"), v.literal("speculative"), v.literal("unanswered"))), "audienceLabel": v.optional(v.string()), "beliefStatus": v.optional(v.union(v.literal("assumption"), v.literal("hypothesis"), v.literal("belief"), v.literal("fact"))), "beliefType": v.optional(v.string()), "canonicalText": v.string(), "confidence": v.optional(v.number()), "consensusConfidence": v.optional(v.number()), "consensusSource": v.optional(v.string()), "consensusView": v.optional(v.union(v.literal("aligned"), v.literal("ahead_of"), v.literal("contrarian"), v.literal("orthogonal"), v.literal("unknown"))), "content": v.optional(v.string()), "contentHash": v.string(), "contentType": v.optional(v.string()), "createdAt": v.number(), "createdBy": v.string(), "decisionOutcome": v.optional(v.union(v.literal("pending"), v.literal("successful"), v.literal("unsuccessful"), v.literal("mixed"), v.literal("unknown"))), "decisionType": v.optional(v.union(v.literal("invest"), v.literal("pass"), v.literal("follow_on"), v.literal("exit"), v.literal("deep_dive"), v.literal("monitor"), v.literal("deprioritize"), v.literal("thesis_adopt"), v.literal("thesis_revise"), v.literal("thesis_abandon"))), "domain": v.optional(v.string()), "epistemicLayer": v.optional(v.union(v.literal("L4"), v.literal("L3"), v.literal("L2"), v.literal("L1"), v.literal("ontological"), v.literal("organizational"))), "epistemicStatus": v.optional(v.union(v.literal("hypothesis"), v.literal("emerging"), v.literal("established"), v.literal("challenged"), v.literal("assumption"), v.literal("deprecated"))), "exportClass": v.optional(v.union(v.literal("internal_only"), v.literal("client_safe"), v.literal("public_safe"), v.literal("restricted"))), "externalIds": v.optional(v.object({ "crunchbase": v.optional(v.string()), "linkedin": v.optional(v.string()), "pitchbook": v.optional(v.string()), "twitter": v.optional(v.string()), "website": v.optional(v.string()) })), "extractedFromNodeId": v.optional(v.id("epistemicNodes")), "extractionLangfuseTraceId": v.optional(v.string()), "extractionModel": v.optional(v.string()), "extractionPromptName": v.optional(v.string()), "extractionPromptVersion": v.optional(v.number()), "extractionTemperature": v.optional(v.number()), "globalId": v.string(), "groundingConfidence": v.optional(v.number()), "groundingEndOffset": v.optional(v.number()), "groundingMatchedText": v.optional(v.string()), "groundingRejectionReason": v.optional(v.string()), "groundingStartOffset": v.optional(v.number()), "groundingVerified": v.optional(v.boolean()), "informationAsymmetry": v.optional(v.union(v.literal("proprietary"), v.literal("early"), v.literal("common"))), "metadata": v.optional(v.record(v.string(), v.any())), "methodology": v.optional(v.union(v.literal("primary_research"), v.literal("expert_interview"), v.literal("customer_interview"), v.literal("field_observation"), v.literal("proprietary_data"), v.literal("desk_research"), v.literal("regulatory_filing"), v.literal("news_article"), v.literal("academic_paper"), v.literal("ai_synthesis"), v.literal("ai_extraction"))), "nodeType": v.union(v.literal("decision"), v.literal("belief"), v.literal("question"), v.literal("theme"), v.literal("deal"), v.literal("topic"), v.literal("claim"), v.literal("evidence"), v.literal("synthesis"), v.literal("answer"), v.literal("atomic_fact"), v.literal("excerpt"), v.literal("source"), v.literal("company"), v.literal("person"), v.literal("investor"), v.literal("function"), v.literal("value_chain")), "ownerPrincipalId": v.optional(v.string()), "policyTags": v.optional(v.array(v.string())), "predictionMeta": v.optional(v.object({ "actualVsPredicted": v.optional(v.string()), "confidenceAtPrediction": v.optional(v.number()), "expectedBy": v.optional(v.number()), "isPrediction": v.boolean(), "outcome": v.optional(v.union(v.literal("pending"), v.literal("confirmed"), v.literal("disconfirmed"), v.literal("partial"), v.literal("expired"))), "outcomeEvidenceId": v.optional(v.string()), "outcomeRecordedAt": v.optional(v.number()), "registeredAt": v.number() })), "projectId": v.optional(v.string()), "questionPriority": v.optional(v.union(v.literal("critical"), v.literal("high"), v.literal("medium"), v.literal("low"))), "questionType": v.optional(v.union(v.literal("validation"), v.literal("falsification"), v.literal("assumption_probe"), v.literal("prediction_test"), v.literal("counterfactual"), v.literal("discovery"), v.literal("clarification"), v.literal("comparison"), v.literal("causal"), v.literal("mechanism"), v.literal("general"))), "reversibility": v.optional(v.union(v.literal("irreversible"), v.literal("hard_to_reverse"), v.literal("reversible"), v.literal("trivial"))), "sensitivityTier": v.optional(v.union(v.literal("low"), v.literal("medium"), v.literal("high"), v.literal("restricted"))), "sourceType": v.union(v.literal("human"), v.literal("ai_extracted"), v.literal("ai_generated"), v.literal("imported"), v.literal("system"), v.literal("verified"), v.literal("proprietary")), "status": v.union(v.literal("active"), v.literal("superseded"), v.literal("archived"), v.literal("deleted")), "subtype": v.optional(v.string()), "supersededBy": v.optional(v.id("epistemicNodes")), "syncError": v.optional(v.string()), "syncStatus": v.optional(v.union(v.literal("synced"), v.literal("pending_edges"), v.literal("edge_creation_failed"))), "tags": v.optional(v.array(v.string())), "temporalNature": v.optional(v.union(v.literal("factual"), v.literal("forecast"), v.literal("unknown"))), "tenantId": v.optional(v.string()), "themeConviction": v.optional(v.union(v.literal("high"), v.literal("medium"), v.literal("low"), v.literal("negative"))), "title": v.optional(v.string()), "topicId": v.optional(v.string()), "updatedAt": v.number(), "verificationStatus": v.optional(v.union(v.literal("unverified"), v.literal("human_verified"), v.literal("ai_verified"), v.literal("contradicted"), v.literal("outdated"))), "workspaceId": v.optional(v.string()) })).index("by_globalId", ["globalId"]).index("by_contentHash", ["contentHash"]).index("by_nodeType", ["nodeType"]).index("by_subtype", ["nodeType", "subtype"]).index("by_domain", ["domain"]).index("by_topic", ["topicId"]).index("by_topic_type", ["topicId", "nodeType"]).index("by_tenantId", ["tenantId"]).index("by_workspaceId", ["workspaceId"]).index("by_tenant_workspace", ["tenantId", "workspaceId"]).index("by_audienceLabel", ["audienceLabel"]).index("by_sensitivityTier", ["sensitivityTier"]).index("by_exportClass", ["exportClass"]).index("by_status", ["status"]).index("by_sourceType", ["sourceType"]).index("by_verification", ["verificationStatus"]).index("by_layer", ["epistemicLayer"]).index("by_layer_type", ["epistemicLayer", "nodeType"]).index("by_syncStatus", ["syncStatus"]).index("by_belief_status", ["nodeType", "beliefStatus"]).index("by_epistemic_status", ["nodeType", "epistemicStatus"]).index("by_temporal_nature", ["nodeType", "temporalNature"]).index("by_methodology", ["nodeType", "methodology"]).index("by_reversibility", ["nodeType", "reversibility"]).index("by_questionType", ["nodeType", "questionType"]).index("by_questionPriority", ["nodeType", "questionPriority"]).searchIndex("search_canonicalText", { searchField: "canonicalText", filterFields: ["nodeType", "topicId", "topicId", "status"] }),
32
32
  "graphAnalysisCache": defineTable(v.object({ "analysisVersion": v.string(), "analyzedAt": v.number(), "changesSinceRefresh": v.number(), "findings": v.array(v.object({ "category": v.union(v.literal("structural_risk"), v.literal("evidence_gap"), v.literal("reasoning_flaw"), v.literal("staleness"), v.literal("opportunity"), v.literal("propagation_risk"), v.literal("epistemology"), v.literal("temporal"), v.literal("semantic_gap")), "description": v.string(), "detector": v.string(), "id": v.string(), "importance": v.optional(v.number()), "nodeIds": v.array(v.string()), "nodeLabels": v.array(v.string()), "severity": v.union(v.literal("critical"), v.literal("warning"), v.literal("info")), "title": v.string(), "totalCount": v.optional(v.number()) })), "healthScore": v.number(), "isStale": v.boolean(), "killerQueryResults": v.optional(v.object({ "anchoringBias": v.optional(v.array(v.any())), "confirmationBias": v.optional(v.array(v.any())), "contradictionTensions": v.optional(v.array(v.any())), "knowledgeFrontier": v.optional(v.array(v.any())), "minimumFalsificationSet": v.optional(v.union(v.string(), v.number(), v.boolean(), v.null(), v.record(v.string(), v.any()), v.array(v.any()))), "missingQuestions": v.optional(v.array(v.any())), "nonConsensusBeliefs": v.optional(v.array(v.any())), "portfolioConviction": v.optional(v.array(v.any())), "reasoningDepth": v.optional(v.array(v.any())), "sourceConcentration": v.optional(v.array(v.any())), "staleThemes": v.optional(v.array(v.any())) })), "lastGraphChange": v.optional(v.number()), "stats": v.object({ "algebraicConnectivity": v.number(), "averageResilience": v.number(), "beliefs": v.number(), "beliefStatus": v.optional(v.object({ "assumption": v.number(), "belief": v.number(), "fact": v.number(), "hypothesis": v.number() })), "bridgeNodeCount": v.number(), "coherenceScore": v.number(), "communityCount": v.number(), "cycleCount": v.number(), "evidence": v.number(), "evidenceTemporalNature": v.optional(v.object({ "factual": v.number(), "forecast": v.number(), "unknown": v.number() })), "orphanCount": v.number(), "overconfidentCount": v.number(), "propagationRisks": v.number(), "questions": v.number(), "sccCount": v.number(), "temporalDecayCount": v.number(), "tensionPairs": v.number(), "totalEdges": v.number(), "totalNodes": v.number(), "ungroundedCount": v.number() }), "topicId": v.optional(v.string()) })).index("by_topic", ["topicId"]).index("by_topic_stale", ["topicId", "isStale"]).index("by_analyzedAt", ["analyzedAt"]),
@@ -37,6 +37,7 @@ var KERNEL_SCHEMA_TABLES = {
37
37
  "idempotencyTokens": defineTable(v.object({ "expiresAt": v.number(), "fnName": v.string(), "key": v.string(), "recordedAt": v.number(), "resultJson": v.string(), "tenantId": v.string() })).index("by_tenant_fn_key", ["tenantId", "fnName", "key"]).index("by_expiry", ["expiresAt"]),
38
38
  "lenses": defineTable(v.object({ "createdAt": v.number(), "createdBy": v.string(), "description": v.optional(v.string()), "filterCriteria": v.optional(v.object({ "entityTypeFilters": v.array(v.object({ "entityTypeValue": v.string(), "subtypeValues": v.optional(v.array(v.string())) })), "kind": v.literal("taxonomy"), "ontologyScope": v.optional(v.object({ "ontologyKey": v.optional(v.string()) })), "version": v.literal(1) })), "globalId": v.string(), "metadata": v.optional(v.any()), "name": v.string(), "perspectiveType": v.string(), "promptTemplates": v.array(v.object({ "key": v.string(), "metadata": v.optional(v.any()), "phase": v.optional(v.string()), "promptRef": v.string(), "required": v.optional(v.boolean()), "role": v.optional(v.string()), "version": v.optional(v.string()) })), "questionTemplates": v.optional(v.array(v.object({ "key": v.string(), "linkedBeliefKey": v.optional(v.string()), "metadata": v.optional(v.any()), "priority": v.optional(v.union(v.literal("critical"), v.literal("high"), v.literal("medium"), v.literal("low"))), "text": v.string() }))), "status": v.union(v.literal("draft"), v.literal("active"), v.literal("archived")), "taskTemplates": v.array(v.object({ "description": v.optional(v.string()), "key": v.string(), "metadata": v.optional(v.any()), "phase": v.optional(v.string()), "priority": v.optional(v.union(v.literal("critical"), v.literal("high"), v.literal("medium"), v.literal("low"))), "title": v.string() })), "topicId": v.optional(v.string()), "updatedAt": v.number(), "workflowTemplates": v.array(v.object({ "description": v.optional(v.string()), "key": v.string(), "metadata": v.optional(v.any()), "name": v.string(), "steps": v.array(v.object({ "description": v.optional(v.string()), "key": v.string(), "metadata": v.optional(v.any()), "promptTemplateKey": v.optional(v.string()), "taskTemplateKeys": v.optional(v.array(v.string())), "title": v.string() })) })), "workspaceId": v.string() })).index("by_workspace", ["workspaceId"]).index("by_workspace_status", ["workspaceId", "status"]).index("by_workspace_perspective", ["workspaceId", "perspectiveType"]).index("by_topic", ["topicId"]),
39
39
  "lensTopicBindings": defineTable(v.object({ "appliedAt": v.number(), "appliedBy": v.string(), "lensId": v.id("lenses"), "metadata": v.optional(v.any()), "removedAt": v.optional(v.number()), "removedBy": v.optional(v.string()), "status": v.union(v.literal("active"), v.literal("removed")), "topicId": v.string(), "updatedAt": v.number(), "workspaceId": v.string() })).index("by_lens", ["lensId"]).index("by_lens_status", ["lensId", "status"]).index("by_topic", ["topicId"]).index("by_topic_status", ["topicId", "status"]).index("by_topic_lens", ["topicId", "lensId"]),
40
+ "neo4jSyncQueue": defineTable(v.object({ "attempts": v.number(), "createdAt": v.number(), "entityId": v.string(), "entityType": v.union(v.literal("node"), v.literal("edge")), "lastAttemptAt": v.optional(v.number()), "lastError": v.optional(v.string()), "maxAttempts": v.number(), "operation": v.union(v.literal("upsert"), v.literal("delete")), "status": v.union(v.literal("pending"), v.literal("in_progress"), v.literal("failed"), v.literal("succeeded")), "updatedAt": v.number() })).index("by_status", ["status"]).index("by_entity", ["entityType", "entityId"]).index("by_status_attempts", ["status", "attempts"]),
40
41
  "ontologyDefinitions": defineTable(v.object({ "createdAt": v.number(), "createdBy": v.string(), "description": v.optional(v.string()), "name": v.string(), "ontologyKey": v.string(), "parentOntologyId": v.optional(v.id("ontologyDefinitions")), "status": v.union(v.literal("draft"), v.literal("active"), v.literal("deprecated"), v.literal("archived")), "tenantId": v.optional(v.string()), "tier": v.union(v.literal("platform"), v.literal("pack"), v.literal("tenant")), "updatedAt": v.number() })).index("by_ontologyKey", ["ontologyKey"]).index("by_tenant_ontologyKey", ["tenantId", "ontologyKey"]).index("by_tier", ["tier"]).index("by_status", ["status"]).index("by_tenant_status", ["tenantId", "status"]).index("by_parentOntologyId", ["parentOntologyId"]),
41
42
  "ontologyVersions": defineTable(v.object({ "createdAt": v.number(), "edgeTypes": v.array(v.object({ "constraintSeverity": v.optional(v.union(v.literal("warn"), v.literal("info"))), "description": v.optional(v.string()), "label": v.string(), "sourceTypes": v.optional(v.array(v.string())), "targetTypes": v.optional(v.array(v.string())), "value": v.string() })), "entityTypes": v.array(v.object({ "description": v.optional(v.string()), "label": v.string(), "schema": v.optional(v.any()), "subtypes": v.optional(v.array(v.object({ "description": v.optional(v.string()), "label": v.string(), "value": v.string() }))), "value": v.string() })), "ontologyId": v.id("ontologyDefinitions"), "ontologyKey": v.string(), "publishedAt": v.optional(v.number()), "publishedBy": v.optional(v.string()), "releaseNotes": v.optional(v.string()), "status": v.union(v.literal("draft"), v.literal("published"), v.literal("deprecated")), "version": v.string() })).index("by_ontologyId", ["ontologyId"]).index("by_ontologyKey", ["ontologyKey"]).index("by_ontologyKey_version", ["ontologyKey", "version"]).index("by_status", ["status"]).index("by_publishedAt", ["publishedAt"]),
42
43
  "platformAgentRunPolicyDecisions": defineTable(v.object({ "action": v.string(), "createdAt": v.number(), "decisionId": v.string(), "evaluatedAt": v.number(), "reasonCode": v.string(), "result": v.union(v.literal("allow"), v.literal("deny"), v.literal("shadow_allow")), "runId": v.string(), "scopesChecked": v.array(v.string()), "scopesGranted": v.array(v.string()) })).index("by_decisionId", ["decisionId"]).index("by_run_createdAt", ["runId", "createdAt"]),
@@ -51,12 +52,12 @@ var KERNEL_SCHEMA_TABLES = {
51
52
  "stakeholderGroups": defineTable(v.object({ "createdAt": v.number(), "createdBy": v.string(), "decisionEventId": v.id("decisionEvents"), "description": v.optional(v.string()), "groupKey": v.string(), "metadata": v.optional(v.record(v.string(), v.any())), "name": v.string(), "status": v.union(v.literal("active"), v.literal("archived")), "tenantId": v.optional(v.string()), "topicId": v.optional(v.string()), "updatedAt": v.number(), "weight": v.number(), "workspaceId": v.optional(v.string()) })).index("by_decisionEventId", ["decisionEventId"]).index("by_topicId", ["topicId"]).index("by_decision_groupKey", ["decisionEventId", "groupKey"]).index("by_decision_status", ["decisionEventId", "status"]),
52
53
  "systemLogs": defineTable(v.object({ "chatId": v.optional(v.string()), "createdAt": v.number(), "level": v.string(), "message": v.string(), "metadata": v.optional(v.record(v.string(), v.any())), "source": v.string(), "threadId": v.optional(v.string()), "traceId": v.optional(v.string()), "workflowId": v.optional(v.string()) })).index("by_chatId", ["chatId"]).index("by_workflowId", ["workflowId"]).index("by_threadId", ["threadId"]).index("by_traceId", ["traceId"]).index("by_level", ["level"]).index("by_source", ["source"]),
53
54
  "tasks": defineTable(v.object({ "assigneeId": v.optional(v.string()), "attachments": v.optional(v.array(v.object({ "capturedAsEvidence": v.optional(v.boolean()), "capturedAt": v.optional(v.number()), "capturedInsightId": v.optional(v.id("epistemicNodes")), "content": v.string(), "createdAt": v.number(), "createdBy": v.string(), "id": v.string(), "metadata": v.optional(v.object({ "capturedAsEvidence": v.optional(v.boolean()), "capturedAt": v.optional(v.number()), "capturedImpact": v.optional(v.number()), "capturedInsightId": v.optional(v.string()), "continueOnFailure": v.optional(v.boolean()), "dependsOnStepIds": v.optional(v.array(v.string())), "editable": v.optional(v.boolean()), "executionTool": v.optional(v.string()), "experts": v.optional(v.array(v.object({ "expertise": v.string(), "potentialSources": v.array(v.string()), "questions": v.array(v.string()), "searchStrategy": v.optional(v.string()) }))), "expertSearchAt": v.optional(v.number()), "expertSearchResults": v.optional(v.array(v.any())), "factChecker": v.optional(v.object({ "claimsToVerify": v.array(v.string()), "sourcesToCheck": v.array(v.string()), "verificationCriteria": v.array(v.string()) })), "fileName": v.optional(v.string()), "fileSize": v.optional(v.number()), "fileUrl": v.optional(v.string()), "frameworkType": v.optional(v.string()), "generatedPersonas": v.optional(v.array(v.any())), "items": v.optional(v.array(v.object({ "completed": v.boolean(), "id": v.string(), "text": v.string() }))), "linkedBeliefId": v.optional(v.string()), "linkedCallScriptId": v.optional(v.string()), "linkedQuestionId": v.optional(v.string()), "mappedQuestions": v.optional(v.array(v.object({ "answered": v.optional(v.boolean()), "answerExcerpt": v.optional(v.string()), "answerTimestamp": v.optional(v.string()), "capturedAsInsight": v.optional(v.boolean()), "category": v.optional(v.string()), "id": v.string(), "insightId": v.optional(v.id("epistemicNodes")), "linkedBeliefId": v.optional(v.string()), "linkedQuestionId": v.optional(v.string()), "priority": v.optional(v.union(v.literal("must_ask"), v.literal("nice_to_have"))), "questionText": v.string() }))), "metrics": v.optional(v.array(v.object({ "currentValue": v.optional(v.string()), "frequency": v.string(), "metric": v.string(), "source": v.string() }))), "personas": v.optional(v.array(v.object({ "company": v.string(), "rationale": v.string(), "role": v.string(), "title": v.string() }))), "personasGeneratedAt": v.optional(v.number()), "researchCitations": v.optional(v.array(v.union(v.string(), v.object({ "snippet": v.optional(v.string()), "title": v.optional(v.string()), "url": v.string() })))), "researchCompletedAt": v.optional(v.number()), "researchResult": v.optional(v.string()), "researchStatus": v.optional(v.union(v.literal("pending"), v.literal("running"), v.literal("completed"), v.literal("failed"))), "runCondition": v.optional(v.string()), "stepFailureReason": v.optional(v.string()), "stepLastRunAt": v.optional(v.number()), "stepOutputData": v.optional(v.string()), "stepOutputSummary": v.optional(v.string()), "stepRunCount": v.optional(v.number()), "stepStatus": v.optional(v.union(v.literal("pending"), v.literal("running"), v.literal("completed"), v.literal("failed"), v.literal("skipped"))), "tools": v.optional(v.array(v.object({ "purpose": v.string(), "suggestedQuery": v.string(), "tool": v.string() }))), "variables": v.optional(v.array(v.string())), "workflowOrder": v.optional(v.number()), "workflowStepId": v.optional(v.string()) })), "title": v.string(), "type": v.union(v.literal("call_script"), v.literal("email_template"), v.literal("research_plan"), v.literal("framework"), v.literal("checklist"), v.literal("note"), v.literal("file"), v.literal("transcript")) }))), "blockedBy": v.optional(v.array(v.id("tasks"))), "blockedReason": v.optional(v.string()), "blocks": v.optional(v.array(v.id("tasks"))), "comments": v.optional(v.array(v.object({ "content": v.string(), "createdAt": v.number(), "id": v.string(), "userId": v.string() }))), "completedAt": v.optional(v.number()), "completedBy": v.optional(v.string()), "createdAt": v.number(), "createdBy": v.string(), "description": v.optional(v.string()), "dueDate": v.optional(v.number()), "executionCompletedAt": v.optional(v.number()), "executionError": v.optional(v.string()), "executionOrder": v.optional(v.number()), "executionResults": v.optional(v.union(v.string(), v.number(), v.boolean(), v.null(), v.record(v.string(), v.any()), v.array(v.any()))), "executionStartedAt": v.optional(v.number()), "executionStatus": v.optional(v.union(v.literal("pending"), v.literal("running"), v.literal("completed"), v.literal("failed"))), "executionType": v.optional(v.union(v.literal("research_search"), v.literal("find_news"), v.literal("identify_experts"), v.literal("market_research"), v.literal("generate_primer"), v.literal("verify_claim"), v.literal("manual"), v.literal("mcp_research"), v.literal("mcp_web_search"), v.literal("mcp_capture"), v.literal("mcp_network_search"))), "linkedBeliefId": v.optional(v.string()), "linkedChatId": v.optional(v.string()), "linkedQuestionId": v.optional(v.string()), "linkedWorktreeId": v.optional(v.id("worktrees")), "mcpDatasetIds": v.optional(v.array(v.string())), "mcpExecutionId": v.optional(v.string()), "mcpSkillIds": v.optional(v.array(v.string())), "priority": v.union(v.literal("urgent"), v.literal("high"), v.literal("medium"), v.literal("low")), "sortOrder": v.optional(v.number()), "status": v.union(v.literal("todo"), v.literal("in_progress"), v.literal("blocked"), v.literal("done")), "subtasks": v.optional(v.array(v.object({ "completed": v.boolean(), "completedAt": v.optional(v.number()), "id": v.string(), "title": v.string() }))), "tags": v.optional(v.array(v.string())), "taskType": v.optional(v.union(v.literal("general"), v.literal("find_evidence"), v.literal("verify_claim"), v.literal("research"), v.literal("review"), v.literal("interview"), v.literal("analysis"), v.literal("track_metrics"))), "tenantId": v.optional(v.string()), "title": v.string(), "topicId": v.optional(v.string()), "updatedAt": v.number(), "workspaceId": v.optional(v.string()) })).index("by_topicId", ["topicId"]).index("by_topicId_status", ["topicId", "status"]).index("by_tenantId", ["tenantId"]).index("by_workspaceId", ["workspaceId"]).index("by_worktreeId", ["linkedWorktreeId"]).index("by_beliefId", ["linkedBeliefId"]).index("by_questionId", ["linkedQuestionId"]).index("by_status", ["status"]).index("by_assigneeId", ["assigneeId"]).index("by_dueDate", ["dueDate"]).index("by_priority", ["priority"]).index("by_executionType", ["executionType"]).index("by_executionStatus", ["executionStatus"]),
54
- "topics": defineTable(v.object({ "createdAt": v.number(), "createdBy": v.string(), "depth": v.number(), "description": v.optional(v.string()), "globalId": v.string(), "graphScopeProjectId": v.optional(v.string()), "metadata": v.optional(v.any()), "name": v.string(), "ontologyId": v.optional(v.id("ontologyDefinitions")), "parentTopicId": v.optional(v.id("topics")), "path": v.array(v.string()), "status": v.union(v.literal("active"), v.literal("archived"), v.literal("watching")), "tenantId": v.optional(v.string()), "type": v.string(), "updatedAt": v.number(), "visibility": v.optional(v.union(v.literal("private"), v.literal("team"), v.literal("firm"), v.literal("external"), v.literal("public"))), "workspaceId": v.optional(v.string()) })).index("by_parent", ["parentTopicId"]).index("by_type", ["type"]).index("by_graph_scope_project", ["graphScopeProjectId"]).index("by_tenant", ["tenantId"]).index("by_ontology", ["ontologyId"]).index("by_path", ["path"]).searchIndex("search_name", { searchField: "name", filterFields: ["tenantId", "type"] }),
55
+ "topics": defineTable(v.object({ "createdAt": v.number(), "createdBy": v.string(), "depth": v.number(), "description": v.optional(v.string()), "globalId": v.string(), "graphScopeProjectId": v.optional(v.string()), "metadata": v.optional(v.any()), "name": v.string(), "ontologyId": v.optional(v.id("ontologyDefinitions")), "parentTopicId": v.optional(v.id("topics")), "path": v.array(v.string()), "status": v.union(v.literal("active"), v.literal("archived"), v.literal("watching")), "tenantId": v.optional(v.string()), "type": v.string(), "updatedAt": v.number(), "visibility": v.optional(v.union(v.literal("private"), v.literal("team"), v.literal("firm"), v.literal("external"), v.literal("public"))), "workspaceId": v.optional(v.string()) })).index("by_globalId", ["globalId"]).index("by_parent", ["parentTopicId"]).index("by_type", ["type"]).index("by_graph_scope_project", ["graphScopeProjectId"]).index("by_tenant", ["tenantId"]).index("by_ontology", ["ontologyId"]).index("by_path", ["path"]).searchIndex("search_name", { searchField: "name", filterFields: ["tenantId", "type"] }),
55
56
  "workflowDefinitions": defineTable(v.object({ "createdAt": v.number(), "createdBy": v.string(), "description": v.optional(v.string()), "displayName": v.string(), "metadata": v.optional(v.record(v.string(), v.any())), "name": v.string(), "status": v.union(v.literal("draft"), v.literal("active"), v.literal("deprecated")), "tenantId": v.string(), "updatedAt": v.number(), "version": v.number() })).index("by_tenant", ["tenantId"]).index("by_tenant_name", ["tenantId", "name"]).index("by_tenant_status", ["tenantId", "status"]),
56
57
  "workflowPullRequests": defineTable(v.object({ "createdAt": v.number(), "createdBy": v.string(), "metadata": v.optional(v.record(v.string(), v.any())), "resolvedAt": v.optional(v.number()), "resolvedBy": v.optional(v.string()), "reviewers": v.optional(v.array(v.string())), "status": v.union(v.literal("pending_review"), v.literal("changes_requested"), v.literal("approved"), v.literal("blocked")), "summary": v.string(), "topicId": v.optional(v.string()), "updatedAt": v.number(), "worktreeId": v.id("worktrees") })).index("by_worktreeId", ["worktreeId"]).index("by_status", ["status"]).index("by_topicId", ["topicId"]).index("by_topic_status", ["topicId", "status"]),
57
58
  "workflowStages": defineTable(v.object({ "createdAt": v.number(), "description": v.optional(v.string()), "displayName": v.string(), "entryConditions": v.optional(v.record(v.string(), v.any())), "exitConditions": v.optional(v.record(v.string(), v.any())), "gateRules": v.optional(v.record(v.string(), v.any())), "isOptional": v.optional(v.boolean()), "metadata": v.optional(v.record(v.string(), v.any())), "name": v.string(), "order": v.number(), "updatedAt": v.number(), "workflowDefinitionId": v.id("workflowDefinitions") })).index("by_workflow", ["workflowDefinitionId"]).index("by_workflow_order", ["workflowDefinitionId", "order"]),
58
59
  "worktreeBeliefCluster": defineTable(v.object({ "addedAt": v.number(), "beliefId": v.string(), "cascadeText": v.optional(v.string()), "confidenceDelta": v.optional(v.number()), "counterfactualText": v.optional(v.string()), "dependencyText": v.optional(v.string()), "finalConfidence": v.optional(v.number()), "finalEvidenceCount": v.optional(v.number()), "initialConfidence": v.optional(v.number()), "initialEvidenceCount": v.optional(v.number()), "llmAssessedAt": v.optional(v.number()), "llmCertainty": v.optional(v.number()), "llmEvidenceScores": v.optional(v.string()), "llmReasoning": v.optional(v.string()), "llmValence": v.optional(v.number()), "relationDescription": v.optional(v.string()), "relationType": v.union(v.literal("primary"), v.literal("counterfactual"), v.literal("dependency"), v.literal("cascade"), v.literal("conditional"), v.literal("supporting"), v.literal("contradicting"), v.literal("alternative"), v.literal("prerequisite")), "updatedAt": v.number(), "worktreeId": v.id("worktrees") })).index("by_worktree", ["worktreeId"]).index("by_belief", ["beliefId"]).index("by_worktree_relation", ["worktreeId", "relationType"]),
59
- "worktrees": defineTable(v.object({ "beliefFocus": v.optional(v.string()), "beliefRefinement": v.optional(v.object({ "checklist": v.optional(v.object({ "hasMeasurableCriteria": v.boolean(), "hasSpecificClaim": v.boolean(), "hasTestability": v.boolean(), "hasTimeframe": v.boolean() })), "isRefined": v.boolean(), "measurableCriteria": v.optional(v.string()), "originalText": v.optional(v.string()), "refinedAt": v.optional(v.number()), "refinedBy": v.optional(v.string()), "refinedText": v.optional(v.string()), "testingCriteria": v.optional(v.string()), "timeframe": v.optional(v.string()) })), "beliefRefinements": v.optional(v.array(v.any())), "blocks": v.optional(v.array(v.id("worktrees"))), "branchThesis": v.optional(v.object({ "approvedAt": v.optional(v.number()), "approvedBy": v.optional(v.string()), "content": v.string(), "generatedAt": v.optional(v.number()), "generationMetadata": v.optional(v.object({ "langfuseTraceId": v.optional(v.string()), "modelUsed": v.string(), "promptName": v.string() })), "memoContent": v.optional(v.string()), "status": v.union(v.literal("ai_draft"), v.literal("user_draft"), v.literal("final")) })), "chatId": v.optional(v.string()), "clusterStatus": v.optional(v.object({ "conditionalsByType": v.optional(v.object({ "cascades": v.number(), "counterfactuals": v.number(), "dependencies": v.number(), "other": v.number() })), "hasCascades": v.boolean(), "hasCounterfactuals": v.boolean(), "hasDependencies": v.boolean(), "mappingCompletedAt": v.optional(v.number()), "mappingCompletedBy": v.optional(v.string()), "totalConditionals": v.number() })), "confidenceImpact": v.optional(v.union(v.literal("high"), v.literal("medium"), v.literal("low"))), "createdAt": v.optional(v.number()), "createdBy": v.string(), "decisionGate": v.optional(v.object({ "decidedAt": v.optional(v.number()), "decidedBy": v.optional(v.string()), "goCriteria": v.array(v.string()), "noGoSignals": v.array(v.string()), "verdict": v.optional(v.union(v.literal("go"), v.literal("no_go"), v.literal("pivot"), v.literal("pending"))), "verdictRationale": v.optional(v.string()) })), "decisionsReached": v.optional(v.array(v.string())), "dependsOn": v.optional(v.array(v.id("worktrees"))), "dismissedReason": v.optional(v.string()), "durationWeeks": v.number(), "endDate": v.number(), "endingConfidence": v.optional(v.object({ "beliefConfidences": v.array(v.object({ "beliefId": v.string(), "confidence": v.number() })), "overall": v.number() })), "epistemicChain": v.optional(v.object({ "capturedAt": v.number(), "capturedBy": v.string(), "clusterEdges": v.array(v.object({ "createdAt": v.optional(v.number()), "edgeId": v.optional(v.string()), "edgeType": v.string(), "sourceId": v.string(), "targetId": v.string(), "weight": v.optional(v.number()) })), "confidenceHistory": v.optional(v.array(v.object({ "beliefId": v.string(), "recentChanges": v.array(v.object({ "confidence": v.optional(v.string()), "timestamp": v.optional(v.number()), "trigger": v.optional(v.string()) })) }))), "evidence": v.array(v.object({ "createdAt": v.optional(v.number()), "id": v.string(), "sourceType": v.optional(v.string()), "text": v.string(), "verificationStatus": v.optional(v.string()), "verified": v.boolean() })), "outcome": v.object({ "confidenceChange": v.number(), "endingConfidence": v.number(), "startingConfidence": v.number(), "summary": v.string(), "verdict": v.string() }), "primaryBelief": v.optional(v.object({ "confidenceScore": v.optional(v.number()), "criticality": v.optional(v.string()), "endingConfidence": v.number(), "endingConfidenceLabel": v.optional(v.string()), "id": v.string(), "startingConfidence": v.number(), "startingConfidenceLabel": v.optional(v.string()), "status": v.optional(v.string()), "text": v.string() })), "questions": v.array(v.object({ "answer": v.optional(v.string()), "answeredAt": v.optional(v.number()), "answeredBy": v.optional(v.string()), "answerStatus": v.optional(v.string()), "evidenceCount": v.number(), "id": v.string(), "priority": v.optional(v.string()), "status": v.string(), "text": v.string() })), "relatedBeliefs": v.optional(v.array(v.object({ "confidence": v.optional(v.string()), "confidenceScore": v.optional(v.number()), "id": v.string(), "text": v.optional(v.string()) }))), "tasksCompleted": v.optional(v.number()), "topicId": v.optional(v.string()), "totalTasks": v.optional(v.number()), "worktreeId": v.id("worktrees") })), "epistemicOrigin": v.optional(v.string()), "evidenceReviewState": v.optional(v.object({ "evidenceGaps": v.array(v.string()), "evidenceQuestionMapping": v.optional(v.array(v.object({ "coverageNote": v.optional(v.string()), "evidenceId": v.string(), "questionIds": v.array(v.string()) }))), "existingEvidenceReviewed": v.boolean(), "reviewCompletedAt": v.optional(v.number()), "reviewCompletedBy": v.optional(v.string()), "strengthAreas": v.array(v.string()) })), "evidenceSignals": v.optional(v.array(v.object({ "collected": v.boolean(), "notes": v.optional(v.string()), "progress": v.optional(v.string()), "signal": v.string() }))), "executionBand": v.optional(v.number()), "executionOrder": v.optional(v.number()), "gate": v.optional(v.string()), "generatedAt": v.optional(v.number()), "generatedBy": v.optional(v.string()), "hypothesis": v.optional(v.string()), "index": v.number(), "keyFindings": v.optional(v.array(v.string())), "keyQuestions": v.optional(v.array(v.object({ "answer": v.optional(v.string()), "answerConfidence": v.optional(v.union(v.literal("high"), v.literal("medium"), v.literal("low"))), "linkedQuestionId": v.optional(v.string()), "question": v.string(), "status": v.union(v.literal("open"), v.literal("answered"), v.literal("forked")) }))), "linkedCallIds": v.optional(v.array(v.string())), "linkedDeepResearchIds": v.optional(v.array(v.string())), "linkedDocumentIds": v.optional(v.array(v.string())), "linkedEvidenceIds": v.optional(v.array(v.string())), "linkedNewsIds": v.optional(v.array(v.string())), "linkedPrimerIds": v.optional(v.array(v.string())), "metadata": v.optional(v.any()), "name": v.string(), "nextSteps": v.optional(v.array(v.string())), "notes": v.optional(v.array(v.object({ "content": v.string(), "createdAt": v.number(), "createdBy": v.string(), "id": v.string(), "linkedBeliefId": v.optional(v.string()), "linkedQuestionId": v.optional(v.string()), "linkedTaskId": v.optional(v.string()) }))), "objective": v.string(), "outcome": v.optional(v.object({ "confidenceChange": v.number(), "summary": v.string(), "verdict": v.union(v.literal("validated"), v.literal("invalidated"), v.literal("forked"), v.literal("inconclusive")), "whatChanged": v.string() })), "phase": v.optional(v.string()), "phaseHistory": v.optional(v.array(v.object({ "completedAt": v.optional(v.number()), "completedBy": v.optional(v.string()), "enteredAt": v.number(), "pausedAt": v.optional(v.number()), "phase": v.string(), "resumedAt": v.optional(v.number()) }))), "priority": v.optional(v.number()), "questionsCoverage": v.optional(v.object({ "clusterNodesCovered": v.number(), "coveragePercent": v.number(), "gapsIdentified": v.optional(v.array(v.string())), "totalQuestions": v.number() })), "rationale": v.optional(v.string()), "researchEfficiency": v.optional(v.object({ "clusterCoverage": v.number(), "efficiencyScore": v.number(), "questionsPerTask": v.number(), "totalTasks": v.number() })), "retrospective": v.optional(v.object({ "confidenceChange": v.number(), "lessonsLearned": v.array(v.string()), "whatDidnt": v.array(v.string()), "whatWorked": v.array(v.string()) })), "sourceProposalId": v.optional(v.string()), "startDate": v.number(), "startingConfidence": v.optional(v.object({ "beliefConfidences": v.array(v.object({ "beliefId": v.string(), "confidence": v.number() })), "overall": v.number() })), "status": v.union(v.literal("suggested"), v.literal("planning"), v.literal("active"), v.literal("paused"), v.literal("completed"), v.literal("dismissed"), v.literal("abandoned")), "synthesisState": v.optional(v.object({ "originalBeliefIds": v.array(v.string()), "synthesisComplete": v.boolean(), "synthesisCompletedAt": v.optional(v.number()), "synthesisCompletedBy": v.optional(v.string()), "synthesisRationale": v.optional(v.string()), "synthesizedBeliefIds": v.array(v.string()) })), "targetBeliefIds": v.array(v.string()), "targetBranch": v.optional(v.string()), "targetQuestionIds": v.array(v.string()), "tasks": v.optional(v.union(v.string(), v.number(), v.boolean(), v.null(), v.record(v.string(), v.any()), v.array(v.any()))), "thesisReportId": v.optional(v.string()), "topicId": v.optional(v.string()), "track": v.optional(v.string()), "trackPosition": v.optional(v.number()), "triggerReason": v.optional(v.string()), "updatedAt": v.optional(v.number()), "userId": v.optional(v.string()), "worktreeScope": v.optional(v.union(v.literal("belief"), v.literal("branch"))), "worktreeType": v.optional(v.string()) })).index("by_topicId", ["topicId"]).index("by_topicId_status", ["topicId", "status"]).index("by_topicId_index", ["topicId", "index"]).index("by_worktreeType", ["topicId", "worktreeType"]).index("by_topicId_priority", ["topicId", "priority"]).index("by_topicId_branch", ["topicId", "targetBranch"]).index("by_topicId_scope", ["topicId", "worktreeScope"])
60
+ "worktrees": defineTable(v.object({ "beliefFocus": v.optional(v.string()), "beliefRefinement": v.optional(v.object({ "checklist": v.optional(v.object({ "hasMeasurableCriteria": v.boolean(), "hasSpecificClaim": v.boolean(), "hasTestability": v.boolean(), "hasTimeframe": v.boolean() })), "isRefined": v.boolean(), "measurableCriteria": v.optional(v.string()), "originalText": v.optional(v.string()), "refinedAt": v.optional(v.number()), "refinedBy": v.optional(v.string()), "refinedText": v.optional(v.string()), "testingCriteria": v.optional(v.string()), "timeframe": v.optional(v.string()) })), "beliefRefinements": v.optional(v.array(v.any())), "blocks": v.optional(v.array(v.id("worktrees"))), "branchThesis": v.optional(v.object({ "approvedAt": v.optional(v.number()), "approvedBy": v.optional(v.string()), "content": v.string(), "generatedAt": v.optional(v.number()), "generationMetadata": v.optional(v.object({ "langfuseTraceId": v.optional(v.string()), "modelUsed": v.string(), "promptName": v.string() })), "memoContent": v.optional(v.string()), "status": v.union(v.literal("ai_draft"), v.literal("user_draft"), v.literal("final")) })), "campaign": v.optional(v.number()), "chatId": v.optional(v.string()), "clusterStatus": v.optional(v.object({ "conditionalsByType": v.optional(v.object({ "cascades": v.number(), "counterfactuals": v.number(), "dependencies": v.number(), "other": v.number() })), "hasCascades": v.boolean(), "hasCounterfactuals": v.boolean(), "hasDependencies": v.boolean(), "mappingCompletedAt": v.optional(v.number()), "mappingCompletedBy": v.optional(v.string()), "totalConditionals": v.number() })), "confidenceImpact": v.optional(v.union(v.literal("high"), v.literal("medium"), v.literal("low"))), "createdAt": v.optional(v.number()), "createdBy": v.string(), "decisionGate": v.optional(v.object({ "decidedAt": v.optional(v.number()), "decidedBy": v.optional(v.string()), "goCriteria": v.array(v.string()), "noGoSignals": v.array(v.string()), "verdict": v.optional(v.union(v.literal("go"), v.literal("no_go"), v.literal("pivot"), v.literal("pending"))), "verdictRationale": v.optional(v.string()) })), "decisionsReached": v.optional(v.array(v.string())), "dependsOn": v.optional(v.array(v.id("worktrees"))), "dismissedReason": v.optional(v.string()), "durationWeeks": v.number(), "endDate": v.number(), "endingConfidence": v.optional(v.object({ "beliefConfidences": v.array(v.object({ "beliefId": v.string(), "confidence": v.number() })), "overall": v.number() })), "epistemicChain": v.optional(v.object({ "capturedAt": v.number(), "capturedBy": v.string(), "clusterEdges": v.array(v.object({ "createdAt": v.optional(v.number()), "edgeId": v.optional(v.string()), "edgeType": v.string(), "sourceId": v.string(), "targetId": v.string(), "weight": v.optional(v.number()) })), "confidenceHistory": v.optional(v.array(v.object({ "beliefId": v.string(), "recentChanges": v.array(v.object({ "confidence": v.optional(v.string()), "timestamp": v.optional(v.number()), "trigger": v.optional(v.string()) })) }))), "evidence": v.array(v.object({ "createdAt": v.optional(v.number()), "id": v.string(), "sourceType": v.optional(v.string()), "text": v.string(), "verificationStatus": v.optional(v.string()), "verified": v.boolean() })), "outcome": v.object({ "confidenceChange": v.number(), "endingConfidence": v.number(), "startingConfidence": v.number(), "summary": v.string(), "verdict": v.string() }), "primaryBelief": v.optional(v.object({ "confidenceScore": v.optional(v.number()), "criticality": v.optional(v.string()), "endingConfidence": v.number(), "endingConfidenceLabel": v.optional(v.string()), "id": v.string(), "startingConfidence": v.number(), "startingConfidenceLabel": v.optional(v.string()), "status": v.optional(v.string()), "text": v.string() })), "questions": v.array(v.object({ "answer": v.optional(v.string()), "answeredAt": v.optional(v.number()), "answeredBy": v.optional(v.string()), "answerStatus": v.optional(v.string()), "evidenceCount": v.number(), "id": v.string(), "priority": v.optional(v.string()), "status": v.string(), "text": v.string() })), "relatedBeliefs": v.optional(v.array(v.object({ "confidence": v.optional(v.string()), "confidenceScore": v.optional(v.number()), "id": v.string(), "text": v.optional(v.string()) }))), "tasksCompleted": v.optional(v.number()), "topicId": v.optional(v.string()), "totalTasks": v.optional(v.number()), "worktreeId": v.id("worktrees") })), "epistemicOrigin": v.optional(v.string()), "evidenceReviewState": v.optional(v.object({ "evidenceGaps": v.array(v.string()), "evidenceQuestionMapping": v.optional(v.array(v.object({ "coverageNote": v.optional(v.string()), "evidenceId": v.string(), "questionIds": v.array(v.string()) }))), "existingEvidenceReviewed": v.boolean(), "reviewCompletedAt": v.optional(v.number()), "reviewCompletedBy": v.optional(v.string()), "strengthAreas": v.array(v.string()) })), "evidenceSignals": v.optional(v.array(v.object({ "collected": v.boolean(), "notes": v.optional(v.string()), "progress": v.optional(v.string()), "signal": v.string() }))), "gate": v.optional(v.string()), "generatedAt": v.optional(v.number()), "generatedBy": v.optional(v.string()), "hypothesis": v.optional(v.string()), "index": v.number(), "keyFindings": v.optional(v.array(v.string())), "keyQuestions": v.optional(v.array(v.object({ "answer": v.optional(v.string()), "answerConfidence": v.optional(v.union(v.literal("high"), v.literal("medium"), v.literal("low"))), "linkedQuestionId": v.optional(v.string()), "question": v.string(), "status": v.union(v.literal("open"), v.literal("answered"), v.literal("forked")) }))), "lane": v.optional(v.string()), "laneOrderInCampaign": v.optional(v.number()), "linkedCallIds": v.optional(v.array(v.string())), "linkedDeepResearchIds": v.optional(v.array(v.string())), "linkedDocumentIds": v.optional(v.array(v.string())), "linkedEvidenceIds": v.optional(v.array(v.string())), "linkedNewsIds": v.optional(v.array(v.string())), "linkedPrimerIds": v.optional(v.array(v.string())), "metadata": v.optional(v.any()), "name": v.string(), "nextSteps": v.optional(v.array(v.string())), "notes": v.optional(v.array(v.object({ "content": v.string(), "createdAt": v.number(), "createdBy": v.string(), "id": v.string(), "linkedBeliefId": v.optional(v.string()), "linkedQuestionId": v.optional(v.string()), "linkedTaskId": v.optional(v.string()) }))), "objective": v.string(), "orderInLane": v.optional(v.number()), "outcome": v.optional(v.object({ "confidenceChange": v.number(), "summary": v.string(), "verdict": v.union(v.literal("validated"), v.literal("invalidated"), v.literal("forked"), v.literal("inconclusive")), "whatChanged": v.string() })), "phase": v.optional(v.string()), "phaseHistory": v.optional(v.array(v.object({ "completedAt": v.optional(v.number()), "completedBy": v.optional(v.string()), "enteredAt": v.number(), "pausedAt": v.optional(v.number()), "phase": v.string(), "resumedAt": v.optional(v.number()) }))), "priority": v.optional(v.number()), "questionsCoverage": v.optional(v.object({ "clusterNodesCovered": v.number(), "coveragePercent": v.number(), "gapsIdentified": v.optional(v.array(v.string())), "totalQuestions": v.number() })), "rationale": v.optional(v.string()), "researchEfficiency": v.optional(v.object({ "clusterCoverage": v.number(), "efficiencyScore": v.number(), "questionsPerTask": v.number(), "totalTasks": v.number() })), "retrospective": v.optional(v.object({ "confidenceChange": v.number(), "lessonsLearned": v.array(v.string()), "whatDidnt": v.array(v.string()), "whatWorked": v.array(v.string()) })), "sourceProposalId": v.optional(v.string()), "startDate": v.number(), "startingConfidence": v.optional(v.object({ "beliefConfidences": v.array(v.object({ "beliefId": v.string(), "confidence": v.number() })), "overall": v.number() })), "status": v.union(v.literal("suggested"), v.literal("planning"), v.literal("active"), v.literal("paused"), v.literal("completed"), v.literal("dismissed"), v.literal("abandoned")), "synthesisState": v.optional(v.object({ "originalBeliefIds": v.array(v.string()), "synthesisComplete": v.boolean(), "synthesisCompletedAt": v.optional(v.number()), "synthesisCompletedBy": v.optional(v.string()), "synthesisRationale": v.optional(v.string()), "synthesizedBeliefIds": v.array(v.string()) })), "targetBeliefIds": v.array(v.string()), "targetBranch": v.optional(v.string()), "targetQuestionIds": v.array(v.string()), "tasks": v.optional(v.union(v.string(), v.number(), v.boolean(), v.null(), v.record(v.string(), v.any()), v.array(v.any()))), "thesisReportId": v.optional(v.string()), "topicId": v.optional(v.string()), "triggerReason": v.optional(v.string()), "updatedAt": v.optional(v.number()), "userId": v.optional(v.string()), "worktreeScope": v.optional(v.union(v.literal("belief"), v.literal("branch"))), "worktreeType": v.optional(v.string()) })).index("by_topicId", ["topicId"]).index("by_topicId_status", ["topicId", "status"]).index("by_topicId_index", ["topicId", "index"]).index("by_worktreeType", ["topicId", "worktreeType"]).index("by_topicId_priority", ["topicId", "priority"]).index("by_topicId_campaign_lane_order", ["topicId", "campaign", "laneOrderInCampaign", "orderInLane"]).index("by_topicId_lane_order", ["topicId", "lane", "orderInLane"]).index("by_topicId_branch", ["topicId", "targetBranch"]).index("by_topicId_scope", ["topicId", "worktreeScope"])
60
61
  };
61
62
  var IDENTITY_SCHEMA_TABLES = {
62
63
  "agents": defineTable(v.object({ "createdAt": v.number(), "createdBy": v.string(), "displayName": v.optional(v.string()), "groupIds": v.optional(v.array(v.string())), "permittedPackKeys": v.optional(v.array(v.string())), "permittedToolNames": v.optional(v.array(v.string())), "principalId": v.string(), "principalType": v.literal("service"), "roles": v.array(v.string()), "slug": v.string(), "status": v.union(v.literal("active"), v.literal("suspended"), v.literal("disabled")), "tenantId": v.string(), "updatedAt": v.number(), "workspaceId": v.string() })).index("by_slug", ["slug"]).index("by_principalId", ["principalId"]).index("by_tenantId", ["tenantId"]).index("by_status", ["status"]),
@@ -98,6 +99,7 @@ var MC_SCHEMA_TABLES = {
98
99
  "groups": defineTable(v.object({ "createdAt": v.number(), "description": v.optional(v.string()), "groupKey": v.string(), "groupType": v.union(v.literal("internal"), v.literal("external"), v.literal("system")), "metadata": v.optional(v.record(v.string(), v.any())), "name": v.string(), "tenantId": v.id("tenants"), "updatedAt": v.number(), "workspaceId": v.optional(v.id("workspaces")) })).index("by_tenantId", ["tenantId"]).index("by_workspaceId", ["workspaceId"]).index("by_tenantId_groupKey", ["tenantId", "groupKey"]),
99
100
  "memberships": defineTable(v.object({ "createdAt": v.number(), "grantedBy": v.optional(v.string()), "principalId": v.string(), "principalRefId": v.optional(v.id("principals")), "role": v.union(v.literal("platform_admin"), v.literal("tenant_admin"), v.literal("workspace_admin"), v.literal("editor"), v.literal("viewer"), v.literal("auditor"), v.literal("service_agent")), "source": v.union(v.literal("manual"), v.literal("sso"), v.literal("bootstrap"), v.literal("api"), v.literal("scim")), "status": v.union(v.literal("active"), v.literal("invited"), v.literal("revoked")), "tenantId": v.id("tenants"), "updatedAt": v.number(), "workspaceId": v.optional(v.id("workspaces")) })).index("by_principalId", ["principalId"]).index("by_principal_tenant", ["principalId", "tenantId"]).index("by_workspace_principal", ["workspaceId", "principalId"]).index("by_tenant_role", ["tenantId", "role"]).index("by_status", ["status"]),
100
101
  "methodologyPacks": defineTable(v.object({ "createdAt": v.number(), "description": v.string(), "enforcementLevel": v.union(v.literal("strict"), v.literal("guided"), v.literal("advisory")), "name": v.string(), "packId": v.string(), "phases": v.array(v.object({ "description": v.string(), "gate": v.optional(v.string()), "instructions": v.string(), "name": v.string(), "requiredTools": v.array(v.string()), "title": v.string() })), "principles": v.array(v.string()), "status": v.union(v.literal("active"), v.literal("draft"), v.literal("archived")), "updatedAt": v.number(), "version": v.string() })).index("by_packId", ["packId"]).index("by_status", ["status"]),
102
+ "oauthDeviceCodes": defineTable(v.object({ "approvedAt": v.optional(v.number()), "clerkUserId": v.optional(v.string()), "clientId": v.string(), "consumedAt": v.optional(v.number()), "createdAt": v.number(), "deniedAt": v.optional(v.number()), "deviceCodeHash": v.string(), "expiresAt": v.number(), "intervalSeconds": v.number(), "lastPolledAt": v.optional(v.number()), "principalId": v.optional(v.string()), "role": v.optional(v.string()), "scope": v.string(), "scopes": v.optional(v.array(v.string())), "sessionId": v.optional(v.string()), "slowDownCount": v.optional(v.number()), "status": v.union(v.literal("pending"), v.literal("approved"), v.literal("denied"), v.literal("expired"), v.literal("consumed")), "tenantId": v.optional(v.id("tenants")), "updatedAt": v.number(), "userCode": v.string(), "workspaceId": v.optional(v.string()) })).index("by_deviceCodeHash", ["deviceCodeHash"]).index("by_userCode", ["userCode"]).index("by_status_expiresAt", ["status", "expiresAt"]).index("by_sessionId", ["sessionId"]),
101
103
  "packAssignments": defineTable(v.object({ "assignedBy": v.string(), "createdAt": v.number(), "groupId": v.id("groups"), "packKey": v.string(), "status": v.union(v.literal("active"), v.literal("revoked")), "tenantId": v.id("tenants"), "updatedAt": v.number() })).index("by_groupId", ["groupId"]).index("by_tenantId", ["tenantId"]).index("by_tenant_packKey", ["tenantId", "packKey"]).index("by_group_packKey", ["groupId", "packKey"]).index("by_status", ["status"]),
102
104
  "packDefinitions": defineTable(v.object({ "agentKeys": v.optional(v.array(v.string())), "category": v.union(v.literal("developer"), v.literal("strategy"), v.literal("data"), v.literal("methodology"), v.literal("ontology"), v.literal("custom")), "configTemplates": v.optional(v.record(v.string(), v.any())), "createdAt": v.number(), "createdBy": v.string(), "description": v.optional(v.string()), "installScope": v.optional(v.union(v.literal("tenant"), v.literal("workspace"))), "lensConfig": v.optional(v.array(v.object({ "lensKey": v.string(), "perspectiveType": v.string() }))), "lifecycle": v.union(v.literal("active"), v.literal("beta"), v.literal("experimental")), "methodologyPackIds": v.optional(v.array(v.string())), "name": v.string(), "ontologyConfig": v.optional(v.object({ "ontologyKey": v.string(), "ontologyVersion": v.optional(v.string()), "topicBindings": v.optional(v.array(v.object({ "autoBindNewTopics": v.boolean(), "topicType": v.string() }))) })), "packKey": v.string(), "promptNames": v.optional(v.array(v.string())), "status": v.union(v.literal("draft"), v.literal("active"), v.literal("archived")), "tierRequirement": v.union(v.literal("free"), v.literal("developer"), v.literal("team"), v.literal("enterprise")), "toolNames": v.array(v.string()), "topicIds": v.optional(v.array(v.string())), "updatedAt": v.number() })).index("by_packKey", ["packKey"]).index("by_category", ["category"]).index("by_lifecycle", ["lifecycle"]).index("by_status", ["status"]).index("by_tierRequirement", ["tierRequirement"]),
103
105
  "packEntitlements": defineTable(v.object({ "allowedLifecycles": v.optional(v.array(v.union(v.literal("active"), v.literal("beta"), v.literal("experimental")))), "createdAt": v.number(), "grantedBy": v.optional(v.string()), "maxVersion": v.optional(v.string()), "metadata": v.optional(v.record(v.string(), v.any())), "minVersion": v.optional(v.string()), "packKey": v.string(), "status": v.union(v.literal("active"), v.literal("disabled"), v.literal("revoked")), "tenantId": v.id("tenants"), "updatedAt": v.number(), "workspaceId": v.optional(v.id("workspaces")) })).index("by_packKey", ["packKey"]).index("by_tenantId", ["tenantId"]).index("by_workspaceId", ["workspaceId"]).index("by_tenant_packKey", ["tenantId", "packKey"]).index("by_tenant_workspace_packKey", ["tenantId", "workspaceId", "packKey"]).index("by_tenant_status", ["tenantId", "status"]).index("by_workspace_status", ["workspaceId", "status"]),
@@ -110,13 +112,13 @@ var MC_SCHEMA_TABLES = {
110
112
  "principals": defineTable(v.object({ "clerkId": v.optional(v.string()), "createdAt": v.number(), "displayName": v.optional(v.string()), "email": v.optional(v.string()), "groupIds": v.optional(v.array(v.id("groups"))), "metadata": v.optional(v.record(v.string(), v.any())), "principalId": v.string(), "principalType": v.union(v.literal("user"), v.literal("group"), v.literal("service"), v.literal("external_viewer")), "status": v.union(v.literal("active"), v.literal("invited"), v.literal("suspended"), v.literal("disabled")), "tenantId": v.optional(v.id("tenants")), "updatedAt": v.number(), "workspaceId": v.optional(v.id("workspaces")) })).index("by_principalId", ["principalId"]).index("by_clerkId", ["clerkId"]).index("by_tenantId", ["tenantId"]).index("by_workspaceId", ["workspaceId"]).index("by_status", ["status"]),
111
113
  "rateLimitWindows": defineTable(v.object({ "createdAt": v.number(), "keyId": v.optional(v.string()), "limit": v.number(), "principalId": v.string(), "requestCount": v.number(), "tenantId": v.optional(v.id("tenants")), "tier": v.union(v.literal("free"), v.literal("developer"), v.literal("partner")), "updatedAt": v.number(), "windowEndMs": v.number(), "windowStartMs": v.number(), "windowType": v.union(v.literal("minute"), v.literal("hour")) })).index("by_principal_window", ["principalId", "windowType", "windowStartMs"]).index("by_window_type_start", ["windowType", "windowStartMs"]).index("by_window_end", ["windowEndMs"]).index("by_tier_window_end", ["tier", "windowEndMs"]),
112
114
  "servicePrincipalKeys": defineTable(v.object({ "createdAt": v.number(), "createdBy": v.string(), "environment": v.union(v.literal("sandbox"), v.literal("production")), "expiresAt": v.number(), "keyId": v.string(), "lastUsedAt": v.optional(v.number()), "metadata": v.optional(v.record(v.string(), v.any())), "principalId": v.string(), "rateLimitTier": v.optional(v.union(v.literal("free"), v.literal("developer"), v.literal("partner"))), "revokedAt": v.optional(v.number()), "revokedBy": v.optional(v.string()), "rotatedToKeyId": v.optional(v.string()), "rotationGracePeriod": v.optional(v.number()), "scopes": v.array(v.string()), "status": v.union(v.literal("active"), v.literal("rotating"), v.literal("rotated"), v.literal("expired"), v.literal("revoked")), "tenantId": v.id("tenants"), "tokenHash": v.string(), "updatedAt": v.number(), "workspaceId": v.optional(v.id("workspaces")) })).index("by_keyId", ["keyId"]).index("by_tokenHash", ["tokenHash"]).index("by_principalId", ["principalId"]).index("by_tenantId", ["tenantId"]).index("by_workspaceId", ["workspaceId"]).index("by_status", ["status"]).index("by_principal_status", ["principalId", "status"]),
113
- "tenantDeploymentCredentials": defineTable(v.object({ "createdAt": v.number(), "createdBy": v.string(), "credentialRef": v.string(), "encryptedDeployKey": v.string(), "encryptionVersion": v.string(), "environment": v.union(v.literal("dev"), v.literal("prod")), "keyFingerprint": v.string(), "keyHint": v.string(), "lastUsedAt": v.optional(v.number()), "metadata": v.optional(v.record(v.string(), v.any())), "revokedAt": v.optional(v.number()), "revokedBy": v.optional(v.string()), "rotatedFromCredentialRef": v.optional(v.string()), "status": v.union(v.literal("active"), v.literal("revoked")), "target": v.union(v.literal("kernelDeployment"), v.literal("appDeployment")), "tenantId": v.id("tenants"), "updatedAt": v.number() })).index("by_credentialRef", ["credentialRef"]).index("by_tenantId", ["tenantId"]).index("by_tenant_target", ["tenantId", "target"]).index("by_tenant_target_environment", ["tenantId", "target", "environment"]).index("by_tenant_target_environment_status", ["tenantId", "target", "environment", "status"]).index("by_status", ["status"]),
115
+ "tenantDeploymentCredentials": defineTable(v.object({ "createdAt": v.number(), "createdBy": v.string(), "credentialRef": v.string(), "encryptedDeployKey": v.string(), "encryptionVersion": v.string(), "environment": v.union(v.literal("dev"), v.literal("staging"), v.literal("prod")), "keyFingerprint": v.string(), "keyHint": v.string(), "lastUsedAt": v.optional(v.number()), "metadata": v.optional(v.record(v.string(), v.any())), "revokedAt": v.optional(v.number()), "revokedBy": v.optional(v.string()), "rotatedFromCredentialRef": v.optional(v.string()), "status": v.union(v.literal("active"), v.literal("revoked")), "target": v.union(v.literal("kernelDeployment"), v.literal("appDeployment")), "tenantId": v.id("tenants"), "updatedAt": v.number() })).index("by_credentialRef", ["credentialRef"]).index("by_tenantId", ["tenantId"]).index("by_tenant_target", ["tenantId", "target"]).index("by_tenant_target_environment", ["tenantId", "target", "environment"]).index("by_tenant_target_environment_status", ["tenantId", "target", "environment", "status"]).index("by_status", ["status"]),
114
116
  "tenantMethodologyAssignments": defineTable(v.object({ "assignedAt": v.number(), "assignedBy": v.string(), "isDefault": v.boolean(), "methodologyPackId": v.id("methodologyPacks"), "tenantId": v.id("tenants") })).index("by_tenantId", ["tenantId"]).index("by_methodologyPackId", ["methodologyPackId"]),
115
117
  "tenants": defineTable(v.object({ "appDeployment": v.optional(v.object({ "devId": v.string(), "devUrl": v.string(), "prodId": v.optional(v.string()), "prodUrl": v.optional(v.string()), "stagingId": v.optional(v.string()), "stagingUrl": v.optional(v.string()) })), "createdAt": v.number(), "kernelDeployment": v.optional(v.object({ "devId": v.string(), "devUrl": v.string(), "prodId": v.optional(v.string()), "prodUrl": v.optional(v.string()), "stagingId": v.optional(v.string()), "stagingUrl": v.optional(v.string()) })), "lucernDeployment": v.optional(v.object({ "devId": v.string(), "devUrl": v.string(), "prodId": v.optional(v.string()), "prodUrl": v.optional(v.string()), "stagingId": v.optional(v.string()), "stagingUrl": v.optional(v.string()) })), "metadata": v.optional(v.any()), "name": v.string(), "ownerClerkId": v.string(), "ownerEmail": v.optional(v.string()), "slug": v.string(), "status": v.union(v.literal("provisioning"), v.literal("active"), v.literal("suspended"), v.literal("archived")), "tier": v.union(v.literal("free"), v.literal("developer"), v.literal("team"), v.literal("enterprise")), "updatedAt": v.number() })).index("by_slug", ["slug"]).index("by_status", ["status"]).index("by_ownerClerkId", ["ownerClerkId"]),
116
118
  "toolCatalog": defineTable(v.object({ "category": v.union(v.literal("read"), v.literal("write"), v.literal("admin"), v.literal("system")), "createdAt": v.number(), "description": v.string(), "distribution": v.union(v.literal("base"), v.literal("pack_only")), "executionAdapter": v.optional(v.union(v.literal("convex_mutation"), v.literal("convex_action"), v.literal("http_callback"), v.literal("mcp_tool"), v.literal("sdk_invocation"), v.literal("external_observed"))), "handlerRef": v.optional(v.string()), "metadata": v.optional(v.record(v.string(), v.any())), "parameterSchema": v.optional(v.record(v.string(), v.any())), "requiredAction": v.union(v.literal("read"), v.literal("mutate"), v.literal("admin"), v.literal("summarize"), v.literal("export"), v.literal("create"), v.literal("delete"), v.literal("grant"), v.literal("revoke")), "requiredRole": v.union(v.literal("platform_admin"), v.literal("tenant_admin"), v.literal("workspace_admin"), v.literal("editor"), v.literal("viewer"), v.literal("auditor"), v.literal("service_agent")), "returnSchema": v.optional(v.record(v.string(), v.any())), "safetyMetadata": v.optional(v.object({ "idempotent": v.boolean(), "readOnly": v.boolean(), "sideEffectLevel": v.union(v.literal("none"), v.literal("low"), v.literal("high")) })), "status": v.union(v.literal("active"), v.literal("deprecated"), v.literal("draft")), "surfaces": v.array(v.union(v.literal("mcp"), v.literal("chat"), v.literal("voice"), v.literal("sprint"), v.literal("api"), v.literal("sdk"), v.literal("cli"))), "toolName": v.string(), "updatedAt": v.number(), "version": v.string() })).index("by_toolName", ["toolName"]).index("by_status", ["status"]).index("by_distribution", ["distribution"]).index("by_distribution_status", ["distribution", "status"]).index("by_category", ["category"]).index("by_requiredRole", ["requiredRole"]),
117
119
  "toolRegistryEntries": defineTable(v.object({ "approvalGateId": v.optional(v.string()), "category": v.optional(v.union(v.literal("read"), v.literal("write"), v.literal("admin"), v.literal("system"))), "createdAt": v.number(), "createdBy": v.string(), "description": v.string(), "exampleInvocations": v.array(v.object({ "expectedOutput": v.optional(v.record(v.string(), v.any())), "input": v.record(v.string(), v.any()) })), "executionAdapter": v.union(v.literal("convex_mutation"), v.literal("convex_action"), v.literal("http_callback"), v.literal("mcp_tool"), v.literal("sdk_invocation"), v.literal("external_observed")), "gateClassification": v.union(v.literal("core"), v.literal("shimmed")), "isCore": v.optional(v.boolean()), "metadata": v.optional(v.record(v.string(), v.any())), "parameterSchema": v.record(v.string(), v.any()), "requiredAction": v.optional(v.union(v.literal("read"), v.literal("mutate"), v.literal("admin"), v.literal("summarize"), v.literal("export"), v.literal("create"), v.literal("delete"), v.literal("grant"), v.literal("revoke"))), "requiredRole": v.optional(v.union(v.literal("platform_admin"), v.literal("tenant_admin"), v.literal("workspace_admin"), v.literal("editor"), v.literal("viewer"), v.literal("auditor"), v.literal("service_agent"))), "safetyMetadata": v.object({ "idempotent": v.boolean(), "readOnly": v.boolean(), "sideEffectLevel": v.union(v.literal("none"), v.literal("low"), v.literal("high")) }), "scopeRequirements": v.array(v.string()), "status": v.union(v.literal("active"), v.literal("deprecated"), v.literal("disabled")), "surfaces": v.optional(v.array(v.union(v.literal("mcp"), v.literal("chat"), v.literal("voice"), v.literal("sprint"), v.literal("api"), v.literal("sdk"), v.literal("cli")))), "tenantId": v.id("tenants"), "toolId": v.string(), "toolName": v.string(), "updatedAt": v.number(), "version": v.string(), "workspaceId": v.optional(v.id("workspaces")) })).index("by_toolId", ["toolId"]).index("by_tenant_toolId", ["tenantId", "toolId"]).index("by_tenant_toolId_version", ["tenantId", "toolId", "version"]).index("by_tenant_toolName", ["tenantId", "toolName"]).index("by_tenant_toolName_version", ["tenantId", "toolName", "version"]).index("by_workspace_toolName_version", ["workspaceId", "toolName", "version"]).index("by_tenant_gateClassification", ["tenantId", "gateClassification"]).index("by_tenant_status", ["tenantId", "status"]),
118
120
  "userSessions": defineTable(v.object({ "apiKeyId": v.id("apiKeys"), "authMode": v.optional(v.union(v.literal("interactive_user"), v.literal("service_principal"), v.literal("tenant_api_key"), v.literal("session_token"))), "clerkUserId": v.string(), "createdAt": v.number(), "delegationChain": v.optional(v.array(v.object({ "authMode": v.optional(v.union(v.literal("interactive_user"), v.literal("service_principal"), v.literal("tenant_api_key"), v.literal("session_token"))), "delegatedAt": v.optional(v.number()), "principalId": v.string(), "principalType": v.union(v.literal("human"), v.literal("service"), v.literal("agent")), "reason": v.optional(v.string()), "sessionId": v.optional(v.string()) }))), "jwtExpiresAt": v.optional(v.number()), "jwtIssuedAt": v.optional(v.number()), "lastActivityAt": v.number(), "lastValidatedAt": v.optional(v.number()), "principalId": v.optional(v.string()), "principalType": v.optional(v.union(v.literal("human"), v.literal("service"), v.literal("agent"))), "revokedAt": v.optional(v.number()), "revokedBy": v.optional(v.string()), "revokeReason": v.optional(v.string()), "role": v.optional(v.string()), "scopes": v.optional(v.array(v.string())), "sessionExpiresAt": v.optional(v.number()), "sessionId": v.string(), "sessionType": v.union(v.literal("user"), v.literal("agent")), "sourceSessionId": v.optional(v.string()), "status": v.union(v.literal("active"), v.literal("expired"), v.literal("revoked")), "tenantId": v.id("tenants"), "updatedAt": v.number(), "workspaceId": v.optional(v.string()) })).index("by_sessionId", ["sessionId"]).index("by_sourceSessionId", ["sourceSessionId"]).index("by_tenantId", ["tenantId"]).index("by_clerkUserId", ["clerkUserId"]).index("by_status", ["status"]),
119
- "workspaces": defineTable(v.object({ "createdAt": v.number(), "createdBy": v.optional(v.string()), "defaultProjectVisibility": v.optional(v.union(v.literal("private"), v.literal("team"), v.literal("firm"), v.literal("external"), v.literal("public"))), "deployments": v.optional(v.record(v.string(), v.object({ "encryptedDeployKey": v.string(), "url": v.string() }))), "key": v.string(), "metadata": v.optional(v.record(v.string(), v.any())), "name": v.string(), "slug": v.string(), "status": v.union(v.literal("active"), v.literal("archived")), "tenantId": v.id("tenants"), "updatedAt": v.number() })).index("by_tenantId", ["tenantId"]).index("by_tenantId_key", ["tenantId", "key"]).index("by_tenantId_slug", ["tenantId", "slug"]).index("by_status", ["status"])
121
+ "workspaces": defineTable(v.object({ "createdAt": v.number(), "createdBy": v.optional(v.string()), "defaultProjectVisibility": v.optional(v.union(v.literal("private"), v.literal("team"), v.literal("firm"), v.literal("external"), v.literal("public"))), "deployments": v.optional(v.record(v.string(), v.object({ "credentialRef": v.optional(v.string()), "encryptedDeployKey": v.optional(v.string()), "target": v.optional(v.union(v.literal("kernelDeployment"), v.literal("appDeployment"))), "url": v.string() }))), "key": v.string(), "metadata": v.optional(v.record(v.string(), v.any())), "name": v.string(), "slug": v.string(), "status": v.union(v.literal("active"), v.literal("archived")), "tenantId": v.id("tenants"), "updatedAt": v.number() })).index("by_tenantId", ["tenantId"]).index("by_tenantId_key", ["tenantId", "key"]).index("by_tenantId_slug", ["tenantId", "slug"]).index("by_status", ["status"])
120
122
  };
121
123
  var DEVELOPER_PACK_SCHEMA_TABLES = {};
122
124
  var EMPTY_SCHEMA_TABLES = {};