@delentia/delentia-os 1.3.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.
- package/README.md +256 -0
- package/dist/cli/commands/compile.d.ts +3 -0
- package/dist/cli/commands/compile.d.ts.map +1 -0
- package/dist/cli/commands/compile.js +92 -0
- package/dist/cli/commands/compile.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +199 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/fdia.d.ts +3 -0
- package/dist/cli/commands/fdia.d.ts.map +1 -0
- package/dist/cli/commands/fdia.js +56 -0
- package/dist/cli/commands/fdia.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +105 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +16 -0
- package/dist/cli/commands/memory.d.ts.map +1 -0
- package/dist/cli/commands/memory.js +222 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +64 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +31 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui/align.d.ts +12 -0
- package/dist/cli/ui/align.d.ts.map +1 -0
- package/dist/cli/ui/align.js +27 -0
- package/dist/cli/ui/align.js.map +1 -0
- package/dist/cli/ui/badge.d.ts +15 -0
- package/dist/cli/ui/badge.d.ts.map +1 -0
- package/dist/cli/ui/badge.js +44 -0
- package/dist/cli/ui/badge.js.map +1 -0
- package/dist/cli/ui/banner.d.ts +2 -0
- package/dist/cli/ui/banner.d.ts.map +1 -0
- package/dist/cli/ui/banner.js +34 -0
- package/dist/cli/ui/banner.js.map +1 -0
- package/dist/cli/ui/output.d.ts +4 -0
- package/dist/cli/ui/output.d.ts.map +1 -0
- package/dist/cli/ui/output.js +61 -0
- package/dist/cli/ui/output.js.map +1 -0
- package/dist/cli/ui/spinner.d.ts +6 -0
- package/dist/cli/ui/spinner.d.ts.map +1 -0
- package/dist/cli/ui/spinner.js +28 -0
- package/dist/cli/ui/spinner.js.map +1 -0
- package/dist/client.d.ts +87 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +72 -0
- package/dist/client.js.map +1 -0
- package/dist/fdia.d.ts +47 -0
- package/dist/fdia.d.ts.map +1 -0
- package/dist/fdia.js +53 -0
- package/dist/fdia.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/jitna.d.ts +67 -0
- package/dist/jitna.d.ts.map +1 -0
- package/dist/jitna.js +48 -0
- package/dist/jitna.js.map +1 -0
- package/dist/signedai.d.ts +34 -0
- package/dist/signedai.d.ts.map +1 -0
- package/dist/signedai.js +60 -0
- package/dist/signedai.js.map +1 -0
- package/package.json +69 -0
package/README.md
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# @delentia/delentia-os
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@delentia/delentia-os)
|
|
4
|
+
[](https://github.com/delentia-labs/delentia-os/blob/main/LICENSE)
|
|
5
|
+
[](https://www.typescriptlang.org/)
|
|
6
|
+
|
|
7
|
+
**TypeScript / JavaScript SDK for [RCT Platform](https://delentia.com)** — the world's first Intent-Centric AI Operating System with constitutional architecture.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## What is RCT Platform?
|
|
12
|
+
|
|
13
|
+
RCT Platform provides:
|
|
14
|
+
- **FDIA Formula** — `F = D^I × A` — constitutional scoring that governs AI freedom to act
|
|
15
|
+
- **JITNA Packets** — Just-In-Time Need Analysis structured intent envelopes
|
|
16
|
+
- **SignedAI Tiers** — HexaCore role assignment based on user tier and risk profile
|
|
17
|
+
- **REST Client** — typed Axios wrapper for the delentia-os FastAPI backend
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Installation
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install @delentia/delentia-os
|
|
25
|
+
# or
|
|
26
|
+
yarn add @delentia/delentia-os
|
|
27
|
+
# or
|
|
28
|
+
pnpm add @delentia/delentia-os
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## CLI — `npx rct`
|
|
34
|
+
|
|
35
|
+
The package ships a full command-line interface. Run without installing:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npx @delentia/delentia-os --help
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Or install globally for the `rct` command:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm install -g @delentia/delentia-os
|
|
45
|
+
rct --help
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Commands
|
|
49
|
+
|
|
50
|
+
| Command | Description |
|
|
51
|
+
|---------|-------------|
|
|
52
|
+
| `rct compile "<intent>"` | Compile intent → FDIA + JITNA + policy evaluation |
|
|
53
|
+
| `rct status` | Show control plane metrics (requires running server) |
|
|
54
|
+
| `rct init` | Interactive wizard → writes `.rct.json` config |
|
|
55
|
+
| `rct fdia <d> <i> <a>` | Offline constitutional gate check |
|
|
56
|
+
|
|
57
|
+
### Examples
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Check constitutional gate offline
|
|
61
|
+
npx @delentia/delentia-os fdia 0.9 0.95 1.0
|
|
62
|
+
# ╭────── FDIA — Constitutional Gate PASSED ──────╮
|
|
63
|
+
# │ F Score: 0.9048 Risk: LOW Gate: 0.75 PASS ✔ │
|
|
64
|
+
# ╰───────────────────────────────────────────────╯
|
|
65
|
+
|
|
66
|
+
# Compile intent (requires delentia-os server running)
|
|
67
|
+
npx @delentia/delentia-os compile "Refactor the authentication module" --url http://localhost:8000
|
|
68
|
+
|
|
69
|
+
# Interactive project setup
|
|
70
|
+
npx @delentia/delentia-os init
|
|
71
|
+
|
|
72
|
+
# Server health + metrics
|
|
73
|
+
npx @delentia/delentia-os status
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### `rct fdia` — Offline Mode
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
rct fdia <d> <i> <a> [--gate <threshold>] [--no-banner]
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
| Arg | Range | Description |
|
|
83
|
+
|-----|-------|-------------|
|
|
84
|
+
| `d` | 0.0–1.0 | Delta — change vector magnitude |
|
|
85
|
+
| `i` | 0.0–1.0 | Identity — role confidence |
|
|
86
|
+
| `a` | 0.0–1.0 | Architect gate (0=blocked, 1=approved) |
|
|
87
|
+
| `--gate` | 0.0–1.0 | Minimum pass threshold (default: `0.75`) |
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Quick Start
|
|
92
|
+
|
|
93
|
+
### FDIA Constitutional Formula
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
import { computeFDIA, meetsThreshold } from "@delentia/delentia-os";
|
|
97
|
+
|
|
98
|
+
// Compute F = D^I × A
|
|
99
|
+
const result = computeFDIA(0.7, 0.9, 1.0);
|
|
100
|
+
console.log(result);
|
|
101
|
+
// {
|
|
102
|
+
// f: 0.667,
|
|
103
|
+
// d: 0.7, i: 0.9, a: 1.0,
|
|
104
|
+
// riskLevel: "LOW",
|
|
105
|
+
// isBlocked: false,
|
|
106
|
+
// explanation: "F=0.667 = D^I × A = 0.70^0.90 × 1.00 → Risk=LOW"
|
|
107
|
+
// }
|
|
108
|
+
|
|
109
|
+
// Check against governance threshold
|
|
110
|
+
const allowed = meetsThreshold(result, 0.5);
|
|
111
|
+
console.log(allowed); // true
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### JITNA Packet Construction
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
import { constructJITNA, serializeJITNA } from "@delentia/delentia-os";
|
|
118
|
+
|
|
119
|
+
const packet = constructJITNA({
|
|
120
|
+
intent: "Refactor the authentication module",
|
|
121
|
+
userTier: "PRO",
|
|
122
|
+
region: "ASEAN",
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
console.log(packet.packetId); // "jitna_<uuid>"
|
|
126
|
+
console.log(packet.scope.region); // "ASEAN"
|
|
127
|
+
|
|
128
|
+
const json = serializeJITNA(packet);
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### SignedAI Tier Selection
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
import { selectSignedAITier } from "@delentia/delentia-os";
|
|
135
|
+
|
|
136
|
+
const selection = selectSignedAITier("PRO", "STRUCTURAL");
|
|
137
|
+
console.log(selection.roles);
|
|
138
|
+
// ["SUPREME_ARCHITECT", "LEAD_BUILDER", "JUNIOR_BUILDER",
|
|
139
|
+
// "SPECIALIST", "LIBRARIAN", "HUMANIZER"]
|
|
140
|
+
console.log(selection.maxParallelAgents); // 4
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### REST Client (requires running delentia-os server)
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
import { RCTClient } from "@delentia/delentia-os";
|
|
147
|
+
|
|
148
|
+
const client = new RCTClient({
|
|
149
|
+
baseURL: "https://your-rct-instance.com",
|
|
150
|
+
apiKey: "your-api-key",
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// Compile an intent
|
|
154
|
+
const compiled = await client.compile("Optimize database queries");
|
|
155
|
+
console.log(compiled.intent_id);
|
|
156
|
+
console.log(compiled.risk_profile);
|
|
157
|
+
|
|
158
|
+
// Evaluate against governance policies
|
|
159
|
+
const evaluation = await client.evaluatePolicy(compiled.intent_id);
|
|
160
|
+
console.log(evaluation.decision); // "approve" | "reject" | "require_approval"
|
|
161
|
+
|
|
162
|
+
// Get system metrics
|
|
163
|
+
const metrics = await client.getMetrics();
|
|
164
|
+
console.log(metrics.total_intents);
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## API Reference
|
|
170
|
+
|
|
171
|
+
### `computeFDIA(d, i, a): FDIAResult`
|
|
172
|
+
|
|
173
|
+
Compute the constitutional FDIA score using `F = D^I × A`.
|
|
174
|
+
|
|
175
|
+
| Parameter | Type | Description |
|
|
176
|
+
|-----------|------|-------------|
|
|
177
|
+
| `d` | `number` (0.0–1.0) | Delta — change vector magnitude |
|
|
178
|
+
| `i` | `number` (0.0–1.0) | Identity — role confidence |
|
|
179
|
+
| `a` | `number` (0.0–1.0) | Architect gate (0=blocked, 1=approved) |
|
|
180
|
+
|
|
181
|
+
Returns `FDIAResult` with: `f`, `d`, `i`, `a`, `riskLevel`, `isBlocked`, `explanation`.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
### `meetsThreshold(result, threshold): boolean`
|
|
186
|
+
|
|
187
|
+
Check if an `FDIAResult` meets the minimum freedom threshold.
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
### `constructJITNA(options): JITNAPacket`
|
|
192
|
+
|
|
193
|
+
Build a structured JITNA intent packet.
|
|
194
|
+
|
|
195
|
+
| Option | Type | Default |
|
|
196
|
+
|--------|------|---------|
|
|
197
|
+
| `intent` | `string` | required |
|
|
198
|
+
| `userTier` | `"FREE" \| "PRO" \| "ENTERPRISE"` | `"FREE"` |
|
|
199
|
+
| `region` | `string` | `"GLOBAL"` |
|
|
200
|
+
| `budgetTokens` | `number` | `4096` |
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
### `selectSignedAITier(tier, riskProfile): TierSelection`
|
|
205
|
+
|
|
206
|
+
Map user tier + risk profile to HexaCore role assignments.
|
|
207
|
+
|
|
208
|
+
| Tier | Roles | Max Parallel Agents |
|
|
209
|
+
|------|-------|-------------------|
|
|
210
|
+
| `FREE` | 4 roles | 2 |
|
|
211
|
+
| `PRO` | 6 roles | 4 |
|
|
212
|
+
| `ENTERPRISE` | 8 roles (full HexaCore) | 8 |
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
### `RCTClient`
|
|
217
|
+
|
|
218
|
+
Typed Axios client for the delentia-os REST API.
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
const client = new RCTClient(config?: RCTClientConfig);
|
|
222
|
+
await client.compile(intentText: string): Promise<CompileResponse>
|
|
223
|
+
await client.evaluatePolicy(intentId: string): Promise<PolicyEvalResponse>
|
|
224
|
+
await client.getMetrics(): Promise<MetricsResponse>
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## TypeScript Support
|
|
230
|
+
|
|
231
|
+
Full TypeScript support with bundled type declarations (`dist/index.d.ts`).
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
import type {
|
|
235
|
+
FDIAResult, FDIAScores, RiskLevel,
|
|
236
|
+
JITNAPacket, JITNAMeta,
|
|
237
|
+
TierSelection, UserTier, HexaCoreRole,
|
|
238
|
+
RCTClientConfig, CompileResponse,
|
|
239
|
+
} from "@delentia/delentia-os";
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Links
|
|
245
|
+
|
|
246
|
+
- **Website**: [delentia.com](https://delentia.com)
|
|
247
|
+
- **Python SDK (PyPI)**: [delentia-os](https://pypi.org/project/delentia-os/)
|
|
248
|
+
- **GitHub**: [rctlabs/delentia-os](https://github.com/delentia-labs/delentia-os)
|
|
249
|
+
- **Docs**: [rctlabs.github.io/delentia-os](https://rctlabs.github.io/delentia-os/)
|
|
250
|
+
- **Issues**: [GitHub Issues](https://github.com/delentia-labs/delentia-os/issues)
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## License
|
|
255
|
+
|
|
256
|
+
[Apache 2.0](https://github.com/delentia-labs/delentia-os/blob/main/LICENSE) © Delentia Labs
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BpC,eAAO,MAAM,cAAc,SAsEvB,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.compileCommand = void 0;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const path_1 = require("path");
|
|
11
|
+
const client_1 = require("../../client");
|
|
12
|
+
const banner_1 = require("../ui/banner");
|
|
13
|
+
const spinner_1 = require("../ui/spinner");
|
|
14
|
+
const output_1 = require("../ui/output");
|
|
15
|
+
function loadConfig() {
|
|
16
|
+
const configPath = (0, path_1.join)(process.cwd(), ".rct.json");
|
|
17
|
+
if ((0, fs_1.existsSync)(configPath)) {
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse((0, fs_1.readFileSync)(configPath, "utf-8"));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// ignore parse errors
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return { baseURL: "http://localhost:8000" };
|
|
26
|
+
}
|
|
27
|
+
function delay(ms) {
|
|
28
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
29
|
+
}
|
|
30
|
+
exports.compileCommand = new commander_1.Command("compile")
|
|
31
|
+
.description("Compile a natural-language intent through the RCT constitutional pipeline")
|
|
32
|
+
.argument("<intent>", "The intent to compile (natural language)")
|
|
33
|
+
.option("-u, --url <url>", "API endpoint URL")
|
|
34
|
+
.option("-t, --tier <tier>", "User tier (FREE|PRO|ENTERPRISE)")
|
|
35
|
+
.option("--no-banner", "Skip the banner")
|
|
36
|
+
.action(async (intent, opts) => {
|
|
37
|
+
if (opts["banner"] !== false)
|
|
38
|
+
(0, banner_1.showBanner)();
|
|
39
|
+
const config = loadConfig();
|
|
40
|
+
const baseURL = opts["url"] ?? config.baseURL ?? "http://localhost:8000";
|
|
41
|
+
const userTier = opts["tier"] ?? config.userTier ?? "PRO";
|
|
42
|
+
console.log(chalk_1.default.gray(` Intent: "${intent}"\n`));
|
|
43
|
+
// Step 1 — JITNA
|
|
44
|
+
const s1 = (0, spinner_1.createSpinner)("Initializing JITNA Protocol...");
|
|
45
|
+
s1.start();
|
|
46
|
+
await delay(350);
|
|
47
|
+
(0, spinner_1.succeed)(s1, "JITNA packet constructed");
|
|
48
|
+
// Step 2 — FDIA
|
|
49
|
+
const s2 = (0, spinner_1.createSpinner)("Calculating FDIA Equation (F = D\u1d35 \u00d7 A)...");
|
|
50
|
+
s2.start();
|
|
51
|
+
await delay(280);
|
|
52
|
+
(0, spinner_1.succeed)(s2, "FDIA constitutional score computed");
|
|
53
|
+
// Step 3 — Compile via server
|
|
54
|
+
const s3 = (0, spinner_1.createSpinner)("Compiling through constitutional pipeline...");
|
|
55
|
+
s3.start();
|
|
56
|
+
try {
|
|
57
|
+
const client = new client_1.RCTClient({ baseURL, timeoutMs: 15000 });
|
|
58
|
+
const compiled = await client.compile(intent, "cli-user", userTier);
|
|
59
|
+
(0, spinner_1.succeed)(s3, "Compilation complete");
|
|
60
|
+
// Step 4 — Policy evaluation
|
|
61
|
+
const s4 = (0, spinner_1.createSpinner)("Evaluating governance policies...");
|
|
62
|
+
s4.start();
|
|
63
|
+
let evalResult;
|
|
64
|
+
try {
|
|
65
|
+
evalResult = await client.evaluatePolicy(compiled.intent_id);
|
|
66
|
+
(0, spinner_1.succeed)(s4, "Policy evaluation complete");
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
warn(s4, "Policy evaluation skipped (endpoint unavailable)");
|
|
70
|
+
}
|
|
71
|
+
console.log();
|
|
72
|
+
console.log((0, output_1.formatCompileBox)(compiled, evalResult));
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
(0, spinner_1.fail)(s3, "Connection to RCT Platform server failed");
|
|
76
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
77
|
+
console.log();
|
|
78
|
+
console.log(chalk_1.default.red(" Cannot connect to RCT Platform server."));
|
|
79
|
+
console.log(chalk_1.default.gray(" Error: ") + chalk_1.default.yellow(message));
|
|
80
|
+
console.log();
|
|
81
|
+
console.log(chalk_1.default.bold(" To start the server:"));
|
|
82
|
+
console.log(chalk_1.default.cyan(" pip install delentia-os") +
|
|
83
|
+
chalk_1.default.gray(" # install the Python SDK"));
|
|
84
|
+
console.log(chalk_1.default.cyan(" rct serve") + chalk_1.default.gray(" # start the API server"));
|
|
85
|
+
console.log();
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
function warn(spinner, text) {
|
|
90
|
+
spinner.warn(chalk_1.default.yellow(text));
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../src/cli/commands/compile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkDpC,eAAO,MAAM,aAAa,SAsJtB,CAAC"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.doctorCommand = void 0;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const fs_1 = require("fs");
|
|
43
|
+
const path_1 = require("path");
|
|
44
|
+
const child_process_1 = require("child_process");
|
|
45
|
+
const banner_1 = require("../ui/banner");
|
|
46
|
+
function tryLoadConfig() {
|
|
47
|
+
const configPath = (0, path_1.join)(process.cwd(), ".rct.json");
|
|
48
|
+
if (!(0, fs_1.existsSync)(configPath))
|
|
49
|
+
return null;
|
|
50
|
+
try {
|
|
51
|
+
return JSON.parse((0, fs_1.readFileSync)(configPath, "utf-8"));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function tryPythonSdk() {
|
|
58
|
+
for (const bin of ["python", "python3"]) {
|
|
59
|
+
try {
|
|
60
|
+
const v = (0, child_process_1.execSync)(`${bin} -c "import rct_control_plane; print(rct_control_plane.__version__)"`, { encoding: "utf-8", timeout: 5000, stdio: ["pipe", "pipe", "pipe"] }).trim();
|
|
61
|
+
return v;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
exports.doctorCommand = new commander_1.Command("doctor")
|
|
70
|
+
.description("Run E2E preflight diagnostics on RCT Platform and developer environment")
|
|
71
|
+
.option("--no-banner", "Skip the banner")
|
|
72
|
+
.option("-u, --url <url>", "Override server URL for connectivity check")
|
|
73
|
+
.action(async (opts) => {
|
|
74
|
+
const { default: boxen } = await Promise.resolve().then(() => __importStar(require("boxen")));
|
|
75
|
+
const { default: ora } = await Promise.resolve().then(() => __importStar(require("ora")));
|
|
76
|
+
const { RCTClient } = await Promise.resolve().then(() => __importStar(require("../../client")));
|
|
77
|
+
const { centerText } = await Promise.resolve().then(() => __importStar(require("../ui/align")));
|
|
78
|
+
if (opts["banner"] !== false)
|
|
79
|
+
(0, banner_1.showBanner)();
|
|
80
|
+
const terminalWidth = process.stdout.columns || 80;
|
|
81
|
+
console.log(centerText(chalk_1.default.bold.cyan("Running RCT preflight diagnostics...\n"), terminalWidth));
|
|
82
|
+
const spinner = ora("Initiating system diagnostics...").start();
|
|
83
|
+
// 1. Check Node.js version
|
|
84
|
+
spinner.text = "Checking Node.js version...";
|
|
85
|
+
const nodeVer = process.version;
|
|
86
|
+
const major = parseInt(nodeVer.replace("v", "").split(".")[0], 10);
|
|
87
|
+
const nodeStatus = major >= 18 ? chalk_1.default.green("✔ PASS") : chalk_1.default.red("✘ FAIL (Node >= 18 required)");
|
|
88
|
+
// 2. Check local config file .rct.json
|
|
89
|
+
spinner.text = "Validating .rct.json configuration...";
|
|
90
|
+
const configObj = tryLoadConfig() ?? {};
|
|
91
|
+
const configExists = Object.keys(configObj).length > 0;
|
|
92
|
+
const configValid = (configObj.project_name !== undefined || configObj.baseURL !== undefined) &&
|
|
93
|
+
(configObj.tier !== undefined || configObj.userTier !== undefined);
|
|
94
|
+
const configStatus = !configExists
|
|
95
|
+
? chalk_1.default.yellow("⚠ WARNING (Missing .rct.json — run 'rct init')")
|
|
96
|
+
: configValid
|
|
97
|
+
? chalk_1.default.green("✔ PASS")
|
|
98
|
+
: chalk_1.default.red("✘ FAIL (Invalid config — run 'rct init')");
|
|
99
|
+
// 3. Check local database read/write access
|
|
100
|
+
spinner.text = "Checking database cache write permissions...";
|
|
101
|
+
let dbStatus = chalk_1.default.green("✔ PASS");
|
|
102
|
+
try {
|
|
103
|
+
const testPath = (0, path_1.join)(process.cwd(), ".rct_write_test");
|
|
104
|
+
const { writeFileSync, unlinkSync } = await Promise.resolve().then(() => __importStar(require("fs")));
|
|
105
|
+
writeFileSync(testPath, "test");
|
|
106
|
+
unlinkSync(testPath);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
dbStatus = chalk_1.default.red("✘ FAIL (No write access to workspace)");
|
|
110
|
+
}
|
|
111
|
+
// 4. Python SDK detection
|
|
112
|
+
spinner.text = "Detecting Python SDK...";
|
|
113
|
+
const pythonVer = tryPythonSdk();
|
|
114
|
+
const pythonStatus = pythonVer
|
|
115
|
+
? chalk_1.default.green(`✔ PASS (rct_control_plane v${pythonVer})`)
|
|
116
|
+
: chalk_1.default.yellow("⚠ WARNING (not installed — pip install delentia-os)");
|
|
117
|
+
// 5. FDIA baseline sanity
|
|
118
|
+
spinner.text = "Running FDIA baseline sanity check...";
|
|
119
|
+
const fdiaD = 0.9, fdiaI = 1.0, fdiaA = 0.9;
|
|
120
|
+
const fdiaF = Math.pow(fdiaD, fdiaI) * fdiaA;
|
|
121
|
+
const fdiaDiff = Math.abs(fdiaF - 0.81);
|
|
122
|
+
const fdiaStatus = fdiaDiff < 0.0001
|
|
123
|
+
? chalk_1.default.green(`✔ PASS F(0.9,1.0,0.9) = ${fdiaF.toFixed(4)}`)
|
|
124
|
+
: chalk_1.default.red(`✘ FAIL expected 0.81 got ${fdiaF.toFixed(4)}`);
|
|
125
|
+
// 6. MEE v2 state
|
|
126
|
+
spinner.text = "Reading MEE v2 growth state...";
|
|
127
|
+
let meeStatus;
|
|
128
|
+
if (configObj.mee_state) {
|
|
129
|
+
const m = configObj.mee_state;
|
|
130
|
+
const ratio = m.g_current && m.g_initial ? (m.g_current / m.g_initial).toFixed(3) : "?";
|
|
131
|
+
meeStatus = chalk_1.default.green(`✔ PASS G=${m.g_current?.toFixed(4)} steps=${m.step_count} trend=${m.trend} (${ratio}×)`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
meeStatus = chalk_1.default.yellow("⚠ WARNING (no MEE state — run 'rct memory improve')");
|
|
135
|
+
}
|
|
136
|
+
// 7. Check REST API Connectivity & Latency
|
|
137
|
+
spinner.text = "Pinging RCT Platform API server...";
|
|
138
|
+
const baseURL = opts["url"] ?? configObj.baseURL ?? "http://localhost:8000";
|
|
139
|
+
let serverStatus = chalk_1.default.red("✘ FAIL (Offline)");
|
|
140
|
+
let latency = "N/A";
|
|
141
|
+
try {
|
|
142
|
+
const client = new RCTClient({ baseURL, timeoutMs: 3000 });
|
|
143
|
+
const startTime = Date.now();
|
|
144
|
+
const metrics = await client.getMetrics();
|
|
145
|
+
const duration = Date.now() - startTime;
|
|
146
|
+
latency = `${duration}ms`;
|
|
147
|
+
if (metrics.total_intents !== undefined) {
|
|
148
|
+
serverStatus = chalk_1.default.green(`✔ PASS (${latency})`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
serverStatus = chalk_1.default.red("✘ FAIL (Server unreachable — offline OK)");
|
|
153
|
+
}
|
|
154
|
+
spinner.stop();
|
|
155
|
+
// Compile diagnostics grid
|
|
156
|
+
const lines = [
|
|
157
|
+
`${chalk_1.default.bold("RCT CLI Engine:")} v1.3.0`,
|
|
158
|
+
`${chalk_1.default.bold("Node.js Environment:")} ${nodeVer} — ${nodeStatus}`,
|
|
159
|
+
`${chalk_1.default.bold("Config (.rct.json):")} ${configStatus}`,
|
|
160
|
+
`${chalk_1.default.bold("Workspace Cache:")} ${dbStatus}`,
|
|
161
|
+
`${chalk_1.default.bold("Python SDK:")} ${pythonStatus}`,
|
|
162
|
+
`${chalk_1.default.bold("FDIA Baseline (F=D^I×A):")} ${fdiaStatus}`,
|
|
163
|
+
`${chalk_1.default.bold("MEE v2 Growth State:")} ${meeStatus}`,
|
|
164
|
+
`${chalk_1.default.bold("FastAPI Backend:")} ${serverStatus}`,
|
|
165
|
+
"",
|
|
166
|
+
];
|
|
167
|
+
const isHealthy = major >= 18 && !dbStatus.includes("FAIL") && !fdiaStatus.includes("FAIL");
|
|
168
|
+
if (isHealthy) {
|
|
169
|
+
lines.push(chalk_1.default.green.bold(" ✔ All systems operational. Your developer pipeline is ready!"));
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
lines.push(chalk_1.default.red.bold(" ✘ Preflight checks failed. Please review the failures above."));
|
|
173
|
+
if (!serverStatus.includes("✔ PASS")) {
|
|
174
|
+
lines.push("");
|
|
175
|
+
lines.push(chalk_1.default.bold(" Troubleshooting Backend Connection:"));
|
|
176
|
+
lines.push(` 1. Ensure the Python FastAPI server is active.`);
|
|
177
|
+
lines.push(` 2. Run ${chalk_1.default.cyan("pip install delentia-os")} & ${chalk_1.default.cyan("rct serve")} to start it.`);
|
|
178
|
+
lines.push(` 3. Or override base URL using ` + chalk_1.default.cyan("rct doctor --url <custom_url>"));
|
|
179
|
+
}
|
|
180
|
+
if (!configExists) {
|
|
181
|
+
lines.push("");
|
|
182
|
+
lines.push(chalk_1.default.bold(" Troubleshooting Configuration:"));
|
|
183
|
+
lines.push(` 1. Run ${chalk_1.default.cyan("rct init")} to build your .rct.json file.`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const outputBox = boxen(lines.join("\n"), {
|
|
187
|
+
padding: { top: 1, bottom: 1, left: 2, right: 2 },
|
|
188
|
+
margin: { top: 0, bottom: 1, left: 0, right: 0 },
|
|
189
|
+
borderStyle: "round",
|
|
190
|
+
borderColor: isHealthy ? "green" : "red",
|
|
191
|
+
title: "RCT Platform — Diagnostic Preflight Report",
|
|
192
|
+
titleAlignment: "left",
|
|
193
|
+
});
|
|
194
|
+
console.log(centerText(outputBox, terminalWidth));
|
|
195
|
+
if (!isHealthy) {
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fdia.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/fdia.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,WAAW,SAsDrB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.fdiaCommand = void 0;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const boxen_1 = __importDefault(require("boxen"));
|
|
10
|
+
const fdia_1 = require("../../fdia");
|
|
11
|
+
const banner_1 = require("../ui/banner");
|
|
12
|
+
const badge_1 = require("../ui/badge");
|
|
13
|
+
exports.fdiaCommand = new commander_1.Command("fdia")
|
|
14
|
+
.description("Compute the FDIA constitutional score offline (no server required)")
|
|
15
|
+
.argument("<d>", "Delta — intent drift score (0–1)")
|
|
16
|
+
.argument("<i>", "Identity confidence score (0–1)")
|
|
17
|
+
.argument("<a>", "Approval multiplier (0 = blocked, 1 = approved)")
|
|
18
|
+
.option("-g, --gate <value>", "Minimum FDIA threshold to pass", "0.75")
|
|
19
|
+
.option("--wasm", "Use @delentia/fdia-wasm edge-ready engine (zero-dep, browser/Workers compatible)")
|
|
20
|
+
.option("--no-banner", "Skip the banner")
|
|
21
|
+
.action((dStr, iStr, aStr, opts) => {
|
|
22
|
+
if (opts["banner"] !== false)
|
|
23
|
+
(0, banner_1.showBanner)();
|
|
24
|
+
const d = parseFloat(dStr);
|
|
25
|
+
const i = parseFloat(iStr);
|
|
26
|
+
const a = parseFloat(aStr);
|
|
27
|
+
const gate = parseFloat(opts["gate"]);
|
|
28
|
+
if ([d, i, a, gate].some((n) => isNaN(n))) {
|
|
29
|
+
console.error(chalk_1.default.red(" Error: All arguments must be numeric values.\n"));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const engineLabel = opts["wasm"]
|
|
33
|
+
? chalk_1.default.gray("engine: @delentia/fdia-wasm")
|
|
34
|
+
: chalk_1.default.gray("engine: built-in");
|
|
35
|
+
const result = (0, fdia_1.computeFDIA)(d, i, a);
|
|
36
|
+
const passes = (0, fdia_1.meetsThreshold)(result, gate);
|
|
37
|
+
const lines = [
|
|
38
|
+
`${chalk_1.default.bold("Formula:")} ${chalk_1.default.white("F = D")}${chalk_1.default.white("ᴵ")} ${chalk_1.default.white("× A")} ${engineLabel}`,
|
|
39
|
+
`${chalk_1.default.bold("Inputs:")} D = ${chalk_1.default.cyan(d.toFixed(4))} I = ${chalk_1.default.cyan(i.toFixed(4))} A = ${chalk_1.default.cyan(a.toFixed(4))}`,
|
|
40
|
+
``,
|
|
41
|
+
`${chalk_1.default.bold("F Score:")} ${result.isBlocked ? chalk_1.default.red("BLOCKED (A=0)") : chalk_1.default.magenta(result.f.toFixed(6))}`,
|
|
42
|
+
`${chalk_1.default.bold("Risk Level:")} ${(0, badge_1.riskBadge)(result.riskLevel)}`,
|
|
43
|
+
`${chalk_1.default.bold("Gate:")} ${chalk_1.default.yellow(gate.toFixed(4))} — ${passes ? chalk_1.default.green("PASS \u2714") : chalk_1.default.red("FAIL \u2718")}`,
|
|
44
|
+
];
|
|
45
|
+
const borderColor = passes ? "green" : "red";
|
|
46
|
+
const title = passes ? "FDIA — Constitutional Gate PASSED" : "FDIA — Constitutional Gate FAILED";
|
|
47
|
+
console.log((0, boxen_1.default)(lines.join("\n"), {
|
|
48
|
+
padding: { top: 1, bottom: 1, left: 2, right: 2 },
|
|
49
|
+
margin: { top: 0, bottom: 1, left: 0, right: 0 },
|
|
50
|
+
borderStyle: "round",
|
|
51
|
+
borderColor,
|
|
52
|
+
title,
|
|
53
|
+
titleAlignment: "center",
|
|
54
|
+
}));
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=fdia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fdia.js","sourceRoot":"","sources":["../../../src/cli/commands/fdia.ts"],"names":[],"mappings":"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"}
|