@rubytech/create-maxy-code 0.1.353 → 0.1.354

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 (45) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/admin-access-password/__tests__/index.test.ts +96 -14
  3. package/payload/platform/lib/admin-access-password/dist/index.d.ts +20 -4
  4. package/payload/platform/lib/admin-access-password/dist/index.d.ts.map +1 -1
  5. package/payload/platform/lib/admin-access-password/dist/index.js +43 -4
  6. package/payload/platform/lib/admin-access-password/dist/index.js.map +1 -1
  7. package/payload/platform/lib/admin-access-password/src/index.ts +67 -4
  8. package/payload/platform/lib/admins-write/__tests__/index.test.ts +182 -0
  9. package/payload/platform/lib/admins-write/dist/index.d.ts +65 -11
  10. package/payload/platform/lib/admins-write/dist/index.d.ts.map +1 -1
  11. package/payload/platform/lib/admins-write/dist/index.js +93 -31
  12. package/payload/platform/lib/admins-write/dist/index.js.map +1 -1
  13. package/payload/platform/lib/admins-write/src/index.ts +133 -36
  14. package/payload/platform/plugins/admin/PLUGIN.md +4 -0
  15. package/payload/platform/plugins/admin/mcp/dist/index.js +15 -3
  16. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  17. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +16 -1
  18. package/payload/platform/plugins/docs/references/troubleshooting.md +15 -0
  19. package/payload/server/{chunk-QAKVFSEJ.js → chunk-7GNXBVGY.js} +38 -11
  20. package/payload/server/maxy-edge.js +1 -1
  21. package/payload/server/public/assets/{AdminLoginScreens-CzdOQKyO.js → AdminLoginScreens-6WgO-Z3m.js} +1 -1
  22. package/payload/server/public/assets/{AdminShell-CC-CuN6Y.js → AdminShell-GGnPXCOe.js} +1 -1
  23. package/payload/server/public/assets/{Checkbox-sQBc9xSy.js → Checkbox-D3XFVUMT.js} +1 -1
  24. package/payload/server/public/assets/{OperatorConversations-DPVKGsRS.css → OperatorConversations-CFWXdnjB.css} +1 -1
  25. package/payload/server/public/assets/{admin-qW6jM6l0.js → admin-B2yNhVvH.js} +1 -1
  26. package/payload/server/public/assets/{browser-BsW6KaxZ.js → browser-ByaQ0ItQ.js} +1 -1
  27. package/payload/server/public/assets/{calendar-BPAiN1cL.js → calendar-BjqCT8cW.js} +1 -1
  28. package/payload/server/public/assets/chat-kl-Ips-o.js +1 -0
  29. package/payload/server/public/assets/{data-D_cR_NCZ.js → data-p9p-181v.js} +1 -1
  30. package/payload/server/public/assets/{graph-CmpAy2WP.js → graph-BuunC8eP.js} +1 -1
  31. package/payload/server/public/assets/{graph-labels-C0SLq_VP.js → graph-labels-BF3Ak8q0.js} +1 -1
  32. package/payload/server/public/assets/{operator-CrjtJcEY.js → operator-D7c8mN4J.js} +1 -1
  33. package/payload/server/public/assets/{page-Cf3fVDSo.js → page-C6uMZdT1.js} +3 -3
  34. package/payload/server/public/assets/{public-BkNtvSYp.js → public-B9_UhjEa.js} +1 -1
  35. package/payload/server/public/browser.html +4 -4
  36. package/payload/server/public/calendar.html +4 -4
  37. package/payload/server/public/chat.html +5 -5
  38. package/payload/server/public/data.html +4 -4
  39. package/payload/server/public/graph.html +6 -6
  40. package/payload/server/public/index.html +6 -6
  41. package/payload/server/public/operator.html +7 -7
  42. package/payload/server/public/public.html +5 -5
  43. package/payload/server/server.js +1010 -966
  44. package/payload/server/public/assets/chat-DVD9yoVL.js +0 -1
  45. /package/payload/server/public/assets/{OperatorConversations-CA_2c3sp.js → OperatorConversations-DeZ2wDEK.js} +0 -0
