@neuroverseos/governance 0.5.0 → 0.6.0

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 (133) hide show
  1. package/README.md +244 -0
  2. package/dist/adapters/autoresearch.d.cts +2 -1
  3. package/dist/adapters/autoresearch.d.ts +2 -1
  4. package/dist/adapters/autoresearch.js +2 -2
  5. package/dist/adapters/deep-agents.d.cts +3 -2
  6. package/dist/adapters/deep-agents.d.ts +3 -2
  7. package/dist/adapters/deep-agents.js +2 -2
  8. package/dist/adapters/express.d.cts +2 -1
  9. package/dist/adapters/express.d.ts +2 -1
  10. package/dist/adapters/express.js +2 -2
  11. package/dist/adapters/github.cjs +1697 -0
  12. package/dist/adapters/github.d.cts +225 -0
  13. package/dist/adapters/github.d.ts +225 -0
  14. package/dist/adapters/github.js +27 -0
  15. package/dist/adapters/index.d.cts +4 -316
  16. package/dist/adapters/index.d.ts +4 -316
  17. package/dist/adapters/index.js +23 -21
  18. package/dist/adapters/langchain.d.cts +3 -2
  19. package/dist/adapters/langchain.d.ts +3 -2
  20. package/dist/adapters/langchain.js +2 -2
  21. package/dist/adapters/mentraos.cjs +2181 -0
  22. package/dist/adapters/mentraos.d.cts +319 -0
  23. package/dist/adapters/mentraos.d.ts +319 -0
  24. package/dist/{mentraos-LLH7KEV4.js → adapters/mentraos.js} +12 -10
  25. package/dist/adapters/openai.d.cts +3 -2
  26. package/dist/adapters/openai.d.ts +3 -2
  27. package/dist/adapters/openai.js +2 -2
  28. package/dist/adapters/openclaw.d.cts +3 -2
  29. package/dist/adapters/openclaw.d.ts +3 -2
  30. package/dist/adapters/openclaw.js +2 -2
  31. package/dist/{add-LYHDZ5RL.js → add-XSANI3FK.js} +1 -1
  32. package/dist/admin/index.cjs +2214 -0
  33. package/dist/admin/index.d.cts +362 -0
  34. package/dist/admin/index.d.ts +362 -0
  35. package/dist/admin/index.js +703 -0
  36. package/dist/bootstrap-contract-DcV6t-8M.d.cts +216 -0
  37. package/dist/bootstrap-contract-DcV6t-8M.d.ts +216 -0
  38. package/dist/{build-SCAWPA7E.js → build-UTVDGHB3.js} +5 -5
  39. package/dist/{chunk-JKGPSFGH.js → chunk-7FL3U7Z5.js} +3 -3
  40. package/dist/chunk-A2UZTLRV.js +421 -0
  41. package/dist/{chunk-TD5GKIHP.js → chunk-B3IIPTY3.js} +3 -3
  42. package/dist/chunk-EQR7BGFN.js +337 -0
  43. package/dist/{chunk-5JUZ4HL7.js → chunk-FDPPZLSQ.js} +3 -3
  44. package/dist/{chunk-MFKHTE5R.js → chunk-FKQCPRKI.js} +3 -3
  45. package/dist/{chunk-7D7PZLB7.js → chunk-FS2UUJJO.js} +3 -3
  46. package/dist/{chunk-U6FRAEQJ.js → chunk-GJ6LM4JZ.js} +1 -441
  47. package/dist/chunk-H3REGQRI.js +107 -0
  48. package/dist/{chunk-25XHSTPT.js → chunk-HDNDL6D5.js} +3 -3
  49. package/dist/{chunk-BXLTEUS4.js → chunk-I4RTIMLX.js} +2 -2
  50. package/dist/chunk-IOVXB6QN.js +447 -0
  51. package/dist/{chunk-Y6WXAPKY.js → chunk-NTHXZAW4.js} +3 -3
  52. package/dist/{chunk-UTH7OXTM.js → chunk-OTZU76DH.js} +22 -4
  53. package/dist/{chunk-DWHUZUEY.js → chunk-T6GMRZWC.js} +3 -3
  54. package/dist/{chunk-V4FZHJQX.js → chunk-TIXVEPS2.js} +3 -3
  55. package/dist/{chunk-YNYCQECH.js → chunk-TJ5L2UTE.js} +3 -3
  56. package/dist/chunk-UGTNKTHS.js +542 -0
  57. package/dist/cli/neuroverse.cjs +3372 -523
  58. package/dist/cli/neuroverse.js +53 -21
  59. package/dist/cli/plan.js +2 -2
  60. package/dist/cli/run.cjs +242 -139
  61. package/dist/cli/run.js +23 -3
  62. package/dist/cli/worldmodel.cjs +1624 -0
  63. package/dist/cli/worldmodel.d.cts +24 -0
  64. package/dist/cli/worldmodel.d.ts +24 -0
  65. package/dist/cli/worldmodel.js +742 -0
  66. package/dist/{demo-66MMJTEH.js → demo-6W3YXLAX.js} +4 -4
  67. package/dist/{derive-AUQE3L3P.js → derive-42IJW7JI.js} +4 -4
  68. package/dist/{doctor-EY7LKSYY.js → doctor-XEMLO6UA.js} +3 -2
  69. package/dist/engine/bootstrap-emitter.cjs +241 -0
  70. package/dist/engine/bootstrap-emitter.d.cts +27 -0
  71. package/dist/engine/bootstrap-emitter.d.ts +27 -0
  72. package/dist/{bootstrap-emitter-GIMOJFOC.js → engine/bootstrap-emitter.js} +2 -2
  73. package/dist/engine/bootstrap-parser.cjs +560 -0
  74. package/dist/engine/bootstrap-parser.d.cts +96 -0
  75. package/dist/engine/bootstrap-parser.d.ts +96 -0
  76. package/dist/{bootstrap-parser-LBLGVEMU.js → engine/bootstrap-parser.js} +2 -2
  77. package/dist/engine/guard-engine.cjs +1116 -0
  78. package/dist/engine/guard-engine.d.cts +60 -0
  79. package/dist/engine/guard-engine.d.ts +60 -0
  80. package/dist/{guard-engine-N7TUIUU7.js → engine/guard-engine.js} +3 -3
  81. package/dist/engine/simulate-engine.cjs +390 -0
  82. package/dist/engine/simulate-engine.d.cts +105 -0
  83. package/dist/engine/simulate-engine.d.ts +105 -0
  84. package/dist/engine/simulate-engine.js +9 -0
  85. package/dist/engine/worldmodel-compiler.cjs +366 -0
  86. package/dist/engine/worldmodel-compiler.d.cts +46 -0
  87. package/dist/engine/worldmodel-compiler.d.ts +46 -0
  88. package/dist/engine/worldmodel-compiler.js +17 -0
  89. package/dist/engine/worldmodel-parser.cjs +566 -0
  90. package/dist/engine/worldmodel-parser.d.cts +22 -0
  91. package/dist/engine/worldmodel-parser.d.ts +22 -0
  92. package/dist/engine/worldmodel-parser.js +7 -0
  93. package/dist/{equity-penalties-WWC7UDQD.js → equity-penalties-CCO3GVHS.js} +6 -6
  94. package/dist/{explain-MUSGDT67.js → explain-HDFN4ION.js} +1 -1
  95. package/dist/{guard-W3BMQPBJ.js → guard-IHJEKHL2.js} +16 -4
  96. package/dist/{guard-contract-CLBbTGK_.d.ts → guard-contract-ddiIPlOg.d.cts} +2 -369
  97. package/dist/{guard-contract-CLBbTGK_.d.cts → guard-contract-q6HJAq3Q.d.ts} +2 -369
  98. package/dist/{improve-PJDAWW4Q.js → improve-LRORRYEX.js} +3 -3
  99. package/dist/index.cjs +471 -1
  100. package/dist/index.d.cts +14 -492
  101. package/dist/index.d.ts +14 -492
  102. package/dist/index.js +63 -42
  103. package/dist/keygen-BSZH3NM2.js +77 -0
  104. package/dist/{lens-IP6GIZ2Q.js → lens-TLDZQXBI.js} +152 -26
  105. package/dist/{mcp-server-OG3PPVD2.js → mcp-server-CKYBHXWK.js} +2 -2
  106. package/dist/migrate-NH5PVMX4.js +221 -0
  107. package/dist/{playground-4BK2XQ47.js → playground-3TTBN7XD.js} +5 -5
  108. package/dist/{redteam-BRZALBPP.js → redteam-W644UMWN.js} +3 -3
  109. package/dist/{session-SGRUT2UH.js → session-FMAROEIE.js} +2 -2
  110. package/dist/{shared-CwGpPheR.d.ts → shared-DAzdfWtU.d.ts} +1 -1
  111. package/dist/{shared-BGzmYP5g.d.cts → shared-PpalGKxc.d.cts} +1 -1
  112. package/dist/sign-RRELHKWM.js +11 -0
  113. package/dist/{simulate-FGXKIH7V.js → simulate-VT437EEL.js} +2 -2
  114. package/dist/{test-PT44BSYG.js → test-XDB2DH3L.js} +3 -3
  115. package/dist/types.cjs +18 -0
  116. package/dist/types.d.cts +370 -0
  117. package/dist/types.d.ts +370 -0
  118. package/dist/types.js +0 -0
  119. package/dist/{validate-Q5O5TGLT.js → validate-M52DX22Y.js} +1 -1
  120. package/dist/verify-6AVTWX75.js +151 -0
  121. package/dist/{world-V52ZMH26.js → world-O4HTQPDP.js} +1 -1
  122. package/dist/{world-loader-C4D3VPP3.js → world-loader-YTYFOP7D.js} +1 -1
  123. package/dist/worldmodel-contract-BPGhiuW5.d.cts +221 -0
  124. package/dist/worldmodel-contract-BPGhiuW5.d.ts +221 -0
  125. package/dist/worlds/auki-vanguard.worldmodel.md +116 -0
  126. package/dist/worlds/behavioral-demo.nv-world.md +130 -0
  127. package/dist/worlds/neuroverse-governance.worldmodel.md +115 -0
  128. package/package.json +44 -3
  129. package/dist/{bootstrap-IP5QMC3Q.js → bootstrap-2OW5ZLBL.js} +3 -3
  130. package/dist/{chunk-4G6WHPLI.js → chunk-735Z3HA4.js} +6 -6
  131. package/dist/{chunk-7QIAF377.js → chunk-CYDMUJVZ.js} +0 -0
  132. package/dist/{configure-ai-LL3VAPQW.js → configure-ai-5MP5DWTT.js} +3 -3
  133. package/dist/{decision-flow-3K4D72G4.js → decision-flow-IJPNMVQK.js} +3 -3
