@agentlensai/server 0.8.0 → 0.9.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 (103) hide show
  1. package/dist/db/anonymous-id-manager.d.ts +44 -0
  2. package/dist/db/anonymous-id-manager.d.ts.map +1 -0
  3. package/dist/db/anonymous-id-manager.js +90 -0
  4. package/dist/db/anonymous-id-manager.js.map +1 -0
  5. package/dist/db/capability-store.d.ts +78 -0
  6. package/dist/db/capability-store.d.ts.map +1 -0
  7. package/dist/db/capability-store.js +201 -0
  8. package/dist/db/capability-store.js.map +1 -0
  9. package/dist/db/migrate.d.ts.map +1 -1
  10. package/dist/db/migrate.js +136 -0
  11. package/dist/db/migrate.js.map +1 -1
  12. package/dist/db/schema.sqlite.d.ts +1663 -2
  13. package/dist/db/schema.sqlite.d.ts.map +1 -1
  14. package/dist/db/schema.sqlite.js +135 -1
  15. package/dist/db/schema.sqlite.js.map +1 -1
  16. package/dist/index.d.ts +5 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +32 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/redaction/human-review-layer.d.ts +37 -0
  21. package/dist/lib/redaction/human-review-layer.d.ts.map +1 -0
  22. package/dist/lib/redaction/human-review-layer.js +62 -0
  23. package/dist/lib/redaction/human-review-layer.js.map +1 -0
  24. package/dist/lib/redaction/index.d.ts +12 -0
  25. package/dist/lib/redaction/index.d.ts.map +1 -0
  26. package/dist/lib/redaction/index.js +12 -0
  27. package/dist/lib/redaction/index.js.map +1 -0
  28. package/dist/lib/redaction/pii-detection-layer.d.ts +30 -0
  29. package/dist/lib/redaction/pii-detection-layer.d.ts.map +1 -0
  30. package/dist/lib/redaction/pii-detection-layer.js +183 -0
  31. package/dist/lib/redaction/pii-detection-layer.js.map +1 -0
  32. package/dist/lib/redaction/pipeline.d.ts +26 -0
  33. package/dist/lib/redaction/pipeline.d.ts.map +1 -0
  34. package/dist/lib/redaction/pipeline.js +91 -0
  35. package/dist/lib/redaction/pipeline.js.map +1 -0
  36. package/dist/lib/redaction/secret-detection-layer.d.ts +10 -0
  37. package/dist/lib/redaction/secret-detection-layer.d.ts.map +1 -0
  38. package/dist/lib/redaction/secret-detection-layer.js +79 -0
  39. package/dist/lib/redaction/secret-detection-layer.js.map +1 -0
  40. package/dist/lib/redaction/secret-patterns.d.ts +29 -0
  41. package/dist/lib/redaction/secret-patterns.d.ts.map +1 -0
  42. package/dist/lib/redaction/secret-patterns.js +133 -0
  43. package/dist/lib/redaction/secret-patterns.js.map +1 -0
  44. package/dist/lib/redaction/semantic-denylist-layer.d.ts +10 -0
  45. package/dist/lib/redaction/semantic-denylist-layer.d.ts.map +1 -0
  46. package/dist/lib/redaction/semantic-denylist-layer.js +64 -0
  47. package/dist/lib/redaction/semantic-denylist-layer.js.map +1 -0
  48. package/dist/lib/redaction/tenant-deidentification-layer.d.ts +10 -0
  49. package/dist/lib/redaction/tenant-deidentification-layer.d.ts.map +1 -0
  50. package/dist/lib/redaction/tenant-deidentification-layer.js +64 -0
  51. package/dist/lib/redaction/tenant-deidentification-layer.js.map +1 -0
  52. package/dist/lib/redaction/url-path-scrubbing-layer.d.ts +14 -0
  53. package/dist/lib/redaction/url-path-scrubbing-layer.d.ts.map +1 -0
  54. package/dist/lib/redaction/url-path-scrubbing-layer.js +156 -0
  55. package/dist/lib/redaction/url-path-scrubbing-layer.js.map +1 -0
  56. package/dist/routes/agents.d.ts.map +1 -1
  57. package/dist/routes/agents.js +3 -9
  58. package/dist/routes/agents.js.map +1 -1
  59. package/dist/routes/audit.d.ts +15 -0
  60. package/dist/routes/audit.d.ts.map +1 -0
  61. package/dist/routes/audit.js +177 -0
  62. package/dist/routes/audit.js.map +1 -0
  63. package/dist/routes/capabilities.d.ts +15 -0
  64. package/dist/routes/capabilities.d.ts.map +1 -0
  65. package/dist/routes/capabilities.js +86 -0
  66. package/dist/routes/capabilities.js.map +1 -0
  67. package/dist/routes/community.d.ts +24 -0
  68. package/dist/routes/community.d.ts.map +1 -0
  69. package/dist/routes/community.js +190 -0
  70. package/dist/routes/community.js.map +1 -0
  71. package/dist/routes/delegation.d.ts +20 -0
  72. package/dist/routes/delegation.d.ts.map +1 -0
  73. package/dist/routes/delegation.js +108 -0
  74. package/dist/routes/delegation.js.map +1 -0
  75. package/dist/routes/discovery.d.ts +19 -0
  76. package/dist/routes/discovery.d.ts.map +1 -0
  77. package/dist/routes/discovery.js +96 -0
  78. package/dist/routes/discovery.js.map +1 -0
  79. package/dist/routes/redaction-test.d.ts +14 -0
  80. package/dist/routes/redaction-test.d.ts.map +1 -0
  81. package/dist/routes/redaction-test.js +33 -0
  82. package/dist/routes/redaction-test.js.map +1 -0
  83. package/dist/routes/trust.d.ts +16 -0
  84. package/dist/routes/trust.d.ts.map +1 -0
  85. package/dist/routes/trust.js +23 -0
  86. package/dist/routes/trust.js.map +1 -0
  87. package/dist/services/community-service.d.ts +277 -0
  88. package/dist/services/community-service.d.ts.map +1 -0
  89. package/dist/services/community-service.js +785 -0
  90. package/dist/services/community-service.js.map +1 -0
  91. package/dist/services/delegation-service.d.ts +149 -0
  92. package/dist/services/delegation-service.d.ts.map +1 -0
  93. package/dist/services/delegation-service.js +605 -0
  94. package/dist/services/delegation-service.js.map +1 -0
  95. package/dist/services/discovery-service.d.ts +39 -0
  96. package/dist/services/discovery-service.d.ts.map +1 -0
  97. package/dist/services/discovery-service.js +186 -0
  98. package/dist/services/discovery-service.js.map +1 -0
  99. package/dist/services/trust-service.d.ts +59 -0
  100. package/dist/services/trust-service.d.ts.map +1 -0
  101. package/dist/services/trust-service.js +139 -0
  102. package/dist/services/trust-service.js.map +1 -0
  103. package/package.json +2 -2
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Capability Registration REST API (Story 5.2)
3
+ *
4
+ * PUT /api/agents/:id/capabilities — register a new capability
5
+ * GET /api/agents/:id/capabilities — list agent's capabilities
6
+ * DELETE /api/agents/:id/capabilities/:capabilityId — remove a capability
7
+ */
8
+ import { Hono } from 'hono';
9
+ import { CapabilityStore, ValidationError } from '../db/capability-store.js';
10
+ import { AnonymousIdManager } from '../db/anonymous-id-manager.js';
11
+ import { getTenantStore } from './tenant-helper.js';
12
+ export function capabilityRoutes(store, db) {
13
+ const app = new Hono();
14
+ const capStore = new CapabilityStore(db);
15
+ const anonIdManager = new AnonymousIdManager(db);
16
+ /**
17
+ * Helper to get tenant ID from auth context.
18
+ */
19
+ function getTenantId(c) {
20
+ return c.get('apiKey')?.tenantId ?? 'default';
21
+ }
22
+ // PUT /:id/capabilities — register or update a capability
23
+ app.put('/:id/capabilities', async (c) => {
24
+ const tenantId = getTenantId(c);
25
+ const agentId = c.req.param('id');
26
+ // Verify agent exists
27
+ const tenantStore = getTenantStore(store, c);
28
+ const agent = await tenantStore.getAgent(agentId);
29
+ if (!agent) {
30
+ return c.json({ error: 'Agent not found', status: 404 }, 404);
31
+ }
32
+ let body;
33
+ try {
34
+ body = await c.req.json();
35
+ }
36
+ catch {
37
+ return c.json({ error: 'Invalid JSON body', status: 400 }, 400);
38
+ }
39
+ try {
40
+ const capability = capStore.create(tenantId, agentId, body);
41
+ const anonymousAgentId = anonIdManager.getOrRotateAnonymousId(tenantId, agentId);
42
+ return c.json({ capability, anonymousAgentId }, 201);
43
+ }
44
+ catch (err) {
45
+ if (err instanceof ValidationError) {
46
+ return c.json({ error: err.message, status: 400 }, 400);
47
+ }
48
+ throw err;
49
+ }
50
+ });
51
+ // GET /:id/capabilities — list agent's capabilities
52
+ app.get('/:id/capabilities', async (c) => {
53
+ const tenantId = getTenantId(c);
54
+ const agentId = c.req.param('id');
55
+ // Verify agent exists
56
+ const tenantStore = getTenantStore(store, c);
57
+ const agent = await tenantStore.getAgent(agentId);
58
+ if (!agent) {
59
+ return c.json({ error: 'Agent not found', status: 404 }, 404);
60
+ }
61
+ const capabilities = capStore.listByAgent(tenantId, agentId);
62
+ const anonymousAgentId = anonIdManager.getOrRotateAnonymousId(tenantId, agentId);
63
+ return c.json({ capabilities, anonymousAgentId });
64
+ });
65
+ // DELETE /:id/capabilities/:capabilityId — remove a capability
66
+ app.delete('/:id/capabilities/:capabilityId', async (c) => {
67
+ const tenantId = getTenantId(c);
68
+ const agentId = c.req.param('id');
69
+ const capabilityId = c.req.param('capabilityId');
70
+ // Verify agent exists
71
+ const tenantStore = getTenantStore(store, c);
72
+ const agent = await tenantStore.getAgent(agentId);
73
+ if (!agent) {
74
+ return c.json({ error: 'Agent not found', status: 404 }, 404);
75
+ }
76
+ // Verify the capability belongs to this agent
77
+ const existing = capStore.getById(tenantId, capabilityId);
78
+ if (!existing || existing.agentId !== agentId) {
79
+ return c.json({ error: 'Capability not found', status: 404 }, 404);
80
+ }
81
+ capStore.delete(tenantId, capabilityId);
82
+ return c.json({ deleted: true });
83
+ });
84
+ return app;
85
+ }
86
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/routes/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,UAAU,gBAAgB,CAAC,KAAkB,EAAE,EAAY;IAC/D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAgC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAEjD;;OAEG;IACH,SAAS,WAAW,CAAC,CAA4D;QAC/E,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,QAAQ,IAAI,SAAS,CAAC;IAChD,CAAC;IAED,0DAA0D;IAC1D,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,sBAAsB;QACtB,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,IAA6B,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAwD,CAAC,CAAC;YAChH,MAAM,gBAAgB,GAAG,aAAa,CAAC,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACjF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;gBACnC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;YAC1D,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,oDAAoD;IACpD,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,sBAAsB;QACtB,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,gBAAgB,GAAG,aAAa,CAAC,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,GAAG,CAAC,MAAM,CAAC,iCAAiC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACxD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAEjD,sBAAsB;QACtB,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC9C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;QAED,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Community Sharing REST API (Stories 4.1–4.3)
3
+ *
4
+ * POST /api/community/share — share a lesson
5
+ * GET /api/community/search — search shared lessons
6
+ * GET /api/community/config — get tenant sharing config
7
+ * PUT /api/community/config — update tenant sharing config
8
+ * GET /api/community/config/agents/:agentId — get agent sharing config
9
+ * PUT /api/community/config/agents/:agentId — update agent sharing config
10
+ * GET /api/community/deny-list — list deny-list rules
11
+ * POST /api/community/deny-list — add deny-list rule
12
+ * DELETE /api/community/deny-list/:id — delete deny-list rule
13
+ */
14
+ import { Hono } from 'hono';
15
+ import type { AuthVariables } from '../middleware/auth.js';
16
+ import type { SqliteDb } from '../db/index.js';
17
+ import { CommunityService, type PoolTransport } from '../services/community-service.js';
18
+ export declare function communityRoutes(db: SqliteDb, transport?: PoolTransport): {
19
+ app: Hono<{
20
+ Variables: AuthVariables;
21
+ }, import("hono/types").BlankSchema, "/">;
22
+ service: CommunityService;
23
+ };
24
+ //# sourceMappingURL=community.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community.d.ts","sourceRoot":"","sources":["../../src/routes/community.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAA+B,KAAK,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAKrH,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,aAAa;;mBACnC,aAAa;;;EAyLhD"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Community Sharing REST API (Stories 4.1–4.3)
3
+ *
4
+ * POST /api/community/share — share a lesson
5
+ * GET /api/community/search — search shared lessons
6
+ * GET /api/community/config — get tenant sharing config
7
+ * PUT /api/community/config — update tenant sharing config
8
+ * GET /api/community/config/agents/:agentId — get agent sharing config
9
+ * PUT /api/community/config/agents/:agentId — update agent sharing config
10
+ * GET /api/community/deny-list — list deny-list rules
11
+ * POST /api/community/deny-list — add deny-list rule
12
+ * DELETE /api/community/deny-list/:id — delete deny-list rule
13
+ */
14
+ import { Hono } from 'hono';
15
+ import { CommunityService, LocalCommunityPoolTransport } from '../services/community-service.js';
16
+ import { LESSON_SHARING_CATEGORIES } from '@agentlensai/core';
17
+ const VALID_CATEGORIES = new Set(LESSON_SHARING_CATEGORIES);
18
+ export function communityRoutes(db, transport) {
19
+ const app = new Hono();
20
+ const poolTransport = transport ?? new LocalCommunityPoolTransport();
21
+ const service = new CommunityService(db, { transport: poolTransport });
22
+ function getTenantId(c) {
23
+ return c.get('apiKey')?.tenantId ?? 'default';
24
+ }
25
+ // ─── Share ─────────────────────────────────────────
26
+ app.post('/share', async (c) => {
27
+ const tenantId = getTenantId(c);
28
+ let body;
29
+ try {
30
+ body = await c.req.json();
31
+ }
32
+ catch {
33
+ return c.json({ error: 'Invalid JSON body' }, 400);
34
+ }
35
+ const lessonId = body.lessonId;
36
+ if (!lessonId || typeof lessonId !== 'string') {
37
+ return c.json({ error: 'lessonId is required' }, 400);
38
+ }
39
+ const result = await service.share(tenantId, lessonId, 'api');
40
+ switch (result.status) {
41
+ case 'shared':
42
+ return c.json(result, 201);
43
+ case 'rate_limited':
44
+ return c.json({ error: 'Rate limit exceeded', status: 'rate_limited' }, 429);
45
+ case 'disabled':
46
+ return c.json({ error: result.reason, status: 'disabled' }, 403);
47
+ case 'blocked':
48
+ return c.json({ error: result.reason, status: 'blocked' }, 422);
49
+ case 'pending_review':
50
+ return c.json(result, 202);
51
+ case 'error':
52
+ return c.json({ error: result.error, status: 'error' }, 500);
53
+ }
54
+ });
55
+ // ─── Search ────────────────────────────────────────
56
+ app.get('/search', async (c) => {
57
+ const tenantId = getTenantId(c);
58
+ const query = c.req.query('q');
59
+ if (!query) {
60
+ return c.json({ error: 'q (query) parameter is required' }, 400);
61
+ }
62
+ const category = c.req.query('category') || undefined;
63
+ if (category && !VALID_CATEGORIES.has(category)) {
64
+ return c.json({ error: `Invalid category. Must be one of: ${LESSON_SHARING_CATEGORIES.join(', ')}` }, 400);
65
+ }
66
+ const minReputation = c.req.query('minReputation') ? Number(c.req.query('minReputation')) : undefined;
67
+ const limit = c.req.query('limit') ? Math.min(Number(c.req.query('limit')), 50) : 50;
68
+ const result = await service.search(tenantId, query, { category, minReputation, limit }, 'api');
69
+ return c.json(result);
70
+ });
71
+ // ─── Tenant Config ────────────────────────────────
72
+ app.get('/config', async (c) => {
73
+ const tenantId = getTenantId(c);
74
+ const config = service.getSharingConfig(tenantId);
75
+ return c.json({ config });
76
+ });
77
+ app.put('/config', async (c) => {
78
+ const tenantId = getTenantId(c);
79
+ let body;
80
+ try {
81
+ body = await c.req.json();
82
+ }
83
+ catch {
84
+ return c.json({ error: 'Invalid JSON body' }, 400);
85
+ }
86
+ const updates = {};
87
+ if (body.enabled !== undefined)
88
+ updates.enabled = Boolean(body.enabled);
89
+ if (body.humanReviewEnabled !== undefined)
90
+ updates.humanReviewEnabled = Boolean(body.humanReviewEnabled);
91
+ if (body.poolEndpoint !== undefined)
92
+ updates.poolEndpoint = body.poolEndpoint;
93
+ if (body.rateLimitPerHour !== undefined) {
94
+ const val = Number(body.rateLimitPerHour);
95
+ if (isNaN(val) || val < 1)
96
+ return c.json({ error: 'rateLimitPerHour must be >= 1' }, 400);
97
+ updates.rateLimitPerHour = val;
98
+ }
99
+ if (body.volumeAlertThreshold !== undefined) {
100
+ const val = Number(body.volumeAlertThreshold);
101
+ if (isNaN(val) || val < 1)
102
+ return c.json({ error: 'volumeAlertThreshold must be >= 1' }, 400);
103
+ updates.volumeAlertThreshold = val;
104
+ }
105
+ if (body.categories !== undefined) {
106
+ if (!Array.isArray(body.categories))
107
+ return c.json({ error: 'categories must be an array' }, 400);
108
+ for (const cat of body.categories) {
109
+ if (!VALID_CATEGORIES.has(cat)) {
110
+ return c.json({ error: `Invalid category: ${cat}` }, 400);
111
+ }
112
+ }
113
+ }
114
+ const config = service.updateSharingConfig(tenantId, updates);
115
+ return c.json({ config });
116
+ });
117
+ // ─── Agent Config ──────────────────────────────────
118
+ app.get('/config/agents/:agentId', async (c) => {
119
+ const tenantId = getTenantId(c);
120
+ const agentId = c.req.param('agentId');
121
+ const config = service.getAgentSharingConfig(tenantId, agentId);
122
+ return c.json({ config });
123
+ });
124
+ app.put('/config/agents/:agentId', async (c) => {
125
+ const tenantId = getTenantId(c);
126
+ const agentId = c.req.param('agentId');
127
+ let body;
128
+ try {
129
+ body = await c.req.json();
130
+ }
131
+ catch {
132
+ return c.json({ error: 'Invalid JSON body' }, 400);
133
+ }
134
+ const updates = {};
135
+ if (body.enabled !== undefined)
136
+ updates.enabled = Boolean(body.enabled);
137
+ if (body.categories !== undefined) {
138
+ if (!Array.isArray(body.categories))
139
+ return c.json({ error: 'categories must be an array' }, 400);
140
+ for (const cat of body.categories) {
141
+ if (!VALID_CATEGORIES.has(cat)) {
142
+ return c.json({ error: `Invalid category: ${cat}` }, 400);
143
+ }
144
+ }
145
+ updates.categories = body.categories;
146
+ }
147
+ const config = service.updateAgentSharingConfig(tenantId, agentId, updates);
148
+ return c.json({ config });
149
+ });
150
+ // ─── Deny List ─────────────────────────────────────
151
+ app.get('/deny-list', async (c) => {
152
+ const tenantId = getTenantId(c);
153
+ const rules = service.getDenyList(tenantId);
154
+ return c.json({ rules });
155
+ });
156
+ app.post('/deny-list', async (c) => {
157
+ const tenantId = getTenantId(c);
158
+ let body;
159
+ try {
160
+ body = await c.req.json();
161
+ }
162
+ catch {
163
+ return c.json({ error: 'Invalid JSON body' }, 400);
164
+ }
165
+ const pattern = body.pattern;
166
+ if (!pattern || typeof pattern !== 'string') {
167
+ return c.json({ error: 'pattern is required' }, 400);
168
+ }
169
+ const reason = body.reason || 'No reason provided';
170
+ const isRegex = Boolean(body.isRegex);
171
+ try {
172
+ const rule = service.addDenyListRule(tenantId, pattern, isRegex, reason);
173
+ return c.json({ rule }, 201);
174
+ }
175
+ catch (err) {
176
+ return c.json({ error: err instanceof Error ? err.message : String(err) }, 400);
177
+ }
178
+ });
179
+ app.delete('/deny-list/:id', async (c) => {
180
+ const tenantId = getTenantId(c);
181
+ const ruleId = c.req.param('id');
182
+ const ok = service.deleteDenyListRule(tenantId, ruleId);
183
+ if (!ok) {
184
+ return c.json({ error: 'Rule not found' }, 404);
185
+ }
186
+ return c.json({ deleted: true });
187
+ });
188
+ return { app, service };
189
+ }
190
+ //# sourceMappingURL=community.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community.js","sourceRoot":"","sources":["../../src/routes/community.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Delegation REST API (Stories 6.1 + 6.2)
3
+ *
4
+ * POST /api/agents/delegate — send a delegation request (outbound)
5
+ * GET /api/agents/:id/delegations/inbox — poll for pending requests (inbound)
6
+ * POST /api/agents/:id/delegations/:requestId/accept — accept a delegation
7
+ * POST /api/agents/:id/delegations/:requestId/reject — reject a delegation
8
+ * POST /api/agents/:id/delegations/:requestId/complete — complete with result
9
+ */
10
+ import { Hono } from 'hono';
11
+ import type { AuthVariables } from '../middleware/auth.js';
12
+ import type { SqliteDb } from '../db/index.js';
13
+ import { DelegationService, type PoolTransport } from '../services/delegation-service.js';
14
+ export declare function delegationRoutes(db: SqliteDb, transport: PoolTransport): {
15
+ app: Hono<{
16
+ Variables: AuthVariables;
17
+ }, import("hono/types").BlankSchema, "/">;
18
+ service: DelegationService;
19
+ };
20
+ //# sourceMappingURL=delegation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation.d.ts","sourceRoot":"","sources":["../../src/routes/delegation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAK1F,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa;;mBACnC,aAAa;;;EA4GhD"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Delegation REST API (Stories 6.1 + 6.2)
3
+ *
4
+ * POST /api/agents/delegate — send a delegation request (outbound)
5
+ * GET /api/agents/:id/delegations/inbox — poll for pending requests (inbound)
6
+ * POST /api/agents/:id/delegations/:requestId/accept — accept a delegation
7
+ * POST /api/agents/:id/delegations/:requestId/reject — reject a delegation
8
+ * POST /api/agents/:id/delegations/:requestId/complete — complete with result
9
+ */
10
+ import { Hono } from 'hono';
11
+ import { DelegationService } from '../services/delegation-service.js';
12
+ import { TASK_TYPES } from '@agentlensai/core';
13
+ const VALID_TASK_TYPES = new Set(TASK_TYPES);
14
+ export function delegationRoutes(db, transport) {
15
+ const app = new Hono();
16
+ const service = new DelegationService(db, transport);
17
+ function getTenantId(c) {
18
+ return c.get('apiKey')?.tenantId ?? 'default';
19
+ }
20
+ // POST /delegate — send a delegation request (outbound)
21
+ app.post('/delegate', async (c) => {
22
+ const tenantId = getTenantId(c);
23
+ let body;
24
+ try {
25
+ body = await c.req.json();
26
+ }
27
+ catch {
28
+ return c.json({ error: 'Invalid JSON body', status: 400 }, 400);
29
+ }
30
+ const agentId = body.agentId;
31
+ if (!agentId) {
32
+ return c.json({ error: 'agentId is required', status: 400 }, 400);
33
+ }
34
+ const targetAnonymousId = body.targetAnonymousId;
35
+ if (!targetAnonymousId) {
36
+ return c.json({ error: 'targetAnonymousId is required', status: 400 }, 400);
37
+ }
38
+ const taskType = body.taskType;
39
+ if (!taskType || !VALID_TASK_TYPES.has(taskType)) {
40
+ return c.json({ error: 'taskType is required and must be valid', status: 400 }, 400);
41
+ }
42
+ const result = await service.delegate(tenantId, agentId, {
43
+ targetAnonymousId,
44
+ taskType: taskType,
45
+ input: body.input,
46
+ timeoutMs: body.timeoutMs ?? 30000,
47
+ fallbackEnabled: body.fallbackEnabled,
48
+ maxRetries: body.maxRetries,
49
+ });
50
+ return c.json({ result });
51
+ });
52
+ // GET /:id/delegations/inbox — poll for pending requests
53
+ app.get('/:id/delegations/inbox', async (c) => {
54
+ const tenantId = getTenantId(c);
55
+ const agentId = c.req.param('id');
56
+ const inbox = await service.getInbox(tenantId, agentId);
57
+ return c.json({ requests: inbox, total: inbox.length });
58
+ });
59
+ // POST /:id/delegations/:requestId/accept
60
+ app.post('/:id/delegations/:requestId/accept', async (c) => {
61
+ const tenantId = getTenantId(c);
62
+ const agentId = c.req.param('id');
63
+ const requestId = c.req.param('requestId');
64
+ const result = await service.acceptDelegation(tenantId, agentId, requestId);
65
+ if (!result.ok) {
66
+ return c.json({ error: result.error, status: 400 }, 400);
67
+ }
68
+ return c.json({ accepted: true });
69
+ });
70
+ // POST /:id/delegations/:requestId/reject
71
+ app.post('/:id/delegations/:requestId/reject', async (c) => {
72
+ const tenantId = getTenantId(c);
73
+ const agentId = c.req.param('id');
74
+ const requestId = c.req.param('requestId');
75
+ let body = {};
76
+ try {
77
+ body = await c.req.json();
78
+ }
79
+ catch {
80
+ // Body is optional for reject
81
+ }
82
+ const result = await service.rejectDelegation(tenantId, agentId, requestId, body.reason);
83
+ if (!result.ok) {
84
+ return c.json({ error: result.error, status: 400 }, 400);
85
+ }
86
+ return c.json({ rejected: true });
87
+ });
88
+ // POST /:id/delegations/:requestId/complete
89
+ app.post('/:id/delegations/:requestId/complete', async (c) => {
90
+ const tenantId = getTenantId(c);
91
+ const agentId = c.req.param('id');
92
+ const requestId = c.req.param('requestId');
93
+ let body;
94
+ try {
95
+ body = await c.req.json();
96
+ }
97
+ catch {
98
+ return c.json({ error: 'Invalid JSON body', status: 400 }, 400);
99
+ }
100
+ const result = await service.completeDelegation(tenantId, agentId, requestId, body.output);
101
+ if (!result.ok) {
102
+ return c.json({ error: result.error, status: 400 }, 400);
103
+ }
104
+ return c.json({ completed: true });
105
+ });
106
+ return { app, service };
107
+ }
108
+ //# sourceMappingURL=delegation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation.js","sourceRoot":"","sources":["../../src/routes/delegation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Discovery REST API (Story 5.3 + 5.4)
3
+ *
4
+ * GET /api/agents/discover — discover capabilities
5
+ * PUT /api/agents/discovery/config — update tenant discovery config
6
+ * GET /api/agents/discovery/config — get tenant discovery config
7
+ * PUT /api/agents/capabilities/:capabilityId/permissions — update per-agent permissions
8
+ */
9
+ import { Hono } from 'hono';
10
+ import type { AuthVariables } from '../middleware/auth.js';
11
+ import type { SqliteDb } from '../db/index.js';
12
+ import { DiscoveryService } from '../services/discovery-service.js';
13
+ export declare function discoveryRoutes(db: SqliteDb): {
14
+ app: Hono<{
15
+ Variables: AuthVariables;
16
+ }, import("hono/types").BlankSchema, "/">;
17
+ service: DiscoveryService;
18
+ };
19
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/routes/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAKpE,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ;;mBACR,aAAa;;;EA0FhD"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Discovery REST API (Story 5.3 + 5.4)
3
+ *
4
+ * GET /api/agents/discover — discover capabilities
5
+ * PUT /api/agents/discovery/config — update tenant discovery config
6
+ * GET /api/agents/discovery/config — get tenant discovery config
7
+ * PUT /api/agents/capabilities/:capabilityId/permissions — update per-agent permissions
8
+ */
9
+ import { Hono } from 'hono';
10
+ import { DiscoveryService } from '../services/discovery-service.js';
11
+ import { TASK_TYPES } from '@agentlensai/core';
12
+ const VALID_TASK_TYPES = new Set(TASK_TYPES);
13
+ export function discoveryRoutes(db) {
14
+ const app = new Hono();
15
+ const service = new DiscoveryService(db);
16
+ function getTenantId(c) {
17
+ return c.get('apiKey')?.tenantId ?? 'default';
18
+ }
19
+ // GET /discover — discover capabilities
20
+ app.get('/discover', async (c) => {
21
+ const tenantId = getTenantId(c);
22
+ const taskType = c.req.query('taskType');
23
+ if (!taskType || !VALID_TASK_TYPES.has(taskType)) {
24
+ return c.json({ error: 'taskType is required and must be a valid TaskType', status: 400 }, 400);
25
+ }
26
+ const query = {
27
+ taskType: taskType,
28
+ customType: c.req.query('customType') || undefined,
29
+ minTrustScore: c.req.query('minTrust') ? Number(c.req.query('minTrust')) : undefined,
30
+ maxCostUsd: c.req.query('maxCost') ? Number(c.req.query('maxCost')) : undefined,
31
+ maxLatencyMs: c.req.query('maxLatency') ? Number(c.req.query('maxLatency')) : undefined,
32
+ scope: 'internal', // Only internal for now (B3)
33
+ limit: c.req.query('limit') ? Math.min(Number(c.req.query('limit')), 20) : 20,
34
+ };
35
+ const results = service.discover(tenantId, query);
36
+ return c.json({ results, total: results.length });
37
+ });
38
+ // GET /discovery/config — get tenant discovery config
39
+ app.get('/discovery/config', async (c) => {
40
+ const tenantId = getTenantId(c);
41
+ const config = service.getDiscoveryConfig(tenantId);
42
+ return c.json({ config });
43
+ });
44
+ // PUT /discovery/config — update tenant discovery config
45
+ app.put('/discovery/config', async (c) => {
46
+ const tenantId = getTenantId(c);
47
+ let body;
48
+ try {
49
+ body = await c.req.json();
50
+ }
51
+ catch {
52
+ return c.json({ error: 'Invalid JSON body', status: 400 }, 400);
53
+ }
54
+ const updates = {};
55
+ if (body.minTrustThreshold !== undefined) {
56
+ const val = Number(body.minTrustThreshold);
57
+ if (isNaN(val) || val < 0 || val > 100) {
58
+ return c.json({ error: 'minTrustThreshold must be 0-100', status: 400 }, 400);
59
+ }
60
+ updates.minTrustThreshold = val;
61
+ }
62
+ if (body.delegationEnabled !== undefined) {
63
+ updates.delegationEnabled = Boolean(body.delegationEnabled);
64
+ }
65
+ const config = service.updateDiscoveryConfig(tenantId, updates);
66
+ return c.json({ config });
67
+ });
68
+ // PUT /capabilities/:capabilityId/permissions — update per-agent permissions
69
+ app.put('/capabilities/:capabilityId/permissions', async (c) => {
70
+ const tenantId = getTenantId(c);
71
+ const capabilityId = c.req.param('capabilityId');
72
+ let body;
73
+ try {
74
+ body = await c.req.json();
75
+ }
76
+ catch {
77
+ return c.json({ error: 'Invalid JSON body', status: 400 }, 400);
78
+ }
79
+ const updates = {};
80
+ if (body.enabled !== undefined)
81
+ updates.enabled = Boolean(body.enabled);
82
+ if (body.acceptDelegations !== undefined)
83
+ updates.acceptDelegations = Boolean(body.acceptDelegations);
84
+ if (body.inboundRateLimit !== undefined)
85
+ updates.inboundRateLimit = Number(body.inboundRateLimit);
86
+ if (body.outboundRateLimit !== undefined)
87
+ updates.outboundRateLimit = Number(body.outboundRateLimit);
88
+ const ok = service.updateAgentPermissions(tenantId, capabilityId, updates);
89
+ if (!ok) {
90
+ return c.json({ error: 'Capability not found', status: 404 }, 404);
91
+ }
92
+ return c.json({ updated: true });
93
+ });
94
+ return { app, service };
95
+ }
96
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/routes/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Redaction Test Endpoint (Story 2.4)
3
+ *
4
+ * POST /api/community/redaction/test
5
+ * Accepts raw content, runs it through the redaction pipeline,
6
+ * and returns the redacted output WITHOUT sharing.
7
+ * For testing/debugging purposes only.
8
+ */
9
+ import { Hono } from 'hono';
10
+ import type { AuthVariables } from '../middleware/auth.js';
11
+ export declare function redactionTestRoutes(): Hono<{
12
+ Variables: AuthVariables;
13
+ }, import("hono/types").BlankSchema, "/">;
14
+ //# sourceMappingURL=redaction-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction-test.d.ts","sourceRoot":"","sources":["../../src/routes/redaction-test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAK3D,wBAAgB,mBAAmB;eACC,aAAa;0CAsChD"}