@tumbaland/backend-core 1.38.0 → 1.40.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 (77) hide show
  1. package/dist/apiKeys/ApiKey.d.ts +11 -0
  2. package/dist/apiKeys/ApiKey.d.ts.map +1 -1
  3. package/dist/apiKeys/ApiKey.js +14 -1
  4. package/dist/apiKeys/ApiKey.js.map +1 -1
  5. package/dist/apiKeys/middleware.d.ts +12 -0
  6. package/dist/apiKeys/middleware.d.ts.map +1 -1
  7. package/dist/apiKeys/middleware.js +16 -4
  8. package/dist/apiKeys/middleware.js.map +1 -1
  9. package/dist/apiKeys/service.d.ts.map +1 -1
  10. package/dist/apiKeys/service.js +1 -0
  11. package/dist/apiKeys/service.js.map +1 -1
  12. package/dist/apiKeys/types.d.ts +2 -0
  13. package/dist/apiKeys/types.d.ts.map +1 -1
  14. package/dist/audit/AuditEvent.d.ts +82 -0
  15. package/dist/audit/AuditEvent.d.ts.map +1 -0
  16. package/dist/audit/AuditEvent.js +77 -0
  17. package/dist/audit/AuditEvent.js.map +1 -0
  18. package/dist/audit/actor.d.ts +41 -0
  19. package/dist/audit/actor.d.ts.map +1 -0
  20. package/dist/audit/actor.js +39 -0
  21. package/dist/audit/actor.js.map +1 -0
  22. package/dist/audit/context.d.ts +40 -0
  23. package/dist/audit/context.d.ts.map +1 -0
  24. package/dist/audit/context.js +60 -0
  25. package/dist/audit/context.js.map +1 -0
  26. package/dist/audit/index.d.ts +12 -0
  27. package/dist/audit/index.d.ts.map +1 -0
  28. package/dist/audit/index.js +22 -0
  29. package/dist/audit/index.js.map +1 -0
  30. package/dist/audit/plugin.d.ts +23 -0
  31. package/dist/audit/plugin.d.ts.map +1 -0
  32. package/dist/audit/plugin.js +226 -0
  33. package/dist/audit/plugin.js.map +1 -0
  34. package/dist/audit/reads.d.ts +47 -0
  35. package/dist/audit/reads.d.ts.map +1 -0
  36. package/dist/audit/reads.js +94 -0
  37. package/dist/audit/reads.js.map +1 -0
  38. package/dist/audit/service.d.ts +51 -0
  39. package/dist/audit/service.d.ts.map +1 -0
  40. package/dist/audit/service.js +66 -0
  41. package/dist/audit/service.js.map +1 -0
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +1 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/oauth/models.d.ts.map +1 -1
  47. package/dist/oauth/models.js +10 -0
  48. package/dist/oauth/models.js.map +1 -1
  49. package/dist/oauth/tokens.d.ts +15 -0
  50. package/dist/oauth/tokens.d.ts.map +1 -1
  51. package/dist/oauth/tokens.js +5 -1
  52. package/dist/oauth/tokens.js.map +1 -1
  53. package/package.json +1 -1
  54. package/src/apiKeys/ApiKey.test.ts +25 -1
  55. package/src/apiKeys/ApiKey.ts +15 -0
  56. package/src/apiKeys/middleware.test.ts +26 -3
  57. package/src/apiKeys/middleware.ts +32 -5
  58. package/src/apiKeys/service.test.ts +2 -0
  59. package/src/apiKeys/service.ts +1 -0
  60. package/src/apiKeys/types.ts +2 -0
  61. package/src/audit/AuditEvent.ts +123 -0
  62. package/src/audit/actor.test.ts +95 -0
  63. package/src/audit/actor.ts +68 -0
  64. package/src/audit/context.test.ts +91 -0
  65. package/src/audit/context.ts +83 -0
  66. package/src/audit/index.ts +11 -0
  67. package/src/audit/plugin.test.ts +258 -0
  68. package/src/audit/plugin.ts +254 -0
  69. package/src/audit/reads.test.ts +164 -0
  70. package/src/audit/reads.ts +88 -0
  71. package/src/audit/service.test.ts +115 -0
  72. package/src/audit/service.ts +95 -0
  73. package/src/index.ts +1 -0
  74. package/src/middleware/authMiddleware.test.ts +3 -1
  75. package/src/oauth/models.ts +11 -0
  76. package/src/oauth/tokens.test.ts +2 -0
  77. package/src/oauth/tokens.ts +20 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjD,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC5F,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listAuditEvents = exports.resourceOf = exports.countRead = exports.auditReads = exports.auditPlugin = exports.withAuditContext = exports.currentAuditContext = exports.beginAudit = exports.auditContext = exports.AuditEvent = exports.describeActor = exports.actorOf = void 0;