@@ -0,0 +1,182 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mkdtempSync, writeFileSync, readFileSync, existsSync, mkdirSync } from 'node:fs'
3
+ import { tmpdir } from 'node:os'
4
+ import { dirname, join } from 'node:path'
5
+ import {
6
+ writeAdminEntry,
7
+ removeAdminFromAccount,
8
+ computeAdminStoreDivergence,
9
+ logUsersAudit,
10
+ formatAuditRowIds,
11
+ } from '../src/index'
12
+
13
+ interface Fixture {
14
+ usersFile: string
15
+ accountDir: string
16
+ accountsDir: string
17
+ logFile: string
18
+ }
19
+
20
+ /** One account under accountsDir/<id>/account.json plus the persistent users.json. */
21
+ function fixture(opts: {
22
+ users: Array<{ userId: string; pin?: string }>
23
+ admins: Array<{ userId: string; role: 'owner' | 'admin' }>
24
+ accountId?: string
25
+ }): Fixture {
26
+ const root = mkdtempSync(join(tmpdir(), 'admw-'))
27
+ const accountsDir = join(root, 'accounts')
28
+ const accountId = opts.accountId ?? 'acct0001'
29
+ const accountDir = join(accountsDir, accountId)
30
+ mkdirSync(accountDir, { recursive: true })
31
+ const usersFile = join(root, 'users.json')
32
+ writeFileSync(usersFile, JSON.stringify(opts.users.map(u => ({ pin: 'p', ...u })), null, 2) + '\n')
33
+ writeFileSync(join(accountDir, 'account.json'), JSON.stringify({ accountId, admins: opts.admins }, null, 2) + '\n')
34
+ return { usersFile, accountDir, accountsDir, logFile: join(root, 'users-audit.log') }
35
+ }
36
+
37
+ function readAudit(logFile: string): string[] {
38
+ if (!existsSync(logFile)) return []
39
+ return readFileSync(logFile, 'utf-8').trim().split('\n').filter(Boolean)
40
+ }
41
+
42
+ function accountAdmins(accountDir: string): string[] {
43
+ const cfg = JSON.parse(readFileSync(join(accountDir, 'account.json'), 'utf-8'))
44
+ return (cfg.admins as Array<{ userId: string }>).map(a => a.userId)
45
+ }
46
+
47
+ describe('admins-write — users-audit emission', () => {
48
+ it('writeAdminEntry on a NEW userId emits action=add field=row with the grown row-set', () => {
49
+ const f = fixture({ users: [{ userId: 'aaaaaaaa-1' }], admins: [{ userId: 'aaaaaaaa-1', role: 'owner' }] })
50
+ writeAdminEntry({
51
+ userId: 'bbbbbbbb-2', pin: 'hash', role: 'admin',
52
+ usersFile: f.usersFile, accountDir: f.accountDir, caller: 'admin-add',
53
+ audit: { actor: 'aaaaaaaa-1', logFile: f.logFile },
54
+ })
55
+ const lines = readAudit(f.logFile)
56
+ expect(lines).toHaveLength(1)
57
+ expect(lines[0]).toContain('action=add')
58
+ expect(lines[0]).toContain('field=row')
59
+ expect(lines[0]).toContain('actor=aaaaaaaa')
60
+ expect(lines[0]).toContain('rowsBefore=aaaaaaaa')
61
+ expect(lines[0]).toContain('rowsAfter=aaaaaaaa,bbbbbbbb')
62
+ })
63
+
64
+ it('writeAdminEntry on an EXISTING userId emits action=set-pin field=pin with an unchanged row-set', () => {
65
+ const f = fixture({
66
+ users: [{ userId: 'aaaaaaaa-1' }, { userId: 'bbbbbbbb-2' }],
67
+ admins: [{ userId: 'aaaaaaaa-1', role: 'owner' }, { userId: 'bbbbbbbb-2', role: 'admin' }],
68
+ })
69
+ writeAdminEntry({
70
+ userId: 'bbbbbbbb-2', pin: 'newhash', role: 'admin',
71
+ usersFile: f.usersFile, accountDir: f.accountDir, caller: 'admin-update-pin',
72
+ audit: { actor: 'bbbbbbbb-2', session: 'dddddddd-7', logFile: f.logFile },
73
+ })
74
+ const lines = readAudit(f.logFile)
75
+ expect(lines).toHaveLength(1)
76
+ expect(lines[0]).toContain('action=set-pin')
77
+ expect(lines[0]).toContain('field=pin')
78
+ expect(lines[0]).toContain('session=dddddddd')
79
+ expect(lines[0]).toContain('rowsBefore=aaaaaaaa,bbbbbbbb')
80
+ expect(lines[0]).toContain('rowsAfter=aaaaaaaa,bbbbbbbb')
81
+ })
82
+
83
+ it('removeAdminFromAccount on a present admin emits action=remove field=row on the account set', () => {
84
+ const f = fixture({
85
+ users: [{ userId: 'aaaaaaaa-1' }, { userId: 'bbbbbbbb-2' }],
86
+ admins: [{ userId: 'aaaaaaaa-1', role: 'owner' }, { userId: 'bbbbbbbb-2', role: 'admin' }],
87
+ })
88
+ removeAdminFromAccount({
89
+ userId: 'bbbbbbbb-2', accountDir: f.accountDir, caller: 'admin-remove',
90
+ audit: { actor: 'aaaaaaaa-1', logFile: f.logFile },
91
+ })
92
+ const lines = readAudit(f.logFile)
93
+ expect(lines).toHaveLength(1)
94
+ expect(lines[0]).toContain('action=remove')
95
+ expect(lines[0]).toContain('field=row')
96
+ expect(lines[0]).toContain('rowsBefore=aaaaaaaa,bbbbbbbb')
97
+ expect(lines[0]).toContain('rowsAfter=aaaaaaaa')
98
+ expect(accountAdmins(f.accountDir)).toEqual(['aaaaaaaa-1'])
99
+ })
100
+
101
+ it('removeAdminFromAccount on an absent admin is a noop and emits nothing', () => {
102
+ const f = fixture({ users: [{ userId: 'aaaaaaaa-1' }], admins: [{ userId: 'aaaaaaaa-1', role: 'owner' }] })
103
+ removeAdminFromAccount({
104
+ userId: 'zzzzzzzz-9', accountDir: f.accountDir, caller: 'admin-remove',
105
+ audit: { actor: 'aaaaaaaa-1', logFile: f.logFile },
106
+ })
107
+ expect(readAudit(f.logFile)).toHaveLength(0)
108
+ })
109
+ })
110
+
111
+ describe('admins-write — public audit helper (for direct users.json writers)', () => {
112
+ it('formatAuditRowIds joins 8-char short ids', () => {
113
+ expect(formatAuditRowIds(['aaaaaaaa-1', 'bbbbbbbb-2'])).toBe('aaaaaaaa,bbbbbbbb')
114
+ })
115
+
116
+ it('logUsersAudit writes one canonical set-pin line', () => {
117
+ const root = mkdtempSync(join(tmpdir(), 'admwlog-'))
118
+ const logFile = join(root, 'users-audit.log')
119
+ logUsersAudit(
120
+ { actor: 'cccccccc-9', session: 'dddddddd-7', logFile },
121
+ { action: 'set-pin', field: 'pin', rowsBefore: 'aaaaaaaa', rowsAfter: 'aaaaaaaa' },
122
+ )
123
+ const lines = readAudit(logFile)
124
+ expect(lines).toHaveLength(1)
125
+ expect(lines[0]).toContain('action=set-pin')
126
+ expect(lines[0]).toContain('field=pin')
127
+ expect(lines[0]).toContain('actor=cccccccc')
128
+ expect(lines[0]).toContain('session=dddddddd')
129
+ })
130
+ })
131
+
132
+ describe('admins-write — computeAdminStoreDivergence', () => {
133
+ it('flags an admin in account.json with no users.json row (the incident shape)', () => {
134
+ const f = fixture({
135
+ users: [{ userId: 'aaaaaaaa-1' }],
136
+ admins: [{ userId: 'aaaaaaaa-1', role: 'owner' }, { userId: 'bbbbbbbb-2', role: 'admin' }],
137
+ })
138
+ const r = computeAdminStoreDivergence({ usersFile: f.usersFile, accountsDir: f.accountsDir })
139
+ expect(r.divergences).toBe(1)
140
+ expect(r.accountWithoutUsers.map(x => x.userId)).toEqual(['bbbbbbbb-2'])
141
+ expect(r.usersWithoutAccount).toEqual([])
142
+ })
143
+
144
+ it('flags a users.json row no account.json references', () => {
145
+ const f = fixture({
146
+ users: [{ userId: 'aaaaaaaa-1' }, { userId: 'cccccccc-3' }],
147
+ admins: [{ userId: 'aaaaaaaa-1', role: 'owner' }],
148
+ })
149
+ const r = computeAdminStoreDivergence({ usersFile: f.usersFile, accountsDir: f.accountsDir })
150
+ expect(r.divergences).toBe(1)
151
+ expect(r.usersWithoutAccount.map(x => x.userId)).toEqual(['cccccccc-3'])
152
+ expect(r.accountWithoutUsers).toEqual([])
153
+ })
154
+
155
+ it('clean parity → zero divergences', () => {
156
+ const f = fixture({
157
+ users: [{ userId: 'aaaaaaaa-1' }, { userId: 'bbbbbbbb-2' }],
158
+ admins: [{ userId: 'aaaaaaaa-1', role: 'owner' }, { userId: 'bbbbbbbb-2', role: 'admin' }],
159
+ })
160
+ const r = computeAdminStoreDivergence({ usersFile: f.usersFile, accountsDir: f.accountsDir })
161
+ expect(r.divergences).toBe(0)
162
+ })
163
+
164
+ it('an audited remove of the diverging row clears the account-side mismatch', () => {
165
+ const f = fixture({
166
+ users: [{ userId: 'aaaaaaaa-1' }],
167
+ admins: [{ userId: 'aaaaaaaa-1', role: 'owner' }, { userId: 'bbbbbbbb-2', role: 'admin' }],
168
+ })
169
+ // account-without-users divergence present
170
+ expect(computeAdminStoreDivergence({ usersFile: f.usersFile, accountsDir: f.accountsDir }).divergences).toBe(1)
171
+ // audited delete of the orphan account row
172
+ removeAdminFromAccount({
173
+ userId: 'bbbbbbbb-2', accountDir: f.accountDir, caller: 'admin-remove',
174
+ audit: { actor: 'aaaaaaaa-1', logFile: f.logFile },
175
+ })
176
+ expect(readAudit(f.logFile)[0]).toContain('action=remove')
177
+ expect(readAudit(f.logFile)[0]).toContain('actor=aaaaaaaa')
178
+ // account no longer lists it → parity restored
179
+ expect(computeAdminStoreDivergence({ usersFile: f.usersFile, accountsDir: f.accountsDir }).divergences).toBe(0)
180
+ void dirname
181
+ })
182
+ })
@@ -2,6 +2,34 @@ export interface UserEntry {
2
2
  userId: string;
3
3
  pin: string;
4
4
  }
