@connexum/ai-governance 1.0.0-beta.21 → 1.0.0-beta.23

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 (51) hide show
  1. package/dist/cli/agent-dir-scanner.d.ts +32 -0
  2. package/dist/cli/agent-dir-scanner.d.ts.map +1 -1
  3. package/dist/cli/agent-dir-scanner.js +52 -0
  4. package/dist/cli/agent-dir-scanner.js.map +1 -1
  5. package/dist/cli/governance-md-renderer.d.ts +50 -0
  6. package/dist/cli/governance-md-renderer.d.ts.map +1 -0
  7. package/dist/cli/governance-md-renderer.js +185 -0
  8. package/dist/cli/governance-md-renderer.js.map +1 -0
  9. package/dist/cli/governance-projection-writer.d.ts +88 -0
  10. package/dist/cli/governance-projection-writer.d.ts.map +1 -0
  11. package/dist/cli/governance-projection-writer.js +291 -0
  12. package/dist/cli/governance-projection-writer.js.map +1 -0
  13. package/dist/cli/index.d.ts +85 -0
  14. package/dist/cli/index.d.ts.map +1 -1
  15. package/dist/cli/index.js +343 -2
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cli/per-folder-identity.d.ts +79 -0
  18. package/dist/cli/per-folder-identity.d.ts.map +1 -0
  19. package/dist/cli/per-folder-identity.js +321 -0
  20. package/dist/cli/per-folder-identity.js.map +1 -0
  21. package/dist/cli/sync.d.ts +193 -0
  22. package/dist/cli/sync.d.ts.map +1 -0
  23. package/dist/cli/sync.js +1094 -0
  24. package/dist/cli/sync.js.map +1 -0
  25. package/dist/cli/wrap-shim-generator.d.ts +33 -0
  26. package/dist/cli/wrap-shim-generator.d.ts.map +1 -1
  27. package/dist/cli/wrap-shim-generator.js +93 -8
  28. package/dist/cli/wrap-shim-generator.js.map +1 -1
  29. package/dist/esm/cli/agent-dir-scanner.js +52 -0
  30. package/dist/esm/cli/agent-dir-scanner.js.map +1 -1
  31. package/dist/esm/cli/governance-md-renderer.js +182 -0
  32. package/dist/esm/cli/governance-md-renderer.js.map +1 -0
  33. package/dist/esm/cli/governance-projection-writer.js +253 -0
  34. package/dist/esm/cli/governance-projection-writer.js.map +1 -0
  35. package/dist/esm/cli/index.js +343 -3
  36. package/dist/esm/cli/index.js.map +1 -1
  37. package/dist/esm/cli/per-folder-identity.js +283 -0
  38. package/dist/esm/cli/per-folder-identity.js.map +1 -0
  39. package/dist/esm/cli/sync.js +1054 -0
  40. package/dist/esm/cli/sync.js.map +1 -0
  41. package/dist/esm/cli/wrap-shim-generator.js +92 -8
  42. package/dist/esm/cli/wrap-shim-generator.js.map +1 -1
  43. package/dist/esm/governance/governance-projection-canonical.js +101 -0
  44. package/dist/esm/governance/governance-projection-canonical.js.map +1 -0
  45. package/dist/governance/governance-projection-canonical.d.ts +104 -0
  46. package/dist/governance/governance-projection-canonical.d.ts.map +1 -0
  47. package/dist/governance/governance-projection-canonical.js +141 -0
  48. package/dist/governance/governance-projection-canonical.js.map +1 -0
  49. package/dist/hooks/audit-logger.sh +108 -10
  50. package/package.json +1 -1
  51. package/src/hooks/audit-logger.sh +108 -10
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Governance-projection writer — write-back RFC F2 (§3.1, §4, §10.C).
3
+ *
4
+ * The downward half of the loop: after the identity/token passes, `sync`
5
+ * fetches each agent's effective-governance projection from
6
+ * GET /api/v1/cli/agent-governance and writes
7
+ *
8
+ * <agent>/.connexum/governance.json machine-readable projection (3.1)
9
+ * <agent>/.connexum/GOVERNANCE.md human/LLM-readable rendering (3.2)
10
+ *
11
+ * Both files are DERIVED, REGENERABLE, SECRET-FREE — safe to commit, never
12
+ * hand-edited.
13
+ *
14
+ * File semantics (normative, §10.C):
15
+ * - All writes are atomic (temp → renameSync). No chmod — non-secret.
16
+ * - checksum covers the canonical POLICY body only (shared module —
17
+ * generatedAt/score/version/staleAfter excluded), so a score refresh or
18
+ * re-sync of unchanged policy never perturbs hand-edit detection.
19
+ * - Existing file whose stored checksum mismatches its own body ⇒ HAND-EDITED
20
+ * ⇒ WARN + skip, never clobber (W4). An ABSENT file (user deleted) is
21
+ * written fresh without WARN — absent ≠ hand-edited.
22
+ * - Unchanged policy (new checksum === pristine existing checksum) ⇒ skip the
23
+ * rewrite entirely: byte-identical files (W6) and generatedAt keeps meaning
24
+ * "when the policy last changed".
25
+ * - Fetch failure ⇒ caller never reaches the writer ⇒ prior files retained
26
+ * (Invariant 2 — never delete on failure).
27
+ *
28
+ * Traversal guard is REUSED from per-folder-identity.ts (Shield S-W2) — the
29
+ * same realpath-compared guard B1 writes identities through.
30
+ *
31
+ * @connexum/ai-governance governance-writeback-f2
32
+ */
33
+ import * as fs from 'fs';
34
+ import * as path from 'path';
35
+ import * as crypto from 'crypto';
36
+ import { spawnSync } from 'child_process';
37
+ import { resolveGuardedAgentFolder } from './per-folder-identity.js';
38
+ import { pickCanonicalPolicyBody, computeProjectionChecksum, computeProjectionVersion, } from '../governance/governance-projection-canonical.js';
39
+ import { renderGovernanceMd } from './governance-md-renderer.js';
40
+ /**
41
+ * Fetch the batch governance projection. Same transport posture as the token
42
+ * fetch in sync.ts: HTTPS via curl, Authorization in a 0600 tmpfile (never on
43
+ * argv), NEVER throws — server unreachable returns {agents:null} and the
44
+ * caller leaves prior files intact (Invariant 2/3).
45
+ */
46
+ export function fetchAgentGovernance(govServerUrl, installToken, timeoutSec = 15) {
47
+ const url = `${govServerUrl.replace(/\/$/, '')}/api/v1/cli/agent-governance`;
48
+ let authTmpFile = null;
49
+ try {
50
+ const tmpDir = process.env['TMPDIR'] || process.env['TMP'] || process.env['TEMP'] || '/tmp';
51
+ const tmpPath = path.join(tmpDir, `gov-proj-auth-${crypto.randomBytes(8).toString('hex')}.hdr`);
52
+ fs.writeFileSync(tmpPath, `Authorization: Bearer ${installToken}\n`, { mode: 0o600 });
53
+ try {
54
+ fs.chmodSync(tmpPath, 0o600);
55
+ }
56
+ catch { /* best-effort on Windows */ }
57
+ authTmpFile = tmpPath;
58
+ }
59
+ catch {
60
+ console.warn('[gov-sync] WARNING: auth tmpfile write failed; falling back to token-on-argv (less secure). Check TMPDIR permissions.');
61
+ authTmpFile = null;
62
+ }
63
+ const authArgs = authTmpFile
64
+ ? ['-H', `@${authTmpFile}`]
65
+ : ['-H', `Authorization: Bearer ${installToken}`];
66
+ try {
67
+ const result = spawnSync('curl', [
68
+ '--silent', '--show-error',
69
+ '--max-time', String(timeoutSec),
70
+ '--connect-timeout', '5',
71
+ '--fail-with-body',
72
+ ...authArgs,
73
+ '-H', 'Accept: application/json',
74
+ url,
75
+ ], { encoding: 'utf8', timeout: (timeoutSec + 5) * 1000 });
76
+ if (result.status !== 0) {
77
+ const detail = result.stderr?.trim() || `curl exit ${result.status}`;
78
+ return { agents: null, error: `Governance projection fetch failed: ${detail}` };
79
+ }
80
+ if (!result.stdout)
81
+ return { agents: null, error: 'Empty response from server.' };
82
+ let parsed;
83
+ try {
84
+ parsed = JSON.parse(result.stdout);
85
+ }
86
+ catch {
87
+ return { agents: null, error: 'Could not parse governance response as JSON.' };
88
+ }
89
+ const obj = parsed;
90
+ if (typeof obj?.['error'] === 'string')
91
+ return { agents: null, error: `Server error: ${obj['error']}` };
92
+ if (!Array.isArray(obj?.['agents']))
93
+ return { agents: null, error: 'Server response missing agents[].' };
94
+ const agents = [];
95
+ for (const a of obj['agents']) {
96
+ const e = a;
97
+ if (typeof e?.['agentId'] === 'string' &&
98
+ e?.['effectiveGovernance'] && typeof e['effectiveGovernance'] === 'object' &&
99
+ e?.['scoreSummary'] && typeof e['scoreSummary'] === 'object' &&
100
+ typeof e?.['projectionVersion'] === 'string') {
101
+ agents.push({
102
+ agentId: e['agentId'],
103
+ effectiveGovernance: e['effectiveGovernance'],
104
+ scoreSummary: e['scoreSummary'],
105
+ projectionVersion: e['projectionVersion'],
106
+ });
107
+ }
108
+ }
109
+ const staleRaw = obj['staleAfterDays'];
110
+ return {
111
+ agents,
112
+ staleAfterDays: typeof staleRaw === 'number' && Number.isFinite(staleRaw) ? staleRaw : 7,
113
+ };
114
+ }
115
+ catch (err) {
116
+ return { agents: null, error: `Request failed: ${err.message}` };
117
+ }
118
+ finally {
119
+ if (authTmpFile) {
120
+ try {
121
+ fs.unlinkSync(authTmpFile);
122
+ }
123
+ catch { /* best-effort */ }
124
+ }
125
+ }
126
+ }
127
+ const SCHEMA_VERSION = '1.0';
128
+ /** Compose the full governance.json file object for one agent (RFC §3.1). */
129
+ function buildFileObject(input, generatedAt, staleAfter) {
130
+ const policy = pickCanonicalPolicyBody({
131
+ ...input.effectiveGovernance,
132
+ agentId: input.agentId,
133
+ });
134
+ const checksum = computeProjectionChecksum(policy);
135
+ return {
136
+ schemaVersion: SCHEMA_VERSION,
137
+ generated: true,
138
+ generatedAt,
139
+ staleAfter,
140
+ effectiveGovernanceVersion: input.projectionVersion,
141
+ ...policy,
142
+ score: { ...input.scoreSummary },
143
+ checksum,
144
+ };
145
+ }
146
+ /**
147
+ * Write governance.json + GOVERNANCE.md into each agent's .connexum/ folder.
148
+ * Never throws (Invariant 2): every failure is a per-agent skip + advisory.
149
+ */
150
+ export function writeGovernanceProjections(projectDir, inputs, opts = {}) {
151
+ const warn = opts.warn ?? ((m) => console.warn(m));
152
+ const result = { written: [], unchanged: [], skipped: [] };
153
+ if (inputs.length === 0)
154
+ return result;
155
+ const generatedAt = opts.generatedAt ?? new Date().toISOString();
156
+ const staleDays = Math.min(Math.max(1, Math.floor(opts.staleAfterDays ?? 7)), 30);
157
+ const staleAfter = new Date(Date.parse(generatedAt) + staleDays * 24 * 3600 * 1000).toISOString();
158
+ for (const input of inputs) {
159
+ // Same realpath traversal guard as B1 (Shield S-W2 reuse requirement).
160
+ const guarded = resolveGuardedAgentFolder(projectDir, input.filePath);
161
+ if (!guarded.folder) {
162
+ result.skipped.push({ agentId: input.agentId, reason: guarded.error ?? 'path-traversal: folder outside project root' });
163
+ warn(`[connexum] governance projection skipped for ${input.agentId}: resolved folder escapes project root (${input.filePath})`);
164
+ continue;
165
+ }
166
+ try {
167
+ const dir = path.join(guarded.folder, '.connexum');
168
+ const jsonFile = path.join(dir, 'governance.json');
169
+ const mdFile = path.join(dir, 'GOVERNANCE.md');
170
+ const fileObj = buildFileObject(input, generatedAt, staleAfter);
171
+ const newChecksum = fileObj['checksum'];
172
+ // Hand-edit / unchanged detection against the existing file (W4/W6).
173
+ let existingPristineChecksum = null;
174
+ if (fs.existsSync(jsonFile)) {
175
+ let handEdited = true;
176
+ try {
177
+ const existing = JSON.parse(fs.readFileSync(jsonFile, 'utf-8'));
178
+ const recomputed = computeProjectionChecksum(pickCanonicalPolicyBody(existing));
179
+ if (typeof existing['checksum'] === 'string' && existing['checksum'] === recomputed) {
180
+ handEdited = false;
181
+ existingPristineChecksum = recomputed;
182
+ }
183
+ }
184
+ catch {
185
+ // unparseable ⇒ treat as hand-edited: clobbering an operator's file
186
+ // is the harm the guard exists to prevent.
187
+ }
188
+ if (handEdited) {
189
+ result.skipped.push({ agentId: input.agentId, reason: 'hand-edited: checksum mismatch on existing governance.json' });
190
+ warn(`[connexum] governance.json for ${input.agentId} differs from its recorded checksum — it was edited by hand. Leaving it (and GOVERNANCE.md) untouched. Delete the file and re-run sync to regenerate.`);
191
+ continue;
192
+ }
193
+ }
194
+ // Pristine + same policy ⇒ nothing to do (byte-identical idempotency).
195
+ if (existingPristineChecksum === newChecksum && fs.existsSync(mdFile)) {
196
+ result.unchanged.push(input.agentId);
197
+ continue;
198
+ }
199
+ fs.mkdirSync(dir, { recursive: true });
200
+ // When policy is unchanged but GOVERNANCE.md is missing, re-render from
201
+ // the EXISTING file's timestamps so governance.json stays byte-identical.
202
+ // Stern C-1 (PR #1716 review): the stored score block is OUR write, but
203
+ // guard its shape anyway — a malformed score falls back to the freshly
204
+ // fetched fileObj (json then gets rewritten, which is the safe direction).
205
+ let effective = fileObj;
206
+ if (existingPristineChecksum === newChecksum) {
207
+ const stored = JSON.parse(fs.readFileSync(jsonFile, 'utf-8'));
208
+ const storedScore = stored['score'];
209
+ if (storedScore && typeof storedScore['band'] === 'string' && Array.isArray(storedScore['openFindings'])) {
210
+ effective = stored;
211
+ }
212
+ }
213
+ if (existingPristineChecksum !== newChecksum) {
214
+ atomicWrite(jsonFile, `${JSON.stringify(fileObj, null, 2)}\n`);
215
+ }
216
+ const md = renderGovernanceMd({
217
+ policy: pickCanonicalPolicyBody(effective),
218
+ score: effective['score'],
219
+ generatedAt: String(effective['generatedAt']),
220
+ staleAfter: String(effective['staleAfter']),
221
+ effectiveGovernanceVersion: String(effective['effectiveGovernanceVersion']),
222
+ });
223
+ atomicWrite(mdFile, md.endsWith('\n') ? md : `${md}\n`);
224
+ result.written.push(input.agentId);
225
+ }
226
+ catch (err) {
227
+ result.skipped.push({ agentId: input.agentId, reason: `write-failed: ${err.message}` });
228
+ warn(`[connexum] governance projection write failed for ${input.agentId}: ${err.message}`);
229
+ }
230
+ }
231
+ return result;
232
+ }
233
+ /** Atomic non-secret write: temp → rename (POSIX-atomic replace).
234
+ * Shield Condition-2 (PR #1716 review): clear any orphaned .tmp left by a
235
+ * crash between write and rename on a prior run, so .connexum/ never
236
+ * accumulates stale files an operator could mistake for current data. */
237
+ function atomicWrite(file, content) {
238
+ const tmp = `${file}.tmp`;
239
+ try {
240
+ fs.unlinkSync(tmp);
241
+ }
242
+ catch { /* no orphan */ }
243
+ fs.writeFileSync(tmp, content);
244
+ fs.renameSync(tmp, file);
245
+ }
246
+ /**
247
+ * Sanity re-export so callers can verify a projection version locally without
248
+ * importing the canonical module path directly.
249
+ */
250
+ export function computeLocalProjectionVersion(policy) {
251
+ return computeProjectionVersion(policy);
252
+ }
253
+ //# sourceMappingURL=governance-projection-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance-projection-writer.js","sourceRoot":"","sources":["../../../src/cli/governance-projection-writer.ts"],"names":[],"mappings":"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"}