4
+ var actor_1 = require("./actor");
5
+ Object.defineProperty(exports, "actorOf", { enumerable: true, get: function () { return actor_1.actorOf; } });
6
+ Object.defineProperty(exports, "describeActor", { enumerable: true, get: function () { return actor_1.describeActor; } });
7
+ var AuditEvent_1 = require("./AuditEvent");
8
+ Object.defineProperty(exports, "AuditEvent", { enumerable: true, get: function () { return AuditEvent_1.AuditEvent; } });
9
+ var context_1 = require("./context");
10
+ Object.defineProperty(exports, "auditContext", { enumerable: true, get: function () { return context_1.auditContext; } });
11
+ Object.defineProperty(exports, "beginAudit", { enumerable: true, get: function () { return context_1.beginAudit; } });
12
+ Object.defineProperty(exports, "currentAuditContext", { enumerable: true, get: function () { return context_1.currentAuditContext; } });
13
+ Object.defineProperty(exports, "withAuditContext", { enumerable: true, get: function () { return context_1.withAuditContext; } });
14
+ var plugin_1 = require("./plugin");
15
+ Object.defineProperty(exports, "auditPlugin", { enumerable: true, get: function () { return plugin_1.auditPlugin; } });
16
+ var reads_1 = require("./reads");
17
+ Object.defineProperty(exports, "auditReads", { enumerable: true, get: function () { return reads_1.auditReads; } });
18
+ Object.defineProperty(exports, "countRead", { enumerable: true, get: function () { return reads_1.countRead; } });
19
+ Object.defineProperty(exports, "resourceOf", { enumerable: true, get: function () { return reads_1.resourceOf; } });
20
+ var service_1 = require("./service");
21
+ Object.defineProperty(exports, "listAuditEvents", { enumerable: true, get: function () { return service_1.listAuditEvents; } });
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":";;;AAAA,iCAAiD;AAAxC,gGAAA,OAAO,OAAA;AAAE,sGAAA,aAAa,OAAA;AAE/B,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AAEnB,qCAA4F;AAAnF,uGAAA,YAAY,OAAA;AAAE,qGAAA,UAAU,OAAA;AAAE,8GAAA,mBAAmB,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAExE,mCAAuC;AAA9B,qGAAA,WAAW,OAAA;AAEpB,iCAA4D;AAAnD,mGAAA,UAAU,OAAA;AAAE,kGAAA,SAAS,OAAA;AAAE,mGAAA,UAAU,OAAA;AAC1C,qCAA4C;AAAnC,0GAAA,eAAe,OAAA"}
@@ -0,0 +1,23 @@
1
+ import type { Schema } from 'mongoose';
2
+ export interface AuditPluginOptions {
3
+ /** what these documents are called in a trail — 'activity', 'photo' */
4
+ resource: string;
5
+ /** fields never worth recording the content of */
6
+ redact?: string[];
7
+ }
8
+ /**
9
+ * Attribute and record every write to a collection.
10
+ *
11
+ * Applied to a model rather than called from its controllers, for two reasons.
12
+ * The data layer is the only place that knows which fields actually changed —
13
+ * a controller sees the patch that was requested, not the difference it made,
14
+ * and those differ whenever a field was already the value being set. And a
15
+ * plugin cannot be forgotten: a new endpoint that writes through the model is
16
+ * audited without anyone remembering to add a line.
17
+ *
18
+ * Writes made outside a request — a migration, a backfill script — find no
19
+ * actor and are recorded as nothing, which is honest. A row claiming a script
20
+ * was a person would be worse than no row.
21
+ */
22
+ export declare function auditPlugin(schema: Schema, options: AuditPluginOptions): void;
23
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/audit/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,MAAM,EAAE,MAAM,UAAU,CAAC;AA6D9C,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CA2K7E"}
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.auditPlugin = auditPlugin;
7
+ const logger_1 = __importDefault(require("../logging/logger"));
8
+ const AuditEvent_1 = require("./AuditEvent");
9
+ const context_1 = require("./context");
10
+ /** Bookkeeping fields nobody wants to read in a change list. */
11
+ const NOISE = new Set(['updatedAt', 'createdAt', '__v', 'createdBy', 'updatedBy']);
12
+ /**
13
+ * Where a hook stashes what it read before the write.
14
+ *
15
+ * A symbol on the query object, not `query.set()` — that method writes into the
16
+ * *update payload*, so stashing there would persist the before-image into the
17
+ * document it was taken of. Per-query, so concurrent writes cannot read each
18
+ * other's.
19
+ */
20
+ const BEFORE = Symbol('auditBefore');
21
+ /** Comparable form, so a Date and an ObjectId do not read as changed every time. */
22
+ const plain = (value) => {
23
+ if (value === null || value === undefined)
24
+ return value;
25
+ if (value instanceof Date)
26
+ return value.toISOString();
27
+ if (typeof value === 'object' && 'toHexString' in value)
28
+ return String(value);
29
+ return value;
30
+ };
31
+ const changesBetween = (before, after, fields) => {
32
+ const changes = {};
33
+ for (const field of fields) {
34
+ if (NOISE.has(field))
35
+ continue;
36
+ const from = plain(before?.[field]);
37
+ const to = plain(after?.[field]);
38
+ if (JSON.stringify(from) !== JSON.stringify(to))
39
+ changes[field] = { from, to };
40
+ }
41
+ return Object.keys(changes).length > 0 ? changes : undefined;
42
+ };
43
+ /**
44
+ * Never let recording a thing fail the thing.
45
+ *
46
+ * An audit trail is worth having and is not worth refusing a write over: a
47
+ * failure here means someone loses a row of history, and throwing would mean
48
+ * they lose the entry they were logging. So it is fire-and-forget with the
49
+ * failure written to the ordinary log, where an operator sees it.
50
+ */
51
+ const record = (event) => {
52
+ void AuditEvent_1.AuditEvent.create(event).catch((error) => {
53
+ logger_1.default.warn('Could not record an audit event', {
54
+ error: error?.message,
55
+ action: event.action,
56
+ resource: event.resource
57
+ });
58
+ });
59
+ };
60
+ /**
61
+ * Attribute and record every write to a collection.
62
+ *
63
+ * Applied to a model rather than called from its controllers, for two reasons.
64
+ * The data layer is the only place that knows which fields actually changed —
65
+ * a controller sees the patch that was requested, not the difference it made,
66
+ * and those differ whenever a field was already the value being set. And a
67
+ * plugin cannot be forgotten: a new endpoint that writes through the model is
68
+ * audited without anyone remembering to add a line.
69
+ *
70
+ * Writes made outside a request — a migration, a backfill script — find no
71
+ * actor and are recorded as nothing, which is honest. A row claiming a script
72
+ * was a person would be worse than no row.
73
+ */
74
+ function auditPlugin(schema, options) {
75
+ const { resource, redact = [] } = options;
76
+ const hide = new Set(redact);
77
+ const visible = (doc) => Object.fromEntries(Object.entries(doc)
78
+ .filter(([key]) => !NOISE.has(key) && !hide.has(key))
79
+ .map(([key, value]) => [key, plain(value)]));
80
+ // Who last touched this, on the record itself. Denormalized on purpose: a day
81
+ // view showing "logged by Claude" should not have to query a second
82
+ // collection for every row it renders.
83
+ schema.add({
84
+ createdBy: { type: String },
85
+ updatedBy: { type: String }
86
+ });
87
+ schema.pre('save', async function () {
88
+ const context = (0, context_1.currentAuditContext)();
89
+ if (!context)
90
+ return;
91
+ const label = context.actor.label;
92
+ if (this.isNew)
93
+ this.set('createdBy', label);
94
+ this.set('updatedBy', label);
95
+ // `isNew` is false by the time the post hook runs, so it is carried here.
96
+ // Recording every save as a create was the original mistake: any code that
97
+ // loads a document, changes a field and saves it — revoking an API key,
98
+ // counting a reveal — would appear in the trail as the thing being created
99
+ // again, with a fresh snapshot and no sign of what actually changed.
100
+ this.$locals.auditWasNew = this.isNew;
101
+ if (this.isNew)
102
+ return;
103
+ this.$locals.auditPaths = this.modifiedPaths().filter((path) => !NOISE.has(path));
104
+ this.$locals.auditBefore = await this.constructor
105
+ .findById(this._id)
106
+ .lean();
107
+ });
108
+ schema.post('save', function (doc) {
109
+ const context = (0, context_1.currentAuditContext)();
110
+ if (!context)
111
+ return;
112
+ const common = {
113
+ at: new Date(),
114
+ service: context.service,
115
+ resource,
116
+ resourceId: String(doc._id),
117
+ actorKind: context.actor.kind,
118
+ userId: context.actor.userId,
119
+ actorLabel: context.actor.label,
120
+ actorCredentialId: context.actor.credentialId,
121
+ tenant: context.actor.tenant
122
+ };
123
+ if (doc.$locals.auditWasNew) {
124
+ record({ ...common, action: 'create', snapshot: visible(doc.toObject()) });
125
+ return;
126
+ }
127
+ const before = (doc.$locals.auditBefore ?? {});
128
+ const paths = (doc.$locals.auditPaths ?? []);
129
+ const changes = changesBetween(before, doc.toObject(), paths);
130
+ if (!changes)
131
+ return;
132
+ record({ ...common, action: 'update', changes });
133
+ });
134
+ // The document as it stood, fetched before the write so there is something to
135
+ // compare against. Held on the query, which is per-operation, so concurrent
136
+ // updates cannot read each other's.
137
+ schema.pre('findOneAndUpdate', async function () {
138
+ const context = (0, context_1.currentAuditContext)();
139
+ if (!context)
140
+ return;
141
+ this[BEFORE] = await this.model
142
+ .findOne(this.getQuery())
143
+ .lean();
144
+ // This one genuinely belongs in the update: it is a field on the document.
145
+ this.set('updatedBy', context.actor.label);
146
+ });
147
+ schema.post('findOneAndUpdate', function (doc) {
148
+ const context = (0, context_1.currentAuditContext)();
149
+ if (!context || !doc)
150
+ return;
151
+ const before = (this[BEFORE] ?? {});
152
+ const after = doc.toObject ? doc.toObject() : doc;
153
+ // Only the fields the update touched: comparing everything would report a
154
+ // change on any field a concurrent write happened to move.
155
+ const update = (this.getUpdate() ?? {});
156
+ const touched = Object.keys(update.$set ?? update);
157
+ const changes = changesBetween(before, after, touched);
158
+ if (!changes)
159
+ return;
160
+ record({
161
+ at: new Date(),
162
+ service: context.service,
163
+ action: 'update',
164
+ resource,
165
+ resourceId: String(doc._id),
166
+ actorKind: context.actor.kind,
167
+ userId: context.actor.userId,
168
+ actorLabel: context.actor.label,
169
+ actorCredentialId: context.actor.credentialId,
170
+ tenant: context.actor.tenant,
171
+ changes
172
+ });
173
+ });
174
+ schema.post('findOneAndDelete', function (doc) {
175
+ const context = (0, context_1.currentAuditContext)();
176
+ if (!context || !doc)
177
+ return;
178
+ record({
179
+ at: new Date(),
180
+ service: context.service,
181
+ action: 'delete',
182
+ resource,
183
+ resourceId: String(doc._id),
184
+ actorKind: context.actor.kind,
185
+ userId: context.actor.userId,
186
+ actorLabel: context.actor.label,
187
+ actorCredentialId: context.actor.credentialId,
188
+ tenant: context.actor.tenant,
189
+ // The whole document, because a delete is the one action whose record is
190
+ // the only remaining copy of what was there.
191
+ snapshot: visible(doc.toObject ? doc.toObject() : doc)
192
+ });
193
+ });
194
+ // Bulk deletes are read back first, one row each. A day's save deletes the
195
+ // entries it is replacing, and "the day editor removed three things" is
196
+ // exactly the change someone would come here to find.
197
+ schema.pre('deleteMany', async function () {
198
+ if (!(0, context_1.currentAuditContext)())
199
+ return;
200
+ this[BEFORE] = await this.model
201
+ .find(this.getQuery())
202
+ .lean();
203
+ });
204
+ schema.post('deleteMany', function () {
205
+ const context = (0, context_1.currentAuditContext)();
206
+ if (!context)
207
+ return;
208
+ const doomed = (this[BEFORE] ?? []);
209
+ for (const doc of doomed) {
210
+ record({
211
+ at: new Date(),
212
+ service: context.service,
213
+ action: 'delete',
214
+ resource,
215
+ resourceId: String(doc._id),
216
+ actorKind: context.actor.kind,
217
+ userId: context.actor.userId,
218
+ actorLabel: context.actor.label,
219
+ actorCredentialId: context.actor.credentialId,
220
+ tenant: context.actor.tenant,
221
+ snapshot: visible(doc)
222
+ });
223
+ }
224
+ });
225
+ }
226
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/audit/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { Request, RequestHandler, Response } from 'express';
2
+ import { type Actor } from './actor';
3
+ /**
4
+ * Record what software read, and only what software read.
5
+ *
6
+ * A person browsing their own journal generates nothing here. That is not a
7
+ * shortcut: one dashboard load hits half a dozen endpoints, so logging it would
8
+ * bury the interesting rows under thousands of uninteresting ones and put a
9
+ * database write behind every page view.
10
+ *
11
+ * What an assistant read is the part worth keeping, because it is the part that
12
+ * left the server. A created entry leaves a record behind either way; a read
13
+ * leaves nothing at all, and it is exactly what the privacy page warns about —
14
+ * ask an assistant what you did last month and those entries go to whoever runs
15
+ * it. This is the only place that becomes visible.
16
+ */
17
+ /**
18
+ * Arm the read trail for one request, if it is one worth recording.
19
+ *
20
+ * Nothing is written here — the listener fires when the response finishes, so a
21
+ * refused request is not recorded as a read and the count reflects what was
22
+ * actually sent.
23
+ */
24
+ export declare function recordRead(req: Request, res: Response, actor: Actor, service: string): void;
25
+ /**
26
+ * The same thing as standalone middleware, for anything that authenticates its
27
+ * own way rather than through `authenticateAgent`.
28
+ */
29
+ export declare const auditReads: (service: string) => RequestHandler;
30
+ /**
31
+ * What a path was asking for, in one word.
32
+ *
33
+ * The first path segment, which is the collection on every route here —
34
+ * `/api/activities/68d6…` is about activities. Deliberately crude: a trail
35
+ * naming the resource is readable, and one naming the full path with ids in it
36
+ * is a request log wearing an audit log's clothes.
37
+ */
38
+ export declare function resourceOf(path: string): string;
39
+ /**
40
+ * How many records a response carried.
41
+ *
42
+ * Set by a handler that knows; absent otherwise. The size of what left the
43
+ * server is most of what makes a read worth recording — "read the journal" and
44
+ * "read four hundred entries of the journal" are different events.
45
+ */
46
+ export declare const countRead: (res: Response, count: number) => void;
47
+ //# sourceMappingURL=reads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reads.d.ts","sourceRoot":"","sources":["../../src/audit/reads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/E,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9C;;;;;;;;;;;;;GAaG;AACH;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAqB3F;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,GACpB,SAAS,MAAM,KAAG,cAKlB,CAAC;AAEJ;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,QAAQ,EAAE,OAAO,MAAM,KAAG,IAMxD,CAAC"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.countRead = exports.auditReads = void 0;
7
+ exports.recordRead = recordRead;
8
+ exports.resourceOf = resourceOf;
9
+ const AuditEvent_1 = require("./AuditEvent");
10
+ const actor_1 = require("./actor");
11
+ const logger_1 = __importDefault(require("../logging/logger"));
12
+ /**
13
+ * Record what software read, and only what software read.
14
+ *
15
+ * A person browsing their own journal generates nothing here. That is not a
16
+ * shortcut: one dashboard load hits half a dozen endpoints, so logging it would
17
+ * bury the interesting rows under thousands of uninteresting ones and put a
18
+ * database write behind every page view.
19
+ *
20
+ * What an assistant read is the part worth keeping, because it is the part that
21
+ * left the server. A created entry leaves a record behind either way; a read
22
+ * leaves nothing at all, and it is exactly what the privacy page warns about —
23
+ * ask an assistant what you did last month and those entries go to whoever runs
24
+ * it. This is the only place that becomes visible.
25
+ */
26
+ /**
27
+ * Arm the read trail for one request, if it is one worth recording.
28
+ *
29
+ * Nothing is written here — the listener fires when the response finishes, so a
30
+ * refused request is not recorded as a read and the count reflects what was
31
+ * actually sent.
32
+ */
33
+ function recordRead(req, res, actor, service) {
34
+ if (req.method !== 'GET' || actor.kind === 'person')
35
+ return;
36
+ res.on('finish', () => {
37
+ if (res.statusCode >= 400)
38
+ return;
39
+ void AuditEvent_1.AuditEvent.create({
40
+ at: new Date(),
41
+ service,
42
+ action: 'read',
43
+ resource: resourceOf(req.baseUrl + req.path),
44
+ actorKind: actor.kind,
45
+ userId: actor.userId,
46
+ actorLabel: actor.label,
47
+ actorCredentialId: actor.credentialId,
48
+ tenant: actor.tenant,
49
+ count: res.locals.auditCount
50
+ }).catch((error) => {
51
+ logger_1.default.warn('Could not record a read', { error: error?.message });
52
+ });
53
+ });
54
+ }
55
+ /**
56
+ * The same thing as standalone middleware, for anything that authenticates its
57
+ * own way rather than through `authenticateAgent`.
58
+ */
59
+ const auditReads = (service) => (req, res, next) => {
60
+ const actor = (0, actor_1.actorOf)(req);
61
+ if (actor)
62
+ recordRead(req, res, actor, service);
63
+ next();
64
+ };
65
+ exports.auditReads = auditReads;
66
+ /**
67
+ * What a path was asking for, in one word.
68
+ *
69
+ * The first path segment, which is the collection on every route here —
70
+ * `/api/activities/68d6…` is about activities. Deliberately crude: a trail
71
+ * naming the resource is readable, and one naming the full path with ids in it
72
+ * is a request log wearing an audit log's clothes.
73
+ */
74
+ function resourceOf(path) {
75
+ const segments = path.split('/').filter((segment) => segment && segment !== 'api');
76
+ return segments[0]?.replace(/-/g, '_') ?? 'unknown';
77
+ }
78
+ /**
79
+ * How many records a response carried.
80
+ *
81
+ * Set by a handler that knows; absent otherwise. The size of what left the
82
+ * server is most of what makes a read worth recording — "read the journal" and
83
+ * "read four hundred entries of the journal" are different events.
84
+ */
85
+ const countRead = (res, count) => {
86
+ // Guarded for the same reason recording is fire-and-forget: instrumentation
87
+ // must not be able to fail the thing it instruments. Express always provides
88
+ // `locals`, but a handler called directly does not have to.
89
+ if (!res?.locals)
90
+ return;
91
+ res.locals.auditCount = count;
92
+ };
93
+ exports.countRead = countRead;
94
+ //# sourceMappingURL=reads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reads.js","sourceRoot":"","sources":["../../src/audit/reads.ts"],"names":[],"mappings":";;;;;;AA0BA,gCAqBC;AAsBD,gCAGC;AAvED,6CAA0C;AAC1C,mCAA8C;AAC9C,+DAAuC;AAEvC;;;;;;;;;;;;;GAaG;AACH;;;;;;GAMG;AACH,SAAgB,UAAU,CAAC,GAAY,EAAE,GAAa,EAAE,KAAY,EAAE,OAAe;IACnF,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO;IAE5D,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACpB,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG;YAAE,OAAO;QAElC,KAAK,uBAAU,CAAC,MAAM,CAAC;YACrB,EAAE,EAAE,IAAI,IAAI,EAAE;YACd,OAAO;YACP,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;YAC5C,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,KAAK;YACvB,iBAAiB,EAAE,KAAK,CAAC,YAAY;YACrC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,UAAgC;SACnD,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,gBAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAG,KAAe,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACI,MAAM,UAAU,GACrB,CAAC,OAAe,EAAkB,EAAE,CACpC,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;IACxD,MAAM,KAAK,GAAG,IAAA,eAAO,EAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,KAAK;QAAE,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAChD,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AANS,QAAA,UAAU,cAMnB;AAEJ;;;;;;;GAOG;AACH,SAAgB,UAAU,CAAC,IAAY;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC;IACnF,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC;AACtD,CAAC;AAED;;;;;;GAMG;AACI,MAAM,SAAS,GAAG,CAAC,GAAa,EAAE,KAAa,EAAQ,EAAE;IAC9D,4EAA4E;IAC5E,6EAA6E;IAC7E,4DAA4D;IAC5D,IAAI,CAAC,GAAG,EAAE,MAAM;QAAE,OAAO;IACzB,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;AAChC,CAAC,CAAC;AANW,QAAA,SAAS,aAMpB"}
@@ -0,0 +1,51 @@
1
+ import { type IAuditEvent, type ToolCall } from './AuditEvent';
2
+ import type { ActorKind } from './actor';
3
+ export interface AuditQuery {
4
+ userId: string;
5
+ /** narrow to one actor — a key's id or an OAuth client id */
6
+ credentialId?: string;
7
+ actorKind?: ActorKind;
8
+ action?: IAuditEvent['action'];
9
+ resource?: string;
10
+ /** narrow to one area — 'relationship-service', 'album-service' */
11
+ service?: string;
12
+ from?: Date;
13
+ to?: Date;
14
+ limit?: number;
15
+ page?: number;
16
+ }
17
+ export interface AuditEntry {
18
+ id: string;
19
+ at: string;
20
+ service: string;
21
+ action: IAuditEvent['action'];
22
+ resource: string;
23
+ resourceId?: string;
24
+ actorKind: ActorKind;
25
+ actorLabel: string;
26
+ actorCredentialId?: string;
27
+ tenant: string;
28
+ changes?: Record<string, {
29
+ from: unknown;
30
+ to: unknown;
31
+ }>;
32
+ snapshot?: Record<string, unknown>;
33
+ count?: number;
34
+ /** present on 'call': which tool ran, how long it took, and what it cost */
35
+ tool?: ToolCall;
36
+ }
37
+ /**
38
+ * One account's trail, newest first.
39
+ *
40
+ * Always scoped to `userId` by the query rather than filtered afterwards, so
41
+ * there is no path where a wider read is one forgotten condition away. The trail
42
+ * carries old values of journal entries, which makes it as sensitive as the
43
+ * journal itself.
44
+ */
45
+ export declare const listAuditEvents: (query: AuditQuery) => Promise<{
46
+ events: AuditEntry[];
47
+ total: number;
48
+ page: number;
49
+ totalPages: number;
50
+ }>;
51
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/audit/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,EAAE,CAAC,EAAE,IAAI,CAAC;IACV,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAmBD;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,UAAU,KAChB,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CA+BnF,CAAC"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listAuditEvents = void 0;
4
+ const AuditEvent_1 = require("./AuditEvent");
5
+ const toEntry = (event) => ({
6
+ id: String(event._id),
7
+ at: event.at.toISOString(),
8
+ service: event.service,
9
+ action: event.action,
10
+ resource: event.resource,
11
+ resourceId: event.resourceId,
12
+ actorKind: event.actorKind,
13
+ actorLabel: event.actorLabel,
14
+ actorCredentialId: event.actorCredentialId,
15
+ tenant: event.tenant,
16
+ changes: event.changes,
17
+ snapshot: event.snapshot,
18
+ count: event.count,
19
+ tool: event.tool
20
+ });
21
+ /**
22
+ * One account's trail, newest first.
23
+ *
24
+ * Always scoped to `userId` by the query rather than filtered afterwards, so
25
+ * there is no path where a wider read is one forgotten condition away. The trail
26
+ * carries old values of journal entries, which makes it as sensitive as the
27
+ * journal itself.
28
+ */
29
+ const listAuditEvents = async (query) => {
30
+ const limit = Math.min(query.limit ?? 50, 200);
31
+ const page = Math.max(query.page ?? 1, 1);
32
+ const filter = { userId: query.userId };
33
+ if (query.credentialId)
34
+ filter.actorCredentialId = query.credentialId;
35
+ if (query.actorKind)
36
+ filter.actorKind = query.actorKind;
37
+ if (query.action)
38
+ filter.action = query.action;
39
+ if (query.resource)
40
+ filter.resource = query.resource;
41
+ if (query.service)
42
+ filter.service = query.service;
43
+ if (query.from || query.to) {
44
+ const at = {};
45
+ if (query.from)
46
+ at.$gte = query.from;
47
+ if (query.to)
48
+ at.$lte = query.to;
49
+ filter.at = at;
50
+ }
51
+ const [events, total] = await Promise.all([
52
+ AuditEvent_1.AuditEvent.find(filter)
53
+ .sort({ at: -1 })
54
+ .skip((page - 1) * limit)
55
+ .limit(limit),
56
+ AuditEvent_1.AuditEvent.countDocuments(filter)
57
+ ]);
58
+ return {
59
+ events: events.map(toEntry),
60
+ total,
61
+ page,
62
+ totalPages: Math.ceil(total / limit)
63
+ };
64
+ };
65
+ exports.listAuditEvents = listAuditEvents;
66
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/audit/service.ts"],"names":[],"mappings":";;;AAAA,6CAA2E;AAoC3E,MAAM,OAAO,GAAG,CAAC,KAAkB,EAAc,EAAE,CAAC,CAAC;IACnD,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;IACrB,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE;IAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;IACtB,MAAM,EAAE,KAAK,CAAC,MAAM;IACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;IACxB,UAAU,EAAE,KAAK,CAAC,UAAU;IAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;IAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;IAC5B,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;IAC1C,MAAM,EAAE,KAAK,CAAC,MAAM;IACpB,OAAO,EAAE,KAAK,CAAC,OAAO;IACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;IACxB,KAAK,EAAE,KAAK,CAAC,KAAK;IAClB,IAAI,EAAE,KAAK,CAAC,IAAI;CACjB,CAAC,CAAC;AAEH;;;;;;;GAOG;AACI,MAAM,eAAe,GAAG,KAAK,EAClC,KAAiB,EACmE,EAAE;IACtF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1C,MAAM,MAAM,GAA4B,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACjE,IAAI,KAAK,CAAC,YAAY;QAAE,MAAM,CAAC,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAAC;IACtE,IAAI,KAAK,CAAC,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/C,IAAI,KAAK,CAAC,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IACrD,IAAI,KAAK,CAAC,OAAO;QAAE,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAClD,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAyB,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,IAAI;YAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACrC,IAAI,KAAK,CAAC,EAAE;YAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxC,uBAAU,CAAC,IAAI,CAAC,MAAM,CAAC;aACpB,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;aAChB,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;aACxB,KAAK,CAAC,KAAK,CAAC;QACf,uBAAU,CAAC,cAAc,CAAC,MAAM,CAAC;KAClC,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC3B,KAAK;QACL,IAAI;QACJ,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;KACrC,CAAC;AACJ,CAAC,CAAC;AAjCW,QAAA,eAAe,mBAiC1B"}
package/dist/index.d.ts CHANGED
@@ -14,6 +14,7 @@ export * from './entitlements';
14
14
  export * from './groups';
