arkna 1.4.0 → 2.0.1
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/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +276 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +2 -5
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +47 -116
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +87 -114
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.js +6 -16
- package/dist/index.js.map +1 -1
- package/dist/lib/arkna-dir.d.ts +4 -86
- package/dist/lib/arkna-dir.d.ts.map +1 -1
- package/dist/lib/arkna-dir.js +6 -110
- package/dist/lib/arkna-dir.js.map +1 -1
- package/dist/lib/connectivity.d.ts +7 -50
- package/dist/lib/connectivity.d.ts.map +1 -1
- package/dist/lib/connectivity.js +39 -255
- package/dist/lib/connectivity.js.map +1 -1
- package/dist/lib/detect.d.ts +35 -0
- package/dist/lib/detect.d.ts.map +1 -0
- package/dist/lib/detect.js +335 -0
- package/dist/lib/detect.js.map +1 -0
- package/dist/lib/ui.js +2 -2
- package/dist/lib/ui.js.map +1 -1
- package/package.json +8 -7
- package/dist/commands/action.d.ts +0 -3
- package/dist/commands/action.d.ts.map +0 -1
- package/dist/commands/action.js +0 -333
- package/dist/commands/action.js.map +0 -1
- package/dist/commands/connect.d.ts +0 -3
- package/dist/commands/connect.d.ts.map +0 -1
- package/dist/commands/connect.js +0 -582
- package/dist/commands/connect.js.map +0 -1
- package/dist/commands/pull-governance.d.ts +0 -3
- package/dist/commands/pull-governance.d.ts.map +0 -1
- package/dist/commands/pull-governance.js +0 -116
- package/dist/commands/pull-governance.js.map +0 -1
- package/dist/commands/push-manifest.d.ts +0 -3
- package/dist/commands/push-manifest.d.ts.map +0 -1
- package/dist/commands/push-manifest.js +0 -138
- package/dist/commands/push-manifest.js.map +0 -1
- package/dist/commands/sync.d.ts +0 -3
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js +0 -65
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/test.d.ts +0 -3
- package/dist/commands/test.d.ts.map +0 -1
- package/dist/commands/test.js +0 -142
- package/dist/commands/test.js.map +0 -1
- package/dist/lib/platforms.d.ts +0 -45
- package/dist/lib/platforms.d.ts.map +0 -1
- package/dist/lib/platforms.js +0 -638
- package/dist/lib/platforms.js.map +0 -1
package/dist/commands/verify.js
CHANGED
|
@@ -1,139 +1,112 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.verifyCommand = void 0;
|
|
4
37
|
const commander_1 = require("commander");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
5
40
|
const ui_1 = require("../lib/ui");
|
|
6
41
|
const connectivity_1 = require("../lib/connectivity");
|
|
7
42
|
const arkna_dir_1 = require("../lib/arkna-dir");
|
|
43
|
+
function loadDotEnv() {
|
|
44
|
+
const envPath = path.join(process.cwd(), '.env');
|
|
45
|
+
const vars = {};
|
|
46
|
+
if (fs.existsSync(envPath)) {
|
|
47
|
+
const lines = fs.readFileSync(envPath, 'utf-8').split('\n');
|
|
48
|
+
for (const line of lines) {
|
|
49
|
+
const match = line.match(/^([^#][^=]+)=(.+)$/);
|
|
50
|
+
if (match)
|
|
51
|
+
vars[match[1].trim()] = match[2].trim();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return vars;
|
|
55
|
+
}
|
|
8
56
|
exports.verifyCommand = new commander_1.Command('verify')
|
|
9
|
-
.description('Verify
|
|
10
|
-
.option('-
|
|
11
|
-
.option('-
|
|
12
|
-
.option('--timeout <seconds>', 'Timeout for --watch mode in seconds (default: 120)', '120')
|
|
57
|
+
.description('Verify ARKNA setup: API reachable, token valid, test ingestion')
|
|
58
|
+
.option('-u, --url <url>', 'ARKNA API URL')
|
|
59
|
+
.option('-t, --token <token>', 'Integration token')
|
|
13
60
|
.action(async (options) => {
|
|
14
|
-
|
|
15
|
-
(0,
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
61
|
+
(0, ui_1.miniBanner)('Verify Setup');
|
|
62
|
+
const arknaEnv = (0, arkna_dir_1.readArknaEnv)();
|
|
63
|
+
const dotEnv = loadDotEnv();
|
|
64
|
+
const url = options.url
|
|
65
|
+
|| process.env.ARKNA_URL
|
|
66
|
+
|| arknaEnv?.url
|
|
67
|
+
|| dotEnv.ARKNA_URL
|
|
68
|
+
|| 'https://api.arkna.com.au';
|
|
69
|
+
const token = options.token
|
|
70
|
+
|| process.env.ARKNA_TOKEN
|
|
71
|
+
|| arknaEnv?.token
|
|
72
|
+
|| dotEnv.ARKNA_TOKEN;
|
|
73
|
+
console.log(` ${(0, ui_1.dim)('API:')} ${url}`);
|
|
74
|
+
console.log(` ${(0, ui_1.dim)('Token:')} ${token ? (0, ui_1.maskToken)(token) : (0, ui_1.dim)('(not set)')}`);
|
|
75
|
+
console.log('');
|
|
76
|
+
if (!token) {
|
|
77
|
+
(0, ui_1.errorBox)('No token found', [
|
|
78
|
+
(0, ui_1.dim)('Run arkna init to set up your project, or set ARKNA_TOKEN.'),
|
|
22
79
|
]);
|
|
23
80
|
process.exit(1);
|
|
24
81
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
const health = await (0, connectivity_1.checkHealth)(env.url);
|
|
82
|
+
const results = [];
|
|
83
|
+
// 1. API reachable
|
|
84
|
+
const s1 = (0, ui_1.startSpinner)('Checking API...');
|
|
85
|
+
const health = await (0, connectivity_1.checkHealth)(url);
|
|
30
86
|
s1.stop();
|
|
87
|
+
results.push(health);
|
|
31
88
|
(0, ui_1.resultLine)(health.passed, health.name, health.detail);
|
|
32
89
|
if (!health.passed) {
|
|
33
|
-
(0,
|
|
34
|
-
(0, ui_1.dim)('Check your ARKNA_URL and network connection.'),
|
|
35
|
-
]);
|
|
90
|
+
(0, connectivity_1.printSummary)(results);
|
|
36
91
|
process.exit(1);
|
|
37
92
|
}
|
|
38
|
-
//
|
|
93
|
+
// 2. Token valid
|
|
39
94
|
const s2 = (0, ui_1.startSpinner)('Validating token...');
|
|
40
|
-
const tokenCheck = await (0, connectivity_1.checkTokenValid)(
|
|
95
|
+
const tokenCheck = await (0, connectivity_1.checkTokenValid)(url, token);
|
|
41
96
|
s2.stop();
|
|
97
|
+
results.push(tokenCheck);
|
|
42
98
|
(0, ui_1.resultLine)(tokenCheck.passed, tokenCheck.name, tokenCheck.detail);
|
|
43
99
|
if (!tokenCheck.passed) {
|
|
44
|
-
(0,
|
|
45
|
-
(0, ui_1.dim)('Check your ARKNA_TOKEN or create a new one in Settings > External Agents.'),
|
|
46
|
-
]);
|
|
100
|
+
(0, connectivity_1.printSummary)(results);
|
|
47
101
|
process.exit(1);
|
|
48
102
|
}
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
(0, ui_1.resultLine)(true, 'Agent registered', 'bound to token');
|
|
53
|
-
await showRegisteredStatus(env.url, env.token, baseDir);
|
|
54
|
-
process.exit(0);
|
|
55
|
-
}
|
|
56
|
-
// Agent not yet registered
|
|
57
|
-
if (!options.watch) {
|
|
58
|
-
// Instant mode — just report what we know
|
|
59
|
-
(0, ui_1.resultLine)(false, 'Agent registered', 'waiting \u2014 no agent has called POST /register yet');
|
|
60
|
-
console.log('');
|
|
61
|
-
console.log(` ${(0, ui_1.warn)('\u26A0')} ${(0, ui_1.dim)('No agent found.')}`);
|
|
62
|
-
console.log(` ${(0, ui_1.dim)(' This means your agent has not started yet, or it is not configured')}`);
|
|
63
|
-
console.log(` ${(0, ui_1.dim)(' to call POST /api/gateway/register on startup.')}`);
|
|
64
|
-
console.log('');
|
|
65
|
-
console.log(` ${(0, ui_1.dim)(' Make sure you are running this from your')} ${(0, ui_1.brand)('agent project directory')}`);
|
|
66
|
-
console.log(` ${(0, ui_1.dim)(' and that your agent has been wired with')} ${(0, ui_1.brand)('arkna connect')}`);
|
|
67
|
-
console.log('');
|
|
68
|
-
console.log(` ${(0, ui_1.dim)(' To wait for your agent to register:')} ${(0, ui_1.brand)('arkna verify --watch')}`);
|
|
69
|
-
console.log('');
|
|
70
|
-
process.exit(0);
|
|
71
|
-
}
|
|
72
|
-
// ── Watch mode — poll until agent registers ──────────────────────────
|
|
73
|
-
const timeoutSec = parseInt(options.timeout || '120', 10);
|
|
74
|
-
console.log('');
|
|
75
|
-
console.log(` ${(0, ui_1.dim)('\u23F3')} ${(0, ui_1.dim)(`Waiting for agent to register (timeout: ${timeoutSec}s)...`)}`);
|
|
76
|
-
console.log(` ${(0, ui_1.dim)(' Start your agent now — it should call POST /api/gateway/register on startup.')}`);
|
|
77
|
-
console.log('');
|
|
78
|
-
const startTime = Date.now();
|
|
79
|
-
const pollInterval = 5000; // 5 seconds
|
|
80
|
-
while (true) {
|
|
81
|
-
const elapsed = (Date.now() - startTime) / 1000;
|
|
82
|
-
if (elapsed >= timeoutSec) {
|
|
83
|
-
(0, ui_1.errorBox)('Timeout', [
|
|
84
|
-
`${(0, ui_1.dim)(`Agent did not register within ${timeoutSec}s.`)}`,
|
|
85
|
-
(0, ui_1.dim)('Check that your agent is running and has the correct ARKNA_TOKEN.'),
|
|
86
|
-
(0, ui_1.dim)('You can increase timeout: arkna verify --watch --timeout 300'),
|
|
87
|
-
]);
|
|
88
|
-
process.exit(1);
|
|
89
|
-
}
|
|
90
|
-
// Poll
|
|
91
|
-
const check = await (0, connectivity_1.checkTokenValid)(env.url, env.token);
|
|
92
|
-
if (check.agentRegistered) {
|
|
93
|
-
(0, ui_1.resultLine)(true, 'Agent registered', `detected after ${Math.round(elapsed)}s`);
|
|
94
|
-
await showRegisteredStatus(env.url, env.token, baseDir);
|
|
95
|
-
process.exit(0);
|
|
96
|
-
}
|
|
97
|
-
// Show progress dot
|
|
98
|
-
const remaining = Math.round(timeoutSec - elapsed);
|
|
99
|
-
process.stdout.write(`\r ${(0, ui_1.dim)('\u23F3')} ${(0, ui_1.dim)(`Polling... ${remaining}s remaining`)}`);
|
|
100
|
-
await sleep(pollInterval);
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
async function showRegisteredStatus(url, token, baseDir) {
|
|
104
|
-
// Pull config
|
|
105
|
-
const s3 = (0, ui_1.startSpinner)('Pulling config...');
|
|
106
|
-
const configResult = await (0, connectivity_1.pullConfig)(url, token);
|
|
103
|
+
// 3. Test ingestion
|
|
104
|
+
const s3 = (0, ui_1.startSpinner)('Testing ingestion pipeline...');
|
|
105
|
+
const ingestion = await (0, connectivity_1.sendTestRun)(url, token);
|
|
107
106
|
s3.stop();
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
const toolCount = envelope.tools?.length || 0;
|
|
114
|
-
const policyCount = envelope.policies?.length || 0;
|
|
115
|
-
(0, ui_1.resultLine)(true, 'Config pulled', `${toolCount} tools, ${policyCount} policies`);
|
|
116
|
-
// Kill switch
|
|
117
|
-
if (envelope.kill_switch?.active) {
|
|
118
|
-
(0, ui_1.resultLine)(false, 'Kill switch', `ACTIVE \u2014 ${envelope.kill_switch.reason || 'no reason'}`);
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
(0, ui_1.resultLine)(true, 'Kill switch', 'inactive');
|
|
122
|
-
}
|
|
123
|
-
// Write full .arkna/ directory
|
|
124
|
-
const files = (0, arkna_dir_1.writeArknaDir)(envelope, url, token, envelope.agent?.external_platform || 'custom', baseDir);
|
|
125
|
-
(0, ui_1.fileTree)('.arkna', files);
|
|
126
|
-
(0, ui_1.divider)();
|
|
127
|
-
(0, ui_1.successBox)('GOVERNED', [
|
|
128
|
-
`${(0, ui_1.dim)('Agent:')} ${envelope.agent?.name || 'unknown'}`,
|
|
129
|
-
`${(0, ui_1.dim)('Agent ID:')} ${envelope.agent?.id || 'unknown'}`,
|
|
130
|
-
`${(0, ui_1.dim)('Platform:')} ${envelope.agent?.external_platform || 'unknown'}`,
|
|
131
|
-
`${(0, ui_1.dim)('Tools:')} ${toolCount}`,
|
|
132
|
-
`${(0, ui_1.dim)('Policies:')} ${policyCount}`,
|
|
133
|
-
`${(0, ui_1.dim)('Version:')} ${envelope.config_version || '?'}`,
|
|
134
|
-
]);
|
|
135
|
-
}
|
|
136
|
-
function sleep(ms) {
|
|
137
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
138
|
-
}
|
|
107
|
+
results.push(ingestion);
|
|
108
|
+
(0, ui_1.resultLine)(ingestion.passed, ingestion.name, ingestion.detail);
|
|
109
|
+
(0, connectivity_1.printSummary)(results);
|
|
110
|
+
process.exit(results.every(r => r.passed) ? 0 : 1);
|
|
111
|
+
});
|
|
139
112
|
//# sourceMappingURL=verify.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,35 +5,25 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const commander_1 = require("commander");
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
-
const
|
|
9
|
-
const connect_1 = require("./commands/connect");
|
|
8
|
+
const init_1 = require("./commands/init");
|
|
10
9
|
const verify_1 = require("./commands/verify");
|
|
11
|
-
const sync_1 = require("./commands/sync");
|
|
12
10
|
const status_1 = require("./commands/status");
|
|
13
|
-
const
|
|
14
|
-
const push_manifest_1 = require("./commands/push-manifest");
|
|
15
|
-
const pull_governance_1 = require("./commands/pull-governance");
|
|
16
|
-
const action_1 = require("./commands/action");
|
|
11
|
+
const login_1 = require("./commands/login");
|
|
17
12
|
const update_check_1 = require("./lib/update-check");
|
|
18
13
|
// Version injected at build time by `npm run build` — never depends on runtime path resolution
|
|
19
|
-
const CLI_VERSION = '
|
|
14
|
+
const CLI_VERSION = '2.0.1';
|
|
20
15
|
const brand = chalk_1.default.hex('#3B82F6');
|
|
21
16
|
// Start non-blocking update check (runs at most once per 24h)
|
|
22
17
|
const printUpdateNotice = (0, update_check_1.startUpdateCheck)(CLI_VERSION);
|
|
23
18
|
const program = new commander_1.Command();
|
|
24
19
|
program
|
|
25
20
|
.name('arkna')
|
|
26
|
-
.description(brand('\u25B2 ARKNA CLI') + chalk_1.default.dim(' \u2014
|
|
21
|
+
.description(brand('\u25B2 ARKNA CLI') + chalk_1.default.dim(' \u2014 Agent Observability'))
|
|
27
22
|
.version(CLI_VERSION, '-v, --version');
|
|
28
|
-
program.addCommand(
|
|
29
|
-
program.addCommand(connect_1.connectCommand);
|
|
23
|
+
program.addCommand(init_1.initCommand, { isDefault: true });
|
|
30
24
|
program.addCommand(verify_1.verifyCommand);
|
|
31
|
-
program.addCommand(sync_1.syncCommand);
|
|
32
25
|
program.addCommand(status_1.statusCommand);
|
|
33
|
-
program.addCommand(
|
|
34
|
-
program.addCommand(push_manifest_1.pushManifestCommand);
|
|
35
|
-
program.addCommand(pull_governance_1.pullGovernanceCommand);
|
|
36
|
-
program.addCommand(action_1.actionCommand);
|
|
26
|
+
program.addCommand(login_1.loginCommand);
|
|
37
27
|
program.parseAsync().then(() => {
|
|
38
28
|
printUpdateNotice();
|
|
39
29
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,0CAA8C;AAC9C,8CAAkD;AAClD,8CAAkD;AAClD,4CAAgD;AAChD,qDAAsD;AAEtD,+FAA+F;AAC/F,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAEtC,MAAM,KAAK,GAAG,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAEnC,8DAA8D;AAC9D,MAAM,iBAAiB,GAAG,IAAA,+BAAgB,EAAC,WAAW,CAAC,CAAC;AAExD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,eAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;KACjF,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;AAEzC,OAAO,CAAC,UAAU,CAAC,kBAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AAEjC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IAC7B,iBAAiB,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC"}
|
package/dist/lib/arkna-dir.d.ts
CHANGED
|
@@ -1,94 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
platform: string;
|
|
5
|
-
gateway_url: string;
|
|
6
|
-
endpoints: {
|
|
7
|
-
health: string;
|
|
8
|
-
heartbeat: string;
|
|
9
|
-
actions: string;
|
|
10
|
-
tools: string;
|
|
11
|
-
config: string;
|
|
12
|
-
};
|
|
13
|
-
config_version: string;
|
|
14
|
-
enrolled_at: string;
|
|
15
|
-
last_synced_at: string;
|
|
16
|
-
}
|
|
17
|
-
export interface GovernanceContract {
|
|
18
|
-
version: string;
|
|
19
|
-
enforcement_mode: string;
|
|
20
|
-
governed_domains: string[];
|
|
21
|
-
gateway_url: string;
|
|
22
|
-
agent_id: string;
|
|
23
|
-
tenant_id: string;
|
|
24
|
-
issued_at: string;
|
|
25
|
-
signature: string;
|
|
26
|
-
}
|
|
27
|
-
export interface PolicyEnvelope {
|
|
28
|
-
agent: {
|
|
29
|
-
id: string;
|
|
30
|
-
name: string;
|
|
31
|
-
status: string;
|
|
32
|
-
risk_tier: string;
|
|
33
|
-
agent_source: string;
|
|
34
|
-
external_platform: string;
|
|
35
|
-
agent_type: string;
|
|
36
|
-
};
|
|
37
|
-
tools: Array<{
|
|
38
|
-
name: string;
|
|
39
|
-
description: string;
|
|
40
|
-
parameters: Record<string, unknown>;
|
|
41
|
-
}>;
|
|
42
|
-
permissions: Record<string, {
|
|
43
|
-
permission: string;
|
|
44
|
-
config: Record<string, unknown>;
|
|
45
|
-
}>;
|
|
46
|
-
policies: Array<{
|
|
47
|
-
id: string;
|
|
48
|
-
name: string;
|
|
49
|
-
description: string;
|
|
50
|
-
priority: number;
|
|
51
|
-
scope: string;
|
|
52
|
-
}>;
|
|
53
|
-
constitution: Array<{
|
|
54
|
-
category: string;
|
|
55
|
-
rule: string;
|
|
56
|
-
severity: string;
|
|
57
|
-
}>;
|
|
58
|
-
kill_switch: {
|
|
59
|
-
active: boolean;
|
|
60
|
-
reason: string | null;
|
|
61
|
-
};
|
|
62
|
-
governance_contract?: GovernanceContract;
|
|
63
|
-
gateway: {
|
|
64
|
-
url: string;
|
|
65
|
-
endpoints: {
|
|
66
|
-
health: string;
|
|
67
|
-
heartbeat: string;
|
|
68
|
-
actions: string;
|
|
69
|
-
tools: string;
|
|
70
|
-
config: string;
|
|
71
|
-
};
|
|
72
|
-
};
|
|
73
|
-
config_version: string;
|
|
74
|
-
refresh_interval_seconds: number;
|
|
75
|
-
}
|
|
76
|
-
export declare function arknaConfigExists(baseDir?: string): boolean;
|
|
77
|
-
export declare function readArknaConfig(baseDir?: string): ArknaConfig | null;
|
|
1
|
+
/**
|
|
2
|
+
* Read token + URL from .arkna/.env file.
|
|
3
|
+
*/
|
|
78
4
|
export declare function readArknaEnv(baseDir?: string): {
|
|
79
5
|
url: string;
|
|
80
6
|
token: string;
|
|
81
|
-
agentId?: string;
|
|
82
7
|
} | null;
|
|
83
|
-
export declare function writeArknaDir(envelope: PolicyEnvelope, url: string, token: string, platform: string, baseDir?: string): string[];
|
|
84
8
|
/**
|
|
85
|
-
* Write
|
|
86
|
-
* Used by `arkna connect` before the agent has registered — only stores credentials.
|
|
9
|
+
* Write token + URL to .arkna/.env (creates directory + .gitignore if needed).
|
|
87
10
|
*/
|
|
88
11
|
export declare function writeTokenEnv(url: string, token: string, baseDir?: string): string[];
|
|
89
|
-
export declare function updateArknaDir(envelope: PolicyEnvelope, baseDir?: string): {
|
|
90
|
-
updated: boolean;
|
|
91
|
-
previousVersion: string;
|
|
92
|
-
newVersion: string;
|
|
93
|
-
};
|
|
94
12
|
//# sourceMappingURL=arkna-dir.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arkna-dir.d.ts","sourceRoot":"","sources":["../../src/lib/arkna-dir.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"arkna-dir.d.ts","sourceRoot":"","sources":["../../src/lib/arkna-dir.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiBpF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBpF"}
|
package/dist/lib/arkna-dir.js
CHANGED
|
@@ -33,35 +33,24 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.arknaConfigExists = arknaConfigExists;
|
|
37
|
-
exports.readArknaConfig = readArknaConfig;
|
|
38
36
|
exports.readArknaEnv = readArknaEnv;
|
|
39
|
-
exports.writeArknaDir = writeArknaDir;
|
|
40
37
|
exports.writeTokenEnv = writeTokenEnv;
|
|
41
|
-
exports.updateArknaDir = updateArknaDir;
|
|
42
38
|
const fs = __importStar(require("fs"));
|
|
43
39
|
const path = __importStar(require("path"));
|
|
44
40
|
const ARKNA_DIR = '.arkna';
|
|
45
41
|
function getArknaDir(baseDir) {
|
|
46
42
|
return path.join(baseDir || process.cwd(), ARKNA_DIR);
|
|
47
43
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
function readArknaConfig(baseDir) {
|
|
52
|
-
const configPath = path.join(getArknaDir(baseDir), 'config.json');
|
|
53
|
-
if (!fs.existsSync(configPath)) {
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
return JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
57
|
-
}
|
|
44
|
+
/**
|
|
45
|
+
* Read token + URL from .arkna/.env file.
|
|
46
|
+
*/
|
|
58
47
|
function readArknaEnv(baseDir) {
|
|
59
48
|
const envPath = path.join(getArknaDir(baseDir), '.env');
|
|
60
49
|
if (!fs.existsSync(envPath)) {
|
|
61
50
|
return null;
|
|
62
51
|
}
|
|
63
52
|
const vars = {};
|
|
64
|
-
const lines = fs.readFileSync(envPath, 'utf-8').split(
|
|
53
|
+
const lines = fs.readFileSync(envPath, 'utf-8').split(/\r?\n/);
|
|
65
54
|
for (const line of lines) {
|
|
66
55
|
const match = line.match(/^([^#][^=]+)=(.+)$/);
|
|
67
56
|
if (match) {
|
|
@@ -71,77 +60,15 @@ function readArknaEnv(baseDir) {
|
|
|
71
60
|
if (!vars.ARKNA_URL || !vars.ARKNA_TOKEN) {
|
|
72
61
|
return null;
|
|
73
62
|
}
|
|
74
|
-
return { url: vars.ARKNA_URL, token: vars.ARKNA_TOKEN
|
|
75
|
-
}
|
|
76
|
-
function writeArknaDir(envelope, url, token, platform, baseDir) {
|
|
77
|
-
const dir = getArknaDir(baseDir);
|
|
78
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
79
|
-
const files = [];
|
|
80
|
-
const now = new Date().toISOString();
|
|
81
|
-
// config.json — agent identity + gateway info
|
|
82
|
-
const config = {
|
|
83
|
-
agent_id: envelope.agent.id,
|
|
84
|
-
agent_name: envelope.agent.name,
|
|
85
|
-
platform,
|
|
86
|
-
gateway_url: url,
|
|
87
|
-
endpoints: envelope.gateway.endpoints,
|
|
88
|
-
config_version: envelope.config_version,
|
|
89
|
-
enrolled_at: now,
|
|
90
|
-
last_synced_at: now,
|
|
91
|
-
};
|
|
92
|
-
fs.writeFileSync(path.join(dir, 'config.json'), JSON.stringify(config, null, 2) + '\n');
|
|
93
|
-
files.push('config.json');
|
|
94
|
-
// tools.json — available tools with full schemas
|
|
95
|
-
fs.writeFileSync(path.join(dir, 'tools.json'), JSON.stringify(envelope.tools, null, 2) + '\n');
|
|
96
|
-
files.push('tools.json');
|
|
97
|
-
// policy.json — permissions, policies, constitution, kill switch
|
|
98
|
-
const policy = {
|
|
99
|
-
permissions: envelope.permissions,
|
|
100
|
-
policies: envelope.policies,
|
|
101
|
-
constitution: envelope.constitution,
|
|
102
|
-
kill_switch: envelope.kill_switch,
|
|
103
|
-
};
|
|
104
|
-
fs.writeFileSync(path.join(dir, 'policy.json'), JSON.stringify(policy, null, 2) + '\n');
|
|
105
|
-
files.push('policy.json');
|
|
106
|
-
// governance.json — HMAC-signed governance contract for SDK enforcement
|
|
107
|
-
if (envelope.governance_contract) {
|
|
108
|
-
fs.writeFileSync(path.join(dir, 'governance.json'), JSON.stringify(envelope.governance_contract, null, 2) + '\n');
|
|
109
|
-
files.push('governance.json');
|
|
110
|
-
}
|
|
111
|
-
// .env — secrets (gitignored)
|
|
112
|
-
const envContent = `# ARKNA Agent Enrollment — Environment Variables
|
|
113
|
-
# This file is gitignored. Do NOT commit this file.
|
|
114
|
-
ARKNA_URL=${url}
|
|
115
|
-
ARKNA_TOKEN=${token}
|
|
116
|
-
ARKNA_AGENT_ID=${envelope.agent.id}
|
|
117
|
-
`;
|
|
118
|
-
fs.writeFileSync(path.join(dir, '.env'), envContent);
|
|
119
|
-
files.push('.env');
|
|
120
|
-
// .gitignore — block EVERYTHING from git (secrets + config are local-only)
|
|
121
|
-
const gitignore = `# .arkna/ contains secrets — never commit any of it
|
|
122
|
-
*
|
|
123
|
-
!.gitignore
|
|
124
|
-
`;
|
|
125
|
-
fs.writeFileSync(path.join(dir, '.gitignore'), gitignore);
|
|
126
|
-
files.push('.gitignore');
|
|
127
|
-
return files;
|
|
63
|
+
return { url: vars.ARKNA_URL, token: vars.ARKNA_TOKEN };
|
|
128
64
|
}
|
|
129
65
|
/**
|
|
130
|
-
* Write
|
|
131
|
-
* Used by `arkna connect` before the agent has registered — only stores credentials.
|
|
66
|
+
* Write token + URL to .arkna/.env (creates directory + .gitignore if needed).
|
|
132
67
|
*/
|
|
133
68
|
function writeTokenEnv(url, token, baseDir) {
|
|
134
69
|
const dir = getArknaDir(baseDir);
|
|
135
70
|
fs.mkdirSync(dir, { recursive: true });
|
|
136
71
|
const files = [];
|
|
137
|
-
// Remove stale config files from previous enrollment — they belong to a
|
|
138
|
-
// different agent/token and will confuse `status` and `sync`.
|
|
139
|
-
for (const staleFile of ['config.json', 'tools.json', 'policy.json']) {
|
|
140
|
-
const p = path.join(dir, staleFile);
|
|
141
|
-
if (fs.existsSync(p)) {
|
|
142
|
-
fs.unlinkSync(p);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
72
|
// .env — secrets (gitignored)
|
|
146
73
|
const envContent = `# ARKNA Agent Configuration — Environment Variables
|
|
147
74
|
# This file is gitignored. Do NOT commit this file.
|
|
@@ -159,35 +86,4 @@ ARKNA_TOKEN=${token}
|
|
|
159
86
|
files.push('.gitignore');
|
|
160
87
|
return files;
|
|
161
88
|
}
|
|
162
|
-
function updateArknaDir(envelope, baseDir) {
|
|
163
|
-
const dir = getArknaDir(baseDir);
|
|
164
|
-
const configPath = path.join(dir, 'config.json');
|
|
165
|
-
if (!fs.existsSync(configPath)) {
|
|
166
|
-
return { updated: false, previousVersion: '', newVersion: envelope.config_version };
|
|
167
|
-
}
|
|
168
|
-
const existing = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
169
|
-
const previousVersion = existing.config_version;
|
|
170
|
-
if (previousVersion === envelope.config_version) {
|
|
171
|
-
return { updated: false, previousVersion, newVersion: envelope.config_version };
|
|
172
|
-
}
|
|
173
|
-
// Update tools.json
|
|
174
|
-
fs.writeFileSync(path.join(dir, 'tools.json'), JSON.stringify(envelope.tools, null, 2) + '\n');
|
|
175
|
-
// Update policy.json
|
|
176
|
-
const policy = {
|
|
177
|
-
permissions: envelope.permissions,
|
|
178
|
-
policies: envelope.policies,
|
|
179
|
-
constitution: envelope.constitution,
|
|
180
|
-
kill_switch: envelope.kill_switch,
|
|
181
|
-
};
|
|
182
|
-
fs.writeFileSync(path.join(dir, 'policy.json'), JSON.stringify(policy, null, 2) + '\n');
|
|
183
|
-
// Update governance.json
|
|
184
|
-
if (envelope.governance_contract) {
|
|
185
|
-
fs.writeFileSync(path.join(dir, 'governance.json'), JSON.stringify(envelope.governance_contract, null, 2) + '\n');
|
|
186
|
-
}
|
|
187
|
-
// Update config.json (preserve enrolled_at)
|
|
188
|
-
existing.config_version = envelope.config_version;
|
|
189
|
-
existing.last_synced_at = new Date().toISOString();
|
|
190
|
-
fs.writeFileSync(configPath, JSON.stringify(existing, null, 2) + '\n');
|
|
191
|
-
return { updated: true, previousVersion, newVersion: envelope.config_version };
|
|
192
|
-
}
|
|
193
89
|
//# sourceMappingURL=arkna-dir.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arkna-dir.js","sourceRoot":"","sources":["../../src/lib/arkna-dir.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"arkna-dir.js","sourceRoot":"","sources":["../../src/lib/arkna-dir.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,oCAiBC;AAKD,sCAwBC;AA1DD,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,SAAS,GAAG,QAAQ,CAAC;AAE3B,SAAS,WAAW,CAAC,OAAgB;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,OAAgB;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IACxD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC/C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,GAAW,EAAE,KAAa,EAAE,OAAgB;IACxE,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACjC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,8BAA8B;IAC9B,MAAM,UAAU,GAAG;;YAET,GAAG;cACD,KAAK;CAClB,CAAC;IACA,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnB,2EAA2E;IAC3E,MAAM,SAAS,GAAG;;;CAGnB,CAAC;IACA,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAEzB,OAAO,KAAK,CAAC;AACf,CAAC"}
|