habi-agent 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +295 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud.d.ts +50 -0
- package/dist/cloud.d.ts.map +1 -0
- package/dist/cloud.js +147 -0
- package/dist/cloud.js.map +1 -0
- package/dist/context.d.ts +62 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +172 -0
- package/dist/context.js.map +1 -0
- package/dist/hardware.d.ts +38 -0
- package/dist/hardware.d.ts.map +1 -0
- package/dist/hardware.js +130 -0
- package/dist/hardware.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +25 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +276 -0
- package/dist/server.js.map +1 -0
- package/package.json +24 -0
- package/src/cli.ts +264 -0
- package/src/cloud.ts +165 -0
- package/src/context.ts +186 -0
- package/src/hardware.ts +114 -0
- package/src/index.ts +5 -0
- package/src/server.ts +255 -0
- package/tsconfig.json +10 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* HABI Agent CLI
|
|
4
|
+
* Usage:
|
|
5
|
+
* habi-agent start — start the local identity daemon
|
|
6
|
+
* habi-agent status — check if agent is running
|
|
7
|
+
* habi-agent identity — print hardware identity
|
|
8
|
+
* habi-agent init — generate a Project Context File
|
|
9
|
+
* habi-agent verify — verify current session
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* HABI Agent CLI
|
|
5
|
+
* Usage:
|
|
6
|
+
* habi-agent start — start the local identity daemon
|
|
7
|
+
* habi-agent status — check if agent is running
|
|
8
|
+
* habi-agent identity — print hardware identity
|
|
9
|
+
* habi-agent init — generate a Project Context File
|
|
10
|
+
* habi-agent verify — verify current session
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
const server_1 = require("./server");
|
|
47
|
+
const hardware_1 = require("./hardware");
|
|
48
|
+
const context_1 = require("./context");
|
|
49
|
+
const cloud_1 = require("./cloud");
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const http = __importStar(require("http"));
|
|
53
|
+
const os = __importStar(require("os"));
|
|
54
|
+
const AGENT_PORT = 7432;
|
|
55
|
+
const command = process.argv[2] || 'start';
|
|
56
|
+
// ── Utility: ping the running agent ────────────────────────────────────────
|
|
57
|
+
function pingAgent(p = '/health') {
|
|
58
|
+
return new Promise((resolve, reject) => {
|
|
59
|
+
const req = http.get({ host: '127.0.0.1', port: AGENT_PORT, path: p }, (res) => {
|
|
60
|
+
let body = '';
|
|
61
|
+
res.on('data', (chunk) => body += chunk.toString());
|
|
62
|
+
res.on('end', () => {
|
|
63
|
+
try {
|
|
64
|
+
resolve(JSON.parse(body));
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
reject(new Error('Invalid JSON from agent'));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
req.on('error', reject);
|
|
72
|
+
req.setTimeout(2000, () => { req.destroy(); reject(new Error('timeout')); });
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async function cmdStart() {
|
|
76
|
+
console.log('\n┌─────────────────────────────────────────────┐');
|
|
77
|
+
console.log('│ HABI Local Identity Agent v0.1.0 │');
|
|
78
|
+
console.log('│ On Spot Solutions LLC — hardware-first AI │');
|
|
79
|
+
console.log('└─────────────────────────────────────────────┘\n');
|
|
80
|
+
// Check if already running
|
|
81
|
+
try {
|
|
82
|
+
await pingAgent();
|
|
83
|
+
console.log('⚠ HABI agent is already running on port 7432.');
|
|
84
|
+
console.log(' Run: habi-agent status to check it.');
|
|
85
|
+
process.exit(0);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Not running — proceed
|
|
89
|
+
}
|
|
90
|
+
const server = new server_1.HabiLocalServer();
|
|
91
|
+
// Graceful shutdown
|
|
92
|
+
const shutdown = () => {
|
|
93
|
+
console.log('\n[HABI] Shutting down agent...');
|
|
94
|
+
server.stop();
|
|
95
|
+
process.exit(0);
|
|
96
|
+
};
|
|
97
|
+
process.on('SIGINT', shutdown);
|
|
98
|
+
process.on('SIGTERM', shutdown);
|
|
99
|
+
try {
|
|
100
|
+
await server.start();
|
|
101
|
+
// ── Cloud registration ──────────────────────────────────────────────
|
|
102
|
+
const hw = (0, hardware_1.readHardwareIdentity)();
|
|
103
|
+
const habiKey = process.env.HABI_KEY || process.env.HABI_OWNER_EMAIL || "";
|
|
104
|
+
const friendlyName = process.env.HABI_DEVICE_NAME || os.hostname();
|
|
105
|
+
if (!habiKey) {
|
|
106
|
+
console.log('[HABI Cloud] HABI_OWNER_EMAIL not set — running in local-only mode.');
|
|
107
|
+
console.log('[HABI Cloud] Set export HABI_OWNER_EMAIL=you@example.com to enable cloud registration.\n');
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
console.log(`[HABI Cloud] Registering "${friendlyName}" via HABI key...`);
|
|
111
|
+
const cloudState = await (0, cloud_1.registerDevice)({
|
|
112
|
+
friendlyName,
|
|
113
|
+
hardwareFingerprint: hw.fingerprint,
|
|
114
|
+
fingerprintType: hw.type,
|
|
115
|
+
agentVersion: '0.1.0',
|
|
116
|
+
osPlatform: os.platform(),
|
|
117
|
+
});
|
|
118
|
+
if (cloudState) {
|
|
119
|
+
console.log(`[HABI Cloud] ✓ Device registered — ID: ${cloudState.deviceId.slice(0, 8)}...`);
|
|
120
|
+
console.log(`[HABI Cloud] ✓ Session token active until ${new Date(cloudState.sessionTokenExpiresAt).toLocaleTimeString()}\n`);
|
|
121
|
+
// ── Heartbeat loop every 30s ──────────────────────────────────
|
|
122
|
+
let currentToken = cloudState.sessionToken;
|
|
123
|
+
setInterval(async () => {
|
|
124
|
+
const hb = await (0, cloud_1.sendHeartbeat)({
|
|
125
|
+
deviceId: cloudState.deviceId,
|
|
126
|
+
sessionToken: currentToken,
|
|
127
|
+
hardwareFingerprint: hw.fingerprint,
|
|
128
|
+
});
|
|
129
|
+
if (hb) {
|
|
130
|
+
currentToken = hb.sessionToken;
|
|
131
|
+
if (hb.pendingJobs && hb.pendingJobs.length > 0) {
|
|
132
|
+
console.log(`[HABI Cloud] ${hb.pendingJobs.length} pending job(s) received from dispatch queue.`);
|
|
133
|
+
// Job execution handled in Phase 2 — log for now
|
|
134
|
+
for (const job of hb.pendingJobs) {
|
|
135
|
+
console.log(`[HABI Cloud] Job ${job.id.slice(0, 8)}: ${JSON.stringify(job.payload).slice(0, 80)}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}, 30000);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Keep alive
|
|
143
|
+
await new Promise(() => { });
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
console.error(`\n✗ HABI agent failed to start:\n ${err}\n`);
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async function cmdStatus() {
|
|
151
|
+
try {
|
|
152
|
+
const health = await pingAgent('/health');
|
|
153
|
+
console.log('\n✓ HABI agent is RUNNING');
|
|
154
|
+
console.log(` Port: ${AGENT_PORT}`);
|
|
155
|
+
console.log(` Version: ${health.version || 'unknown'}`);
|
|
156
|
+
const identity = await pingAgent('/identity');
|
|
157
|
+
const hw = identity.hardware;
|
|
158
|
+
const sess = identity.session;
|
|
159
|
+
if (hw) {
|
|
160
|
+
console.log(` Hardware: ${hw.fingerprint} (${hw.type})`);
|
|
161
|
+
console.log(` Platform: ${hw.platform} / ${hw.hostname}`);
|
|
162
|
+
}
|
|
163
|
+
if (sess) {
|
|
164
|
+
const expiresAt = new Date(sess.expiresAt);
|
|
165
|
+
const active = sess.active ? '✓ ACTIVE' : '✗ EXPIRED';
|
|
166
|
+
console.log(` Session: ${sess.fingerprint?.slice(0, 16)}...`);
|
|
167
|
+
console.log(` Status: ${active} (expires ${expiresAt.toLocaleTimeString()})`);
|
|
168
|
+
}
|
|
169
|
+
console.log();
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
console.log('\n✗ HABI agent is NOT RUNNING');
|
|
173
|
+
console.log(' Start it with: npx ts-node src/cli.ts start\n');
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async function cmdIdentity() {
|
|
178
|
+
try {
|
|
179
|
+
const hw = (0, hardware_1.readHardwareIdentity)();
|
|
180
|
+
const ctx = (() => {
|
|
181
|
+
try {
|
|
182
|
+
const p = (0, context_1.findContextFile)();
|
|
183
|
+
return p ? (0, context_1.loadContext)(p) : null;
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
})();
|
|
189
|
+
const contextHash = ctx?.contextHash ?? (0, hardware_1.sha256)('no-context');
|
|
190
|
+
const fingerprint = (0, hardware_1.generateSessionFingerprint)(hw.fingerprint, contextHash, Date.now());
|
|
191
|
+
console.log('\n┌─ HABI Hardware Identity ──────────────────────────────────┐');
|
|
192
|
+
console.log(`│ Hardware ID: ${hw.fingerprint}`);
|
|
193
|
+
console.log(`│ Type: ${hw.type}`);
|
|
194
|
+
console.log(`│ Interface: ${hw.iface}`);
|
|
195
|
+
console.log(`│ Platform: ${hw.platform}`);
|
|
196
|
+
console.log(`│ Hostname: ${hw.hostname}`);
|
|
197
|
+
console.log(`│ Context: ${ctx ? ctx.context.project : 'none loaded'}`);
|
|
198
|
+
console.log(`│ Context Hash: ${ctx ? ctx.contextHash.slice(0, 24) + '...' : 'n/a'}`);
|
|
199
|
+
console.log(`│ Session FP: ${fingerprint.slice(0, 24)}...`);
|
|
200
|
+
console.log('└────────────────────────────────────────────────────────────┘\n');
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
console.error(`\n✗ Could not read hardware identity:\n ${err}\n`);
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async function cmdInit() {
|
|
208
|
+
const hw = (0, hardware_1.readHardwareIdentity)();
|
|
209
|
+
const projectName = process.argv[3] || path.basename(process.cwd());
|
|
210
|
+
const contextContent = {
|
|
211
|
+
project: projectName,
|
|
212
|
+
version: '1.0.0',
|
|
213
|
+
owner: process.env.HABI_OWNER_EMAIL || process.env.USER || process.env.USERNAME || 'owner',
|
|
214
|
+
allowedMachines: [hw.fingerprint],
|
|
215
|
+
allowedOperations: {
|
|
216
|
+
paths: [`${process.cwd()}/**`],
|
|
217
|
+
cloudAccounts: [],
|
|
218
|
+
databases: [],
|
|
219
|
+
repos: [],
|
|
220
|
+
},
|
|
221
|
+
deniedOperations: [
|
|
222
|
+
'DROP TABLE',
|
|
223
|
+
'DROP DATABASE',
|
|
224
|
+
'rm -rf /',
|
|
225
|
+
'DELETE FROM audit_log',
|
|
226
|
+
'truncate audit_log',
|
|
227
|
+
],
|
|
228
|
+
};
|
|
229
|
+
const contextHash = (0, hardware_1.sha256)(JSON.stringify(contextContent, null, 2));
|
|
230
|
+
const fullContext = { ...contextContent, contextHash };
|
|
231
|
+
const outPath = path.join(process.cwd(), 'habi-context.json');
|
|
232
|
+
if (fs.existsSync(outPath)) {
|
|
233
|
+
console.log(`\n⚠ Context file already exists: ${outPath}`);
|
|
234
|
+
console.log(' Delete it first if you want to regenerate.\n');
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
fs.writeFileSync(outPath, JSON.stringify(fullContext, null, 2), 'utf8');
|
|
238
|
+
console.log('\n✓ HABI Project Context File created');
|
|
239
|
+
console.log(` File: ${outPath}`);
|
|
240
|
+
console.log(` Project: ${projectName}`);
|
|
241
|
+
console.log(` Machine: ${hw.fingerprint} (${hw.type})`);
|
|
242
|
+
console.log(` Hash: ${contextHash.slice(0, 24)}...`);
|
|
243
|
+
console.log('\n⚠ IMPORTANT: Add habi-context.json to your .gitignore');
|
|
244
|
+
console.log(' This file contains your machine identity — do not commit it.\n');
|
|
245
|
+
}
|
|
246
|
+
async function cmdVerify() {
|
|
247
|
+
try {
|
|
248
|
+
const data = await pingAgent('/verify');
|
|
249
|
+
if (data.verified) {
|
|
250
|
+
console.log('\n✓ Session VERIFIED');
|
|
251
|
+
console.log(` Hardware ID: ${data.hardwareId}`);
|
|
252
|
+
console.log(` Fingerprint: ${data.fingerprint?.slice(0, 24)}...`);
|
|
253
|
+
console.log(` Expires in: ${data.expiresIn}s\n`);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
console.log('\n✗ Session NOT VERIFIED');
|
|
257
|
+
console.log(` Reason: ${data.reason || data.error}\n`);
|
|
258
|
+
process.exit(1);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
console.log('\n✗ HABI agent not running. Start with: npx ts-node src/cli.ts start\n');
|
|
263
|
+
process.exit(1);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// ── Dispatch ────────────────────────────────────────────────────────────────
|
|
267
|
+
(async () => {
|
|
268
|
+
switch (command) {
|
|
269
|
+
case 'start':
|
|
270
|
+
await cmdStart();
|
|
271
|
+
break;
|
|
272
|
+
case 'status':
|
|
273
|
+
await cmdStatus();
|
|
274
|
+
break;
|
|
275
|
+
case 'identity':
|
|
276
|
+
await cmdIdentity();
|
|
277
|
+
break;
|
|
278
|
+
case 'init':
|
|
279
|
+
await cmdInit();
|
|
280
|
+
break;
|
|
281
|
+
case 'verify':
|
|
282
|
+
await cmdVerify();
|
|
283
|
+
break;
|
|
284
|
+
default:
|
|
285
|
+
console.log(`\nHABI Agent v0.1.0 — On Spot Solutions LLC`);
|
|
286
|
+
console.log(`Usage: npx ts-node src/cli.ts <command>`);
|
|
287
|
+
console.log(`\nCommands:`);
|
|
288
|
+
console.log(` start Start the local identity daemon on port 7432`);
|
|
289
|
+
console.log(` status Show agent status and hardware identity`);
|
|
290
|
+
console.log(` identity Print hardware fingerprint`);
|
|
291
|
+
console.log(` init Generate a Project Context File for this directory`);
|
|
292
|
+
console.log(` verify Verify the current session\n`);
|
|
293
|
+
}
|
|
294
|
+
})();
|
|
295
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/cloud.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HABI Cloud Sync
|
|
3
|
+
* Authenticates via HABI_KEY, registers device, and sends heartbeats.
|
|
4
|
+
*/
|
|
5
|
+
interface HeartbeatResponse {
|
|
6
|
+
ok: boolean;
|
|
7
|
+
sessionToken?: string;
|
|
8
|
+
sessionTokenExpiresAt?: string;
|
|
9
|
+
tokenRotated?: boolean;
|
|
10
|
+
pendingJobs?: Array<{
|
|
11
|
+
id: string;
|
|
12
|
+
payload: Record<string, unknown>;
|
|
13
|
+
payload_hash: string;
|
|
14
|
+
}>;
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
interface JobResultPayload {
|
|
18
|
+
jobId: string;
|
|
19
|
+
deviceId: string;
|
|
20
|
+
sessionToken: string;
|
|
21
|
+
status: 'COMPLETED' | 'FAILED';
|
|
22
|
+
result?: Record<string, unknown>;
|
|
23
|
+
error?: string;
|
|
24
|
+
durationMs?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface CloudState {
|
|
27
|
+
deviceId: string;
|
|
28
|
+
ownerId: string;
|
|
29
|
+
sessionToken: string;
|
|
30
|
+
sessionTokenExpiresAt: string;
|
|
31
|
+
registered: boolean;
|
|
32
|
+
}
|
|
33
|
+
export declare function registerDevice(params: {
|
|
34
|
+
friendlyName: string;
|
|
35
|
+
hardwareFingerprint: string;
|
|
36
|
+
fingerprintType: 'mac' | 'ipv6_link_local';
|
|
37
|
+
agentVersion?: string;
|
|
38
|
+
osPlatform?: string;
|
|
39
|
+
}): Promise<CloudState | null>;
|
|
40
|
+
export declare function sendHeartbeat(params: {
|
|
41
|
+
deviceId: string;
|
|
42
|
+
sessionToken: string;
|
|
43
|
+
hardwareFingerprint: string;
|
|
44
|
+
}): Promise<{
|
|
45
|
+
sessionToken: string;
|
|
46
|
+
pendingJobs: HeartbeatResponse['pendingJobs'];
|
|
47
|
+
} | null>;
|
|
48
|
+
export declare function reportJobResult(payload: JobResultPayload): Promise<void>;
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=cloud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH,UAAU,iBAAiB;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5F,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyCD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,KAAK,GAAG,iBAAiB,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAgC7B;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAA;CAAE,GAAG,IAAI,CAAC,CAoB1F;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9E"}
|
package/dist/cloud.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HABI Cloud Sync
|
|
4
|
+
* Authenticates via HABI_KEY, registers device, and sends heartbeats.
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.registerDevice = registerDevice;
|
|
41
|
+
exports.sendHeartbeat = sendHeartbeat;
|
|
42
|
+
exports.reportJobResult = reportJobResult;
|
|
43
|
+
const https = __importStar(require("https"));
|
|
44
|
+
const HABI_API = process.env.HABI_API_URL ||
|
|
45
|
+
'https://dokcixjitwihtbdlkbdb.supabase.co/functions/v1';
|
|
46
|
+
const HABI_KEY = process.env.HABI_KEY || '';
|
|
47
|
+
const OWNER_EMAIL = process.env.HABI_OWNER_EMAIL || '';
|
|
48
|
+
function post(path, body) {
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
const bodyStr = JSON.stringify(body);
|
|
51
|
+
const url = new URL(`${HABI_API}/${path}`);
|
|
52
|
+
const headers = {
|
|
53
|
+
'Content-Type': 'application/json',
|
|
54
|
+
'Content-Length': String(Buffer.byteLength(bodyStr)),
|
|
55
|
+
};
|
|
56
|
+
// Pass HABI_KEY in header if set
|
|
57
|
+
if (HABI_KEY) {
|
|
58
|
+
headers['x-habi-key'] = HABI_KEY;
|
|
59
|
+
}
|
|
60
|
+
const options = {
|
|
61
|
+
hostname: url.hostname,
|
|
62
|
+
port: 443,
|
|
63
|
+
path: url.pathname,
|
|
64
|
+
method: 'POST',
|
|
65
|
+
headers,
|
|
66
|
+
};
|
|
67
|
+
const req = https.request(options, (res) => {
|
|
68
|
+
let data = '';
|
|
69
|
+
res.on('data', (chunk) => data += chunk.toString());
|
|
70
|
+
res.on('end', () => {
|
|
71
|
+
try {
|
|
72
|
+
resolve(JSON.parse(data));
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
reject(new Error(`Parse error: ${data.slice(0, 100)}`));
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
req.on('error', reject);
|
|
80
|
+
req.setTimeout(10000, () => { req.destroy(); reject(new Error('Cloud sync timeout')); });
|
|
81
|
+
req.write(bodyStr);
|
|
82
|
+
req.end();
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async function registerDevice(params) {
|
|
86
|
+
if (!HABI_KEY && !OWNER_EMAIL) {
|
|
87
|
+
console.warn('[HABI] No HABI_KEY or HABI_OWNER_EMAIL set — running offline.');
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const body = { ...params };
|
|
92
|
+
if (HABI_KEY)
|
|
93
|
+
body.habiKey = HABI_KEY;
|
|
94
|
+
if (OWNER_EMAIL)
|
|
95
|
+
body.ownerEmail = OWNER_EMAIL;
|
|
96
|
+
const res = await post('device-register', body);
|
|
97
|
+
if (!res.ok || !res.deviceId) {
|
|
98
|
+
console.error(`[HABI] Registration failed: ${res.error}`);
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
console.log(`[HABI] ✓ Device registered: ${params.friendlyName} (${res.deviceId.slice(0, 8)}...)`);
|
|
102
|
+
return {
|
|
103
|
+
deviceId: res.deviceId,
|
|
104
|
+
ownerId: res.ownerId,
|
|
105
|
+
sessionToken: res.sessionToken,
|
|
106
|
+
sessionTokenExpiresAt: res.sessionTokenExpiresAt,
|
|
107
|
+
registered: true,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
console.error(`[HABI] Registration error: ${err}`);
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async function sendHeartbeat(params) {
|
|
116
|
+
try {
|
|
117
|
+
const body = { ...params };
|
|
118
|
+
if (HABI_KEY)
|
|
119
|
+
body.habiKey = HABI_KEY;
|
|
120
|
+
const res = await post('heartbeat', body);
|
|
121
|
+
if (!res.ok) {
|
|
122
|
+
console.error(`[HABI] Heartbeat failed: ${res.error}`);
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
sessionToken: res.sessionToken || params.sessionToken,
|
|
127
|
+
pendingJobs: res.pendingJobs || [],
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
console.error(`[HABI] Heartbeat error: ${err}`);
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function reportJobResult(payload) {
|
|
136
|
+
try {
|
|
137
|
+
const body = { ...payload };
|
|
138
|
+
if (HABI_KEY)
|
|
139
|
+
body.habiKey = HABI_KEY;
|
|
140
|
+
await post('job-result', body);
|
|
141
|
+
console.log(`[HABI] Job result reported: ${payload.jobId} → ${payload.status}`);
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
console.error(`[HABI] Job result error: ${err}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=cloud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.js","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HABI Project Context File Loader
|
|
3
|
+
*
|
|
4
|
+
* The Project Context File is the source of truth for what is authorized
|
|
5
|
+
* on this machine for this project. It lives OUTSIDE version control.
|
|
6
|
+
*
|
|
7
|
+
* The SHA-256 hash of the file is computed on load and included in every
|
|
8
|
+
* session fingerprint. Tampering with the file invalidates active sessions.
|
|
9
|
+
*/
|
|
10
|
+
export interface AllowedOperations {
|
|
11
|
+
paths?: string[];
|
|
12
|
+
cloudAccounts?: string[];
|
|
13
|
+
databases?: string[];
|
|
14
|
+
repos?: string[];
|
|
15
|
+
commands?: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface ProjectContext {
|
|
18
|
+
project: string;
|
|
19
|
+
version: string;
|
|
20
|
+
owner: string;
|
|
21
|
+
allowedMachines: string[];
|
|
22
|
+
allowedOperations: AllowedOperations;
|
|
23
|
+
deniedOperations: string[];
|
|
24
|
+
contextHash: string;
|
|
25
|
+
}
|
|
26
|
+
export interface LoadedContext {
|
|
27
|
+
context: ProjectContext;
|
|
28
|
+
contextHash: string;
|
|
29
|
+
filePath: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Locates the context file by walking up from cwd.
|
|
33
|
+
* Searches: cwd → parent → grandparent → $HOME
|
|
34
|
+
*/
|
|
35
|
+
export declare function findContextFile(startDir?: string): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Loads and validates a Project Context File.
|
|
38
|
+
*
|
|
39
|
+
* Validation:
|
|
40
|
+
* 1. File exists and is valid JSON
|
|
41
|
+
* 2. Required fields are present
|
|
42
|
+
* 3. Recomputed hash matches stored contextHash
|
|
43
|
+
* (if mismatch → file was tampered with → reject)
|
|
44
|
+
*/
|
|
45
|
+
export declare function loadContext(filePath: string): LoadedContext;
|
|
46
|
+
/**
|
|
47
|
+
* Checks whether a proposed operation is authorized under the loaded context.
|
|
48
|
+
*
|
|
49
|
+
* Returns: { allowed: true } or { allowed: false, reason: string }
|
|
50
|
+
*/
|
|
51
|
+
export declare function assertOperation(operation: string, context: ProjectContext): {
|
|
52
|
+
allowed: boolean;
|
|
53
|
+
reason?: string;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Checks whether this machine's hardware ID is authorized in the context file.
|
|
57
|
+
*/
|
|
58
|
+
export declare function assertMachineAuthorized(hardwareId: string, context: ProjectContext): {
|
|
59
|
+
allowed: boolean;
|
|
60
|
+
reason?: string;
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,cAAc,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAQD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAe/E;AAMD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CA4C3D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,GACtB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CA8BvC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAevC"}
|