atabey-shared 0.1.0-beta.0 → 0.1.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 (221) hide show
  1. package/README.md +63 -24
  2. package/dist/agent-identity.d.ts +1 -34
  3. package/dist/agent-identity.js +1 -76
  4. package/dist/agent-identity.js.map +1 -1
  5. package/dist/api-catalog.d.ts +1 -57
  6. package/dist/api-catalog.js +1 -253
  7. package/dist/api-catalog.js.map +1 -1
  8. package/dist/audit-chain.d.ts +1 -80
  9. package/dist/audit-chain.js +1 -261
  10. package/dist/audit-chain.js.map +1 -1
  11. package/dist/audit.d.ts +1 -121
  12. package/dist/audit.js +1 -321
  13. package/dist/audit.js.map +1 -1
  14. package/dist/constants.d.ts +1 -153
  15. package/dist/constants.js +1 -214
  16. package/dist/constants.js.map +1 -1
  17. package/dist/database.d.ts +1 -5
  18. package/dist/database.js +1 -12
  19. package/dist/database.js.map +1 -1
  20. package/dist/errors.d.ts +1 -46
  21. package/dist/errors.js +1 -68
  22. package/dist/errors.js.map +1 -1
  23. package/dist/file-lock.d.ts +1 -93
  24. package/dist/file-lock.js +1 -239
  25. package/dist/file-lock.js.map +1 -1
  26. package/dist/fs.d.ts +1 -9
  27. package/dist/fs.js +1 -53
  28. package/dist/fs.js.map +1 -1
  29. package/dist/index.d.ts +2 -31
  30. package/dist/index.js +2 -31
  31. package/dist/index.js.map +1 -1
  32. package/dist/job-queue.d.ts +1 -53
  33. package/dist/job-queue.js +1 -126
  34. package/dist/job-queue.js.map +1 -1
  35. package/dist/lock.d.ts +1 -82
  36. package/dist/lock.js +1 -158
  37. package/dist/lock.js.map +1 -1
  38. package/dist/logger.d.ts +1 -31
  39. package/dist/logger.js +1 -152
  40. package/dist/logger.js.map +1 -1
  41. package/dist/memory-prune.d.ts +1 -18
  42. package/dist/memory-prune.js +1 -47
  43. package/dist/memory-prune.js.map +1 -1
  44. package/dist/migrations.d.ts +1 -69
  45. package/dist/migrations.js +1 -374
  46. package/dist/migrations.js.map +1 -1
  47. package/dist/modules/agent/agent-identity.d.ts +34 -0
  48. package/dist/modules/agent/agent-identity.js +77 -0
  49. package/dist/modules/agent/agent-identity.js.map +1 -0
  50. package/dist/modules/agent/api-catalog.d.ts +57 -0
  51. package/dist/modules/agent/api-catalog.js +254 -0
  52. package/dist/modules/agent/api-catalog.js.map +1 -0
  53. package/dist/modules/agent/index.d.ts +3 -0
  54. package/dist/modules/agent/index.js +4 -0
  55. package/dist/modules/agent/index.js.map +1 -0
  56. package/dist/modules/agent/tokenizer.d.ts +54 -0
  57. package/dist/modules/agent/tokenizer.js +272 -0
  58. package/dist/modules/agent/tokenizer.js.map +1 -0
  59. package/dist/modules/concurrency/file-lock.d.ts +93 -0
  60. package/dist/modules/concurrency/file-lock.js +240 -0
  61. package/dist/modules/concurrency/file-lock.js.map +1 -0
  62. package/dist/modules/concurrency/index.d.ts +6 -0
  63. package/dist/modules/concurrency/index.js +7 -0
  64. package/dist/modules/concurrency/index.js.map +1 -0
  65. package/dist/modules/concurrency/job-queue.d.ts +76 -0
  66. package/dist/modules/concurrency/job-queue.js +200 -0
  67. package/dist/modules/concurrency/job-queue.js.map +1 -0
  68. package/dist/modules/concurrency/lock.d.ts +82 -0
  69. package/dist/modules/concurrency/lock.js +159 -0
  70. package/dist/modules/concurrency/lock.js.map +1 -0
  71. package/dist/modules/concurrency/resilience.d.ts +84 -0
  72. package/dist/modules/concurrency/resilience.js +217 -0
  73. package/dist/modules/concurrency/resilience.js.map +1 -0
  74. package/dist/modules/concurrency/worker-pool.d.ts +52 -0
  75. package/dist/modules/concurrency/worker-pool.js +229 -0
  76. package/dist/modules/concurrency/worker-pool.js.map +1 -0
  77. package/dist/modules/concurrency/worker-thread.d.ts +21 -0
  78. package/dist/modules/concurrency/worker-thread.js +67 -0
  79. package/dist/modules/concurrency/worker-thread.js.map +1 -0
  80. package/dist/modules/index.d.ts +14 -0
  81. package/dist/modules/index.js +15 -0
  82. package/dist/modules/index.js.map +1 -0
  83. package/dist/modules/observability/audit-chain.d.ts +80 -0
  84. package/dist/modules/observability/audit-chain.js +262 -0
  85. package/dist/modules/observability/audit-chain.js.map +1 -0
  86. package/dist/modules/observability/audit.d.ts +121 -0
  87. package/dist/modules/observability/audit.js +322 -0
  88. package/dist/modules/observability/audit.js.map +1 -0
  89. package/dist/modules/observability/index.d.ts +4 -0
  90. package/dist/modules/observability/index.js +5 -0
  91. package/dist/modules/observability/index.js.map +1 -0
  92. package/dist/modules/observability/logger.d.ts +31 -0
  93. package/dist/modules/observability/logger.js +153 -0
  94. package/dist/modules/observability/logger.js.map +1 -0
  95. package/dist/modules/observability/otel.d.ts +39 -0
  96. package/dist/modules/observability/otel.js +93 -0
  97. package/dist/modules/observability/otel.js.map +1 -0
  98. package/dist/modules/primitives/constants.d.ts +150 -0
  99. package/dist/modules/primitives/constants.js +212 -0
  100. package/dist/modules/primitives/constants.js.map +1 -0
  101. package/dist/modules/primitives/errors.d.ts +46 -0
  102. package/dist/modules/primitives/errors.js +69 -0
  103. package/dist/modules/primitives/errors.js.map +1 -0
  104. package/dist/modules/primitives/fs.d.ts +9 -0
  105. package/dist/modules/primitives/fs.js +54 -0
  106. package/dist/modules/primitives/fs.js.map +1 -0
  107. package/dist/modules/primitives/index.d.ts +7 -0
  108. package/dist/modules/primitives/index.js +8 -0
  109. package/dist/modules/primitives/index.js.map +1 -0
  110. package/dist/modules/primitives/outbound-http.d.ts +32 -0
  111. package/dist/modules/primitives/outbound-http.js +88 -0
  112. package/dist/modules/primitives/outbound-http.js.map +1 -0
  113. package/dist/modules/primitives/string.d.ts +1 -0
  114. package/dist/modules/primitives/string.js +30 -0
  115. package/dist/modules/primitives/string.js.map +1 -0
  116. package/dist/modules/primitives/time.d.ts +5 -0
  117. package/dist/modules/primitives/time.js +35 -0
  118. package/dist/modules/primitives/time.js.map +1 -0
  119. package/dist/modules/primitives/types.d.ts +27 -0
  120. package/dist/modules/primitives/types.js +17 -0
  121. package/dist/modules/primitives/types.js.map +1 -0
  122. package/dist/modules/sandbox/index.d.ts +3 -0
  123. package/dist/modules/sandbox/index.js +4 -0
  124. package/dist/modules/sandbox/index.js.map +1 -0
  125. package/dist/modules/sandbox/sandbox-fs.d.ts +28 -0
  126. package/dist/modules/sandbox/sandbox-fs.js +143 -0
  127. package/dist/modules/sandbox/sandbox-fs.js.map +1 -0
  128. package/dist/modules/sandbox/sandbox-runtime.d.ts +78 -0
  129. package/dist/modules/sandbox/sandbox-runtime.js +282 -0
  130. package/dist/modules/sandbox/sandbox-runtime.js.map +1 -0
  131. package/dist/modules/sandbox/sandbox.d.ts +54 -0
  132. package/dist/modules/sandbox/sandbox.js +179 -0
  133. package/dist/modules/sandbox/sandbox.js.map +1 -0
  134. package/dist/modules/security/index.d.ts +5 -0
  135. package/dist/modules/security/index.js +6 -0
  136. package/dist/modules/security/index.js.map +1 -0
  137. package/dist/modules/security/pii.d.ts +70 -0
  138. package/dist/modules/security/pii.js +276 -0
  139. package/dist/modules/security/pii.js.map +1 -0
  140. package/dist/modules/security/policy-gate.d.ts +42 -0
  141. package/dist/modules/security/policy-gate.js +172 -0
  142. package/dist/modules/security/policy-gate.js.map +1 -0
  143. package/dist/modules/security/retention.d.ts +68 -0
  144. package/dist/modules/security/retention.js +218 -0
  145. package/dist/modules/security/retention.js.map +1 -0
  146. package/dist/modules/security/secrets.d.ts +99 -0
  147. package/dist/modules/security/secrets.js +371 -0
  148. package/dist/modules/security/secrets.js.map +1 -0
  149. package/dist/modules/security/tls.d.ts +87 -0
  150. package/dist/modules/security/tls.js +154 -0
  151. package/dist/modules/security/tls.js.map +1 -0
  152. package/dist/modules/storage/database.d.ts +6 -0
  153. package/dist/modules/storage/database.js +16 -0
  154. package/dist/modules/storage/database.js.map +1 -0
  155. package/dist/modules/storage/index.d.ts +4 -0
  156. package/dist/modules/storage/index.js +5 -0
  157. package/dist/modules/storage/index.js.map +1 -0
  158. package/dist/modules/storage/memory-prune.d.ts +18 -0
  159. package/dist/modules/storage/memory-prune.js +48 -0
  160. package/dist/modules/storage/memory-prune.js.map +1 -0
  161. package/dist/modules/storage/migrations.d.ts +69 -0
  162. package/dist/modules/storage/migrations.js +394 -0
  163. package/dist/modules/storage/migrations.js.map +1 -0
  164. package/dist/modules/storage/storage.d.ts +341 -0
  165. package/dist/modules/storage/storage.js +1004 -0
  166. package/dist/modules/storage/storage.js.map +1 -0
  167. package/dist/otel.d.ts +1 -39
  168. package/dist/otel.js +1 -92
  169. package/dist/otel.js.map +1 -1
  170. package/dist/outbound-http.d.ts +1 -32
  171. package/dist/outbound-http.js +1 -87
  172. package/dist/outbound-http.js.map +1 -1
  173. package/dist/pii.d.ts +1 -70
  174. package/dist/pii.js +1 -275
  175. package/dist/pii.js.map +1 -1
  176. package/dist/policy-gate.d.ts +1 -42
  177. package/dist/policy-gate.js +1 -171
  178. package/dist/policy-gate.js.map +1 -1
  179. package/dist/resilience.d.ts +1 -84
  180. package/dist/resilience.js +1 -216
  181. package/dist/resilience.js.map +1 -1
  182. package/dist/retention.d.ts +1 -68
  183. package/dist/retention.js +1 -217
  184. package/dist/retention.js.map +1 -1
  185. package/dist/sandbox-fs.d.ts +1 -28
  186. package/dist/sandbox-fs.js +1 -142
  187. package/dist/sandbox-fs.js.map +1 -1
  188. package/dist/sandbox-runtime.d.ts +1 -78
  189. package/dist/sandbox-runtime.js +1 -281
  190. package/dist/sandbox-runtime.js.map +1 -1
  191. package/dist/sandbox.d.ts +1 -54
  192. package/dist/sandbox.js +1 -178
  193. package/dist/sandbox.js.map +1 -1
  194. package/dist/secrets.d.ts +1 -99
  195. package/dist/secrets.js +1 -370
  196. package/dist/secrets.js.map +1 -1
  197. package/dist/storage.d.ts +1 -341
  198. package/dist/storage.js +1 -1003
  199. package/dist/storage.js.map +1 -1
  200. package/dist/string.d.ts +1 -1
  201. package/dist/string.js +1 -29
  202. package/dist/string.js.map +1 -1
  203. package/dist/time.d.ts +1 -5
  204. package/dist/time.js +1 -34
  205. package/dist/time.js.map +1 -1
  206. package/dist/tls.d.ts +1 -87
  207. package/dist/tls.js +1 -153
  208. package/dist/tls.js.map +1 -1
  209. package/dist/tokenizer.d.ts +1 -54
  210. package/dist/tokenizer.js +1 -271
  211. package/dist/tokenizer.js.map +1 -1
  212. package/dist/types.d.ts +1 -27
  213. package/dist/types.js +1 -16
  214. package/dist/types.js.map +1 -1
  215. package/dist/worker-pool.d.ts +1 -52
  216. package/dist/worker-pool.js +1 -228
  217. package/dist/worker-pool.js.map +1 -1
  218. package/dist/worker-thread.d.ts +1 -21
  219. package/dist/worker-thread.js +1 -66
  220. package/dist/worker-thread.js.map +1 -1
  221. package/package.json +44 -34
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # [GOV] Atabey Shared — Core Utility Library for AI Governance Platform
2
2
 