@@ -0,0 +1,421 @@
1
+ import {
2
+ GovernanceBlockedError,
3
+ buildEngineOptions,
4
+ trackPlanProgress
5
+ } from "./chunk-5U2MQO5P.js";
6
+ import {
7
+ loadWorld
8
+ } from "./chunk-I4RTIMLX.js";
9
+ import {
10
+ evaluateGuard
11
+ } from "./chunk-ZAF6JH23.js";
12
+
13
+ // src/adapters/github.ts
14
+ var GitHubGovernanceBlockedError = class extends GovernanceBlockedError {
15
+ action;
16
+ constructor(verdict, action) {
17
+ super(verdict, `[NeuroVerse] GitHub action blocked: ${action.action} on ${action.repository}`);
18
+ this.name = "GitHubGovernanceBlockedError";
19
+ this.action = action;
20
+ }
21
+ };
22
+ function extractBranch(ref) {
23
+ if (!ref) return void 0;
24
+ if (ref.startsWith("refs/heads/")) return ref.slice("refs/heads/".length);
25
+ if (ref.startsWith("refs/tags/")) return ref.slice("refs/tags/".length);
26
+ return ref;
27
+ }
28
+ function isProtectedBranch(branch, protectedBranches) {
29
+ if (!branch) return false;
30
+ return protectedBranches.some(
31
+ (pb) => branch === pb || branch.startsWith(`${pb}/`)
32
+ );
33
+ }
34
+ function defaultMapAction(action, protectedBranches, restrictedActors) {
35
+ const branch = action.branch ?? extractBranch(action.ref);
36
+ const isProtected = isProtectedBranch(branch, protectedBranches);
37
+ const isRestricted = action.actor ? restrictedActors.some((ra) => action.actor === ra || action.actor?.endsWith("[bot]")) : false;
38
+ let actionCategory = "other";
39
+ const act = action.action.toLowerCase();
40
+ if (act.includes("read") || act.includes("get") || act.includes("list") || act.includes("view")) {
41
+ actionCategory = "read";
42
+ } else if (act.includes("delete") || act.includes("remove") || act.includes("close")) {
43
+ actionCategory = "delete";
44
+ } else if (act.includes("deploy") || act.includes("run") || act.includes("execute") || act.includes("merge")) {
45
+ actionCategory = "network";
46
+ } else if (act.includes("create") || act.includes("push") || act.includes("write") || act.includes("update") || act.includes("edit")) {
47
+ actionCategory = "write";
48
+ } else if (act.includes("comment") || act.includes("review") || act.includes("notify")) {
49
+ actionCategory = "other";
50
+ }
51
+ return {
52
+ intent: action.action,
53
+ tool: "github",
54
+ scope: `${action.repository}${branch ? `@${branch}` : ""}`,
55
+ actionCategory,
56
+ direction: "input",
57
+ args: {
58
+ repository: action.repository,
59
+ ref: action.ref,
60
+ branch,
61
+ actor: action.actor,
62
+ protected_branch: isProtected,
63
+ restricted_actor: isRestricted,
64
+ ...action.metadata
65
+ }
66
+ };
67
+ }
68
+ function defaultMapWebhook(eventType, payload) {
69
+ const repo = payload.repository;
70
+ const repoFullName = repo?.full_name ?? "unknown/unknown";
71
+ const sender = payload.sender;
72
+ const actor = sender?.login ?? void 0;
73
+ const webhookAction = payload.action;
74
+ switch (eventType) {
75
+ case "push": {
76
+ const ref = payload.ref;
77
+ const branch = extractBranch(ref);
78
+ const forced = payload.forced;
79
+ return {
80
+ action: forced ? "force_push" : `push_to_${branch ?? "branch"}`,
81
+ repository: repoFullName,
82
+ ref,
83
+ branch,
84
+ actor,
85
+ metadata: {
86
+ forced: forced ?? false,
87
+ commits_count: payload.commits?.length ?? 0,
88
+ head_commit: payload.head_commit?.id
89
+ }
90
+ };
91
+ }
92
+ case "pull_request": {
93
+ const pr = payload.pull_request;
94
+ const base = pr?.base;
95
+ const baseBranch = base?.ref;
96
+ const prNumber = pr?.number;
97
+ const merged = pr?.merged;
98
+ const labels = pr?.labels?.map((l) => l.name) ?? [];
99
+ let action = `pull_request_${webhookAction ?? "unknown"}`;
100
+ if (webhookAction === "closed" && merged) {
101
+ action = "merge_pull_request";
102
+ }
103
+ return {
104
+ action,
105
+ repository: repoFullName,
106
+ branch: baseBranch,
107
+ actor,
108
+ metadata: {
109
+ pr_number: prNumber,
110
+ labels,
111
+ merged: merged ?? false,
112
+ draft: pr?.draft ?? false,
113
+ webhook_action: webhookAction
114
+ }
115
+ };
116
+ }
117
+ case "release": {
118
+ const release = payload.release;
119
+ return {
120
+ action: `release_${webhookAction ?? "published"}`,
121
+ repository: repoFullName,
122
+ ref: release?.tag_name ? `refs/tags/${release.tag_name}` : void 0,
123
+ actor,
124
+ metadata: {
125
+ tag: release?.tag_name,
126
+ prerelease: release?.prerelease ?? false,
127
+ draft: release?.draft ?? false,
128
+ webhook_action: webhookAction
129
+ }
130
+ };
131
+ }
132
+ case "deployment":
133
+ case "deployment_status": {
134
+ const deployment = payload.deployment ?? payload;
135
+ return {
136
+ action: eventType === "deployment" ? "create_deployment" : "deployment_status_update",
137
+ repository: repoFullName,
138
+ ref: deployment.ref,
139
+ actor,
140
+ metadata: {
141
+ environment: deployment.environment,
142
+ status: payload.deployment_status?.state,
143
+ webhook_action: webhookAction
144
+ }
145
+ };
146
+ }
147
+ case "workflow_run": {
148
+ const run = payload.workflow_run;
149
+ return {
150
+ action: `workflow_${webhookAction ?? "completed"}`,
151
+ repository: repoFullName,
152
+ branch: run?.head_branch,
153
+ actor,
154
+ metadata: {
155
+ workflow_name: run?.name,
156
+ conclusion: run?.conclusion,
157
+ status: run?.status,
158
+ webhook_action: webhookAction
159
+ }
160
+ };
161
+ }
162
+ case "issues": {
163
+ const issue = payload.issue;
164
+ return {
165
+ action: `issue_${webhookAction ?? "opened"}`,
166
+ repository: repoFullName,
167
+ actor,
168
+ metadata: {
169
+ issue_number: issue?.number,
170
+ labels: issue?.labels?.map((l) => l.name) ?? [],
171
+ webhook_action: webhookAction
172
+ }
173
+ };
174
+ }
175
+ case "issue_comment": {
176
+ return {
177
+ action: `issue_comment_${webhookAction ?? "created"}`,
178
+ repository: repoFullName,
179
+ actor,
180
+ metadata: {
181
+ issue_number: payload.issue?.number,
182
+ webhook_action: webhookAction
183
+ }
184
+ };
185
+ }
186
+ case "delete": {
187
+ return {
188
+ action: `delete_${payload.ref_type ?? "ref"}`,
189
+ repository: repoFullName,
190
+ ref: payload.ref,
191
+ actor,
192
+ metadata: {
193
+ ref_type: payload.ref_type
194
+ }
195
+ };
196
+ }
197
+ default: {
198
+ return {
199
+ action: webhookAction ? `${eventType}_${webhookAction}` : eventType,
200
+ repository: repoFullName,
201
+ actor,
202
+ metadata: { webhook_action: webhookAction }
203
+ };
204
+ }
205
+ }
206
+ }
207
+ var GitHubGovernor = class {
208
+ world;
209
+ options;
210
+ engineOptions;
211
+ activePlan;
212
+ protectedBranches;
213
+ restrictedActors;
214
+ mapFn;
215
+ constructor(world, options = {}) {
216
+ this.world = world;
217
+ this.options = options;
218
+ this.activePlan = options.plan;
219
+ this.engineOptions = buildEngineOptions(options, this.activePlan);
220
+ this.protectedBranches = options.protectedBranches ?? ["main", "master", "production"];
221
+ this.restrictedActors = options.restrictedActors ?? [];
222
+ this.mapFn = options.mapAction ?? ((action) => defaultMapAction(action, this.protectedBranches, this.restrictedActors));
223
+ }
224
+ /**
225
+ * Evaluate a GitHub action against governance rules.
226
+ * Returns a full result with verdict, event, and the original action.
227
+ */
228
+ evaluate(action) {
229
+ const event = this.mapFn(action);
230
+ this.engineOptions.plan = this.activePlan;
231
+ const verdict = evaluateGuard(event, this.world, this.engineOptions);
232
+ this.options.onEvaluate?.(verdict, event, action);
233
+ if (verdict.status === "ALLOW") {
234
+ trackPlanProgress(event, this, this.options);
235
+ }
236
+ return { verdict, event, action };
237
+ }
238
+ /**
239
+ * Evaluate and enforce — throws GitHubGovernanceBlockedError on BLOCK/PAUSE.
240
+ * Use this as a gate before executing GitHub API calls.
241
+ */
242
+ enforce(action) {
243
+ const result = this.evaluate(action);
244
+ if (result.verdict.status === "BLOCK" || result.verdict.status === "PAUSE") {
245
+ throw new GitHubGovernanceBlockedError(result.verdict, action);
246
+ }
247
+ return result;
248
+ }
249
+ /**
250
+ * Check if pushing to a branch is allowed.
251
+ * Convenience method for the most common governance check.
252
+ */
253
+ canPush(repository, branch, actor) {
254
+ return this.evaluate({
255
+ action: `push_to_${branch}`,
256
+ repository,
257
+ ref: `refs/heads/${branch}`,
258
+ branch,
259
+ actor
260
+ }).verdict;
261
+ }
262
+ /**
263
+ * Check if merging a PR is allowed.
264
+ */
265
+ canMerge(repository, targetBranch, prNumber, actor, labels) {
266
+ return this.evaluate({
267
+ action: "merge_pull_request",
268
+ repository,
269
+ branch: targetBranch,
270
+ actor,
271
+ metadata: { pr_number: prNumber, labels: labels ?? [] }
272
+ }).verdict;
273
+ }
274
+ /**
275
+ * Check if creating a release is allowed.
276
+ */
277
+ canRelease(repository, tag, actor, prerelease) {
278
+ return this.evaluate({
279
+ action: "release_published",
280
+ repository,
281
+ ref: `refs/tags/${tag}`,
282
+ actor,
283
+ metadata: { tag, prerelease: prerelease ?? false }
284
+ }).verdict;
285
+ }
286
+ /**
287
+ * Check if deploying to an environment is allowed.
288
+ */
289
+ canDeploy(repository, environment, ref, actor) {
290
+ return this.evaluate({
291
+ action: "create_deployment",
292
+ repository,
293
+ ref,
294
+ actor,
295
+ metadata: { environment }
296
+ }).verdict;
297
+ }
298
+ };
299
+ var GitHubWebhookHandler = class {
300
+ governor;
301
+ mapWebhookFn;
302
+ webhookSecret;
303
+ constructor(world, options = {}) {
304
+ this.governor = new GitHubGovernor(world, options);
305
+ this.mapWebhookFn = options.mapWebhook ?? defaultMapWebhook;
306
+ this.webhookSecret = options.webhookSecret;
307
+ }
308
+ /**
309
+ * Evaluate a webhook payload.
310
+ *
311
+ * @param eventType - The X-GitHub-Event header value
312
+ * @param payload - The parsed webhook body
313
+ */
314
+ evaluate(eventType, payload) {
315
+ const action = this.mapWebhookFn(eventType, payload);
316
+ const result = this.governor.evaluate(action);
317
+ return {
318
+ verdict: result.verdict,
319
+ event: result.event,
320
+ webhookEvent: eventType,
321
+ webhookAction: payload.action
322
+ };
323
+ }
324
+ /**
325
+ * Evaluate and enforce — throws on BLOCK/PAUSE.
326
+ */
327
+ enforce(eventType, payload) {
328
+ const result = this.evaluate(eventType, payload);
329
+ if (result.verdict.status === "BLOCK" || result.verdict.status === "PAUSE") {
330
+ const action = this.mapWebhookFn(eventType, payload);
331
+ throw new GitHubGovernanceBlockedError(result.verdict, action);
332
+ }
333
+ return result;
334
+ }
335
+ /** Access the underlying governor for direct action evaluation. */
336
+ getGovernor() {
337
+ return this.governor;
338
+ }
339
+ /** Get the configured webhook secret (for signature verification in your server). */
340
+ getWebhookSecret() {
341
+ return this.webhookSecret;
342
+ }
343
+ };
344
+ function formatForActions(verdict) {
345
+ const status = verdict.status === "ALLOW" ? "allowed" : verdict.status === "BLOCK" ? "blocked" : "paused";
346
+ const reason = verdict.reason ?? "";
347
+ const ruleId = verdict.ruleId ?? "";
348
+ const lines = [
349
+ `governance_status=${status}`,
350
+ `verdict_status=${verdict.status}`,
351
+ `reason=${reason}`,
352
+ `rule_id=${ruleId}`
353
+ ].join("\n");
354
+ return {
355
+ governance_status: status,
356
+ verdict_status: verdict.status,
357
+ reason,
358
+ rule_id: ruleId,
359
+ outputLines: lines
360
+ };
361
+ }
362
+ function formatPRComment(verdict, action) {
363
+ const icon = verdict.status === "ALLOW" ? "\u2705" : verdict.status === "BLOCK" ? "\u{1F6AB}" : "\u23F8\uFE0F";
364
+ const status = verdict.status;
365
+ let body = `## ${icon} Governance: ${status}
366
+
367
+ `;
368
+ body += `**Action:** \`${action.action}\`
369
+ `;
370
+ body += `**Repository:** \`${action.repository}\`
371
+ `;
372
+ if (action.branch) {
373
+ body += `**Branch:** \`${action.branch}\`
374
+ `;
375
+ }
376
+ if (action.actor) {
377
+ body += `**Actor:** \`${action.actor}\`
378
+ `;
379
+ }
380
+ body += "\n";
381
+ if (verdict.reason) {
382
+ body += `**Reason:** ${verdict.reason}
383
+ `;
384
+ }
385
+ if (verdict.ruleId) {
386
+ body += `**Rule:** \`${verdict.ruleId}\`
387
+ `;
388
+ }
389
+ if (verdict.evidence?.invariantsSatisfied < verdict.evidence?.invariantsTotal) {
390
+ body += `**Invariants:** ${verdict.evidence.invariantsSatisfied}/${verdict.evidence.invariantsTotal} satisfied
391
+ `;
392
+ }
393
+ body += "\n---\n*Evaluated by [NeuroVerse Governance](https://github.com/NeuroverseOS/neuroverseos-governance)*";
394
+ return body;
395
+ }
396
+ async function createGitHubGovernor(worldPath, options) {
397
+ const world = await loadWorld(worldPath);
398
+ return new GitHubGovernor(world, options);
399
+ }
400
+ function createGitHubGovernorFromWorld(world, options) {
401
+ return new GitHubGovernor(world, options);
402
+ }
403
+ async function createGitHubWebhookHandler(worldPath, options) {
404
+ const world = await loadWorld(worldPath);
405
+ return new GitHubWebhookHandler(world, options);
406
+ }
407
+ function createGitHubWebhookHandlerFromWorld(world, options) {
408
+ return new GitHubWebhookHandler(world, options);
409
+ }
410
+
411
+ export {
412
+ GitHubGovernanceBlockedError,
413
+ GitHubGovernor,
414
+ GitHubWebhookHandler,
415
+ formatForActions,
416
+ formatPRComment,
417
+ createGitHubGovernor,
418
+ createGitHubGovernorFromWorld,
419
+ createGitHubWebhookHandler,
420
+ createGitHubWebhookHandlerFromWorld
421
+ };
@@ -5,12 +5,12 @@ import {
5
5
  extractScope,
6
6
  trackPlanProgress
7
7
  } from "./chunk-5U2MQO5P.js";
8
+ import {
9
+ loadWorld
10
+ } from "./chunk-I4RTIMLX.js";
8
11
  import {
9
12
  evaluateGuard
10
13
  } from "./chunk-ZAF6JH23.js";
11
- import {
12
- loadWorld
13
- } from "./chunk-BXLTEUS4.js";
14
14
 
15
15
  // src/adapters/openai.ts
16
16
  var GovernanceBlockedError2 = class extends GovernanceBlockedError {