15
15
  export * from './apiKeys';
16
16
  export * from './oauth';
17
+ export * from './audit';
17
18
  export { authenticateToken, optionalAuth } from './middleware/authMiddleware';
18
19
  export { requireInternalServiceToken, internalServiceTokenBypass, allowUserOrInternalService, verifyInternalToken, INTERNAL_TOKEN_HEADER, SERVICE_ID_HEADER } from './middleware/internalServiceAuth';
19
20
  export { createCorsMiddleware } from './middleware/corsMiddleware';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAG9D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC7K,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAGjE,cAAc,gBAAgB,CAAC;AAG/B,cAAc,UAAU,CAAC;AAGzB,cAAc,WAAW,CAAC;AAG1B,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAC1G,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACnH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG9E,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACT,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,UAAU,EACV,aAAa,EACb,kBAAkB,EACnB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAG9D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC7K,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAGjE,cAAc,gBAAgB,CAAC;AAG/B,cAAc,UAAU,CAAC;AAGzB,cAAc,WAAW,CAAC;AAG1B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAC1G,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACnH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG9E,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACT,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,UAAU,EACV,aAAa,EACb,kBAAkB,EACnB,MAAM,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -60,6 +60,7 @@ __exportStar(require("./groups"), exports);
60
60
  __exportStar(require("./apiKeys"), exports);
