hazo_audit 1.0.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 (67) hide show
  1. package/CHANGE_LOG.md +53 -0
  2. package/README.md +269 -0
  3. package/SETUP_CHECKLIST.md +186 -0
  4. package/bin/hazo-audit-migrate.js +169 -0
  5. package/config/hazo_audit_config.ini.sample +71 -0
  6. package/dist/client/FieldAuditIcon.d.ts +11 -0
  7. package/dist/client/FieldAuditIcon.d.ts.map +1 -0
  8. package/dist/client/FieldAuditIcon.js +46 -0
  9. package/dist/client/FieldAuditIcon.js.map +1 -0
  10. package/dist/client/FieldAuditTrail.d.ts +8 -0
  11. package/dist/client/FieldAuditTrail.d.ts.map +1 -0
  12. package/dist/client/FieldAuditTrail.js +136 -0
  13. package/dist/client/FieldAuditTrail.js.map +1 -0
  14. package/dist/client/cn.d.ts +3 -0
  15. package/dist/client/cn.d.ts.map +1 -0
  16. package/dist/client/cn.js +6 -0
  17. package/dist/client/cn.js.map +1 -0
  18. package/dist/client/index.d.ts +11 -0
  19. package/dist/client/index.d.ts.map +1 -0
  20. package/dist/client/index.js +9 -0
  21. package/dist/client/index.js.map +1 -0
  22. package/dist/client/types.d.ts +19 -0
  23. package/dist/client/types.d.ts.map +1 -0
  24. package/dist/client/types.js +2 -0
  25. package/dist/client/types.js.map +1 -0
  26. package/dist/index.d.ts +76 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +20 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/nextjs/index.d.ts +78 -0
  31. package/dist/nextjs/index.d.ts.map +1 -0
  32. package/dist/nextjs/index.js +229 -0
  33. package/dist/nextjs/index.js.map +1 -0
  34. package/dist/server/audited_crud.d.ts +42 -0
  35. package/dist/server/audited_crud.d.ts.map +1 -0
  36. package/dist/server/audited_crud.js +57 -0
  37. package/dist/server/audited_crud.js.map +1 -0
  38. package/dist/server/config.d.ts +70 -0
  39. package/dist/server/config.d.ts.map +1 -0
  40. package/dist/server/config.js +203 -0
  41. package/dist/server/config.js.map +1 -0
  42. package/dist/server/context.d.ts +28 -0
  43. package/dist/server/context.d.ts.map +1 -0
  44. package/dist/server/context.js +49 -0
  45. package/dist/server/context.js.map +1 -0
  46. package/dist/server/diff.d.ts +32 -0
  47. package/dist/server/diff.d.ts.map +1 -0
  48. package/dist/server/diff.js +152 -0
  49. package/dist/server/diff.js.map +1 -0
  50. package/dist/server/index.d.ts +23 -0
  51. package/dist/server/index.d.ts.map +1 -0
  52. package/dist/server/index.js +26 -0
  53. package/dist/server/index.js.map +1 -0
  54. package/dist/server/outbox.d.ts +29 -0
  55. package/dist/server/outbox.d.ts.map +1 -0
  56. package/dist/server/outbox.js +53 -0
  57. package/dist/server/outbox.js.map +1 -0
  58. package/dist/server/worker.d.ts +43 -0
  59. package/dist/server/worker.d.ts.map +1 -0
  60. package/dist/server/worker.js +248 -0
  61. package/dist/server/worker.js.map +1 -0
  62. package/dist/server/wrap.d.ts +32 -0
  63. package/dist/server/wrap.d.ts.map +1 -0
  64. package/dist/server/wrap.js +232 -0
  65. package/dist/server/wrap.js.map +1 -0
  66. package/migrations/001_init.sql +149 -0
  67. package/package.json +101 -0
