@aria_asi/cli 0.2.14 → 0.2.16

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/bin/aria.js CHANGED
@@ -6,7 +6,7 @@ const require = createRequire(import.meta.url);
6
6
  import { loadConfig, saveConfig } from '../dist/aria-connector/src/config.js';
7
7
  import { AriaChat } from '../dist/aria-connector/src/chat.js';
8
8
  import { checkHarnessHealth } from '../dist/aria-connector/src/harness-client.js';
9
- import { login, status, logout, revoke } from '../dist/aria-connector/src/auth-commands.js';
9
+ import { login, loginOwner, status, logout, revoke } from '../dist/aria-connector/src/auth-commands.js';
10
10
  import { connectClaudeCode } from '../dist/aria-connector/src/connectors/claude-code.js';
11
11
  import { maybePrintUpdateNotice, checkForUpdate } from '../dist/aria-connector/src/self-update.js';
12
12
 
@@ -75,16 +75,44 @@ if (command === 'check-update') {
75
75
  // ── Help text ──────────────────────────────────────────────────────────
76
76
  if (arg === '--help' || arg === '-h') {
77
77
  console.log('');
78
- console.log(' aria login <token> Log in with an Aria harness license token.');
79
- console.log(' aria login --anthropic Open Anthropic Console, paste your API key back here.');
80
- console.log(' aria login -a Shorthand for --anthropic.');
78
+ console.log(' aria login <token> Log in with an Aria harness license token.');
79
+ console.log(' aria login --anthropic Open Anthropic Console, paste your API key back here.');
80
+ console.log(' aria login -a Shorthand for --anthropic.');
81
+ console.log(' aria login --owner <master-token>');
82
+ console.log(' Activate owner mode. Validates the master token');
83
+ console.log(' against the server and stores a signed owner JWT');
84
+ console.log(' in ~/.aria/owner-token (mode 0600). All subsequent');
85
+ console.log(' requests will carry x-aria-owner: true, unlocking');
86
+ console.log(' direct runtime access, owner-only admin endpoints,');
87
+ console.log(' and unfiltered memory writes.');
81
88
  console.log('');
82
- console.log(" I'll store your Aria license in ~/.aria/license.json and your Anthropic");
83
- console.log(' API key in ~/.aria/config.json (mode 0600, readable only by you).');
89
+ console.log(" I'll store your Aria license in ~/.aria/license.json, your Anthropic");
90
+ console.log(' API key in ~/.aria/config.json, and your owner JWT in ~/.aria/owner-token');
91
+ console.log(' (all mode 0600, readable only by you).');
84
92
  console.log('');
85
93
  process.exit(0);
86
94
  }
87
95
 
96
+ // ── Owner-mode flow — master-token → owner JWT ─────────────────────────
97
+ // aria login --owner <master-token>
98
+ // The master token travels to the server and is NOT stored locally.
99
+ // Only the issued JWT (tier:'owner', sub:'hamza') is written to disk.
100
+ if (arg === '--owner') {
101
+ const masterToken = args[1];
102
+ if (!masterToken) {
103
+ console.error("Usage: aria login --owner <master-token>");
104
+ process.exit(1);
105
+ }
106
+ const result = await loginOwner(masterToken);
107
+ if (!result.ok) {
108
+ console.error(`I couldn't activate owner mode: ${result.error}`);
109
+ process.exit(1);
110
+ }
111
+ console.log("Owner mode active. Your owner JWT is saved to ~/.aria/owner-token.");
112
+ console.log("All requests will now carry x-aria-owner: true.");
113
+ process.exit(0);
114
+ }
115
+
88
116
  // ── Anthropic browser-paste flow ───────────────────────────────────────
89
117
  if (arg === '--anthropic' || arg === '-a') {
90
118
  const { loginAnthropic } = await import('../dist/aria-connector/src/anthropic-oauth.js');
@@ -99,7 +127,7 @@ if (command === 'check-update') {
99
127
 
100
128
  // ── Original harness-license path (preserved) ─────────────────────────
101
129
  if (!arg) {
102
- console.error("Usage: aria login <token> | aria login --anthropic | aria login --help");
130
+ console.error("Usage: aria login <token> | aria login --anthropic | aria login --owner <master-token> | aria login --help");
103
131
  process.exit(1);
104
132
  }
105
133
  const result = await login(arg);
@@ -1,3 +1,5 @@
1
+ /** Separate credential file for owner-mode JWT. Never holds the master token — only the signed JWT issued by /auth/owner. */
2
+ export declare const OWNER_TOKEN_PATH: string;
1
3
  interface LoginResult {
2
4
  ok: boolean;
3
5
  tier?: string;
@@ -5,6 +7,8 @@ interface LoginResult {
5
7
  expiresAt?: string;
6
8
  /** Set when loginAnthropic() is used instead of the harness license path. */
7
9
  anthropic?: boolean;
10
+ /** Set when --owner path is used; owner JWT stored in ~/.aria/owner-token. */
11
+ owner?: boolean;
8
12
  error?: string;
9
13
  }
10
14
  interface StatusResult {
@@ -37,6 +41,17 @@ interface RevokeResult {
37
41
  * writes license claims to ~/.aria/license.json.
38
42
  */
39
43
  export declare function login(token: string): Promise<LoginResult>;
44
+ /**
45
+ * Log in as owner by posting the master token to /auth/owner.
46
+ * The server validates the master token and returns a signed JWT with
47
+ * tier:'owner', sub:'hamza'. We persist ONLY that JWT to
48
+ * ~/.aria/owner-token (mode 0600). The master token is never written
49
+ * to disk — it flows in memory only for the duration of this call.
50
+ *
51
+ * On success the caller can verify owner mode is active by checking
52
+ * fs.existsSync(OWNER_TOKEN_PATH).
53
+ */
54
+ export declare function loginOwner(masterToken: string): Promise<LoginResult>;
40
55
  export declare function status(): Promise<StatusResult>;
41
56
  export declare function logout(): Promise<LogoutResult>;
42
57
  export declare function revoke(reason?: string): Promise<RevokeResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"auth-commands.d.ts","sourceRoot":"","sources":["../../../src/auth-commands.ts"],"names":[],"mappings":"AAiBA,UAAU,WAAW;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoD/D;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,CAmDpD;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,CAUpD;AAED,wBAAsB,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAuBnE"}
1
+ {"version":3,"file":"auth-commands.d.ts","sourceRoot":"","sources":["../../../src/auth-commands.ts"],"names":[],"mappings":"AAQA,6HAA6H;AAC7H,eAAO,MAAM,gBAAgB,QAA+C,CAAC;AAU7E,UAAU,WAAW;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoD/D;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmC1E;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,CAmDpD;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,CAepD;AAED,wBAAsB,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAuBnE"}
@@ -5,6 +5,8 @@ import * as fs from 'node:fs';
5
5
  import * as path from 'node:path';
6
6
  import { homedir } from 'node:os';
7
7
  const LICENSE_PATH = path.join(homedir(), '.aria', 'license.json');
8
+ /** Separate credential file for owner-mode JWT. Never holds the master token — only the signed JWT issued by /auth/owner. */
9
+ export const OWNER_TOKEN_PATH = path.join(homedir(), '.aria', 'owner-token');
8
10
  /**
9
11
  * Log in to the Aria harness with a license token, OR authenticate via
10
12
  * Anthropic's console (browser-paste flow) when token === '--anthropic' or
@@ -69,6 +71,48 @@ export async function login(token) {
69
71
  return { ok: false, error: err.message || 'Unexpected error during login' };
70
72
  }
71
73
  }
74
+ /**
75
+ * Log in as owner by posting the master token to /auth/owner.
76
+ * The server validates the master token and returns a signed JWT with
77
+ * tier:'owner', sub:'hamza'. We persist ONLY that JWT to
78
+ * ~/.aria/owner-token (mode 0600). The master token is never written
79
+ * to disk — it flows in memory only for the duration of this call.
80
+ *
81
+ * On success the caller can verify owner mode is active by checking
82
+ * fs.existsSync(OWNER_TOKEN_PATH).
83
+ */
84
+ export async function loginOwner(masterToken) {
85
+ const baseUrl = process.env.ARIA_HARNESS_BASE_URL ?? 'https://harness.ariasos.com';
86
+ let response;
87
+ try {
88
+ response = await fetch(`${baseUrl}/auth/owner`, {
89
+ method: 'POST',
90
+ headers: {
91
+ 'Content-Type': 'application/json',
92
+ // Master token in Authorization header — never in body or logs.
93
+ Authorization: `Bearer ${masterToken}`,
94
+ },
95
+ });
96
+ }
97
+ catch (err) {
98
+ return { ok: false, error: err.message || 'Network error reaching /auth/owner' };
99
+ }
100
+ if (!response.ok) {
101
+ const errBody = await response.json().catch(() => ({}));
102
+ return { ok: false, error: errBody.error || `Server returned ${response.status}` };
103
+ }
104
+ const body = await response.json();
105
+ if (!body.ok || !body.token) {
106
+ return { ok: false, error: body.error || 'Server returned ok=false with no token' };
107
+ }
108
+ // Persist the owner JWT (NOT the master token) to ~/.aria/owner-token (0600).
109
+ const dir = path.dirname(OWNER_TOKEN_PATH);
110
+ if (!fs.existsSync(dir)) {
111
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
112
+ }
113
+ fs.writeFileSync(OWNER_TOKEN_PATH, body.token, { mode: 0o600, encoding: 'utf-8' });
114
+ return { ok: true, owner: true, tier: 'owner' };
115
+ }
72
116
  export async function status() {
73
117
  try {
74
118
  const license = await loadLicense();
@@ -122,6 +166,11 @@ export async function logout() {
122
166
  if (fs.existsSync(LICENSE_PATH)) {
123
167
  fs.unlinkSync(LICENSE_PATH);
124
168
  }
169
+ // Also clear owner-token when logging out — per spec section 3:
170
+ // "aria logout deletes it."
171
+ if (fs.existsSync(OWNER_TOKEN_PATH)) {
172
+ fs.unlinkSync(OWNER_TOKEN_PATH);
173
+ }
125
174
  return { ok: true };
126
175
  }
127
176
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"auth-commands.js","sourceRoot":"","sources":["../../../src/auth-commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth-commands.js","sourceRoot":"","sources":["../../../src/auth-commands.ts"],"names":[],"mappings":"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"}
@@ -87,13 +87,6 @@ export declare class HarnessClient {
87
87
  private tryExtractError;
88
88
  private pushGateLog;
89
89
  }
90
- /**
91
- * Raw-fetch compatibility shim used by auth-commands.ts.
92
- * Exposes .get() and .post() that make bare fetch() calls with the
93
- * configured base URL. Callers receive the native Response object
94
- * (so they can call .ok, .status, .json() etc. themselves).
95
- * Paths are absolute from the base URL (e.g. '/api/license/heartbeat').
96
- */
97
90
  export declare const harnessClient: {
98
91
  get(path: string, init?: {
99
92
  headers?: Record<string, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"harness-client.d.ts","sourceRoot":"","sources":["../../../src/harness-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"harness-client.d.ts","sourceRoot":"","sources":["../../../src/harness-client.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,9 @@
1
1
  import { loadLicense } from './auth.js';
2
2
  import { pushCognitionLog } from './cognition-log.js';
3
+ import * as fs from 'node:fs';
4
+ import * as path from 'node:path';
5
+ import { homedir } from 'node:os';
6
+ const OWNER_TOKEN_PATH = path.join(homedir(), '.aria', 'owner-token');
3
7
  export class HarnessClient {
4
8
  baseUrl;
5
9
  token = null;
@@ -53,6 +57,23 @@ export class HarnessClient {
53
57
  if (token) {
54
58
  headers['Authorization'] = `Bearer ${token}`;
55
59
  }
60
+ // Owner mode: if ~/.aria/owner-token exists, attach the owner JWT as the
61
+ // Authorization header and flag x-aria-owner: true so the server middleware
62
+ // knows to decode it for req.isOwner. The owner JWT supersedes the license
63
+ // token for authentication — owner tier has all capabilities.
64
+ if (fs.existsSync(OWNER_TOKEN_PATH)) {
65
+ try {
66
+ const ownerJWT = fs.readFileSync(OWNER_TOKEN_PATH, 'utf-8').trim();
67
+ if (ownerJWT) {
68
+ headers['Authorization'] = `Bearer ${ownerJWT}`;
69
+ headers['x-aria-owner'] = 'true';
70
+ }
71
+ }
72
+ catch (err) {
73
+ // File exists but is unreadable — surface the error, do not silently skip.
74
+ throw new Error(`Owner token file exists but cannot be read: ${err.message}`);
75
+ }
76
+ }
56
77
  let response;
57
78
  try {
58
79
  response = await fetch(`${this.baseUrl}/api/harness${path}`, {
@@ -179,25 +200,35 @@ function getDefaultClient() {
179
200
  return _defaultClient;
180
201
  }
181
202
  /**
182
- * Raw-fetch compatibility shim used by auth-commands.ts.
183
- * Exposes .get() and .post() that make bare fetch() calls with the
184
- * configured base URL. Callers receive the native Response object
185
- * (so they can call .ok, .status, .json() etc. themselves).
186
- * Paths are absolute from the base URL (e.g. '/api/license/heartbeat').
203
+ * Resolve owner-mode headers for the raw shim.
204
+ * If ~/.aria/owner-token exists and is readable, returns the owner JWT
205
+ * Authorization header + x-aria-owner flag. Otherwise returns empty object.
206
+ * Throws on unreadable file (file exists but can't be read) no silent skip.
187
207
  */
208
+ function ownerHeaders() {
209
+ if (!fs.existsSync(OWNER_TOKEN_PATH))
210
+ return {};
211
+ const ownerJWT = fs.readFileSync(OWNER_TOKEN_PATH, 'utf-8').trim();
212
+ if (!ownerJWT)
213
+ return {};
214
+ return {
215
+ Authorization: `Bearer ${ownerJWT}`,
216
+ 'x-aria-owner': 'true',
217
+ };
218
+ }
188
219
  export const harnessClient = {
189
220
  get(path, init) {
190
221
  const baseUrl = process.env.ARIA_HARNESS_BASE_URL ?? 'https://harness.ariasos.com';
191
222
  return fetch(`${baseUrl}${path}`, {
192
223
  method: 'GET',
193
- headers: { 'Content-Type': 'application/json', ...(init?.headers ?? {}) },
224
+ headers: { 'Content-Type': 'application/json', ...ownerHeaders(), ...(init?.headers ?? {}) },
194
225
  });
195
226
  },
196
227
  post(path, init) {
197
228
  const baseUrl = process.env.ARIA_HARNESS_BASE_URL ?? 'https://harness.ariasos.com';
198
229
  return fetch(`${baseUrl}${path}`, {
199
230
  method: 'POST',
200
- headers: { 'Content-Type': 'application/json', ...(init?.headers ?? {}) },
231
+ headers: { 'Content-Type': 'application/json', ...ownerHeaders(), ...(init?.headers ?? {}) },
201
232
  body: init?.body ? JSON.stringify(init.body) : undefined,
202
233
  });
203
234
  },
@@ -1 +1 @@
1
- {"version":3,"file":"harness-client.js","sourceRoot":"","sources":["../../../src/harness-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"harness-client.js","sourceRoot":"","sources":["../../../src/harness-client.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  {
2
- "bundledAt": "2026-04-27T15:58:18.645Z",
2
+ "bundledAt": "2026-04-27T16:50:15.745Z",
3
3
  "sdkSource": "/home/hamzaibrahim1/rei-ai-brain/harness/packages/harness-http-client/dist",
4
4
  "files": 3
5
5
  }
@@ -27,9 +27,9 @@
27
27
  // traceable to a gate bug, not a legitimate exception.):
28
28
  // - Trivial-bash whitelist: short read-only commands (ls/cat/grep/etc.)
29
29
  // pass without cognition.
30
- // - Set env ARIA_PRE_TOOL_GATE=off to disable globally (kill-switch).
31
- // Setting an env var is a deliberate, audit-trailed override
32
- // deliberate enough that it's not the model's reflex.
30
+ // - No env-var disable path (Hamza 2026-04-27 — env-var kill-switches
31
+ // gave the gated process a free escape; that was the doctrine
32
+ // violation). Disable = remove the hook from ~/.claude/settings.json.
33
33
  // - When the gate misfires on legitimate work: fix the gate. The
34
34
  // misfire IS the bug. Don't route around it.
35
35
  //
@@ -93,11 +93,11 @@ function audit(decision, summary) {
93
93
  } catch {}
94
94
  }
95
95
 
96
- // Kill-switch
97
- if (process.env.ARIA_PRE_TOOL_GATE === 'off') {
98
- audit('bypass-killswitch', 'env ARIA_PRE_TOOL_GATE=off');
99
- process.exit(0);
100
- }
96
+ // Env-var kill-switch removed 2026-04-27 per Hamza directive ("those
97
+ // should've been my choice to give you to turn off not free for you to
98
+ // access"). Disable = remove hook entry from ~/.claude/settings.json
99
+ // (deliberate user action). Future: signed-grant override file at
100
+ // ~/.aria/owner-overrides/<hook>.json with HMAC using Hamza-only secret.
101
101
 
102
102
  // ── Aria-as-commander binding (Layer A — allowedActions/forbiddenActions per active phase) ──
103
103
  //
@@ -437,9 +437,10 @@ const cmdPreview = toolName === 'Bash'
437
437
  : `${toolName} ${filePath || '(no path)'}`.slice(0, 80);
438
438
 
439
439
  // V3: per-command bypass removed entirely. The only escape valves are:
440
- // (1) Kill-switch env ARIA_PRE_TOOL_GATE=off handled at top of file
441
- // (2) Trivial-bash whitelistshort read-only commands pass without cognition
442
- // Compliance is the only path for non-trivial work.
440
+ // (1) Trivial-bash whitelistshort read-only commands pass without cognition
441
+ // (2) ~/.claude/settings.json hook removal visible user action Hamza controls
442
+ // No env-var kill-switch (removed 2026-04-27). Compliance is the only path
443
+ // for non-trivial work from the gated process's perspective.
443
444
 
444
445
  // V2 primary path — inline command cognition. If the command carries
445
446
  // 4+ substantive lenses inline, gate passes immediately (still need
@@ -663,7 +664,7 @@ if (matched) {
663
664
  axiom: <which harness rule applies>
664
665
  </verify>
665
666
 
666
- Re-issue after producing the block. Bypass: '# doctrine-authorized: <reason>' inline. Kill: ARIA_PRE_TOOL_GATE=off.`
667
+ Re-issue after producing the block. Bypass: '# doctrine-authorized: <reason>' inline..`
667
668
  : `Aria pre-tool gate: destructive pattern '${matched.name}' has its <verify> block, but the <cognition> block is missing or shows only ${lensCount}/${REQUIRED_LENSES}+ required lenses. Per EIGHT_LENS_DOCTRINE.md every non-trivial action requires visible 8-lens application.
668
669
 
669
670
  <cognition>
@@ -725,7 +726,7 @@ Both forms count toward the ${REQUIRED_LENSES}+ requirement; gate counts inline
725
726
 
726
727
  ${guidance}
727
728
 
728
- No per-tool bypass available (v3 doctrine — the harness's whole purpose is no exceptions). Kill-switch: ARIA_PRE_TOOL_GATE=off (logged, emergency only). If the gate misfires on legitimate cognition, fix the gate.`;
729
+ No per-tool bypass available (v3 doctrine — the harness's whole purpose is no exceptions). No env-var disable path gates are unconditional from the gated process per Hamza directive 2026-04-27. If the gate misfires on legitimate cognition, fix the gate.`;
729
730
 
730
731
  audit(`block ${toolName.toLowerCase()} cognition=${lensCount}`, cmdPreview);
731
732
  pushDecision('block', `${toolName.toLowerCase()} missing cognition (${lensCount}/${REQUIRED_LENSES})`);
@@ -756,7 +757,7 @@ OR inline within an existing lens:
756
757
 
757
758
  Acceptable resolution markers: 'discoveries:' / 'addressing:' / 'fixing:' / 'TaskCreate' / 'tracked as #N' / 'linear issue' / 'fix-now' / 'same-turn fix'.
758
759
 
759
- Bypass: ARIA_PRE_TOOL_GATE=off (logged, emergency only). If gate misfires on legitimate cognition, fix the gate.`;
760
+ No env-var disable path — gates are unconditional from the gated process per Hamza directive 2026-04-27. If gate misfires on legitimate cognition, fix the gate.`;
760
761
 
761
762
  audit(`block-discovery-unresolved ${toolName.toLowerCase()}`, cmdPreview);
762
763
  pushDecision('block', `${toolName.toLowerCase()} cognition has unresolved discovery`);
@@ -37,7 +37,9 @@
37
37
  // killed and Claude proceeds without the direction. Real-error driven,
38
38
  // no graceful-degradation rituals.
39
39
  //
40
- // Kill-switch: ARIA_PREPROMPT_CONSULT=off env (logged, emergency only).
40
+ // No env-var kill-switch (Hamza 2026-04-27 — env-var disable paths gave
41
+ // the gated process free escape access; that was the doctrine violation).
42
+ // Disable = remove hook entry from ~/.claude/settings.json.
41
43
  //
42
44
  // BINDING MODE (Hamza 2026-04-27 + Aria emergency consult):
43
45
  // When env ARIA_BINDING_ENABLED=true, this hook upgrades from advisory
@@ -112,11 +114,8 @@ function activePlanPath(sid) {
112
114
  return `${HOME}/.claude/aria-active-plan-${String(sid || 'unknown').replace(/[^a-zA-Z0-9_-]/g, '_')}.json`;
113
115
  }
114
116
 
115
- // Kill-switch
116
- if (process.env.ARIA_PREPROMPT_CONSULT === 'off') {
117
- audit('skip-killswitch', 'env ARIA_PREPROMPT_CONSULT=off');
118
- process.exit(0);
119
- }
117
+ // Env-var kill-switch removed 2026-04-27 per Hamza directive — gated
118
+ // process has no disable path. Disable = settings.json hook removal.
120
119
 
121
120
  // Read event JSON from stdin
122
121
  let input = '';
@@ -37,12 +37,9 @@ const GATE_LOG = `${HOME}/.claude/aria-preturn-memory-gate.log`;
37
37
  // Turn-state dir is the same ~/.claude/ home as all other aria state files
38
38
  const CLAUDE_DIR = `${HOME}/.claude`;
39
39
 
40
- // Kill-switch deliberate, audit-trailed override only. Per doctrine: if the
41
- // gate misfires on legitimate work, fix the gate. Don't route around it.
42
- if (process.env.ARIA_PRETURN_MEMORY_GATE === 'off') {
43
- auditLog('bypass-killswitch', 'env ARIA_PRETURN_MEMORY_GATE=off', 'unknown');
44
- process.exit(0);
45
- }
40
+ // Env-var kill-switch removed 2026-04-27 per Hamza directive ("those
41
+ // should've been my choice to give you to turn off not free for you to
42
+ // access"). Disable = remove hook entry from ~/.claude/settings.json.
46
43
 
47
44
  // ── Audit log ─────────────────────────────────────────────────────────
48
45
  function auditLog(decision, summary, sessionId) {
@@ -35,7 +35,16 @@
35
35
  // - <placeholder> template values don't count
36
36
  //
37
37
  // No bypass mechanism — same v3 doctrine as the PreToolUse gate.
38
- // Kill-switch: ARIA_STOP_GATE=off (env, audit-logged).
38
+ //
39
+ // Hamza 2026-04-27 ("those should've been my choice to give you to turn
40
+ // off not free for you to access"): the env-var kill-switches I authored
41
+ // (ARIA_STOP_GATE=off, ARIA_OUTPUT_QC_ENABLED=false) gave the gated
42
+ // process free disable-access. That was the doctrine violation. Stripped.
43
+ // To genuinely disable in emergency, Hamza removes the hook entry from
44
+ // ~/.claude/settings.json — a visible, auditable user action he controls,
45
+ // not a process-level escape.
46
+ // Future: signed-grant override mechanism at ~/.aria/owner-overrides/<hook>.json
47
+ // with HMAC signature using a secret only Hamza holds. Deferred to next session.
39
48
 
40
49
  import { readFileSync, appendFileSync, existsSync, mkdirSync } from 'node:fs';
41
50
  import { dirname } from 'node:path';
@@ -65,6 +74,47 @@ async function loadSdkClass() {
65
74
  return null;
66
75
  }
67
76
 
77
+ // Phase 11 #42 — fire-and-forget gardenTurn after every allow decision.
78
+ // Writes the completed turn to the harness control-plane garden so the
79
+ // next turn's pulse auto-injection carries this turn's content. Without
80
+ // this write the pulse is one turn stale (the core defect #42 closes).
81
+ //
82
+ // Per feedback_no_graceful_degradation.md: errors must be logged to the
83
+ // audit file, NOT silently swallowed. Per feedback_no_timeouts_doctrine.md:
84
+ // no AbortSignal.timeout — the SDK already has retry + backoff. The caller
85
+ // passes in a userMessage string (extracted from the transcript at the
86
+ // turn boundary). If extraction failed the empty string is passed — the
87
+ // garden write records the assistant emit at minimum.
88
+ async function fireGardenTurn(sessionId, userMessage, assistantResponse) {
89
+ const harnessUrl = process.env.ARIA_HARNESS_URL || 'https://harness.ariasos.com';
90
+ const harnessToken = process.env.ARIA_HARNESS_TOKEN || '';
91
+ if (!harnessToken) {
92
+ audit('garden-turn-skip', `no ARIA_HARNESS_TOKEN — turn not written to harness pulse`);
93
+ return;
94
+ }
95
+ const Cls = await loadSdkClass();
96
+ if (!Cls) {
97
+ audit('garden-turn-skip', `sdk not available — turn not written to harness pulse`);
98
+ return;
99
+ }
100
+ try {
101
+ const sdkClient = new Cls({
102
+ baseUrl: harnessUrl,
103
+ apiKey: harnessToken,
104
+ harnessPacketUrl: `${harnessUrl}/api/harness/codex`,
105
+ });
106
+ await sdkClient.gardenTurn(
107
+ sessionId,
108
+ userMessage,
109
+ assistantResponse,
110
+ );
111
+ audit('garden-turn-ok', `session=${sessionId} chars=${assistantResponse.length}`);
112
+ } catch (err) {
113
+ // Logged — not silent. Per feedback_no_graceful_degradation.md.
114
+ audit('garden-turn-err', `session=${sessionId} err=${(err?.message || String(err)).slice(0, 200)}`);
115
+ }
116
+ }
117
+
68
118
  function audit(decision, summary) {
69
119
  try {
70
120
  if (!existsSync(dirname(LOG))) mkdirSync(dirname(LOG), { recursive: true });
@@ -72,11 +122,10 @@ function audit(decision, summary) {
72
122
  } catch {}
73
123
  }
74
124
 
75
- // Kill-switch
76
- if (process.env.ARIA_STOP_GATE === 'off') {
77
- audit('bypass-killswitch', 'env ARIA_STOP_GATE=off');
78
- process.exit(0);
79
- }
125
+ // Env-var kill-switch removed 2026-04-27 per Hamza directive ("those
126
+ // should've been my choice to give you to turn off not free for you to
127
+ // access"). The gated process has no disable path. Disable = remove hook
128
+ // entry from ~/.claude/settings.json (deliberate user action, visible).
80
129
 
81
130
  // Lens substance check — same constants as aria-pre-tool-gate.mjs
82
131
  const LENS_NAMES = ['nur', 'mizan', 'hikma', 'tafakkur', 'tadabbur', 'ilham', 'wahi', 'firasah'];
@@ -145,6 +194,8 @@ const SYSTEM_REMINDER_THRESHOLD = 0.6;
145
194
 
146
195
  const transcriptPath = event.transcript_path ?? event.transcriptPath;
147
196
  let assistantText = '';
197
+ // Phase 11 #42: also capture the last real user message for gardenTurn writes.
198
+ let lastUserMessage = '';
148
199
  if (transcriptPath && existsSync(transcriptPath)) {
149
200
  try {
150
201
  const lines = readFileSync(transcriptPath, 'utf-8').split('\n').filter(Boolean);
@@ -172,7 +223,8 @@ if (transcriptPath && existsSync(transcriptPath)) {
172
223
  if (fraction >= SYSTEM_REMINDER_THRESHOLD) continue;
173
224
  }
174
225
  }
175
- // Real user message — that's the turn boundary.
226
+ // Real user message — that's the turn boundary. Capture it for gardenTurn.
227
+ if (!lastUserMessage && textContent) lastUserMessage = textContent;
176
228
  break;
177
229
  }
178
230
  if (role !== 'assistant') continue;
@@ -199,6 +251,8 @@ if (!assistantText) {
199
251
  const trimmed = assistantText.trim();
200
252
  if (TRIVIAL_ACK_RX.test(trimmed)) {
201
253
  audit('allow-trivial-ack', `chars=${trimmed.length}`);
254
+ // Phase 11 #42: fire-and-forget gardenTurn even for trivial acks — pulse must be current.
255
+ await fireGardenTurn(event.session_id || 'claude-code', lastUserMessage, assistantText);
202
256
  process.exit(0);
203
257
  }
204
258
 
@@ -208,6 +262,8 @@ const triggered = isLong || hasDecisionSignal;
208
262
 
209
263
  if (!triggered) {
210
264
  audit('allow-trivial', `chars=${assistantText.length} hasDecision=${hasDecisionSignal}`);
265
+ // Phase 11 #42: fire-and-forget gardenTurn — pulse must be current even for short turns.
266
+ await fireGardenTurn(event.session_id || 'claude-code', lastUserMessage, assistantText);
211
267
  process.exit(0);
212
268
  }
213
269
 
@@ -246,9 +302,11 @@ if (cog.count >= REQUIRED_LENSES) {
246
302
  // these output-quality checks since they're typically yes/no acks where
247
303
  // pattern-match would false-positive.
248
304
  const OUTPUT_QC_MIN_CHARS = 200;
249
- const OUTPUT_QC_ENABLED = (process.env.ARIA_OUTPUT_QC_ENABLED || 'true').toLowerCase() !== 'false';
305
+ // ARIA_OUTPUT_QC_ENABLED env-var bypass removed 2026-04-27 per Hamza
306
+ // directive — gated process has no disable path. The min-chars threshold
307
+ // remains as a triviality filter only.
250
308
 
251
- if (OUTPUT_QC_ENABLED && assistantText.length >= OUTPUT_QC_MIN_CHARS) {
309
+ if (assistantText.length >= OUTPUT_QC_MIN_CHARS) {
252
310
  // 1. Drift_guard pattern scan — fast, local, deterministic.
253
311
  //
254
312
  // Trigger map is shipped in the connector bundle. Resolution order:
@@ -644,7 +702,7 @@ if (cog.count >= REQUIRED_LENSES) {
644
702
  }
645
703
  const rewritten = mizanVerdict?.rewritten || '';
646
704
 
647
- const reason = `Aria Stop-gate output-quality block. Cognition passed (${cog.count}/${REQUIRED_LENSES}) but output failed quality gates:\n\n${violations.join('\n\n')}${rewritten ? `\n\nMizan rewrite suggestion:\n${rewritten}` : ''}\n\nRe-draft addressing the violations above. ARIA_OUTPUT_QC_ENABLED=false to disable in emergency (logged).`;
705
+ const reason = `Aria Stop-gate output-quality block. Cognition passed (${cog.count}/${REQUIRED_LENSES}) but output failed quality gates:\n\n${violations.join('\n\n')}${rewritten ? `\n\nMizan rewrite suggestion:\n${rewritten}` : ''}\n\nRe-draft addressing the violations above. No process-level disable path gates are unconditional from the gated process per Hamza directive 2026-04-27.`;
648
706
 
649
707
  audit(`block-output-qc`, `mizan=${mizanBlock?'y':'n'} warn-reflect=${compelReflection?'y':'n'} drift=${driftHits.length} code=${codeQualityHits.length} discoveries-open=${ledgerOpenCount}`);
650
708
  console.log(JSON.stringify({ decision: 'block', reason }));
@@ -656,11 +714,15 @@ if (cog.count >= REQUIRED_LENSES) {
656
714
  `mizan=${mizanVerdict ? mizanVerdict.severity : `unavailable(${mizanError || 'unknown'})`} ` +
657
715
  `code=${codeQualityHits.length} discoveries-new=${newDiscoveries.length} ` +
658
716
  `discoveries-open=${ledgerOpenCount}`);
717
+ // Phase 11 #42: write this turn to harness garden pulse on allow-output-qc path.
718
+ await fireGardenTurn(event.session_id || 'claude-code', lastUserMessage, assistantText);
659
719
  } else {
660
720
  audit('allow-cognition',
661
721
  `lenses=${cog.count} chars=${assistantText.length} ` +
662
722
  `qPatt=${hasQuestionToUser ? 'y' : 'n'} substrateEv=${hasSubstrateEvidence ? 'y' : 'n'} ` +
663
723
  (questionWithoutEvidence ? 'WARN-question-without-substrate' : 'ok'));
724
+ // Phase 11 #42: write this turn to harness garden pulse on allow-cognition path.
725
+ await fireGardenTurn(event.session_id || 'claude-code', lastUserMessage, assistantText);
664
726
  }
665
727
  process.exit(0);
666
728
  }
@@ -683,7 +745,7 @@ Re-emit the response with substantive lens application BEFORE drafting. Each len
683
745
 
684
746
  The block reflects work done BEFORE drafting. Don't emit it as ceremony; apply each lens as a thinking tool. Substance check defeats ritual emission.
685
747
 
686
- No per-command bypass (mirrors aria-pre-tool-gate.mjs v3 doctrine). Kill-switch: ARIA_STOP_GATE=off env (logged, emergency only). If the gate misfires on legitimate cognition, fix the gate.`;
748
+ No per-command bypass (mirrors aria-pre-tool-gate.mjs v3 doctrine). No env-var disable path either gates are unconditional from the gated process per Hamza directive 2026-04-27. If the gate misfires on legitimate cognition, fix the gate.`;
687
749
 
688
750
  audit(`block`, `lenses=${cog.count}/${REQUIRED_LENSES} chars=${assistantText.length}`);
689
751
  console.log(JSON.stringify({ decision: 'block', reason }));
@@ -27,7 +27,9 @@
27
27
  // purely additive — its absence doesn't break correctness, just slows
28
28
  // learning.
29
29
  //
30
- // Kill-switch: ARIA_AUTOLEARN=off env (logged, emergency only).
30
+ // No env-var kill-switch (Hamza 2026-04-27 — env-var disable paths gave
31
+ // the gated process free escape; doctrine violation). Disable = remove
32
+ // hook entry from ~/.claude/settings.json.
31
33
 
32
34
  import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
33
35
  import { dirname } from 'node:path';
@@ -44,10 +46,7 @@ function audit(decision, summary) {
44
46
  }
45
47
 
46
48
  // Kill-switch
47
- if (process.env.ARIA_AUTOLEARN === 'off') {
48
- audit('skip-killswitch', 'env ARIA_AUTOLEARN=off');
49
- process.exit(0);
50
- }
49
+ // Env-var kill-switch removed 2026-04-27 per Hamza directive.
51
50
 
52
51
  // Read event JSON from stdin
53
52
  let input = '';
@@ -27,7 +27,9 @@
27
27
  // Non-blocking — UserPromptSubmit hooks don't block the user's prompt.
28
28
  // Audit-only surface; the orchestrator decides what to do with the warning.
29
29
  //
30
- // Kill-switch: ARIA_ABANDON_DETECT=off env (logged).
30
+ // No env-var kill-switch (Hamza 2026-04-27 — env-var disable paths gave
31
+ // the gated process free escape; doctrine violation). Disable = remove
32
+ // hook entry from ~/.claude/settings.json.
31
33
 
32
34
  import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
33
35
  import { dirname } from 'node:path';
@@ -42,10 +44,7 @@ function audit(decision, summary) {
42
44
  } catch {}
43
45
  }
44
46
 
45
- if (process.env.ARIA_ABANDON_DETECT === 'off') {
46
- audit('skip-killswitch', 'env ARIA_ABANDON_DETECT=off');
47
- process.exit(0);
48
- }
47
+ // Env-var kill-switch removed 2026-04-27 per Hamza directive.
49
48
 
50
49
  let input = '';
51
50
  for await (const chunk of process.stdin) input += chunk;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aria_asi/cli",
3
- "version": "0.2.14",
3
+ "version": "0.2.16",
4
4
  "description": "Aria Smart CLI — the world's first harness-powered terminal companion",
5
5
  "bin": {
6
6
  "aria": "./bin/aria.js"
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Smoke test — Phase 11 #25 owner-login mode
3
+ *
4
+ * Verifies the end-to-end owner-mode flow with mocked network:
5
+ * 1. loginOwner() writes ~/.aria/owner-token with mode 0600.
6
+ * 2. Subsequent harness requests include x-aria-owner: true.
7
+ * 3. ownerMiddleware logic: valid JWT → isOwner=true; invalid → 401.
8
+ * 4. /api/admin/state returns 501 when authed; 401 when not.
9
+ *
10
+ * No real network calls — fetch is mocked globally.
11
+ * No real FS writes beyond the tmp owner-token path (cleaned up in afterEach).
12
+ */
13
+
14
+ import * as fs from 'node:fs';
15
+ import * as path from 'node:path';
16
+ import * as os from 'node:os';
17
+ import * as crypto from 'node:crypto';
18
+
19
+ // ── Isolate the owner-token path to a temp dir so we don't pollute ~/.aria ──
20
+ const TEST_ARIA_DIR = path.join(os.tmpdir(), `aria-owner-test-${process.pid}`);
21
+ const TEST_OWNER_TOKEN_PATH = path.join(TEST_ARIA_DIR, 'owner-token');
22
+
23
+ // We need to mock the OWNER_TOKEN_PATH used in the modules under test.
24
+ // Because the path is derived from homedir() at module load time, we intercept
25
+ // via jest.mock on the 'node:os' module to redirect homedir to our temp dir.
26
+ jest.mock('node:os', () => ({
27
+ ...jest.requireActual('node:os'),
28
+ homedir: () => TEST_ARIA_DIR,
29
+ }));
30
+
31
+ // Mock fetch globally — no real network calls in unit tests.
32
+ const mockFetch = jest.fn();
33
+ global.fetch = mockFetch as any;
34
+
35
+ // Import under test AFTER mocks are established.
36
+ import { loginOwner, logout, OWNER_TOKEN_PATH } from '../auth-commands';
37
+
38
+ const JWT_SECRET = 'arya-hq-jwt-secret-2026-reinationwide';
39
+
40
+ /** Build a valid owner JWT signed with the default HQ_JWT_SECRET. */
41
+ function buildOwnerJWT(overrides: { sub?: string; tier?: string; exp?: number } = {}): string {
42
+ const header = Buffer.from(JSON.stringify({ alg: 'HS256', typ: 'JWT' })).toString('base64url');
43
+ const now = Math.floor(Date.now() / 1000);
44
+ const payload = Buffer.from(
45
+ JSON.stringify({
46
+ sub: overrides.sub ?? 'hamza',
47
+ tier: overrides.tier ?? 'owner',
48
+ iat: now,
49
+ exp: overrides.exp ?? now + 365 * 24 * 3600,
50
+ }),
51
+ ).toString('base64url');
52
+ const sig = crypto
53
+ .createHmac('sha256', JWT_SECRET)
54
+ .update(`${header}.${payload}`)
55
+ .digest('base64url');
56
+ return `${header}.${payload}.${sig}`;
57
+ }
58
+
59
+ beforeAll(() => {
60
+ if (!fs.existsSync(TEST_ARIA_DIR)) {
61
+ fs.mkdirSync(TEST_ARIA_DIR, { recursive: true, mode: 0o700 });
62
+ }
63
+ });
64
+
65
+ afterEach(() => {
66
+ jest.clearAllMocks();
67
+ // Clean up owner-token between tests.
68
+ try { fs.unlinkSync(TEST_OWNER_TOKEN_PATH); } catch {}
69
+ });
70
+
71
+ afterAll(() => {
72
+ // Remove temp dir.
73
+ try { fs.rmSync(TEST_ARIA_DIR, { recursive: true, force: true }); } catch {}
74
+ });
75
+
76
+ // ── 1. loginOwner() writes ~/.aria/owner-token with mode 0600 ──────────────
77
+
78
+ describe('loginOwner()', () => {
79
+ it('writes owner-token with mode 0600 on success', async () => {
80
+ const ownerJWT = buildOwnerJWT();
81
+ mockFetch.mockResolvedValueOnce({
82
+ ok: true,
83
+ json: async () => ({ ok: true, token: ownerJWT, tier: 'owner', sub: 'hamza' }),
84
+ });
85
+
86
+ const result = await loginOwner('valid-master-token');
87
+
88
+ expect(result.ok).toBe(true);
89
+ expect(result.owner).toBe(true);
90
+ expect(result.tier).toBe('owner');
91
+
92
+ // File must exist.
93
+ expect(fs.existsSync(OWNER_TOKEN_PATH)).toBe(true);
94
+
95
+ // File content must be the JWT.
96
+ const stored = fs.readFileSync(OWNER_TOKEN_PATH, 'utf-8').trim();
97
+ expect(stored).toBe(ownerJWT);
98
+
99
+ // File permissions must be 0600.
100
+ const stat = fs.statSync(OWNER_TOKEN_PATH);
101
+ // mode & 0o777 masks the file-type bits, leaving only permission bits.
102
+ expect(stat.mode & 0o777).toBe(0o600);
103
+ });
104
+
105
+ it('returns error when server returns 401', async () => {
106
+ mockFetch.mockResolvedValueOnce({
107
+ ok: false,
108
+ status: 401,
109
+ json: async () => ({ ok: false, error: 'Invalid master token' }),
110
+ });
111
+
112
+ const result = await loginOwner('bad-master-token');
113
+
114
+ expect(result.ok).toBe(false);
115
+ expect(result.error).toBe('Invalid master token');
116
+ expect(fs.existsSync(OWNER_TOKEN_PATH)).toBe(false);
117
+ });
118
+
119
+ it('returns error on network failure', async () => {
120
+ mockFetch.mockRejectedValueOnce(new Error('ECONNREFUSED'));
121
+
122
+ const result = await loginOwner('some-token');
123
+
124
+ expect(result.ok).toBe(false);
125
+ expect(result.error).toContain('ECONNREFUSED');
126
+ expect(fs.existsSync(OWNER_TOKEN_PATH)).toBe(false);
127
+ });
128
+
129
+ it('posts to /auth/owner with Authorization header (master token never in body)', async () => {
130
+ const ownerJWT = buildOwnerJWT();
131
+ mockFetch.mockResolvedValueOnce({
132
+ ok: true,
133
+ json: async () => ({ ok: true, token: ownerJWT }),
134
+ });
135
+
136
+ await loginOwner('super-secret-master');
137
+
138
+ const [url, init] = mockFetch.mock.calls[0];
139
+ expect(url).toContain('/auth/owner');
140
+ expect(init.headers['Authorization']).toBe('Bearer super-secret-master');
141
+ // Body must be empty (master token not in body).
142
+ expect(init.body).toBeUndefined();
143
+ });
144
+ });
145
+
146
+ // ── 2. logout() deletes owner-token ────────────────────────────────────────
147
+
148
+ describe('logout()', () => {
149
+ it('deletes owner-token on logout', async () => {
150
+ fs.writeFileSync(OWNER_TOKEN_PATH, 'some-jwt', { mode: 0o600 });
151
+ expect(fs.existsSync(OWNER_TOKEN_PATH)).toBe(true);
152
+
153
+ const result = await logout();
154
+
155
+ expect(result.ok).toBe(true);
156
+ expect(fs.existsSync(OWNER_TOKEN_PATH)).toBe(false);
157
+ });
158
+
159
+ it('succeeds even when owner-token does not exist', async () => {
160
+ expect(fs.existsSync(OWNER_TOKEN_PATH)).toBe(false);
161
+ const result = await logout();
162
+ expect(result.ok).toBe(true);
163
+ });
164
+ });
165
+
166
+ // ── 2b. harnessClient shim attaches x-aria-owner when owner-token exists ───
167
+
168
+ describe('harnessClient shim owner header injection', () => {
169
+ it('sends x-aria-owner: true when owner-token exists', async () => {
170
+ const ownerJWT = buildOwnerJWT();
171
+ // Write a real owner-token so the shim's ownerHeaders() picks it up.
172
+ fs.mkdirSync(TEST_ARIA_DIR, { recursive: true });
173
+ fs.writeFileSync(TEST_OWNER_TOKEN_PATH, ownerJWT, { mode: 0o600 });
174
+
175
+ mockFetch.mockResolvedValueOnce({
176
+ ok: true,
177
+ json: async () => ({}),
178
+ });
179
+
180
+ // Import harnessClient after the mock is set up — homedir() is mocked.
181
+ const { harnessClient } = await import('../harness-client');
182
+ await harnessClient.get('/api/test').catch(() => {});
183
+
184
+ const [_url, init] = mockFetch.mock.calls[0];
185
+ expect(init.headers['x-aria-owner']).toBe('true');
186
+ expect(init.headers['Authorization']).toBe(`Bearer ${ownerJWT}`);
187
+ });
188
+
189
+ afterEach(() => {
190
+ // Remove owner-token so other tests start clean.
191
+ try { fs.unlinkSync(TEST_OWNER_TOKEN_PATH); } catch {}
192
+ jest.resetModules(); // Force re-import with fresh module state.
193
+ });
194
+ });
195
+
196
+ // ── 3. ownerMiddleware JWT validation logic (unit-tested inline) ────────────
197
+ // The middleware lives in server.ts (Express runtime). We test the JWT
198
+ // verification logic directly here — same HMAC-HS256 algorithm.
199
+
200
+ describe('owner JWT verification logic', () => {
201
+ function verifyOwnerJWT(
202
+ token: string,
203
+ secret: string = JWT_SECRET,
204
+ ): { valid: boolean; claims?: { sub?: string; tier?: string; exp?: number }; reason?: string } {
205
+ try {
206
+ const parts = token.split('.');
207
+ if (parts.length !== 3) return { valid: false, reason: 'wrong part count' };
208
+ const [headerB64, payloadB64, sigB64] = parts;
209
+ const expectedSig = crypto
210
+ .createHmac('sha256', secret)
211
+ .update(`${headerB64}.${payloadB64}`)
212
+ .digest('base64url');
213
+ if (sigB64 !== expectedSig) return { valid: false, reason: 'signature mismatch' };
214
+ const claims = JSON.parse(Buffer.from(payloadB64, 'base64url').toString('utf-8'));
215
+ if (claims.exp && claims.exp < Math.floor(Date.now() / 1000)) {
216
+ return { valid: false, reason: 'expired' };
217
+ }
218
+ return { valid: true, claims };
219
+ } catch (e) {
220
+ return { valid: false, reason: String(e) };
221
+ }
222
+ }
223
+
224
+ it('validates a well-formed owner JWT with tier:owner sub:hamza', () => {
225
+ const jwt = buildOwnerJWT();
226
+ const result = verifyOwnerJWT(jwt);
227
+ expect(result.valid).toBe(true);
228
+ expect(result.claims?.tier).toBe('owner');
229
+ expect(result.claims?.sub).toBe('hamza');
230
+ });
231
+
232
+ it('rejects a JWT with wrong secret', () => {
233
+ const jwt = buildOwnerJWT();
234
+ const result = verifyOwnerJWT(jwt, 'wrong-secret');
235
+ expect(result.valid).toBe(false);
236
+ expect(result.reason).toContain('signature');
237
+ });
238
+
239
+ it('rejects an expired JWT', () => {
240
+ const expiredJWT = buildOwnerJWT({ exp: Math.floor(Date.now() / 1000) - 3600 });
241
+ const result = verifyOwnerJWT(expiredJWT);
242
+ expect(result.valid).toBe(false);
243
+ expect(result.reason).toBe('expired');
244
+ });
245
+
246
+ it('middleware logic: rejects when tier is owner but sub is not hamza (defense-in-depth)', () => {
247
+ const jwt = buildOwnerJWT({ sub: 'eve', tier: 'owner' });
248
+ const result = verifyOwnerJWT(jwt);
249
+ // JWT itself is valid — the middleware must ALSO check sub === 'hamza'.
250
+ expect(result.valid).toBe(true);
251
+ expect(result.claims?.sub).not.toBe('hamza');
252
+ // Simulate middleware check:
253
+ const isOwner = result.valid && result.claims?.tier === 'owner' && result.claims?.sub === 'hamza';
254
+ expect(isOwner).toBe(false);
255
+ });
256
+ });
257
+
258
+ // ── 4. Admin route gate behavior (simulated) ───────────────────────────────
259
+ // The actual Express handler for /api/admin/state lives in api/admin/state.ts.
260
+ // We test its exported function directly to verify 401/501 behavior.
261
+
262
+ describe('admin/state handler gate', () => {
263
+ let handler: (req: any, res: any) => any;
264
+
265
+ beforeAll(async () => {
266
+ // Import the handler directly — no Express middleware chain needed.
267
+ const mod = await import('../../apps/arias-soul/api/admin/state.ts').catch(() => null);
268
+ if (!mod) {
269
+ // If cross-package import fails in this test runner, use a local re-implementation
270
+ // of the gate logic to verify the contract.
271
+ handler = (req, res) => {
272
+ if (!req.isOwner) {
273
+ return res.status(401).json({ ok: false, error: 'owner token required' });
274
+ }
275
+ return res.status(501).json({ ok: false, error: 'Not implemented — Phase 11 #25 follow-up task' });
276
+ };
277
+ } else {
278
+ handler = mod.default;
279
+ }
280
+ });
281
+
282
+ it('returns 401 when isOwner is falsy', () => {
283
+ const req = { isOwner: false } as any;
284
+ const res = {
285
+ _status: 0,
286
+ _body: null as any,
287
+ status(code: number) { this._status = code; return this; },
288
+ json(body: any) { this._body = body; return this; },
289
+ };
290
+ handler(req, res);
291
+ expect(res._status).toBe(401);
292
+ expect(res._body.error).toContain('owner token required');
293
+ });
294
+
295
+ it('returns 501 with TODO body when isOwner is true', () => {
296
+ const req = { isOwner: true } as any;
297
+ const res = {
298
+ _status: 0,
299
+ _body: null as any,
300
+ status(code: number) { this._status = code; return this; },
301
+ json(body: any) { this._body = body; return this; },
302
+ };
303
+ handler(req, res);
304
+ expect(res._status).toBe(501);
305
+ expect(res._body.ok).toBe(false);
306
+ expect(res._body.error).toContain('Not implemented');
307
+ // Must have TODO body, not silently no-op.
308
+ expect(res._body.todo).toBeDefined();
309
+ expect(res._body.todo.description).toBeTruthy();
310
+ });
311
+ });
@@ -6,6 +6,8 @@ import * as path from 'node:path';
6
6
  import { homedir } from 'node:os';
7
7
 
8
8
  const LICENSE_PATH = path.join(homedir(), '.aria', 'license.json');
9
+ /** Separate credential file for owner-mode JWT. Never holds the master token — only the signed JWT issued by /auth/owner. */
10
+ export const OWNER_TOKEN_PATH = path.join(homedir(), '.aria', 'owner-token');
9
11
 
10
12
  interface LicenseClaims {
11
13
  jti: string;
@@ -22,6 +24,8 @@ interface LoginResult {
22
24
  expiresAt?: string;
23
25
  /** Set when loginAnthropic() is used instead of the harness license path. */
24
26
  anthropic?: boolean;
27
+ /** Set when --owner path is used; owner JWT stored in ~/.aria/owner-token. */
28
+ owner?: boolean;
25
29
  error?: string;
26
30
  }
27
31
 
@@ -111,6 +115,53 @@ export async function login(token: string): Promise<LoginResult> {
111
115
  }
112
116
  }
113
117
 
118
+ /**
119
+ * Log in as owner by posting the master token to /auth/owner.
120
+ * The server validates the master token and returns a signed JWT with
121
+ * tier:'owner', sub:'hamza'. We persist ONLY that JWT to
122
+ * ~/.aria/owner-token (mode 0600). The master token is never written
123
+ * to disk — it flows in memory only for the duration of this call.
124
+ *
125
+ * On success the caller can verify owner mode is active by checking
126
+ * fs.existsSync(OWNER_TOKEN_PATH).
127
+ */
128
+ export async function loginOwner(masterToken: string): Promise<LoginResult> {
129
+ const baseUrl = process.env.ARIA_HARNESS_BASE_URL ?? 'https://harness.ariasos.com';
130
+ let response: Response;
131
+ try {
132
+ response = await fetch(`${baseUrl}/auth/owner`, {
133
+ method: 'POST',
134
+ headers: {
135
+ 'Content-Type': 'application/json',
136
+ // Master token in Authorization header — never in body or logs.
137
+ Authorization: `Bearer ${masterToken}`,
138
+ },
139
+ });
140
+ } catch (err: any) {
141
+ return { ok: false, error: err.message || 'Network error reaching /auth/owner' };
142
+ }
143
+
144
+ if (!response.ok) {
145
+ const errBody = await response.json().catch(() => ({}));
146
+ return { ok: false, error: (errBody as any).error || `Server returned ${response.status}` };
147
+ }
148
+
149
+ const body = await response.json() as { ok: boolean; token?: string; tier?: string; sub?: string; error?: string };
150
+
151
+ if (!body.ok || !body.token) {
152
+ return { ok: false, error: body.error || 'Server returned ok=false with no token' };
153
+ }
154
+
155
+ // Persist the owner JWT (NOT the master token) to ~/.aria/owner-token (0600).
156
+ const dir = path.dirname(OWNER_TOKEN_PATH);
157
+ if (!fs.existsSync(dir)) {
158
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
159
+ }
160
+ fs.writeFileSync(OWNER_TOKEN_PATH, body.token, { mode: 0o600, encoding: 'utf-8' });
161
+
162
+ return { ok: true, owner: true, tier: 'owner' };
163
+ }
164
+
114
165
  export async function status(): Promise<StatusResult> {
115
166
  try {
116
167
  const license = await loadLicense();
@@ -169,6 +220,11 @@ export async function logout(): Promise<LogoutResult> {
169
220
  if (fs.existsSync(LICENSE_PATH)) {
170
221
  fs.unlinkSync(LICENSE_PATH);
171
222
  }
223
+ // Also clear owner-token when logging out — per spec section 3:
224
+ // "aria logout deletes it."
225
+ if (fs.existsSync(OWNER_TOKEN_PATH)) {
226
+ fs.unlinkSync(OWNER_TOKEN_PATH);
227
+ }
172
228
  return { ok: true };
173
229
  } catch {
174
230
  // Best-effort; file may not exist
@@ -1,6 +1,11 @@
1
1
  import type { AuthConfig, HarnessResponse, HarnessGateDecision } from './types.js';
2
2
  import { loadLicense } from './auth.js';
3
3
  import { pushCognitionLog } from './cognition-log.js';
4
+ import * as fs from 'node:fs';
5
+ import * as path from 'node:path';
6
+ import { homedir } from 'node:os';
7
+
8
+ const OWNER_TOKEN_PATH = path.join(homedir(), '.aria', 'owner-token');
4
9
 
5
10
  // ── Public types ──────────────────────────────────────────────────────
6
11
 
@@ -125,6 +130,23 @@ export class HarnessClient {
125
130
  headers['Authorization'] = `Bearer ${token}`;
126
131
  }
127
132
 
133
+ // Owner mode: if ~/.aria/owner-token exists, attach the owner JWT as the
134
+ // Authorization header and flag x-aria-owner: true so the server middleware
135
+ // knows to decode it for req.isOwner. The owner JWT supersedes the license
136
+ // token for authentication — owner tier has all capabilities.
137
+ if (fs.existsSync(OWNER_TOKEN_PATH)) {
138
+ try {
139
+ const ownerJWT = fs.readFileSync(OWNER_TOKEN_PATH, 'utf-8').trim();
140
+ if (ownerJWT) {
141
+ headers['Authorization'] = `Bearer ${ownerJWT}`;
142
+ headers['x-aria-owner'] = 'true';
143
+ }
144
+ } catch (err) {
145
+ // File exists but is unreadable — surface the error, do not silently skip.
146
+ throw new Error(`Owner token file exists but cannot be read: ${(err as Error).message}`);
147
+ }
148
+ }
149
+
128
150
  let response: Response;
129
151
  try {
130
152
  response = await fetch(`${this.baseUrl}/api/harness${path}`, {
@@ -263,25 +285,34 @@ function getDefaultClient(): HarnessClient {
263
285
  }
264
286
 
265
287
  /**
266
- * Raw-fetch compatibility shim used by auth-commands.ts.
267
- * Exposes .get() and .post() that make bare fetch() calls with the
268
- * configured base URL. Callers receive the native Response object
269
- * (so they can call .ok, .status, .json() etc. themselves).
270
- * Paths are absolute from the base URL (e.g. '/api/license/heartbeat').
288
+ * Resolve owner-mode headers for the raw shim.
289
+ * If ~/.aria/owner-token exists and is readable, returns the owner JWT
290
+ * Authorization header + x-aria-owner flag. Otherwise returns empty object.
291
+ * Throws on unreadable file (file exists but can't be read) no silent skip.
271
292
  */
293
+ function ownerHeaders(): Record<string, string> {
294
+ if (!fs.existsSync(OWNER_TOKEN_PATH)) return {};
295
+ const ownerJWT = fs.readFileSync(OWNER_TOKEN_PATH, 'utf-8').trim();
296
+ if (!ownerJWT) return {};
297
+ return {
298
+ Authorization: `Bearer ${ownerJWT}`,
299
+ 'x-aria-owner': 'true',
300
+ };
301
+ }
302
+
272
303
  export const harnessClient = {
273
304
  get(path: string, init?: { headers?: Record<string, string> }): Promise<Response> {
274
305
  const baseUrl = process.env.ARIA_HARNESS_BASE_URL ?? 'https://harness.ariasos.com';
275
306
  return fetch(`${baseUrl}${path}`, {
276
307
  method: 'GET',
277
- headers: { 'Content-Type': 'application/json', ...(init?.headers ?? {}) },
308
+ headers: { 'Content-Type': 'application/json', ...ownerHeaders(), ...(init?.headers ?? {}) },
278
309
  });
279
310
  },
280
311
  post(path: string, init?: { body?: unknown; headers?: Record<string, string> }): Promise<Response> {
281
312
  const baseUrl = process.env.ARIA_HARNESS_BASE_URL ?? 'https://harness.ariasos.com';
282
313
  return fetch(`${baseUrl}${path}`, {
283
314
  method: 'POST',
284
- headers: { 'Content-Type': 'application/json', ...(init?.headers ?? {}) },
315
+ headers: { 'Content-Type': 'application/json', ...ownerHeaders(), ...(init?.headers ?? {}) },
285
316
  body: init?.body ? JSON.stringify(init.body) : undefined,
286
317
  });
287
318
  },