habi-agent 0.1.2 → 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.
package/dist/cloud.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * HABI Cloud Sync
3
3
  * Authenticates via HABI_KEY, registers device, and sends heartbeats.
4
+ * NOTE: HABI_KEY and OWNER_EMAIL are read at call time (not module load time)
5
+ * so that CLI --key arg has time to set process.env.HABI_KEY first.
4
6
  */
5
7
  interface HeartbeatResponse {
6
8
  ok: boolean;
@@ -1 +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"}
1
+ {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH,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;AAuCD,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,CAmC7B;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,CAqB1F;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAU9E"}
package/dist/cloud.js CHANGED
@@ -2,6 +2,8 @@
2
2
  /**
3
3
  * HABI Cloud Sync
4
4
  * Authenticates via HABI_KEY, registers device, and sends heartbeats.
5
+ * NOTE: HABI_KEY and OWNER_EMAIL are read at call time (not module load time)
6
+ * so that CLI --key arg has time to set process.env.HABI_KEY first.
5
7
  */
6
8
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
9
  if (k2 === undefined) k2 = k;
@@ -43,20 +45,20 @@ exports.reportJobResult = reportJobResult;
43
45
  const https = __importStar(require("https"));
44
46
  const HABI_API = process.env.HABI_API_URL ||
45
47
  'https://dokcixjitwihtbdlkbdb.supabase.co/functions/v1';
46
- const HABI_KEY = process.env.HABI_KEY || '';
47
- const OWNER_EMAIL = process.env.HABI_OWNER_EMAIL || '';
48
+ // ── Read env at call time, not module load time ──────────────────────────────
49
+ function getKey() { return process.env.HABI_KEY || ''; }
50
+ function getEmail() { return process.env.HABI_OWNER_EMAIL || ''; }
48
51
  function post(path, body) {
49
52
  return new Promise((resolve, reject) => {
53
+ const habiKey = getKey();
50
54
  const bodyStr = JSON.stringify(body);
51
55
  const url = new URL(`${HABI_API}/${path}`);
52
56
  const headers = {
53
57
  'Content-Type': 'application/json',
54
58
  'Content-Length': String(Buffer.byteLength(bodyStr)),
55
59
  };
56
- // Pass HABI_KEY in header if set
57
- if (HABI_KEY) {
58
- headers['x-habi-key'] = HABI_KEY;
59
- }
60
+ if (habiKey)
61
+ headers['x-habi-key'] = habiKey;
60
62
  const options = {
61
63
  hostname: url.hostname,
62
64
  port: 443,
@@ -83,16 +85,18 @@ function post(path, body) {
83
85
  });
84
86
  }
85
87
  async function registerDevice(params) {
86
- if (!HABI_KEY && !OWNER_EMAIL) {
88
+ const habiKey = getKey();
89
+ const ownerEmail = getEmail();
90
+ if (!habiKey && !ownerEmail) {
87
91
  console.warn('[HABI] No HABI_KEY or HABI_OWNER_EMAIL set — running offline.');
88
92
  return null;
89
93
  }
90
94
  try {
91
95
  const body = { ...params };
92
- if (HABI_KEY)
93
- body.habiKey = HABI_KEY;
94
- if (OWNER_EMAIL)
95
- body.ownerEmail = OWNER_EMAIL;
96
+ if (habiKey)
97
+ body.habiKey = habiKey;
98
+ if (ownerEmail)
99
+ body.ownerEmail = ownerEmail;
96
100
  const res = await post('device-register', body);
97
101
  if (!res.ok || !res.deviceId) {
98
102
  console.error(`[HABI] Registration failed: ${res.error}`);
@@ -115,8 +119,9 @@ async function registerDevice(params) {
115
119
  async function sendHeartbeat(params) {
116
120
  try {
117
121
  const body = { ...params };
118
- if (HABI_KEY)
119
- body.habiKey = HABI_KEY;
122
+ const habiKey = getKey();
123
+ if (habiKey)
124
+ body.habiKey = habiKey;
120
125
  const res = await post('heartbeat', body);
121
126
  if (!res.ok) {
122
127
  console.error(`[HABI] Heartbeat failed: ${res.error}`);
@@ -135,8 +140,9 @@ async function sendHeartbeat(params) {
135
140
  async function reportJobResult(payload) {
136
141
  try {
137
142
  const body = { ...payload };
138
- if (HABI_KEY)
139
- body.habiKey = HABI_KEY;
143
+ const habiKey = getKey();
144
+ if (habiKey)
145
+ body.habiKey = habiKey;
140
146
  await post('job-result', body);
141
147
  console.log(`[HABI] Job result reported: ${payload.jobId} → ${payload.status}`);
142
148
  }
package/dist/cloud.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "habi-agent",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "HABI Local Identity Agent — hardware fingerprint daemon on localhost:7432",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/cloud.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * HABI Cloud Sync
3
3
  * Authenticates via HABI_KEY, registers device, and sends heartbeats.
4
+ * NOTE: HABI_KEY and OWNER_EMAIL are read at call time (not module load time)
5
+ * so that CLI --key arg has time to set process.env.HABI_KEY first.
4
6
  */
5
7
 
6
8
  import * as https from 'https';
@@ -9,8 +11,9 @@ import * as os from 'os';
9
11
  const HABI_API = process.env.HABI_API_URL ||
10
12
  'https://dokcixjitwihtbdlkbdb.supabase.co/functions/v1';
11
13
 
12
- const HABI_KEY = process.env.HABI_KEY || '';
13
- const OWNER_EMAIL = process.env.HABI_OWNER_EMAIL || '';
14
+ // ── Read env at call time, not module load time ──────────────────────────────
15
+ function getKey(): string { return process.env.HABI_KEY || ''; }
16
+ function getEmail(): string { return process.env.HABI_OWNER_EMAIL || ''; }
14
17
 
15
18
  interface RegisterResponse {
16
19
  ok: boolean;
@@ -42,6 +45,7 @@ interface JobResultPayload {
42
45
 
43
46
  function post<T>(path: string, body: Record<string, unknown>): Promise<T> {
44
47
  return new Promise((resolve, reject) => {
48
+ const habiKey = getKey();
45
49
  const bodyStr = JSON.stringify(body);
46
50
  const url = new URL(`${HABI_API}/${path}`);
47
51
 
@@ -50,10 +54,7 @@ function post<T>(path: string, body: Record<string, unknown>): Promise<T> {
50
54
  'Content-Length': String(Buffer.byteLength(bodyStr)),
51
55
  };
52
56
 
53
- // Pass HABI_KEY in header if set
54
- if (HABI_KEY) {
55
- headers['x-habi-key'] = HABI_KEY;
56
- }
57
+ if (habiKey) headers['x-habi-key'] = habiKey;
57
58
 
58
59
  const options: https.RequestOptions = {
59
60
  hostname: url.hostname,
@@ -95,15 +96,18 @@ export async function registerDevice(params: {
95
96
  osPlatform?: string;
96
97
  }): Promise<CloudState | null> {
97
98
 
98
- if (!HABI_KEY && !OWNER_EMAIL) {
99
+ const habiKey = getKey();
100
+ const ownerEmail = getEmail();
101
+
102
+ if (!habiKey && !ownerEmail) {
99
103
  console.warn('[HABI] No HABI_KEY or HABI_OWNER_EMAIL set — running offline.');
100
104
  return null;
101
105
  }
102
106
 
103
107
  try {
104
108
  const body: Record<string, unknown> = { ...params };
105
- if (HABI_KEY) body.habiKey = HABI_KEY;
106
- if (OWNER_EMAIL) body.ownerEmail = OWNER_EMAIL;
109
+ if (habiKey) body.habiKey = habiKey;
110
+ if (ownerEmail) body.ownerEmail = ownerEmail;
107
111
 
108
112
  const res = await post<RegisterResponse>('device-register', body);
109
113
 
@@ -134,7 +138,8 @@ export async function sendHeartbeat(params: {
134
138
  }): Promise<{ sessionToken: string; pendingJobs: HeartbeatResponse['pendingJobs'] } | null> {
135
139
  try {
136
140
  const body: Record<string, unknown> = { ...params };
137
- if (HABI_KEY) body.habiKey = HABI_KEY;
141
+ const habiKey = getKey();
142
+ if (habiKey) body.habiKey = habiKey;
138
143
 
139
144
  const res = await post<HeartbeatResponse>('heartbeat', body);
140
145
 
@@ -156,7 +161,8 @@ export async function sendHeartbeat(params: {
156
161
  export async function reportJobResult(payload: JobResultPayload): Promise<void> {
157
162
  try {
158
163
  const body = { ...payload as unknown as Record<string, unknown> };
159
- if (HABI_KEY) body.habiKey = HABI_KEY;
164
+ const habiKey = getKey();
165
+ if (habiKey) body.habiKey = habiKey;
160
166
  await post<{ ok: boolean }>('job-result', body);
161
167
  console.log(`[HABI] Job result reported: ${payload.jobId} → ${payload.status}`);
162
168
  } catch (err) {