61
61
  // OAuth 2.1 authorization server, for assistants connecting over MCP
62
62
  __exportStar(require("./oauth"), exports);
63
+ __exportStar(require("./audit"), exports);
63
64
  // Middleware
64
65
  var authMiddleware_1 = require("./middleware/authMiddleware");
65
66
  Object.defineProperty(exports, "authenticateToken", { enumerable: true, get: function () { return authMiddleware_1.authenticateToken; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,qFAAqF;;;;;;;;;;;;;;;;;;;;;AAErF,gBAAgB;AAChB,qDAAoD;AAA3C,8GAAA,aAAa,OAAA;AAEtB,2CAAkD;AAAzC,4GAAA,gBAAgB,OAAA;AAGzB,UAAU;AACV,2CAAqD;AAA5C,iHAAA,OAAO,OAAU;AAE1B,gBAAgB;AAChB,8DAAoF;AAA3E,+GAAA,WAAW,OAAA;AAAE,8GAAA,UAAU,OAAA;AAAE,kHAAA,cAAc,OAAA;AAChD,gEAA+D;AAAtD,sHAAA,iBAAiB,OAAA;AAG1B,WAAW;AACX,oDAAgE;AAAvD,uGAAA,SAAS,OAAA;AAAE,0GAAA,YAAY,OAAA;AAEhC,SAAS;AACT,oCAA0C;AAAjC,iGAAA,UAAU,OAAA;AAEnB,SAAS;AACT,gDAA6K;AAApK,sGAAA,SAAS,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAAE,2GAAA,cAAc,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,iHAAA,oBAAoB,OAAA;AAAE,iHAAA,oBAAoB,OAAA;AAGhJ,wDAAwD;AACxD,iDAA+B;AAE/B,0DAA0D;AAC1D,2CAAyB;AAEzB,+DAA+D;AAC/D,4CAA0B;AAE1B,qEAAqE;AACrE,0CAAwB;AAExB,aAAa;AACb,8DAA8E;AAArE,mHAAA,iBAAiB,OAAA;AAAE,8GAAA,YAAY,OAAA;AACxC,wEAO0C;AANxC,kIAAA,2BAA2B,OAAA;AAC3B,iIAAA,0BAA0B,OAAA;AAC1B,iIAAA,0BAA0B,OAAA;AAC1B,0HAAA,mBAAmB,OAAA;AACnB,4HAAA,qBAAqB,OAAA;AACrB,wHAAA,iBAAiB,OAAA;AAEnB,8DAAmE;AAA1D,sHAAA,oBAAoB,OAAA;AAC7B,0DAAyD;AAAhD,4GAAA,YAAY,OAAA;AACrB,4DAA0G;AAAjG,8GAAA,aAAa,OAAA;AAAE,yHAAA,wBAAwB,OAAA;AAAE,oHAAA,mBAAmB,OAAA;AACrE,kDAAmH;AAA1G,2GAAA,eAAe,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AACnF,kDAAiD;AAAxC,oGAAA,QAAQ,OAAA;AAKjB,QAAQ;AACR,mDAAmF;AAA1E,oHAAA,qBAAqB,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AACrD,6CAA6E;AAApE,6GAAA,iBAAiB,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,qGAAA,SAAS,OAAA;AAElD,2DAA8E;AAArE,mHAAA,gBAAgB,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAE5C,UAAU;AACV,qCAQmB;AAPjB,4GAAA,iBAAiB,OAAA;AACjB,8GAAA,mBAAmB,OAAA;AACnB,4GAAA,iBAAiB,OAAA;AACjB,gHAAA,qBAAqB,OAAA;AACrB,+GAAA,oBAAoB,OAAA;AACpB,0GAAA,eAAe,OAAA;AACf,mGAAA,QAAQ,OAAA;AAGV,UAAU;AACV,qCAUmB;AATjB,qGAAA,UAAU,OAAA;AACV,oGAAA,SAAS,OAAA;AACT,oGAAA,SAAS,OAAA;AACT,4GAAA,iBAAiB,OAAA;AACjB,0GAAA,eAAe,OAAA;AACf,oGAAA,SAAS,OAAA;AACT,qGAAA,UAAU,OAAA;AACV,wGAAA,aAAa,OAAA;AACb,6GAAA,kBAAkB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,qFAAqF;;;;;;;;;;;;;;;;;;;;;AAErF,gBAAgB;AAChB,qDAAoD;AAA3C,8GAAA,aAAa,OAAA;AAEtB,2CAAkD;AAAzC,4GAAA,gBAAgB,OAAA;AAGzB,UAAU;AACV,2CAAqD;AAA5C,iHAAA,OAAO,OAAU;AAE1B,gBAAgB;AAChB,8DAAoF;AAA3E,+GAAA,WAAW,OAAA;AAAE,8GAAA,UAAU,OAAA;AAAE,kHAAA,cAAc,OAAA;AAChD,gEAA+D;AAAtD,sHAAA,iBAAiB,OAAA;AAG1B,WAAW;AACX,oDAAgE;AAAvD,uGAAA,SAAS,OAAA;AAAE,0GAAA,YAAY,OAAA;AAEhC,SAAS;AACT,oCAA0C;AAAjC,iGAAA,UAAU,OAAA;AAEnB,SAAS;AACT,gDAA6K;AAApK,sGAAA,SAAS,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAAE,2GAAA,cAAc,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,iHAAA,oBAAoB,OAAA;AAAE,iHAAA,oBAAoB,OAAA;AAGhJ,wDAAwD;AACxD,iDAA+B;AAE/B,0DAA0D;AAC1D,2CAAyB;AAEzB,+DAA+D;AAC/D,4CAA0B;AAE1B,qEAAqE;AACrE,0CAAwB;AACxB,0CAAwB;AAExB,aAAa;AACb,8DAA8E;AAArE,mHAAA,iBAAiB,OAAA;AAAE,8GAAA,YAAY,OAAA;AACxC,wEAO0C;AANxC,kIAAA,2BAA2B,OAAA;AAC3B,iIAAA,0BAA0B,OAAA;AAC1B,iIAAA,0BAA0B,OAAA;AAC1B,0HAAA,mBAAmB,OAAA;AACnB,4HAAA,qBAAqB,OAAA;AACrB,wHAAA,iBAAiB,OAAA;AAEnB,8DAAmE;AAA1D,sHAAA,oBAAoB,OAAA;AAC7B,0DAAyD;AAAhD,4GAAA,YAAY,OAAA;AACrB,4DAA0G;AAAjG,8GAAA,aAAa,OAAA;AAAE,yHAAA,wBAAwB,OAAA;AAAE,oHAAA,mBAAmB,OAAA;AACrE,kDAAmH;AAA1G,2GAAA,eAAe,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AACnF,kDAAiD;AAAxC,oGAAA,QAAQ,OAAA;AAKjB,QAAQ;AACR,mDAAmF;AAA1E,oHAAA,qBAAqB,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AACrD,6CAA6E;AAApE,6GAAA,iBAAiB,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,qGAAA,SAAS,OAAA;AAElD,2DAA8E;AAArE,mHAAA,gBAAgB,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAE5C,UAAU;AACV,qCAQmB;AAPjB,4GAAA,iBAAiB,OAAA;AACjB,8GAAA,mBAAmB,OAAA;AACnB,4GAAA,iBAAiB,OAAA;AACjB,gHAAA,qBAAqB,OAAA;AACrB,+GAAA,oBAAoB,OAAA;AACpB,0GAAA,eAAe,OAAA;AACf,mGAAA,QAAQ,OAAA;AAGV,UAAU;AACV,qCAUmB;AATjB,qGAAA,UAAU,OAAA;AACV,oGAAA,SAAS,OAAA;AACT,oGAAA,SAAS,OAAA;AACT,4GAAA,iBAAiB,OAAA;AACjB,0GAAA,eAAe,OAAA;AACf,oGAAA,SAAS,OAAA;AACT,qGAAA,UAAU,OAAA;AACV,wGAAA,aAAa,OAAA;AACb,6GAAA,kBAAkB,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/oauth/models.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EAAE,QAAQ,EAAU,MAAM,UAAU,CAAC;AACtD,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAWD,eAAO,MAAM,WAAW;;;;;;qBAE0C,CAAC;AAEnE;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAmB,SAAQ,QAAQ;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,wEAAwE;IACxE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AA4BD,eAAO,MAAM,iBAAiB;;;;;;2BAEsD,CAAC;AAErF;;;;;;;GAOG;AACH,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAuBD,eAAO,MAAM,YAAY;;;;;;sBAE4C,CAAC"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/oauth/models.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EAAE,QAAQ,EAAU,MAAM,UAAU,CAAC;AAEtD,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAWD,eAAO,MAAM,WAAW;;;;;;qBAE0C,CAAC;AAEnE;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAmB,SAAQ,QAAQ;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,wEAAwE;IACxE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AA4BD,eAAO,MAAM,iBAAiB;;;;;;2BAEsD,CAAC;AAErF;;;;;;;GAOG;AACH,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAiCD,eAAO,MAAM,YAAY;;;;;;sBAE4C,CAAC"}