@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.
- package/README.md +244 -0
- package/dist/adapters/autoresearch.d.cts +2 -1
- package/dist/adapters/autoresearch.d.ts +2 -1
- package/dist/adapters/autoresearch.js +2 -2
- package/dist/adapters/deep-agents.d.cts +3 -2
- package/dist/adapters/deep-agents.d.ts +3 -2
- package/dist/adapters/deep-agents.js +2 -2
- package/dist/adapters/express.d.cts +2 -1
- package/dist/adapters/express.d.ts +2 -1
- package/dist/adapters/express.js +2 -2
- package/dist/adapters/github.cjs +1697 -0
- package/dist/adapters/github.d.cts +225 -0
- package/dist/adapters/github.d.ts +225 -0
- package/dist/adapters/github.js +27 -0
- package/dist/adapters/index.d.cts +4 -316
- package/dist/adapters/index.d.ts +4 -316
- package/dist/adapters/index.js +23 -21
- package/dist/adapters/langchain.d.cts +3 -2
- package/dist/adapters/langchain.d.ts +3 -2
- package/dist/adapters/langchain.js +2 -2
- package/dist/adapters/mentraos.cjs +2181 -0
- package/dist/adapters/mentraos.d.cts +319 -0
- package/dist/adapters/mentraos.d.ts +319 -0
- package/dist/{mentraos-LLH7KEV4.js → adapters/mentraos.js} +12 -10
- package/dist/adapters/openai.d.cts +3 -2
- package/dist/adapters/openai.d.ts +3 -2
- package/dist/adapters/openai.js +2 -2
- package/dist/adapters/openclaw.d.cts +3 -2
- package/dist/adapters/openclaw.d.ts +3 -2
- package/dist/adapters/openclaw.js +2 -2
- package/dist/{add-LYHDZ5RL.js → add-XSANI3FK.js} +1 -1
- package/dist/admin/index.cjs +2214 -0
- package/dist/admin/index.d.cts +362 -0
- package/dist/admin/index.d.ts +362 -0
- package/dist/admin/index.js +703 -0
- package/dist/bootstrap-contract-DcV6t-8M.d.cts +216 -0
- package/dist/bootstrap-contract-DcV6t-8M.d.ts +216 -0
- package/dist/{build-SCAWPA7E.js → build-UTVDGHB3.js} +5 -5
- package/dist/{chunk-JKGPSFGH.js → chunk-7FL3U7Z5.js} +3 -3
- package/dist/chunk-A2UZTLRV.js +421 -0
- package/dist/{chunk-TD5GKIHP.js → chunk-B3IIPTY3.js} +3 -3
- package/dist/chunk-EQR7BGFN.js +337 -0
- package/dist/{chunk-5JUZ4HL7.js → chunk-FDPPZLSQ.js} +3 -3
- package/dist/{chunk-MFKHTE5R.js → chunk-FKQCPRKI.js} +3 -3
- package/dist/{chunk-7D7PZLB7.js → chunk-FS2UUJJO.js} +3 -3
- package/dist/{chunk-U6FRAEQJ.js → chunk-GJ6LM4JZ.js} +1 -441
- package/dist/chunk-H3REGQRI.js +107 -0
- package/dist/{chunk-25XHSTPT.js → chunk-HDNDL6D5.js} +3 -3
- package/dist/{chunk-BXLTEUS4.js → chunk-I4RTIMLX.js} +2 -2
- package/dist/chunk-IOVXB6QN.js +447 -0
- package/dist/{chunk-Y6WXAPKY.js → chunk-NTHXZAW4.js} +3 -3
- package/dist/{chunk-UTH7OXTM.js → chunk-OTZU76DH.js} +22 -4
- package/dist/{chunk-DWHUZUEY.js → chunk-T6GMRZWC.js} +3 -3
- package/dist/{chunk-V4FZHJQX.js → chunk-TIXVEPS2.js} +3 -3
- package/dist/{chunk-YNYCQECH.js → chunk-TJ5L2UTE.js} +3 -3
- package/dist/chunk-UGTNKTHS.js +542 -0
- package/dist/cli/neuroverse.cjs +3372 -523
- package/dist/cli/neuroverse.js +53 -21
- package/dist/cli/plan.js +2 -2
- package/dist/cli/run.cjs +242 -139
- package/dist/cli/run.js +23 -3
- package/dist/cli/worldmodel.cjs +1624 -0
- package/dist/cli/worldmodel.d.cts +24 -0
- package/dist/cli/worldmodel.d.ts +24 -0
- package/dist/cli/worldmodel.js +742 -0
- package/dist/{demo-66MMJTEH.js → demo-6W3YXLAX.js} +4 -4
- package/dist/{derive-AUQE3L3P.js → derive-42IJW7JI.js} +4 -4
- package/dist/{doctor-EY7LKSYY.js → doctor-XEMLO6UA.js} +3 -2
- package/dist/engine/bootstrap-emitter.cjs +241 -0
- package/dist/engine/bootstrap-emitter.d.cts +27 -0
- package/dist/engine/bootstrap-emitter.d.ts +27 -0
- package/dist/{bootstrap-emitter-GIMOJFOC.js → engine/bootstrap-emitter.js} +2 -2
- package/dist/engine/bootstrap-parser.cjs +560 -0
- package/dist/engine/bootstrap-parser.d.cts +96 -0
- package/dist/engine/bootstrap-parser.d.ts +96 -0
- package/dist/{bootstrap-parser-LBLGVEMU.js → engine/bootstrap-parser.js} +2 -2
- package/dist/engine/guard-engine.cjs +1116 -0
- package/dist/engine/guard-engine.d.cts +60 -0
- package/dist/engine/guard-engine.d.ts +60 -0
- package/dist/{guard-engine-N7TUIUU7.js → engine/guard-engine.js} +3 -3
- package/dist/engine/simulate-engine.cjs +390 -0
- package/dist/engine/simulate-engine.d.cts +105 -0
- package/dist/engine/simulate-engine.d.ts +105 -0
- package/dist/engine/simulate-engine.js +9 -0
- package/dist/engine/worldmodel-compiler.cjs +366 -0
- package/dist/engine/worldmodel-compiler.d.cts +46 -0
- package/dist/engine/worldmodel-compiler.d.ts +46 -0
- package/dist/engine/worldmodel-compiler.js +17 -0
- package/dist/engine/worldmodel-parser.cjs +566 -0
- package/dist/engine/worldmodel-parser.d.cts +22 -0
- package/dist/engine/worldmodel-parser.d.ts +22 -0
- package/dist/engine/worldmodel-parser.js +7 -0
- package/dist/{equity-penalties-WWC7UDQD.js → equity-penalties-CCO3GVHS.js} +6 -6
- package/dist/{explain-MUSGDT67.js → explain-HDFN4ION.js} +1 -1
- package/dist/{guard-W3BMQPBJ.js → guard-IHJEKHL2.js} +16 -4
- package/dist/{guard-contract-CLBbTGK_.d.ts → guard-contract-ddiIPlOg.d.cts} +2 -369
- package/dist/{guard-contract-CLBbTGK_.d.cts → guard-contract-q6HJAq3Q.d.ts} +2 -369
- package/dist/{improve-PJDAWW4Q.js → improve-LRORRYEX.js} +3 -3
- package/dist/index.cjs +471 -1
- package/dist/index.d.cts +14 -492
- package/dist/index.d.ts +14 -492
- package/dist/index.js +63 -42
- package/dist/keygen-BSZH3NM2.js +77 -0
- package/dist/{lens-IP6GIZ2Q.js → lens-TLDZQXBI.js} +152 -26
- package/dist/{mcp-server-OG3PPVD2.js → mcp-server-CKYBHXWK.js} +2 -2
- package/dist/migrate-NH5PVMX4.js +221 -0
- package/dist/{playground-4BK2XQ47.js → playground-3TTBN7XD.js} +5 -5
- package/dist/{redteam-BRZALBPP.js → redteam-W644UMWN.js} +3 -3
- package/dist/{session-SGRUT2UH.js → session-FMAROEIE.js} +2 -2
- package/dist/{shared-CwGpPheR.d.ts → shared-DAzdfWtU.d.ts} +1 -1
- package/dist/{shared-BGzmYP5g.d.cts → shared-PpalGKxc.d.cts} +1 -1
- package/dist/sign-RRELHKWM.js +11 -0
- package/dist/{simulate-FGXKIH7V.js → simulate-VT437EEL.js} +2 -2
- package/dist/{test-PT44BSYG.js → test-XDB2DH3L.js} +3 -3
- package/dist/types.cjs +18 -0
- package/dist/types.d.cts +370 -0
- package/dist/types.d.ts +370 -0
- package/dist/types.js +0 -0
- package/dist/{validate-Q5O5TGLT.js → validate-M52DX22Y.js} +1 -1
- package/dist/verify-6AVTWX75.js +151 -0
- package/dist/{world-V52ZMH26.js → world-O4HTQPDP.js} +1 -1
- package/dist/{world-loader-C4D3VPP3.js → world-loader-YTYFOP7D.js} +1 -1
- package/dist/worldmodel-contract-BPGhiuW5.d.cts +221 -0
- package/dist/worldmodel-contract-BPGhiuW5.d.ts +221 -0
- package/dist/worlds/auki-vanguard.worldmodel.md +116 -0
- package/dist/worlds/behavioral-demo.nv-world.md +130 -0
- package/dist/worlds/neuroverse-governance.worldmodel.md +115 -0
- package/package.json +44 -3
- package/dist/{bootstrap-IP5QMC3Q.js → bootstrap-2OW5ZLBL.js} +3 -3
- package/dist/{chunk-4G6WHPLI.js → chunk-735Z3HA4.js} +6 -6
- package/dist/{chunk-7QIAF377.js → chunk-CYDMUJVZ.js} +0 -0
- package/dist/{configure-ai-LL3VAPQW.js → configure-ai-5MP5DWTT.js} +3 -3
- 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,
|