atabey-shared 0.1.1-beta → 0.1.3

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 +79 -41
  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 -150
  15. package/dist/constants.js +1 -211
  16. package/dist/constants.js.map +1 -1
  17. package/dist/database.d.ts +1 -6
  18. package/dist/database.js +1 -15
  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 -76
  33. package/dist/job-queue.js +1 -199
  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 -393
  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 +45 -34
package/README.md CHANGED
@@ -1,32 +1,30 @@
1
- # [GOV] Atabey Shared — Core Utility Library for AI Governance Platform
1
+ # Atabey Shared — Local AI Control Plane & Discipline Layer (Shared Utilities)
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.3-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
 
7
- **Atabey Shared** is the foundational utility package of the Atabey framework. It provides the shared codebase, data structures, constants, security filters, database holders, logging layers, and locking mechanisms used by both `atabey` (Core CLI/Orchestrator) and `atabey-mcp` (MCP Server).
7
+ **Atabey Shared** is the foundational utility package of the Atabey framework: shared constants and branded types, security filters (PII, secrets, TLS, policy gate), the SQLite holder and migrations, structured logging, audit chain, concurrency primitives (locks, job queue, worker pool) and the sandbox runtime — used by both `atabey` (core CLI/orchestrator) and `atabey-mcp` (MCP server).
8
8
 
9
9
  ---
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
 
27
25
  ## 🚀 Installation
28
26
 
29
- This package is designed as an **internal shared module** for the Atabey monorepo workspace, but it can be installed independently if needed:
27
+ Designed as an **internal shared module** for the Atabey monorepo workspace, but installable independently:
30
28
 
31
29
  ```bash
32
30
  npm install atabey-shared
@@ -34,52 +32,83 @@ 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; the
39
+ flat `atabey-shared/*.js` entry points are kept as thin re-export shims for backward
40
+ 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)
40
- The `pii.ts` module scans and redacts sensitive data before it is logged to disk or sent to external LLM providers, ensuring absolute data privacy.
76
+ The `pii.ts` module scans and redacts sensitive data before it is logged to disk or sent to external LLM providers.
41
77
  ```typescript
42
78
  import { maskText } from "atabey-shared";
43
79
 
44
- const sensitiveInput = "My phone is +90 555 123 45 67 and email is admin@company.com";
45
- const sanitizedText = maskText(sensitiveInput);
46
- console.log(sanitizedText);
47
- // Output: "My phone is ***-***-**** and email is ***@***"
80
+ const sanitized = maskText("My phone is +90 555 123 45 67 and email is admin@company.com");
81
+ // "My phone is ***-***-**** and email is ***@***"
48
82
  ```
49
83
 
50
84
  ### 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`).
85
+ `lock.ts` provides a SQLite-backed `DistributedLock` (server-authoritative, with stale-lock reclaim) that prevents race conditions between parallel agents writing to shared resources. For a lightweight file-based lock, use `AtomicFileLock` from `file-lock.ts`.
52
86
  ```typescript
53
- import { AtabeyLock } from "atabey-shared";
87
+ import { DistributedLock } from "atabey-shared";
54
88
 
55
- const lock = new AtabeyLock("project-memory", { ttlMs: 10000, retryCount: 3 });
89
+ DistributedLock.initialize(); // once at startup
56
90
 
57
- try {
58
- const acquired = await lock.acquire();
59
- if (acquired) {
60
- // Safe region: write to file
91
+ const owner = DistributedLock.getLocalOwnerId();
92
+ if (DistributedLock.acquire("PROJECT_MEMORY.md", owner, { ttlMs: 10000, reason: "memory sync" })) {
93
+ try {
94
+ // safe region: write the shared resource
95
+ } finally {
96
+ DistributedLock.release("PROJECT_MEMORY.md", owner);
61
97
  }
62
- } finally {
63
- await lock.release();
64
98
  }
65
99
  ```
66
100
 
67
- ### 3. Enterprise Logger
68
- Structured logger wrapping `process.stdout` and `process.stderr` supporting log file logging and JSON output format.
101
+ ### 3. Structured Logger
102
+ Structured logger wrapping `process.stdout`/`process.stderr`, with file logging and JSON output.
69
103
  ```typescript
70
104
  import { logger, LogLevel } from "atabey-shared";
71
105
 
72
- logger.configure({
73
- minLevel: LogLevel.DEBUG,
74
- jsonFormat: true,
75
- logFile: "./.atabey/logs/system.log"
76
- });
77
-
106
+ logger.configure({ minLevel: LogLevel.DEBUG, jsonFormat: true, logFile: "./.atabey/logs/system.log" });
78
107
  logger.info("Database migration completed", { durationMs: 142 });
79
108
  ```
80
109
 
81
110
  ### 4. Branded Types
82
- Ensures compile-time validation for workspace ID primitives to prevent mixing up agent names, message IDs, and task IDs.
111
+ Compile-time validation for workspace ID primitives to prevent mixing agent names, message IDs and task IDs.
83
112
  ```typescript
84
113
  import { AgentID, TaskID, asAgentID, asTaskID } from "atabey-shared";
85
114
 
@@ -91,10 +120,19 @@ const task: TaskID = asTaskID("TASK-102");
91
120
 
92
121
  ## 📦 Dependencies
93
122
 
94
- - **better-sqlite3**: SQLite database engine for storage shims
95
- - **typescript**: Type safety enforcement
123
+ - **js-tiktoken**: `cl100k_base` BPE tokenizer for token accounting
124
+ - **better-sqlite3**, **chalk**, **zod** _(peer)_: storage, terminal styling and runtime validation
125
+
126
+ ## 🔗 Related Packages
127
+
128
+ | Package | Role | Links |
129
+ |---------|------|-------|
130
+ | **atabey** | Core engine — CLI, agents, engines, orchestrator | [npm](https://www.npmjs.com/package/atabey) · [source](https://github.com/ysf-bkr/atabey/tree/main/packages/atabey) |
131
+ | **atabey-mcp** | MCP server — 40 tools & governance pipeline | [npm](https://www.npmjs.com/package/atabey-mcp) · [source](https://github.com/ysf-bkr/atabey/tree/main/packages/atabey-mcp) |
132
+ | **atabey-shared** | Shared utilities — constants, storage, PII, audit, locks | [npm](https://www.npmjs.com/package/atabey-shared) · [source](https://github.com/ysf-bkr/atabey/tree/main/packages/shared) |
133
+
134
+ > Full bilingual documentation (TR + EN): **[github.com/ysf-bkr/atabey](https://github.com/ysf-bkr/atabey#readme)**
96
135
 
97
- ---
98
136
 
99
137
  ## License
100
138
 
@@ -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"}