3
- [![Version](https://img.shields.io/badge/Version-v0.1.0-beta.0-blue.svg)](https://github.com/ysf-bkr/atabey)
3
+ [![Version](https://img.shields.io/badge/Version-v0.1.0-blue.svg)](https://github.com/ysf-bkr/atabey)
4
4
  [![npm](https://img.shields.io/npm/v/atabey-shared)](https://www.npmjs.com/package/atabey-shared)
5
5
  [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)
6
6
 
@@ -10,17 +10,15 @@
10
10
 
11
11
  ## 📋 Package Overview
12
12
 
13
- | Module | Files | Core Responsibilities |
14
- |--------|-------|-----------------------|
15
- | **PII Masking** | `pii.ts` | Regex-based sanitization of 20+ sensitive patterns (emails, phones, credit cards, IP addresses, JWT tokens, API keys) |
16
- | **Distributed Locking** | `lock.ts` | Multi-process file-based lock implementation with stale lock detection (10s TTL) and retry backoff |
17
- | **Enterprise Logger** | `logger.ts` | Multi-destination structured logging (Stdout/Stderr + local files) supporting min-level and JSON formatting |
18
- | **Data Retention** | `retention.ts` | KVKK/GDPR-compliant telemetry and log pruning based on 30-day and 90-day retention policies |
19
- | **Audit Logs** | `audit.ts` | Unified JSON audit trail capturing agent actions, timestamps, trace IDs, and results |
20
- | **Error Handling** | `errors.ts` | Custom error classes (`AtabeyBaseError`, `LockError`, `ComplianceError`) preserving stack traces |
21
- | **Constants & Types** | `constants.ts`, `types.ts` | Centralized constants (Phase paths, candidate directories, MCP constants) and strictly branded types |
22
- | **File System** | `fs.ts` | Safe file write wrapper with automatic parent directory creation and encoding validation |
23
- | **Database Holder** | `database.ts` | Singleton SQLite database holder for shared workspace storage |
13
+ | Module group | Files | Responsibility |
14
+ |--------------|-------|----------------|
15
+ | **primitives** | `constants`, `types`, `errors`, `fs`, `string`, `time`, `outbound-http` | Framework constants, branded types, error classes, safe fs, TLS-aware outbound HTTP |
16
+ | **storage** | `database`, `storage`, `migrations`, `memory-prune` | SQLite holder (singleton), schema migrations, memory pruning |
17
+ | **security** | `pii`, `secrets`, `tls`, `policy-gate`, `retention` | PII masking, AES-256-GCM vault, TLS/mTLS, fail-closed PolicyGate, retention |
18
+ | **concurrency** | `lock`, `file-lock`, `job-queue`, `worker-pool`, `worker-thread`, `resilience` | Distributed/file locks, DB-backed job queue, worker pool, circuit breaker |
19
+ | **sandbox** | `sandbox`, `sandbox-runtime`, `sandbox-fs` | OS sandbox (seatbelt/uid), fail-closed sandboxed file writes |
20
+ | **observability** | `logger`, `otel`, `audit`, `audit-chain` | Structured logging, OTel spans, HMAC-signed audit chain |
21
+ | **agent** | `agent-identity`, `api-catalog`, `tokenizer` | Signed agent identity, API endpoint catalog, `cl100k_base` tokenizer |
24
22
 
25
23
  ---
26
24
 
@@ -34,6 +32,44 @@ npm install atabey-shared
34
32
 
35
33
  ---
36
34
 
35
+ ## 🧩 Module Structure
36
+
37
+ The package is organized into focused **module groups**. `src/index.ts` is a barrel
38
+ that re-exports everything flat **plus** a `Modules.<Group>` namespace per group;
39
+ the flat `atabey-shared/*.js` entry points are kept as thin re-export shims for
40
+ backward compatibility.
41
+
42
+ ```
43
+ packages/shared/
44
+ ├── src/
45
+ │ ├── index.ts # Barrel: flat exports + `Modules.<Group>`
46
+ │ └── modules/
47
+ │ ├── primitives/ # constants, types, errors, fs, string, time, outbound-http
48
+ │ ├── storage/ # database, storage, migrations, memory-prune
49
+ │ ├── security/ # pii, secrets, tls, policy-gate, retention
50
+ │ ├── concurrency/ # lock, file-lock, job-queue, worker-pool, worker-thread, resilience
51
+ │ ├── sandbox/ # sandbox, sandbox-runtime, sandbox-fs
52
+ │ ├── observability/ # logger, otel, audit, audit-chain
53
+ │ └── agent/ # agent-identity, api-catalog, tokenizer
54
+ ```
55
+
56
+ Three import styles are supported:
57
+
58
+ ```typescript
59
+ // 1. Flat — stable public API
60
+ import { maskText, logger } from "atabey-shared";
61
+ import { maskText } from "atabey-shared/pii.js";
62
+
63
+ // 2. Namespaced by module group
64
+ import { Modules } from "atabey-shared";
65
+ Modules.Security.maskText("user@example.com");
66
+
67
+ // 3. Deep module subpath
68
+ import { maskText } from "atabey-shared/security/pii.js";
69
+ ```
70
+
71
+ ---
72
+
37
73
  ## ⚙️ Core Modules Detail
38
74
 
39
75
  ### 1. PII Protection (KVKK/GDPR Compliance)
@@ -48,23 +84,26 @@ console.log(sanitizedText);
48
84
  ```
49
85
 
50
86
  ### 2. Distributed Resource Locking
51
- The `lock.ts` module prevents race conditions between parallel running agents writing to shared resources (e.g. `PROJECT_MEMORY.md`).
87
+ The `lock.ts` module provides a SQLite-backed `DistributedLock` (server-authoritative,
88
+ with stale-lock reclaim) that prevents race conditions between parallel agents writing
89
+ to shared resources (e.g. `PROJECT_MEMORY.md`). For a lightweight file-based lock, use
90
+ `AtomicFileLock` from `file-lock.ts`.
52
91
  ```typescript
53
- import { AtabeyLock } from "atabey-shared";
92
+ import { DistributedLock } from "atabey-shared";
54
93
 
55
- const lock = new AtabeyLock("project-memory", { ttlMs: 10000, retryCount: 3 });
94
+ DistributedLock.initialize(); // once at startup
56
95
 
57
- try {
58
- const acquired = await lock.acquire();
59
- if (acquired) {
60
- // Safe region: write to file
96
+ const owner = DistributedLock.getLocalOwnerId();
97
+ if (DistributedLock.acquire("PROJECT_MEMORY.md", owner, { ttlMs: 10000, reason: "memory sync" })) {
98
+ try {
99
+ // safe region: write the shared resource
100
+ } finally {
101
+ DistributedLock.release("PROJECT_MEMORY.md", owner);
61
102
  }
62
- } finally {
63
- await lock.release();
64
103
  }
65
104
  ```
66
105
 
67
- ### 3. Enterprise Logger
106
+ ### 3. Structured Logger
68
107
  Structured logger wrapping `process.stdout` and `process.stderr` supporting log file logging and JSON output format.
69
108
  ```typescript
70
109
  import { logger, LogLevel } from "atabey-shared";
@@ -91,8 +130,8 @@ const task: TaskID = asTaskID("TASK-102");
91
130
 
92
131
  ## 📦 Dependencies
93
132
 
94
- - **better-sqlite3**: SQLite database engine for storage shims
95
- - **typescript**: Type safety enforcement
133
+ - **js-tiktoken**: `cl100k_base` BPE tokenizer for token/cost accounting
134
+ - **better-sqlite3**, **chalk**, **zod** _(peer)_: storage, terminal styling and runtime validation
96
135
 
97
136
  ---
98
137
 
@@ -1,34 +1 @@
1
- /**
2
- * Agent Identity — cryptographically signed agent tokens.
3
- *
4
- * Problem: `ATABEY_ACTIVE_AGENT` is a plain env var, so any tool/subprocess can
5
- * impersonate `@manager` or `@security`. When `ATABEY_AGENT_SECRET` is set,
6
- * Atabey accepts an HMAC-signed `ATABEY_AGENT_TOKEN` and verifies it
7
- * (fail-closed on tampering/expiry). Set `ATABEY_AGENT_IDENTITY_REQUIRED=true`
8
- * to refuse plain-env identity entirely.
9
- *
10
- * Token format: `${agent}.${issuedAt}.${expiresAt}.${hmacSha256Base64url}`
11
- */
12
- export interface AgentIdentity {
13
- agent: string;
14
- issuedAt: number;
15
- expiresAt: number;
16
- }
17
- export interface AgentTokenResult {
18
- valid: boolean;
19
- agent?: string;
20
- reason?: string;
21
- }
22
- /** True when agent-token verification is mandatory (plain env rejected). */
23
- export declare function isAgentIdentityEnforced(): boolean;
24
- /** Sign an agent identity into a compact token. */
25
- export declare function signAgentToken(agent: string, options?: {
26
- ttlMs?: number;
27
- key?: string | Buffer;
28
- }): string;
29
- /** Verify an agent token (signature + expiry). */
30
- export declare function verifyAgentToken(token: string, options?: {
31
- key?: string | Buffer;
32
- }): AgentTokenResult;
33
- /** Decode a token's identity without verification (for diagnostics only). */
34
- export declare function decodeAgentToken(token: string): AgentIdentity | null;
1
+ export * from "./modules/agent/agent-identity.js";
@@ -1,77 +1,2 @@
1
- /**
2
- * Agent Identity — cryptographically signed agent tokens.
3
- *
4
- * Problem: `ATABEY_ACTIVE_AGENT` is a plain env var, so any tool/subprocess can
5
- * impersonate `@manager` or `@security`. When `ATABEY_AGENT_SECRET` is set,
6
- * Atabey accepts an HMAC-signed `ATABEY_AGENT_TOKEN` and verifies it
7
- * (fail-closed on tampering/expiry). Set `ATABEY_AGENT_IDENTITY_REQUIRED=true`
8
- * to refuse plain-env identity entirely.
9
- *
10
- * Token format: `${agent}.${issuedAt}.${expiresAt}.${hmacSha256Base64url}`
11
- */
12
- import crypto from "crypto";
13
- import { resolveAuditChainKey } from "./audit-chain.js";
14
- function resolveKey(explicit) {
15
- if (explicit) {
16
- return Buffer.isBuffer(explicit) ? explicit : crypto.createHash("sha256").update(explicit, "utf8").digest();
17
- }
18
- const envSecret = process.env.ATABEY_AGENT_SECRET;
19
- if (envSecret && envSecret.trim()) {
20
- return crypto.createHash("sha256").update(envSecret.trim(), "utf8").digest();
21
- }
22
- return resolveAuditChainKey();
23
- }
24
- function timingSafeEqual(a, b) {
25
- const ba = Buffer.from(a);
26
- const bb = Buffer.from(b);
27
- if (ba.length !== bb.length)
28
- return false;
29
- return crypto.timingSafeEqual(ba, bb);
30
- }
31
- /** True when agent-token verification is mandatory (plain env rejected). */
32
- export function isAgentIdentityEnforced() {
33
- return process.env.ATABEY_AGENT_IDENTITY_REQUIRED === "true";
34
- }
35
- /** Sign an agent identity into a compact token. */
36
- export function signAgentToken(agent, options = {}) {
37
- const key = resolveKey(options.key);
38
- if (!key) {
39
- throw new Error("[AGENT_IDENTITY] No signing key. Set ATABEY_AGENT_SECRET.");
40
- }
41
- const name = agent.replace(/^@/, "");
42
- const issuedAt = Date.now();
43
- const expiresAt = issuedAt + (options.ttlMs ?? 60 * 60 * 1000);
44
- const payload = `${name}.${issuedAt}.${expiresAt}`;
45
- const sig = crypto.createHmac("sha256", key).update(payload).digest("base64url");
46
- return `${payload}.${sig}`;
47
- }
48
- /** Verify an agent token (signature + expiry). */
49
- export function verifyAgentToken(token, options = {}) {
50
- const key = resolveKey(options.key);
51
- if (!key)
52
- return { valid: false, reason: "No signing key configured." };
53
- if (!token || typeof token !== "string")
54
- return { valid: false, reason: "Empty token." };
55
- const parts = token.split(".");
56
- if (parts.length !== 4)
57
- return { valid: false, reason: "Malformed token." };
58
- const [name, issuedAt, expiresAt, sig] = parts;
59
- const payload = `${name}.${issuedAt}.${expiresAt}`;
60
- const expected = crypto.createHmac("sha256", key).update(payload).digest("base64url");
61
- if (!timingSafeEqual(sig, expected))
62
- return { valid: false, reason: "Signature mismatch." };
63
- const exp = Number(expiresAt);
64
- if (!Number.isFinite(exp))
65
- return { valid: false, reason: "Invalid expiry." };
66
- if (Date.now() > exp)
67
- return { valid: false, reason: "Token expired." };
68
- return { valid: true, agent: `@${name}` };
69
- }
70
- /** Decode a token's identity without verification (for diagnostics only). */
71
- export function decodeAgentToken(token) {
72
- const parts = token.split(".");
73
- if (parts.length !== 4)
74
- return null;
75
- return { agent: `@${parts[0]}`, issuedAt: Number(parts[1]), expiresAt: Number(parts[2]) };
76
- }
1
+ export * from "./modules/agent/agent-identity.js";
77
2
  //# sourceMappingURL=agent-identity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-identity.js","sourceRoot":"","sources":["../src/agent-identity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-identity.js","sourceRoot":"","sources":["../src/agent-identity.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAC"}
@@ -1,57 +1 @@
1
- /**
2
- * API Catalog — endpoint registry, route/OpenAPI scanner, and drift detection.
3
- *
4
- * Purpose: let frontend/mobile agents integrate against the backend API using
5
- * a compact JSON catalog instead of reading large route source files (token
6
- * savings + zero context pollution).
7
- *
8
- * The scanner is HEURISTIC (regex/AST-lite) and covers:
9
- * - Express / Fastify: app|router|server|fastify.get('/path', ...)
10
- * - Fastify route(): fastify.route({ method, url, ... })
11
- * - NestJS decorators: @Get('path') / @Post('path')
12
- * - OpenAPI v3 / Swagger v2 JSON specs
13
- */
14
- export interface ApiEndpoint {
15
- method: string;
16
- path: string;
17
- tag?: string;
18
- summary?: string;
19
- authRequired: boolean;
20
- requestSchema?: string;
21
- responseSchema?: string;
22
- source?: string;
23
- updatedAt: string;
24
- }
25
- export interface ApiCatalog {
26
- version: 1;
27
- generatedAt: string;
28
- endpoints: ApiEndpoint[];
29
- }
30
- export interface ApiDrift {
31
- added: ApiEndpoint[];
32
- removed: ApiEndpoint[];
33
- changed: Array<{
34
- previous: ApiEndpoint;
35
- current: ApiEndpoint;
36
- }>;
37
- }
38
- export declare function endpointKey(e: {
39
- method: string;
40
- path: string;
41
- }): string;
42
- export declare function normalizePath(p: string): string;
43
- /** Parse an OpenAPI v3 or Swagger v2 spec object into endpoints. */
44
- export declare function parseOpenApiSpec(spec: unknown): ApiEndpoint[];
45
- /**
46
- * Walk a project tree and collect endpoints from route source files and any
47
- * OpenAPI/Swagger JSON specs.
48
- */
49
- export declare function scanProjectForEndpoints(rootDir: string, options?: {
50
- maxFiles?: number;
51
- }): ApiEndpoint[];
52
- export declare function dedupe(endpoints: ApiEndpoint[]): ApiEndpoint[];
53
- /**
54
- * Diff a previous catalog against a freshly scanned one.
55
- */
56
- export declare function detectApiDrift(previous: ApiEndpoint[], current: ApiEndpoint[]): ApiDrift;
57
- export declare function isApiDriftClean(drift: ApiDrift): boolean;
1
+ export * from "./modules/agent/api-catalog.js";
@@ -1,254 +1,2 @@
1
- /**
2
- * API Catalog — endpoint registry, route/OpenAPI scanner, and drift detection.
3
- *
4
- * Purpose: let frontend/mobile agents integrate against the backend API using
5
- * a compact JSON catalog instead of reading large route source files (token
6
- * savings + zero context pollution).
7
- *
8
- * The scanner is HEURISTIC (regex/AST-lite) and covers:
9
- * - Express / Fastify: app|router|server|fastify.get('/path', ...)
10
- * - Fastify route(): fastify.route({ method, url, ... })
11
- * - NestJS decorators: @Get('path') / @Post('path')
12
- * - OpenAPI v3 / Swagger v2 JSON specs
13
- */
14
- import fs from "fs";
15
- import path from "path";
16
- const HTTP_METHODS = ["get", "post", "put", "patch", "delete", "options", "head"];
17
- const ROUTE_EXTENSIONS = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"]);
18
- const SKIP_DIRS = new Set(["node_modules", "dist", "build", ".git", "coverage", ".atabey", ".next"]);
19
- export function endpointKey(e) {
20
- return `${e.method.toUpperCase()} ${normalizePath(e.path)}`;
21
- }
22
- export function normalizePath(p) {
23
- if (!p)
24
- return "/";
25
- let out = p.trim();
26
- if (!out.startsWith("/"))
27
- out = `/${out}`;
28
- // Collapse :param and {param} to a stable placeholder for drift comparison.
29
- out = out.replace(/\{[^}]+\}/g, ":param").replace(/:[A-Za-z0-9_]+/g, ":param");
30
- out = out.replace(/\/+$/, "");
31
- return out || "/";
32
- }
33
- function defaultTag(p) {
34
- const seg = p.split("/").filter(Boolean);
35
- return seg[0] || "root";
36
- }
37
- /** Extract a route statement plus a few following lines for schema hints. */
38
- function scanRouteSource(filePath, content) {
39
- const now = new Date().toISOString();
40
- const lines = content.split("\n");
41
- const found = new Map();
42
- const add = (method, rawPath, schemaHint, authHint) => {
43
- if (!rawPath || rawPath === "*")
44
- return;
45
- const m = method.toUpperCase();
46
- const p = rawPath;
47
- const key = endpointKey({ method: m, path: p });
48
- if (found.has(key))
49
- return;
50
- const schemaMatch = /(?:schema|body|response)\s*:\s*([A-Za-z0-9_.]+)/.exec(schemaHint);
51
- found.set(key, {
52
- method: m,
53
- path: p.startsWith("/") ? p : `/${p}`,
54
- tag: defaultTag(p),
55
- authRequired: authHint,
56
- requestSchema: schemaMatch?.[1],
57
- source: filePath,
58
- updatedAt: now,
59
- });
60
- };
61
- const isRouteLine = (l) => /\.(get|post|put|patch|delete|options|head)\s*\(/.test(l) ||
62
- /@(Get|Post|Put|Patch|Delete|Options|Head)\s*\(/.test(l) ||
63
- /\broute\s*\(/.test(l);
64
- for (let i = 0; i < lines.length; i++) {
65
- const line = lines[i];
66
- // Statement-bounded window: stop at the next route line or statement end
67
- // so schema/auth hints cannot bleed into the following route.
68
- let window = line;
69
- for (let j = i + 1; j < Math.min(i + 12, lines.length); j++) {
70
- if (isRouteLine(lines[j]))
71
- break;
72
- window += `\n${lines[j]}`;
73
- if (/;\s*$/.test(lines[j]))
74
- break;
75
- }
76
- const authHint = /\b(authenticate|authGuard|verifyToken|preHandler\s*:\s*\[?\s*auth|requireAuth|jwt)\b/i.test(window);
77
- // Express / Fastify shorthand: app.get('/x', ...) / router.post("/x", ...)
78
- const short = /\.(get|post|put|patch|delete|options|head)\s*\(\s*[`'"]([^`'"]+)[`'"]/gi;
79
- let m;
80
- while ((m = short.exec(line)) !== null) {
81
- add(m[1], m[2], window, authHint);
82
- }
83
- // Fastify route({ method: 'GET', url: '/x' }) — method/url may be in either order.
84
- if (/\broute\s*\(/.test(line) || /\burl\s*:/.test(line)) {
85
- const methodM = /method\s*:\s*[`'"](\w+)[`'"]/i.exec(window);
86
- const urlM = /url\s*:\s*[`'"]([^`'"]+)[`'"]/i.exec(window);
87
- if (methodM && urlM)
88
- add(methodM[1], urlM[1], window, authHint);
89
- }
90
- // NestJS decorators: @Get('path') @Post()
91
- const dec = /@(Get|Post|Put|Patch|Delete|Options|Head)\s*\(\s*[`'"]?([^`'")]*)[`'"]?\s*\)/g;
92
- while ((m = dec.exec(line)) !== null) {
93
- add(m[1], m[2] || "/", window, authHint);
94
- }
95
- }
96
- return [...found.values()];
97
- }
98
- /** Parse an OpenAPI v3 or Swagger v2 spec object into endpoints. */
99
- export function parseOpenApiSpec(spec) {
100
- const now = new Date().toISOString();
101
- const doc = spec;
102
- const paths = doc?.["paths"];
103
- if (!paths || typeof paths !== "object")
104
- return [];
105
- const out = [];
106
- for (const [rawPath, item] of Object.entries(paths)) {
107
- if (!item || typeof item !== "object")
108
- continue;
109
- for (const method of HTTP_METHODS) {
110
- const op = item[method];
111
- if (!op)
112
- continue;
113
- const tags = Array.isArray(op["tags"]) ? op["tags"] : [];
114
- const security = op["security"];
115
- const requestSchema = refName(op["requestBody"]?.["content"]?.["application/json"]) ??
116
- refName(op["parameters"]);
117
- const responses = op["responses"];
118
- const okResp = responses?.["200"] ?? responses?.["201"] ?? Object.values(responses || {})[0];
119
- const responseSchema = refName((okResp?.["content"]?.["application/json"]) ?? okResp?.["schema"]);
120
- out.push({
121
- method: method.toUpperCase(),
122
- path: rawPath,
123
- tag: tags[0] || defaultTag(rawPath),
124
- summary: typeof op["summary"] === "string" ? op["summary"] : undefined,
125
- authRequired: Array.isArray(security) ? security.length > 0 : false,
126
- requestSchema,
127
- responseSchema,
128
- source: "openapi",
129
- updatedAt: now,
130
- });
131
- }
132
- }
133
- return out;
134
- }
135
- function refName(node) {
136
- if (!node || typeof node !== "object")
137
- return undefined;
138
- const obj = node;
139
- if (typeof obj["$ref"] === "string")
140
- return obj["$ref"];
141
- if (typeof obj["title"] === "string")
142
- return obj["title"];
143
- const schema = obj["schema"];
144
- if (schema && typeof schema === "object") {
145
- const s = schema;
146
- if (typeof s["$ref"] === "string")
147
- return s["$ref"];
148
- if (typeof s["title"] === "string")
149
- return s["title"];
150
- }
151
- return undefined;
152
- }
153
- /**
154
- * Walk a project tree and collect endpoints from route source files and any
155
- * OpenAPI/Swagger JSON specs.
156
- */
157
- export function scanProjectForEndpoints(rootDir, options = {}) {
158
- const maxFiles = options.maxFiles ?? 5000;
159
- const results = [];
160
- let visited = 0;
161
- const walk = (dir) => {
162
- if (visited >= maxFiles)
163
- return;
164
- let entries;
165
- try {
166
- entries = fs.readdirSync(dir, { withFileTypes: true });
167
- }
168
- catch {
169
- return;
170
- }
171
- for (const entry of entries) {
172
- if (visited >= maxFiles)
173
- return;
174
- const full = path.join(dir, entry.name);
175
- if (entry.isDirectory()) {
176
- if (SKIP_DIRS.has(entry.name))
177
- continue;
178
- walk(full);
179
- }
180
- else if (entry.isFile()) {
181
- visited++;
182
- const ext = path.extname(entry.name).toLowerCase();
183
- try {
184
- if (ext === ".json" && /openapi|swagger/i.test(entry.name)) {
185
- const spec = JSON.parse(fs.readFileSync(full, "utf8"));
186
- results.push(...parseOpenApiSpec(spec));
187
- }
188
- else if (ROUTE_EXTENSIONS.has(ext)) {
189
- const content = fs.readFileSync(full, "utf8");
190
- if (/\.(get|post|put|patch|delete)\(|@(Get|Post|Put|Patch|Delete)\(|\broute\(/.test(content)) {
191
- results.push(...scanRouteSource(path.relative(rootDir, full), content));
192
- }
193
- }
194
- }
195
- catch {
196
- /* skip unreadable files */
197
- }
198
- }
199
- }
200
- };
201
- walk(rootDir);
202
- return dedupe(results);
203
- }
204
- export function dedupe(endpoints) {
205
- const map = new Map();
206
- for (const e of endpoints) {
207
- const key = endpointKey(e);
208
- const existing = map.get(key);
209
- if (!existing) {
210
- map.set(key, e);
211
- }
212
- else {
213
- // Prefer the record with richer schema info.
214
- map.set(key, {
215
- ...existing,
216
- requestSchema: existing.requestSchema ?? e.requestSchema,
217
- responseSchema: existing.responseSchema ?? e.responseSchema,
218
- authRequired: existing.authRequired || e.authRequired,
219
- });
220
- }
221
- }
222
- return [...map.values()].sort((a, b) => endpointKey(a).localeCompare(endpointKey(b)));
223
- }
224
- /**
225
- * Diff a previous catalog against a freshly scanned one.
226
- */
227
- export function detectApiDrift(previous, current) {
228
- const prevMap = new Map(previous.map((e) => [endpointKey(e), e]));
229
- const curMap = new Map(current.map((e) => [endpointKey(e), e]));
230
- const added = [];
231
- const removed = [];
232
- const changed = [];
233
- for (const [key, cur] of curMap) {
234
- const prev = prevMap.get(key);
235
- if (!prev) {
236
- added.push(cur);
237
- continue;
238
- }
239
- if ((prev.requestSchema ?? "") !== (cur.requestSchema ?? "") ||
240
- (prev.responseSchema ?? "") !== (cur.responseSchema ?? "") ||
241
- prev.authRequired !== cur.authRequired) {
242
- changed.push({ previous: prev, current: cur });
243
- }
244
- }
245
- for (const [key, prev] of prevMap) {
246
- if (!curMap.has(key))
247
- removed.push(prev);
248
- }
249
- return { added, removed, changed };
250
- }
251
- export function isApiDriftClean(drift) {
252
- return drift.added.length === 0 && drift.removed.length === 0 && drift.changed.length === 0;
253
- }
1
+ export * from "./modules/agent/api-catalog.js";
254
2
  //# sourceMappingURL=api-catalog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-catalog.js","sourceRoot":"","sources":["../src/api-catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-catalog.js","sourceRoot":"","sources":["../src/api-catalog.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC"}