5
+ /**
6
+ * Identity + destination for one credential-store audit line. The writer is
7
+ * pure (it only knows the file paths); the caller is the only party that knows
8
+ * WHO is acting and WHERE the audit log lives, so it is threaded in. `actor` is
9
+ * an admin userId or a non-user sentinel (`onboarding` | `install` | `boot` |
10
+ * `unknown` when an MCP caller has no resolvable USER_ID); `session` is the
11
+ * spawning agent session (SESSION_NODE_ID) when one drove the write. `logFile`
12
+ * is the absolute path to the append-only users-audit log, distinct from
13
+ * server.log. Mirrored in platform/lib/admin-access-password.
14
+ */
15
+ export interface AuditContext {
16
+ actor: string;
17
+ session?: string;
18
+ logFile: string;
19
+ }
20
+ /** Format a userId list as the comma-joined short-id set used in audit lines.
21
+ * Exported for direct users.json writers that do not route through
22
+ * writeAdminEntry (the MCP admin-update-pin path). */
23
+ export declare function formatAuditRowIds(userIds: string[]): string;
24
+ /** Public wrapper so a direct users.json writer that cannot route through
25
+ * writeAdminEntry (the MCP admin-update-pin path) still emits the one
26
+ * canonical `[users-audit]` line, keeping every write covered. */
27
+ export declare function logUsersAudit(audit: AuditContext, fields: {
28
+ action: string;
29
+ field: string;
30
+ rowsBefore: string;
31
+ rowsAfter: string;
32
+ }): void;
5
33
  export interface AdminEntry {
6
34
  userId: string;
7
35
  role: "owner" | "admin";
@@ -13,6 +41,7 @@ export interface AdminWriteInput {
13
41
  usersFile: string;
14
42
  accountDir: string;
15
43
  caller: string;
44
+ audit: AuditContext;
16
45
  }
17
46
  export interface AdminWriteResult {
18
47
  usersJsonResult: "ok" | "fail" | "noop";
@@ -36,6 +65,7 @@ export interface AdminRemoveInput {
36
65
  userId: string;
37
66
  accountDir: string;
38
67
  caller: string;
68
+ audit: AuditContext;
39
69
  }
40
70
  export interface AdminRemoveResult {
41
71
  accountJsonResult: "ok" | "fail" | "noop";
@@ -68,19 +98,43 @@ export interface InvariantCheckResult {
68
98
  userId: string;
69
99
  }>;
70
100
  }
101
+ /** Pure divergence computation — read faults collected, never logged. */
102
+ export interface DivergenceResult {
103
+ divergences: number;
104
+ /** Userids in account.json admins[] that have no row in users.json. */
105
+ accountWithoutUsers: Array<{
106
+ userId: string;
107
+ source: string;
108
+ }>;
109
+ /** Userids in users.json that no account.json admins[] references. */
110
+ usersWithoutAccount: Array<{
111
+ userId: string;
112
+ }>;
113
+ /** Read faults encountered during the walk (unreadable users/account file). */
114
+ errors: Array<{
115
+ source: string;
116
+ detail: string;
117
+ }>;
118
+ }
71
119
  /**
72
120
  * Walk every account.json under accountsDir and compare its admins[] to
73
- * users.json. Emits one log line per divergence and one summary line.
74
- *
75
- * Behaviour: log-only does NOT throw, does NOT refuse boot or install.
76
- * Pre-Task-904 installs that already diverged would otherwise brick on the
77
- * first boot of a Task-904 device. The summary line `divergences=<n>` is
78
- * always emitted (wired-up assertion); per-divergence lines fire only when
79
- * divergences > 0. Operators grep `[install-invariant]` or `[admin-invariant]`
80
- * to detect the regression class without reading every install log.
81
- *
82
- * Promotion to refuse-or-degrade is a future sprint; capture as a TODO once
83
- * the deployed fleet has been audited clean.
121
+ * users.json. PURE: returns the divergence sets and any read faults; does no
122
+ * logging and never throws. Shared by `checkAdminAuthInvariant` (the
123
+ * `[admin-invariant]` boot one-shot) and the `[users-reconcile]` standing tick
124
+ * so the two never disagree on the predicate. An absent users.json or accounts
125
+ * dir is a legitimate first-boot state empty set, not a fault.
126
+ */
127
+ export declare function computeAdminStoreDivergence(input: {
128
+ usersFile: string;
129
+ accountsDir: string;
130
+ }): DivergenceResult;
131
+ /**
132
+ * `[admin-invariant]` / `[install-invariant]` boot one-shot. Wraps the pure
133
+ * `computeAdminStoreDivergence` and emits the documented grep lines:
134
+ * `direction=…`, the per-fault unreadable line, and the always-emitted
135
+ * `check complete divergences=<n>` summary. Log-only — does NOT throw, does NOT
136
+ * refuse boot or install. The recurring standing check is the separate
137
+ * `[users-reconcile]` tick in the admin server boot.
84
138
  */
85
139
  export declare function checkAdminAuthInvariant(input: InvariantCheckInput): InvariantCheckResult;
86
140
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IACxC,iBAAiB,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmBD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAyDxE;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CA+BjF;AAED,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,GAAG,EAAE,mBAAmB,GAAG,iBAAiB,CAAC;CAC9C;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,mBAAmB,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,sEAAsE;IACtE,mBAAmB,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAsFxF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -20,11 +20,51 @@
20
20
  // returns is_error: true with the [admins-write] line; set-pin returns 500
21
21
  // with the same). Same trust model as the [admin-auth-store] pair.
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.formatAuditRowIds = formatAuditRowIds;
24
+ exports.logUsersAudit = logUsersAudit;
23
25
  exports.writeAdminEntry = writeAdminEntry;
24
26
  exports.removeAdminFromAccount = removeAdminFromAccount;
27
+ exports.computeAdminStoreDivergence = computeAdminStoreDivergence;
25
28
  exports.checkAdminAuthInvariant = checkAdminAuthInvariant;
26
29
  const node_fs_1 = require("node:fs");
27
30
  const node_path_1 = require("node:path");
31
+ /** First 8 chars — the short-id convention used across the auth logs. */
32
+ function id8(value) {
33
+ return value.slice(0, 8);
34
+ }
35
+ /** Format a userId list as the comma-joined short-id set used in audit lines.
36
+ * Exported for direct users.json writers that do not route through
37
+ * writeAdminEntry (the MCP admin-update-pin path). */
38
+ function formatAuditRowIds(userIds) {
39
+ return userIds.map(id8).join(",");
40
+ }
41
+ /**
42
+ * Append one canonical `[users-audit]` line. Append failures never propagate —
43
+ * an audit-write fault must not break the credential write it records; the
44
+ * fault is surfaced once on stderr instead.
45
+ */
46
+ function appendUsersAuditLine(audit, fields) {
47
+ const sess = audit.session ? ` session=${id8(audit.session)}` : "";
48
+ // userIds are uuids (shortened to id8); sentinels (boot|install|onboarding|
49
+ // unknown) carry no dash and are written whole so attribution stays readable.
50
+ const actor = audit.actor.includes("-") ? id8(audit.actor) : audit.actor;
51
+ const line = `[users-audit] action=${fields.action} actor=${actor}${sess} ` +
52
+ `field=${fields.field} rowsBefore=${fields.rowsBefore} rowsAfter=${fields.rowsAfter} ` +
53
+ `ts=${new Date().toISOString()}\n`;
54
+ try {
55
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(audit.logFile), { recursive: true, mode: 0o700 });
56
+ (0, node_fs_1.appendFileSync)(audit.logFile, line, { mode: 0o600 });
57
+ }
58
+ catch (err) {
59
+ console.error(`[users-audit] op=write-failed logFile=${audit.logFile} error=${err instanceof Error ? err.message : String(err)}`);
60
+ }
61
+ }
62
+ /** Public wrapper so a direct users.json writer that cannot route through
63
+ * writeAdminEntry (the MCP admin-update-pin path) still emits the one
64
+ * canonical `[users-audit]` line, keeping every write covered. */
65
+ function logUsersAudit(audit, fields) {
66
+ appendUsersAuditLine(audit, fields);
67
+ }
28
68
  function logLine(input, result) {
29
69
  const userIdShort = input.userId.slice(0, 8);
30
70
  console.error(`[admins-write] caller=${input.caller} userId=${userIdShort} ` +
@@ -64,6 +104,7 @@ function writeAdminEntry(input) {
64
104
  users = parsed;
65
105
  }
66
106
  }
107
+ const rowsBefore = users.map(u => id8(u.userId)).join(",");
67
108
  const existing = users.findIndex(u => u.userId === input.userId);
68
109
  if (existing === -1) {
69
110
  users.push({ userId: input.userId, pin: input.pin });
@@ -74,6 +115,13 @@ function writeAdminEntry(input) {
74
115
  }
75
116
  writeFileAtomic(input.usersFile, JSON.stringify(users, null, 2) + "\n", 0o600);
76
117
  result.usersJsonResult = "ok";
118
+ // A new userId is a row add; an existing userId is a pin rotation.
119
+ appendUsersAuditLine(input.audit, {
120
+ action: existing === -1 ? "add" : "set-pin",
121
+ field: existing === -1 ? "row" : "pin",
122
+ rowsBefore,
123
+ rowsAfter: users.map(u => id8(u.userId)).join(","),
124
+ });
77
125
  }
78
126
  catch (err) {
79
127
  result.usersJsonResult = "fail";
@@ -122,6 +170,7 @@ function removeAdminFromAccount(input) {
122
170
  }
123
171
  const config = JSON.parse((0, node_fs_1.readFileSync)(accountJsonPath, "utf-8"));
124
172
  const admins = (config.admins ?? []);
173
+ const rowsBefore = admins.map(a => id8(a.userId)).join(",");
125
174
  const targetIndex = admins.findIndex(a => a.userId === input.userId);
126
175
  if (targetIndex === -1) {
127
176
  result.accountJsonResult = "noop";
@@ -131,6 +180,13 @@ function removeAdminFromAccount(input) {
131
180
  config.admins = admins;
132
181
  writeFileAtomic(accountJsonPath, JSON.stringify(config, null, 2) + "\n");
133
182
  result.accountJsonResult = "ok";
183
+ // Removal touches account.json admins[] only; the row-set is that store's.
184
+ appendUsersAuditLine(input.audit, {
185
+ action: "remove",
186
+ field: "row",
187
+ rowsBefore,
188
+ rowsAfter: admins.map(a => id8(a.userId)).join(","),
189
+ });
134
190
  }
135
191
  }
136
192
  catch (err) {
@@ -144,26 +200,15 @@ function removeAdminFromAccount(input) {
144
200
  }
145
201
  /**
146
202
  * Walk every account.json under accountsDir and compare its admins[] to
147
- * users.json. Emits one log line per divergence and one summary line.
148
- *
149
- * Behaviour: log-only does NOT throw, does NOT refuse boot or install.
150
- * Pre-Task-904 installs that already diverged would otherwise brick on the
151
- * first boot of a Task-904 device. The summary line `divergences=<n>` is
152
- * always emitted (wired-up assertion); per-divergence lines fire only when
153
- * divergences > 0. Operators grep `[install-invariant]` or `[admin-invariant]`
154
- * to detect the regression class without reading every install log.
155
- *
156
- * Promotion to refuse-or-degrade is a future sprint; capture as a TODO once
157
- * the deployed fleet has been audited clean.
203
+ * users.json. PURE: returns the divergence sets and any read faults; does no
204
+ * logging and never throws. Shared by `checkAdminAuthInvariant` (the
205
+ * `[admin-invariant]` boot one-shot) and the `[users-reconcile]` standing tick
206
+ * so the two never disagree on the predicate. An absent users.json or accounts
207
+ * dir is a legitimate first-boot state empty set, not a fault.
158
208
  */
159
- function checkAdminAuthInvariant(input) {
160
- const result = {
161
- divergences: 0,
162
- accountWithoutUsers: [],
163
- usersWithoutAccount: [],
164
- };
165
- // Read users.json userIds (persistent file). Absent file == empty set; do
166
- // not abort — first-boot before set-pin has run is a legitimate state.
209
+ function computeAdminStoreDivergence(input) {
210
+ const result = { divergences: 0, accountWithoutUsers: [], usersWithoutAccount: [], errors: [] };
211
+ // Read users.json userIds (persistent file). Absent file == empty set.
167
212
  const usersUserIds = new Set();
168
213
  if ((0, node_fs_1.existsSync)(input.usersFile)) {
169
214
  try {
@@ -177,8 +222,7 @@ function checkAdminAuthInvariant(input) {
177
222
  }
178
223
  }
179
224
  catch (err) {
180
- const msg = err instanceof Error ? err.message : String(err);
181
- console.error(`[${input.tag}] users.json unreadable usersFile=${input.usersFile} error=${msg}`);
225
+ result.errors.push({ source: input.usersFile, detail: err instanceof Error ? err.message : String(err) });
182
226
  }
183
227
  }
184
228
  // Walk account dirs. Skip dotfiles (.trash/) and missing account.json.
@@ -189,9 +233,7 @@ function checkAdminAuthInvariant(input) {
189
233
  entries = (0, node_fs_1.readdirSync)(input.accountsDir);
190
234
  }
191
235
  catch (err) {
192
- const msg = err instanceof Error ? err.message : String(err);
193
- console.error(`[${input.tag}] accounts-dir unreadable accountsDir=${input.accountsDir} error=${msg}`);
194
- console.error(`[${input.tag}] check complete divergences=0 (accounts-dir unreadable)`);
236
+ result.errors.push({ source: input.accountsDir, detail: err instanceof Error ? err.message : String(err) });
195
237
  return result;
196
238
  }
197
239
  for (const entry of entries) {
@@ -214,8 +256,7 @@ function checkAdminAuthInvariant(input) {
214
256
  admins = (config.admins ?? []);
215
257
  }
216
258
  catch (err) {
217
- const msg = err instanceof Error ? err.message : String(err);
218
- console.error(`[${input.tag}] account.json unreadable source=${accountJsonPath} error=${msg}`);
259
+ result.errors.push({ source: accountJsonPath, detail: err instanceof Error ? err.message : String(err) });
219
260
  continue;
220
261
  }
221
262
  for (const a of admins) {
@@ -223,8 +264,6 @@ function checkAdminAuthInvariant(input) {
223
264
  continue;
224
265
  accountUserIds.add(a.userId);
225
266
  if (!usersUserIds.has(a.userId)) {
226
- const userIdShort = a.userId.slice(0, 8);
227
- console.error(`[${input.tag}] direction=account-without-users userId=${userIdShort} source=${accountJsonPath}`);
228
267
  result.accountWithoutUsers.push({ userId: a.userId, source: accountJsonPath });
229
268
  result.divergences += 1;
230
269
  }
@@ -233,13 +272,36 @@ function checkAdminAuthInvariant(input) {
233
272
  }
234
273
  for (const uid of usersUserIds) {
235
274
  if (!accountUserIds.has(uid)) {
236
- const userIdShort = uid.slice(0, 8);
237
- console.error(`[${input.tag}] direction=users-without-account userId=${userIdShort} source=${input.usersFile}`);
238
275
  result.usersWithoutAccount.push({ userId: uid });
239
276
  result.divergences += 1;
240
277
  }
241
278
  }
242
- console.error(`[${input.tag}] check complete divergences=${result.divergences}`);
243
279
  return result;
244
280
  }
281
+ /**
282
+ * `[admin-invariant]` / `[install-invariant]` boot one-shot. Wraps the pure
283
+ * `computeAdminStoreDivergence` and emits the documented grep lines:
284
+ * `direction=…`, the per-fault unreadable line, and the always-emitted
285
+ * `check complete divergences=<n>` summary. Log-only — does NOT throw, does NOT
286
+ * refuse boot or install. The recurring standing check is the separate
287
+ * `[users-reconcile]` tick in the admin server boot.
288
+ */
289
+ function checkAdminAuthInvariant(input) {
290
+ const d = computeAdminStoreDivergence({ usersFile: input.usersFile, accountsDir: input.accountsDir });
291
+ for (const e of d.errors) {
292
+ console.error(`[${input.tag}] unreadable source=${e.source} error=${e.detail}`);
293
+ }
294
+ for (const a of d.accountWithoutUsers) {
295
+ console.error(`[${input.tag}] direction=account-without-users userId=${a.userId.slice(0, 8)} source=${a.source}`);
296
+ }
297
+ for (const u of d.usersWithoutAccount) {
298
+ console.error(`[${input.tag}] direction=users-without-account userId=${u.userId.slice(0, 8)} source=${input.usersFile}`);
299
+ }
300
+ console.error(`[${input.tag}] check complete divergences=${d.divergences}`);
301
+ return {
302
+ divergences: d.divergences,
303
+ accountWithoutUsers: d.accountWithoutUsers,
304
+ usersWithoutAccount: d.usersWithoutAccount,
305
+ };
306
+ }
245
307
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}