@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
package/dist/index.cjs CHANGED
@@ -949,6 +949,9 @@ __export(index_exports, {
949
949
  DERIVE_EXIT_CODES: () => DERIVE_EXIT_CODES,
950
950
  FileAuditLogger: () => FileAuditLogger,
951
951
  GUARD_EXIT_CODES: () => GUARD_EXIT_CODES,
952
+ GitHubGovernanceBlockedError: () => GitHubGovernanceBlockedError,
953
+ GitHubGovernor: () => GitHubGovernor,
954
+ GitHubWebhookHandler: () => GitHubWebhookHandler,
952
955
  McpGovernanceServer: () => McpGovernanceServer,
953
956
  ModelAdapter: () => ModelAdapter,
954
957
  PLAN_EXIT_CODES: () => PLAN_EXIT_CODES,
@@ -968,6 +971,10 @@ __export(index_exports, {
968
971
  classifyIntent: () => classifyIntent,
969
972
  classifyIntentWithAI: () => classifyIntentWithAI,
970
973
  createAgentState: () => createAgentState,
974
+ createGitHubGovernor: () => createGitHubGovernor,
975
+ createGitHubGovernorFromWorld: () => createGitHubGovernorFromWorld,
976
+ createGitHubWebhookHandler: () => createGitHubWebhookHandler,
977
+ createGitHubWebhookHandlerFromWorld: () => createGitHubWebhookHandlerFromWorld,
971
978
  createGovernanceEngine: () => createGovernanceEngine,
972
979
  createGovernor: () => createGovernor,
973
980
  deriveWorld: () => deriveWorld,
@@ -982,6 +989,8 @@ __export(index_exports, {
982
989
  explainWorld: () => explainWorld,
983
990
  extractContentFields: () => extractContentFields,
984
991
  extractWorldMarkdown: () => extractWorldMarkdown,
992
+ formatForActions: () => formatForActions,
993
+ formatPRComment: () => formatPRComment,
985
994
  formatVerdict: () => formatVerdict,
986
995
  formatVerdictOneLine: () => formatVerdictOneLine,
987
996
  generateAdaptationNarrative: () => generateAdaptationNarrative,
@@ -2824,7 +2833,9 @@ function emptyFlow() {
2824
2833
  async function defaultToolExecutor(name, args) {
2825
2834
  return `Tool "${name}" executed successfully with args: ${JSON.stringify(args)}`;
2826
2835
  }
2827
- var SessionManager = class {
2836
+ var SessionManager = class _SessionManager {
2837
+ /** Maximum unique agent IDs tracked before eviction. Prevents unbounded memory growth. */
2838
+ static MAX_AGENTS = 1e4;
2828
2839
  config;
2829
2840
  state;
2830
2841
  engineOptions;
@@ -2888,6 +2899,16 @@ var SessionManager = class {
2888
2899
  if (verdict.status === "REWARD" && verdict.reward) {
2889
2900
  agentState = applyReward(agentState, verdict.reward, verdict.ruleId ?? "unknown");
2890
2901
  }
2902
+ if (this.state.agentStates.size >= _SessionManager.MAX_AGENTS && !this.state.agentStates.has(event.roleId)) {
2903
+ const oldest = this.state.agentStates.keys().next().value;
2904
+ if (oldest !== void 0) {
2905
+ this.state.agentStates.delete(oldest);
2906
+ }
2907
+ process.stderr.write(
2908
+ `[neuroverse] Warning: agent state map at capacity (${_SessionManager.MAX_AGENTS}), evicted oldest entry
2909
+ `
2910
+ );
2911
+ }
2891
2912
  this.state.agentStates.set(event.roleId, agentState);
2892
2913
  }
2893
2914
  this.config.onVerdict?.(verdict, event);
@@ -2998,11 +3019,17 @@ async function runPipeMode(config) {
2998
3019
  process.stderr.write(`[neuroverse] Plan: ${state.plan.plan_id} (${state.plan.objective})
2999
3020
  `);
3000
3021
  }
3022
+ const MAX_BUFFER_SIZE = 1e6;
3001
3023
  return new Promise((resolve3, reject) => {
3002
3024
  let buffer = "";
3003
3025
  process.stdin.setEncoding("utf-8");
3004
3026
  process.stdin.on("data", (chunk) => {
3005
3027
  buffer += chunk;
3028
+ if (buffer.length > MAX_BUFFER_SIZE) {
3029
+ process.stderr.write("[neuroverse] Warning: pipe buffer exceeded 1MB, resetting\n");
3030
+ buffer = "";
3031
+ return;
3032
+ }
3006
3033
  const lines = buffer.split("\n");
3007
3034
  buffer = lines.pop() ?? "";
3008
3035
  for (const line of lines) {
@@ -7803,6 +7830,440 @@ function round(n, decimals = 3) {
7803
7830
  return Math.round(n * factor) / factor;
7804
7831
  }
7805
7832
 
7833
+ // src/adapters/github.ts
7834
+ init_world_loader();
7835
+
7836
+ // src/adapters/shared.ts
7837
+ var GovernanceBlockedError = class extends Error {
7838
+ verdict;
7839
+ constructor(verdict, message) {
7840
+ super(message ?? `[NeuroVerse] BLOCKED: ${verdict.reason ?? verdict.ruleId ?? "governance rule"}`);
7841
+ this.name = "GovernanceBlockedError";
7842
+ this.verdict = verdict;
7843
+ }
7844
+ };
7845
+ function trackPlanProgress(event, state, callbacks) {
7846
+ if (!state.activePlan) return;
7847
+ const planVerdict = evaluatePlan(event, state.activePlan);
7848
+ if (planVerdict.matchedStep) {
7849
+ const advResult = advancePlan(state.activePlan, planVerdict.matchedStep);
7850
+ if (advResult.success && advResult.plan) {
7851
+ state.activePlan = advResult.plan;
7852
+ state.engineOptions.plan = state.activePlan;
7853
+ }
7854
+ const progress = getPlanProgress(state.activePlan);
7855
+ callbacks.onPlanProgress?.(progress);
7856
+ if (progress.completed === progress.total) {
7857
+ callbacks.onPlanComplete?.();
7858
+ }
7859
+ }
7860
+ }
7861
+ function buildEngineOptions(options, plan) {
7862
+ return {
7863
+ trace: options.trace ?? false,
7864
+ level: options.level,
7865
+ plan: plan ?? options.plan
7866
+ };
7867
+ }
7868
+
7869
+ // src/adapters/github.ts
7870
+ var GitHubGovernanceBlockedError = class extends GovernanceBlockedError {
7871
+ action;
7872
+ constructor(verdict, action) {
7873
+ super(verdict, `[NeuroVerse] GitHub action blocked: ${action.action} on ${action.repository}`);
7874
+ this.name = "GitHubGovernanceBlockedError";
7875
+ this.action = action;
7876
+ }
7877
+ };
7878
+ function extractBranch(ref) {
7879
+ if (!ref) return void 0;
7880
+ if (ref.startsWith("refs/heads/")) return ref.slice("refs/heads/".length);
7881
+ if (ref.startsWith("refs/tags/")) return ref.slice("refs/tags/".length);
7882
+ return ref;
7883
+ }
7884
+ function isProtectedBranch(branch, protectedBranches) {
7885
+ if (!branch) return false;
7886
+ return protectedBranches.some(
7887
+ (pb) => branch === pb || branch.startsWith(`${pb}/`)
7888
+ );
7889
+ }
7890
+ function defaultMapAction(action, protectedBranches, restrictedActors) {
7891
+ const branch = action.branch ?? extractBranch(action.ref);
7892
+ const isProtected = isProtectedBranch(branch, protectedBranches);
7893
+ const isRestricted = action.actor ? restrictedActors.some((ra) => action.actor === ra || action.actor?.endsWith("[bot]")) : false;
7894
+ let actionCategory = "other";
7895
+ const act = action.action.toLowerCase();
7896
+ if (act.includes("read") || act.includes("get") || act.includes("list") || act.includes("view")) {
7897
+ actionCategory = "read";
7898
+ } else if (act.includes("delete") || act.includes("remove") || act.includes("close")) {
7899
+ actionCategory = "delete";
7900
+ } else if (act.includes("deploy") || act.includes("run") || act.includes("execute") || act.includes("merge")) {
7901
+ actionCategory = "network";
7902
+ } else if (act.includes("create") || act.includes("push") || act.includes("write") || act.includes("update") || act.includes("edit")) {
7903
+ actionCategory = "write";
7904
+ } else if (act.includes("comment") || act.includes("review") || act.includes("notify")) {
7905
+ actionCategory = "other";
7906
+ }
7907
+ return {
7908
+ intent: action.action,
7909
+ tool: "github",
7910
+ scope: `${action.repository}${branch ? `@${branch}` : ""}`,
7911
+ actionCategory,
7912
+ direction: "input",
7913
+ args: {
7914
+ repository: action.repository,
7915
+ ref: action.ref,
7916
+ branch,
7917
+ actor: action.actor,
7918
+ protected_branch: isProtected,
7919
+ restricted_actor: isRestricted,
7920
+ ...action.metadata
7921
+ }
7922
+ };
7923
+ }
7924
+ function defaultMapWebhook(eventType, payload) {
7925
+ const repo = payload.repository;
7926
+ const repoFullName = repo?.full_name ?? "unknown/unknown";
7927
+ const sender = payload.sender;
7928
+ const actor = sender?.login ?? void 0;
7929
+ const webhookAction = payload.action;
7930
+ switch (eventType) {
7931
+ case "push": {
7932
+ const ref = payload.ref;
7933
+ const branch = extractBranch(ref);
7934
+ const forced = payload.forced;
7935
+ return {
7936
+ action: forced ? "force_push" : `push_to_${branch ?? "branch"}`,
7937
+ repository: repoFullName,
7938
+ ref,
7939
+ branch,
7940
+ actor,
7941
+ metadata: {
7942
+ forced: forced ?? false,
7943
+ commits_count: payload.commits?.length ?? 0,
7944
+ head_commit: payload.head_commit?.id
7945
+ }
7946
+ };
7947
+ }
7948
+ case "pull_request": {
7949
+ const pr = payload.pull_request;
7950
+ const base = pr?.base;
7951
+ const baseBranch = base?.ref;
7952
+ const prNumber = pr?.number;
7953
+ const merged = pr?.merged;
7954
+ const labels = pr?.labels?.map((l) => l.name) ?? [];
7955
+ let action = `pull_request_${webhookAction ?? "unknown"}`;
7956
+ if (webhookAction === "closed" && merged) {
7957
+ action = "merge_pull_request";
7958
+ }
7959
+ return {
7960
+ action,
7961
+ repository: repoFullName,
7962
+ branch: baseBranch,
7963
+ actor,
7964
+ metadata: {
7965
+ pr_number: prNumber,
7966
+ labels,
7967
+ merged: merged ?? false,
7968
+ draft: pr?.draft ?? false,
7969
+ webhook_action: webhookAction
7970
+ }
7971
+ };
7972
+ }
7973
+ case "release": {
7974
+ const release = payload.release;
7975
+ return {
7976
+ action: `release_${webhookAction ?? "published"}`,
7977
+ repository: repoFullName,
7978
+ ref: release?.tag_name ? `refs/tags/${release.tag_name}` : void 0,
7979
+ actor,
7980
+ metadata: {
7981
+ tag: release?.tag_name,
7982
+ prerelease: release?.prerelease ?? false,
7983
+ draft: release?.draft ?? false,
7984
+ webhook_action: webhookAction
7985
+ }
7986
+ };
7987
+ }
7988
+ case "deployment":
7989
+ case "deployment_status": {
7990
+ const deployment = payload.deployment ?? payload;
7991
+ return {
7992
+ action: eventType === "deployment" ? "create_deployment" : "deployment_status_update",
7993
+ repository: repoFullName,
7994
+ ref: deployment.ref,
7995
+ actor,
7996
+ metadata: {
7997
+ environment: deployment.environment,
7998
+ status: payload.deployment_status?.state,
7999
+ webhook_action: webhookAction
8000
+ }
8001
+ };
8002
+ }
8003
+ case "workflow_run": {
8004
+ const run = payload.workflow_run;
8005
+ return {
8006
+ action: `workflow_${webhookAction ?? "completed"}`,
8007
+ repository: repoFullName,
8008
+ branch: run?.head_branch,
8009
+ actor,
8010
+ metadata: {
8011
+ workflow_name: run?.name,
8012
+ conclusion: run?.conclusion,
8013
+ status: run?.status,
8014
+ webhook_action: webhookAction
8015
+ }
8016
+ };
8017
+ }
8018
+ case "issues": {
8019
+ const issue = payload.issue;
8020
+ return {
8021
+ action: `issue_${webhookAction ?? "opened"}`,
8022
+ repository: repoFullName,
8023
+ actor,
8024
+ metadata: {
8025
+ issue_number: issue?.number,
8026
+ labels: issue?.labels?.map((l) => l.name) ?? [],
8027
+ webhook_action: webhookAction
8028
+ }
8029
+ };
8030
+ }
8031
+ case "issue_comment": {
8032
+ return {
8033
+ action: `issue_comment_${webhookAction ?? "created"}`,
8034
+ repository: repoFullName,
8035
+ actor,
8036
+ metadata: {
8037
+ issue_number: payload.issue?.number,
8038
+ webhook_action: webhookAction
8039
+ }
8040
+ };
8041
+ }
8042
+ case "delete": {
8043
+ return {
8044
+ action: `delete_${payload.ref_type ?? "ref"}`,
8045
+ repository: repoFullName,
8046
+ ref: payload.ref,
8047
+ actor,
8048
+ metadata: {
8049
+ ref_type: payload.ref_type
8050
+ }
8051
+ };
8052
+ }
8053
+ default: {
8054
+ return {
8055
+ action: webhookAction ? `${eventType}_${webhookAction}` : eventType,
8056
+ repository: repoFullName,
8057
+ actor,
8058
+ metadata: { webhook_action: webhookAction }
8059
+ };
8060
+ }
8061
+ }
8062
+ }
8063
+ var GitHubGovernor = class {
8064
+ world;
8065
+ options;
8066
+ engineOptions;
8067
+ activePlan;
8068
+ protectedBranches;
8069
+ restrictedActors;
8070
+ mapFn;
8071
+ constructor(world, options = {}) {
8072
+ this.world = world;
8073
+ this.options = options;
8074
+ this.activePlan = options.plan;
8075
+ this.engineOptions = buildEngineOptions(options, this.activePlan);
8076
+ this.protectedBranches = options.protectedBranches ?? ["main", "master", "production"];
8077
+ this.restrictedActors = options.restrictedActors ?? [];
8078
+ this.mapFn = options.mapAction ?? ((action) => defaultMapAction(action, this.protectedBranches, this.restrictedActors));
8079
+ }
8080
+ /**
8081
+ * Evaluate a GitHub action against governance rules.
8082
+ * Returns a full result with verdict, event, and the original action.
8083
+ */
8084
+ evaluate(action) {
8085
+ const event = this.mapFn(action);
8086
+ this.engineOptions.plan = this.activePlan;
8087
+ const verdict = evaluateGuard(event, this.world, this.engineOptions);
8088
+ this.options.onEvaluate?.(verdict, event, action);
8089
+ if (verdict.status === "ALLOW") {
8090
+ trackPlanProgress(event, this, this.options);
8091
+ }
8092
+ return { verdict, event, action };
8093
+ }
8094
+ /**
8095
+ * Evaluate and enforce — throws GitHubGovernanceBlockedError on BLOCK/PAUSE.
8096
+ * Use this as a gate before executing GitHub API calls.
8097
+ */
8098
+ enforce(action) {
8099
+ const result = this.evaluate(action);
8100
+ if (result.verdict.status === "BLOCK" || result.verdict.status === "PAUSE") {
8101
+ throw new GitHubGovernanceBlockedError(result.verdict, action);
8102
+ }
8103
+ return result;
8104
+ }
8105
+ /**
8106
+ * Check if pushing to a branch is allowed.
8107
+ * Convenience method for the most common governance check.
8108
+ */
8109
+ canPush(repository, branch, actor) {
8110
+ return this.evaluate({
8111
+ action: `push_to_${branch}`,
8112
+ repository,
8113
+ ref: `refs/heads/${branch}`,
8114
+ branch,
8115
+ actor
8116
+ }).verdict;
8117
+ }
8118
+ /**
8119
+ * Check if merging a PR is allowed.
8120
+ */
8121
+ canMerge(repository, targetBranch, prNumber, actor, labels) {
8122
+ return this.evaluate({
8123
+ action: "merge_pull_request",
8124
+ repository,
8125
+ branch: targetBranch,
8126
+ actor,
8127
+ metadata: { pr_number: prNumber, labels: labels ?? [] }
8128
+ }).verdict;
8129
+ }
8130
+ /**
8131
+ * Check if creating a release is allowed.
8132
+ */
8133
+ canRelease(repository, tag, actor, prerelease) {
8134
+ return this.evaluate({
8135
+ action: "release_published",
8136
+ repository,
8137
+ ref: `refs/tags/${tag}`,
8138
+ actor,
8139
+ metadata: { tag, prerelease: prerelease ?? false }
8140
+ }).verdict;
8141
+ }
8142
+ /**
8143
+ * Check if deploying to an environment is allowed.
8144
+ */
8145
+ canDeploy(repository, environment, ref, actor) {
8146
+ return this.evaluate({
8147
+ action: "create_deployment",
8148
+ repository,
8149
+ ref,
8150
+ actor,
8151
+ metadata: { environment }
8152
+ }).verdict;
8153
+ }
8154
+ };
8155
+ var GitHubWebhookHandler = class {
8156
+ governor;
8157
+ mapWebhookFn;
8158
+ webhookSecret;
8159
+ constructor(world, options = {}) {
8160
+ this.governor = new GitHubGovernor(world, options);
8161
+ this.mapWebhookFn = options.mapWebhook ?? defaultMapWebhook;
8162
+ this.webhookSecret = options.webhookSecret;
8163
+ }
8164
+ /**
8165
+ * Evaluate a webhook payload.
8166
+ *
8167
+ * @param eventType - The X-GitHub-Event header value
8168
+ * @param payload - The parsed webhook body
8169
+ */
8170
+ evaluate(eventType, payload) {
8171
+ const action = this.mapWebhookFn(eventType, payload);
8172
+ const result = this.governor.evaluate(action);
8173
+ return {
8174
+ verdict: result.verdict,
8175
+ event: result.event,
8176
+ webhookEvent: eventType,
8177
+ webhookAction: payload.action
8178
+ };
8179
+ }
8180
+ /**
8181
+ * Evaluate and enforce — throws on BLOCK/PAUSE.
8182
+ */
8183
+ enforce(eventType, payload) {
8184
+ const result = this.evaluate(eventType, payload);
8185
+ if (result.verdict.status === "BLOCK" || result.verdict.status === "PAUSE") {
8186
+ const action = this.mapWebhookFn(eventType, payload);
8187
+ throw new GitHubGovernanceBlockedError(result.verdict, action);
8188
+ }
8189
+ return result;
8190
+ }
8191
+ /** Access the underlying governor for direct action evaluation. */
8192
+ getGovernor() {
8193
+ return this.governor;
8194
+ }
8195
+ /** Get the configured webhook secret (for signature verification in your server). */
8196
+ getWebhookSecret() {
8197
+ return this.webhookSecret;
8198
+ }
8199
+ };
8200
+ function formatForActions(verdict) {
8201
+ const status = verdict.status === "ALLOW" ? "allowed" : verdict.status === "BLOCK" ? "blocked" : "paused";
8202
+ const reason = verdict.reason ?? "";
8203
+ const ruleId = verdict.ruleId ?? "";
8204
+ const lines = [
8205
+ `governance_status=${status}`,
8206
+ `verdict_status=${verdict.status}`,
8207
+ `reason=${reason}`,
8208
+ `rule_id=${ruleId}`
8209
+ ].join("\n");
8210
+ return {
8211
+ governance_status: status,
8212
+ verdict_status: verdict.status,
8213
+ reason,
8214
+ rule_id: ruleId,
8215
+ outputLines: lines
8216
+ };
8217
+ }
8218
+ function formatPRComment(verdict, action) {
8219
+ const icon = verdict.status === "ALLOW" ? "\u2705" : verdict.status === "BLOCK" ? "\u{1F6AB}" : "\u23F8\uFE0F";
8220
+ const status = verdict.status;
8221
+ let body = `## ${icon} Governance: ${status}
8222
+
8223
+ `;
8224
+ body += `**Action:** \`${action.action}\`
8225
+ `;
8226
+ body += `**Repository:** \`${action.repository}\`
8227
+ `;
8228
+ if (action.branch) {
8229
+ body += `**Branch:** \`${action.branch}\`
8230
+ `;
8231
+ }
8232
+ if (action.actor) {
8233
+ body += `**Actor:** \`${action.actor}\`
8234
+ `;
8235
+ }
8236
+ body += "\n";
8237
+ if (verdict.reason) {
8238
+ body += `**Reason:** ${verdict.reason}
8239
+ `;
8240
+ }
8241
+ if (verdict.ruleId) {
8242
+ body += `**Rule:** \`${verdict.ruleId}\`
8243
+ `;
8244
+ }
8245
+ if (verdict.evidence?.invariantsSatisfied < verdict.evidence?.invariantsTotal) {
8246
+ body += `**Invariants:** ${verdict.evidence.invariantsSatisfied}/${verdict.evidence.invariantsTotal} satisfied
8247
+ `;
8248
+ }
8249
+ body += "\n---\n*Evaluated by [NeuroVerse Governance](https://github.com/NeuroverseOS/neuroverseos-governance)*";
8250
+ return body;
8251
+ }
8252
+ async function createGitHubGovernor(worldPath, options) {
8253
+ const world = await loadWorld(worldPath);
8254
+ return new GitHubGovernor(world, options);
8255
+ }
8256
+ function createGitHubGovernorFromWorld(world, options) {
8257
+ return new GitHubGovernor(world, options);
8258
+ }
8259
+ async function createGitHubWebhookHandler(worldPath, options) {
8260
+ const world = await loadWorld(worldPath);
8261
+ return new GitHubWebhookHandler(world, options);
8262
+ }
8263
+ function createGitHubWebhookHandlerFromWorld(world, options) {
8264
+ return new GitHubWebhookHandler(world, options);
8265
+ }
8266
+
7806
8267
  // src/engine/api.ts
7807
8268
  init_world_loader();
7808
8269
  function handleHealthCheck() {
@@ -7879,6 +8340,9 @@ function handleCreateCapsule(body) {
7879
8340
  DERIVE_EXIT_CODES,
7880
8341
  FileAuditLogger,
7881
8342
  GUARD_EXIT_CODES,
8343
+ GitHubGovernanceBlockedError,
8344
+ GitHubGovernor,
8345
+ GitHubWebhookHandler,
7882
8346
  McpGovernanceServer,
7883
8347
  ModelAdapter,
7884
8348
  PLAN_EXIT_CODES,
@@ -7898,6 +8362,10 @@ function handleCreateCapsule(body) {
7898
8362
  classifyIntent,
7899
8363
  classifyIntentWithAI,
7900
8364
  createAgentState,
8365
+ createGitHubGovernor,
8366
+ createGitHubGovernorFromWorld,
8367
+ createGitHubWebhookHandler,
8368
+ createGitHubWebhookHandlerFromWorld,
7901
8369
  createGovernanceEngine,
7902
8370
  createGovernor,
7903
8371
  deriveWorld,
@@ -7912,6 +8380,8 @@ function handleCreateCapsule(body) {
7912
8380
  explainWorld,
7913
8381
  extractContentFields,
7914
8382
  extractWorldMarkdown,
8383
+ formatForActions,
8384
+ formatPRComment,
7915
8385
  formatVerdict,
7916
8386
  formatVerdictOneLine,
7917
8387
  generateAdaptationNarrative,