@@ -0,0 +1,149 @@
1
+ -- hazo_audit database schema
2
+ -- Supports both PostgreSQL and SQLite
3
+ --
4
+ -- Three tables:
5
+ -- hazo_audit_outbox : queue produced by wrapWithAudit, drained by the worker
6
+ -- hazo_audit_field : per-leaf field events the UI reads from
7
+ -- hazo_audit_intent : Layer-1 named events (e.g., 'audit_reveal')
8
+ --
9
+ -- ============================================================================
10
+ -- SQLite version (commented; uncomment when running against SQLite)
11
+ -- ============================================================================
12
+ --
13
+ -- CREATE TABLE IF NOT EXISTS hazo_audit_outbox (
14
+ -- id TEXT PRIMARY KEY,
15
+ -- scope_id TEXT,
16
+ -- correlation_id TEXT NOT NULL,
17
+ -- table_name TEXT NOT NULL,
18
+ -- subject_kind TEXT NOT NULL,
19
+ -- subject_id TEXT NOT NULL,
20
+ -- op TEXT NOT NULL CHECK (op IN ('insert','update','delete')),
21
+ -- before_row TEXT,
22
+ -- after_row TEXT,
23
+ -- actor_kind TEXT NOT NULL,
24
+ -- actor_user_id TEXT,
25
+ -- actor_label TEXT,
26
+ -- intent_event TEXT,
27
+ -- intent_payload TEXT,
28
+ -- created_at TEXT NOT NULL DEFAULT (datetime('now')),
29
+ -- drained_at TEXT,
30
+ -- attempt_count INTEGER NOT NULL DEFAULT 0,
31
+ -- last_attempt_at TEXT,
32
+ -- failed_at TEXT,
33
+ -- failure_reason TEXT
34
+ -- );
35
+ --
36
+ -- CREATE INDEX IF NOT EXISTS ix_hazo_audit_outbox_drain
37
+ -- ON hazo_audit_outbox (drained_at, failed_at, attempt_count, last_attempt_at);
38
+ --
39
+ -- CREATE INDEX IF NOT EXISTS ix_hazo_audit_outbox_chain
40
+ -- ON hazo_audit_outbox (subject_kind, subject_id, created_at);
41
+ --
42
+ -- CREATE TABLE IF NOT EXISTS hazo_audit_field (
43
+ -- id TEXT PRIMARY KEY,
44
+ -- scope_id TEXT,
45
+ -- correlation_id TEXT NOT NULL,
46
+ -- subject_kind TEXT NOT NULL,
47
+ -- subject_id TEXT NOT NULL,
48
+ -- field_path TEXT NOT NULL,
49
+ -- op TEXT NOT NULL CHECK (op IN ('insert','update','delete')),
50
+ -- before_value TEXT,
51
+ -- after_value TEXT,
52
+ -- is_sensitive INTEGER NOT NULL DEFAULT 0,
53
+ -- actor_kind TEXT NOT NULL,
54
+ -- actor_user_id TEXT,
55
+ -- actor_label TEXT,
56
+ -- occurred_at TEXT NOT NULL DEFAULT (datetime('now'))
57
+ -- );
58
+ --
59
+ -- CREATE INDEX IF NOT EXISTS ix_hazo_audit_field_subject
60
+ -- ON hazo_audit_field (subject_kind, subject_id, field_path, occurred_at);
61
+ --
62
+ -- CREATE TABLE IF NOT EXISTS hazo_audit_intent (
63
+ -- id TEXT PRIMARY KEY,
64
+ -- scope_id TEXT,
65
+ -- correlation_id TEXT NOT NULL,
66
+ -- event_name TEXT NOT NULL,
67
+ -- payload TEXT,
68
+ -- subject_kind TEXT,
69
+ -- subject_id TEXT,
70
+ -- actor_kind TEXT NOT NULL,
71
+ -- actor_user_id TEXT,
72
+ -- actor_label TEXT,
73
+ -- occurred_at TEXT NOT NULL DEFAULT (datetime('now'))
74
+ -- );
75
+ --
76
+ -- CREATE INDEX IF NOT EXISTS ix_hazo_audit_intent_event
77
+ -- ON hazo_audit_intent (event_name, occurred_at);
78
+ --
79
+ -- ============================================================================
80
+ -- PostgreSQL version (active)
81
+ -- ============================================================================
82
+
83
+ CREATE TABLE IF NOT EXISTS hazo_audit_outbox (
84
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
85
+ scope_id UUID,
86
+ correlation_id UUID NOT NULL,
87
+ table_name TEXT NOT NULL,
88
+ subject_kind TEXT NOT NULL,
89
+ subject_id TEXT NOT NULL,
90
+ op TEXT NOT NULL CHECK (op IN ('insert','update','delete')),
91
+ before_row JSONB,
92
+ after_row JSONB,
93
+ actor_kind TEXT NOT NULL,
94
+ actor_user_id UUID,
95
+ actor_label TEXT,
96
+ intent_event TEXT,
97
+ intent_payload JSONB,
98
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
99
+ drained_at TIMESTAMPTZ,
100
+ attempt_count INTEGER NOT NULL DEFAULT 0,
101
+ last_attempt_at TIMESTAMPTZ,
102
+ failed_at TIMESTAMPTZ,
103
+ failure_reason TEXT
104
+ );
105
+
106
+ CREATE INDEX IF NOT EXISTS ix_hazo_audit_outbox_drain
107
+ ON hazo_audit_outbox (drained_at, failed_at, attempt_count, last_attempt_at)
108
+ WHERE drained_at IS NULL AND failed_at IS NULL;
109
+
110
+ CREATE INDEX IF NOT EXISTS ix_hazo_audit_outbox_chain
111
+ ON hazo_audit_outbox (subject_kind, subject_id, created_at DESC)
112
+ WHERE drained_at IS NOT NULL;
113
+
114
+ CREATE TABLE IF NOT EXISTS hazo_audit_field (
115
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
116
+ scope_id UUID,
117
+ correlation_id UUID NOT NULL,
118
+ subject_kind TEXT NOT NULL,
119
+ subject_id TEXT NOT NULL,
120
+ field_path TEXT NOT NULL,
121
+ op TEXT NOT NULL CHECK (op IN ('insert','update','delete')),
122
+ before_value JSONB,
123
+ after_value JSONB,
124
+ is_sensitive BOOLEAN NOT NULL DEFAULT FALSE,
125
+ actor_kind TEXT NOT NULL,
126
+ actor_user_id UUID,
127
+ actor_label TEXT,
128
+ occurred_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
129
+ );
130
+
131
+ CREATE INDEX IF NOT EXISTS ix_hazo_audit_field_subject
132
+ ON hazo_audit_field (subject_kind, subject_id, field_path, occurred_at DESC);
133
+
134
+ CREATE TABLE IF NOT EXISTS hazo_audit_intent (
135
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
136
+ scope_id UUID,
137
+ correlation_id UUID NOT NULL,
138
+ event_name TEXT NOT NULL,
139
+ payload JSONB,
140
+ subject_kind TEXT,
141
+ subject_id TEXT,
142
+ actor_kind TEXT NOT NULL,
143
+ actor_user_id UUID,
144
+ actor_label TEXT,
145
+ occurred_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
146
+ );
147
+
148
+ CREATE INDEX IF NOT EXISTS ix_hazo_audit_intent_event
149
+ ON hazo_audit_intent (event_name, occurred_at DESC);
package/package.json ADDED
@@ -0,0 +1,101 @@
1
+ {
2
+ "name": "hazo_audit",
3
+ "version": "1.0.0",
4
+ "description": "Field-level audit trail for hazo_connect-backed apps. Attach to any adapter via wrapWithAudit() to auto-capture writes; ships worker, Next.js routes, and React UI primitives.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./server": {
15
+ "types": "./dist/server/index.d.ts",
16
+ "default": "./dist/server/index.js"
17
+ },
18
+ "./nextjs": {
19
+ "types": "./dist/nextjs/index.d.ts",
20
+ "default": "./dist/nextjs/index.js"
21
+ },
22
+ "./client": {
23
+ "types": "./dist/client/index.d.ts",
24
+ "default": "./dist/client/index.js"
25
+ }
26
+ },
27
+ "bin": {
28
+ "hazo-audit-migrate": "./bin/hazo-audit-migrate.js"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "bin",
33
+ "config",
34
+ "migrations",
35
+ "README.md",
36
+ "SETUP_CHECKLIST.md",
37
+ "CHANGE_LOG.md"
38
+ ],
39
+ "scripts": {
40
+ "build": "tsc -p tsconfig.build.json",
41
+ "dev:package": "tsc -p tsconfig.build.json --watch",
42
+ "dev:test-app": "npm run build && cd test-app && npm run dev",
43
+ "build:test-app": "npm run build && cd test-app && npm run build",
44
+ "clean": "rm -rf dist",
45
+ "prebuild": "npm run clean",
46
+ "prepublishOnly": "npm run build"
47
+ },
48
+ "keywords": [
49
+ "audit",
50
+ "hazo",
51
+ "history",
52
+ "outbox",
53
+ "field-level",
54
+ "react",
55
+ "typescript",
56
+ "nextjs"
57
+ ],
58
+ "author": "Pubs Abayasiri",
59
+ "engines": {
60
+ "node": ">=18.0.0"
61
+ },
62
+ "dependencies": {
63
+ "clsx": "^2.1.1",
64
+ "ini": "^4.1.0",
65
+ "microdiff": "^1.5.0",
66
+ "server-only": "^0.0.1",
67
+ "tailwind-merge": "^3.5.0"
68
+ },
69
+ "peerDependencies": {
70
+ "hazo_auth": "^6.0.0",
71
+ "hazo_config": "^2.1.0",
72
+ "hazo_connect": "^2.6.0",
73
+ "hazo_logs": "^1.0.13",
74
+ "hazo_ui": "^2.8.0",
75
+ "next": "^14.0.0 || ^16.0.0",
76
+ "react": "^18.0.0 || ^19.0.0",
77
+ "react-dom": "^18.0.0 || ^19.0.0"
78
+ },
79
+ "peerDependenciesMeta": {
80
+ "hazo_auth": { "optional": true },
81
+ "hazo_logs": { "optional": true },
82
+ "hazo_ui": { "optional": true },
83
+ "next": { "optional": true },
84
+ "react": { "optional": true },
85
+ "react-dom": { "optional": true }
86
+ },
87
+ "devDependencies": {
88
+ "@types/ini": "^4.1.1",
89
+ "@types/node": "^20.14.10",
90
+ "@types/react": "^18.3.3",
91
+ "@types/react-dom": "^18.3.0",
92
+ "hazo_auth": "^6.0.0",
93
+ "hazo_config": "^2.1.0",
94
+ "hazo_connect": "^2.7.0",
95
+ "hazo_logs": "^1.0.13",
96
+ "next": "^14.2.33",
97
+ "react": "^18.3.1",
98
+ "react-dom": "^18.3.1",
99
+ "typescript": "^5.7.2"
100
+ }
101
+ }