@aria_asi/cli 0.2.25 → 0.2.29

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.
Files changed (249) hide show
  1. package/CLIENT-ONBOARDING.md +282 -0
  2. package/bin/aria.js +1140 -14
  3. package/dist/aria-connector/src/auth-commands.d.ts +1 -0
  4. package/dist/aria-connector/src/auth-commands.d.ts.map +1 -1
  5. package/dist/aria-connector/src/auth-commands.js +89 -41
  6. package/dist/aria-connector/src/auth-commands.js.map +1 -1
  7. package/dist/aria-connector/src/chat.d.ts +3 -0
  8. package/dist/aria-connector/src/chat.d.ts.map +1 -1
  9. package/dist/aria-connector/src/chat.js +146 -8
  10. package/dist/aria-connector/src/chat.js.map +1 -1
  11. package/dist/aria-connector/src/codebase-scanner.d.ts +2 -2
  12. package/dist/aria-connector/src/codebase-scanner.d.ts.map +1 -1
  13. package/dist/aria-connector/src/codebase-scanner.js +1 -1
  14. package/dist/aria-connector/src/codebase-scanner.js.map +1 -1
  15. package/dist/aria-connector/src/config.d.ts +12 -0
  16. package/dist/aria-connector/src/config.d.ts.map +1 -1
  17. package/dist/aria-connector/src/config.js +2 -0
  18. package/dist/aria-connector/src/config.js.map +1 -1
  19. package/dist/aria-connector/src/connectors/claude-code.d.ts.map +1 -1
  20. package/dist/aria-connector/src/connectors/claude-code.js +111 -21
  21. package/dist/aria-connector/src/connectors/claude-code.js.map +1 -1
  22. package/dist/aria-connector/src/connectors/codebase-awareness.d.ts +37 -0
  23. package/dist/aria-connector/src/connectors/codebase-awareness.d.ts.map +1 -0
  24. package/dist/aria-connector/src/connectors/codebase-awareness.js +335 -0
  25. package/dist/aria-connector/src/connectors/codebase-awareness.js.map +1 -0
  26. package/dist/aria-connector/src/connectors/codex.d.ts +3 -0
  27. package/dist/aria-connector/src/connectors/codex.d.ts.map +1 -0
  28. package/dist/aria-connector/src/connectors/codex.js +248 -0
  29. package/dist/aria-connector/src/connectors/codex.js.map +1 -0
  30. package/dist/aria-connector/src/connectors/cognitive-skills.d.ts +2 -0
  31. package/dist/aria-connector/src/connectors/cognitive-skills.d.ts.map +1 -0
  32. package/dist/aria-connector/src/connectors/cognitive-skills.js +47 -0
  33. package/dist/aria-connector/src/connectors/cognitive-skills.js.map +1 -0
  34. package/dist/aria-connector/src/connectors/opencode.d.ts.map +1 -1
  35. package/dist/aria-connector/src/connectors/opencode.js +90 -4
  36. package/dist/aria-connector/src/connectors/opencode.js.map +1 -1
  37. package/dist/aria-connector/src/connectors/repo-git-hooks.d.ts +3 -0
  38. package/dist/aria-connector/src/connectors/repo-git-hooks.d.ts.map +1 -0
  39. package/dist/aria-connector/src/connectors/repo-git-hooks.js +87 -0
  40. package/dist/aria-connector/src/connectors/repo-git-hooks.js.map +1 -0
  41. package/dist/aria-connector/src/connectors/repo-guard.d.ts +19 -0
  42. package/dist/aria-connector/src/connectors/repo-guard.d.ts.map +1 -0
  43. package/dist/aria-connector/src/connectors/repo-guard.js +509 -0
  44. package/dist/aria-connector/src/connectors/repo-guard.js.map +1 -0
  45. package/dist/aria-connector/src/connectors/runtime.d.ts +2 -0
  46. package/dist/aria-connector/src/connectors/runtime.d.ts.map +1 -0
  47. package/dist/aria-connector/src/connectors/runtime.js +330 -0
  48. package/dist/aria-connector/src/connectors/runtime.js.map +1 -0
  49. package/dist/aria-connector/src/connectors/shell.d.ts.map +1 -1
  50. package/dist/aria-connector/src/connectors/shell.js +78 -13
  51. package/dist/aria-connector/src/connectors/shell.js.map +1 -1
  52. package/dist/aria-connector/src/connectors/syncd.d.ts +27 -0
  53. package/dist/aria-connector/src/connectors/syncd.d.ts.map +1 -0
  54. package/dist/aria-connector/src/connectors/syncd.js +405 -0
  55. package/dist/aria-connector/src/connectors/syncd.js.map +1 -0
  56. package/dist/aria-connector/src/decisions.d.ts +207 -0
  57. package/dist/aria-connector/src/decisions.d.ts.map +1 -0
  58. package/dist/aria-connector/src/decisions.js +291 -0
  59. package/dist/aria-connector/src/decisions.js.map +1 -0
  60. package/dist/aria-connector/src/garden-control-plane.d.ts.map +1 -1
  61. package/dist/aria-connector/src/garden-control-plane.js +74 -17
  62. package/dist/aria-connector/src/garden-control-plane.js.map +1 -1
  63. package/dist/aria-connector/src/github-connect.d.ts +18 -0
  64. package/dist/aria-connector/src/github-connect.d.ts.map +1 -0
  65. package/dist/aria-connector/src/github-connect.js +117 -0
  66. package/dist/aria-connector/src/github-connect.js.map +1 -0
  67. package/dist/aria-connector/src/harness-client.d.ts +15 -0
  68. package/dist/aria-connector/src/harness-client.d.ts.map +1 -1
  69. package/dist/aria-connector/src/harness-client.js +106 -3
  70. package/dist/aria-connector/src/harness-client.js.map +1 -1
  71. package/dist/aria-connector/src/hive-client.d.ts +30 -0
  72. package/dist/aria-connector/src/hive-client.d.ts.map +1 -1
  73. package/dist/aria-connector/src/hive-client.js +124 -5
  74. package/dist/aria-connector/src/hive-client.js.map +1 -1
  75. package/dist/aria-connector/src/index.d.ts +13 -2
  76. package/dist/aria-connector/src/index.d.ts.map +1 -1
  77. package/dist/aria-connector/src/index.js +10 -1
  78. package/dist/aria-connector/src/index.js.map +1 -1
  79. package/dist/aria-connector/src/lib/aristotle-noor-wire.d.ts +102 -0
  80. package/dist/aria-connector/src/lib/aristotle-noor-wire.d.ts.map +1 -0
  81. package/dist/aria-connector/src/lib/aristotle-noor-wire.js +231 -0
  82. package/dist/aria-connector/src/lib/aristotle-noor-wire.js.map +1 -0
  83. package/dist/aria-connector/src/providers/types.d.ts +5 -0
  84. package/dist/aria-connector/src/providers/types.d.ts.map +1 -1
  85. package/dist/aria-connector/src/runtime-proof.d.ts +45 -0
  86. package/dist/aria-connector/src/runtime-proof.d.ts.map +1 -0
  87. package/dist/aria-connector/src/runtime-proof.js +340 -0
  88. package/dist/aria-connector/src/runtime-proof.js.map +1 -0
  89. package/dist/aria-connector/src/setup-wizard.d.ts.map +1 -1
  90. package/dist/aria-connector/src/setup-wizard.js +34 -2
  91. package/dist/aria-connector/src/setup-wizard.js.map +1 -1
  92. package/dist/assets/hooks/aria-agent-handoff.mjs +224 -0
  93. package/dist/assets/hooks/aria-agent-ledger-merge.mjs +164 -0
  94. package/dist/assets/hooks/aria-architect-fallback.mjs +267 -0
  95. package/dist/assets/hooks/aria-cognition-substrate-binding.mjs +676 -0
  96. package/dist/assets/hooks/aria-discovery-record.mjs +101 -0
  97. package/dist/assets/hooks/aria-harness-via-sdk.mjs +412 -0
  98. package/dist/assets/hooks/aria-import-resolution-gate.mjs +330 -0
  99. package/dist/assets/hooks/aria-outcome-record.mjs +84 -0
  100. package/dist/assets/hooks/aria-pre-emit-dryrun.mjs +294 -0
  101. package/dist/assets/hooks/aria-pre-text-gate.mjs +112 -0
  102. package/dist/assets/hooks/aria-pre-tool-gate.mjs +2133 -0
  103. package/dist/assets/hooks/aria-preprompt-consult.mjs +438 -0
  104. package/dist/assets/hooks/aria-preturn-memory-gate.mjs +570 -0
  105. package/dist/assets/hooks/aria-repo-doctrine-gate.mjs +397 -0
  106. package/dist/assets/hooks/aria-stop-gate.mjs +1551 -0
  107. package/dist/assets/hooks/aria-trigger-autolearn.mjs +229 -0
  108. package/dist/assets/hooks/aria-userprompt-abandon-detect.mjs +192 -0
  109. package/dist/assets/hooks/doctrine_trigger_map.json +479 -0
  110. package/dist/assets/hooks/lib/canonical-lenses.mjs +64 -0
  111. package/dist/assets/hooks/lib/gate-audit.mjs +43 -0
  112. package/dist/assets/hooks/test-aria-preturn-memory-gate.mjs +245 -0
  113. package/dist/assets/hooks/test-tier-lens-labeling.mjs +399 -0
  114. package/dist/assets/opencode-plugins/harness-context/index.js +60 -0
  115. package/dist/assets/opencode-plugins/harness-context/inject-context.mjs +179 -0
  116. package/dist/assets/opencode-plugins/harness-context/package.json +9 -0
  117. package/dist/assets/opencode-plugins/harness-gate/index.js +248 -0
  118. package/dist/assets/opencode-plugins/harness-outcome/index.js +129 -0
  119. package/dist/assets/opencode-plugins/harness-role/index.js +77 -0
  120. package/dist/assets/opencode-plugins/harness-role/package.json +9 -0
  121. package/dist/assets/opencode-plugins/harness-stop/index.js +241 -0
  122. package/dist/runtime/discipline/CLAUDE.md +339 -0
  123. package/dist/runtime/discipline/skills/aria-cognition/aria-essence/SKILL.md +63 -0
  124. package/dist/runtime/discipline/skills/aria-cognition/aria-essence/references/domain-matrix.md +80 -0
  125. package/dist/runtime/discipline/skills/aria-cognition/aria-essence/references/evolution-loop.md +30 -0
  126. package/dist/runtime/discipline/skills/aria-cognition/aria-essence/references/readable-cognition.md +27 -0
  127. package/dist/runtime/discipline/skills/aria-cognition/aria-forge-guardrails/SKILL.md +35 -0
  128. package/dist/runtime/discipline/skills/aria-cognition/aria-forge-guardrails/references/checklist.md +31 -0
  129. package/dist/runtime/discipline/skills/aria-cognition/aria-repo-doctrine/SKILL.md +39 -0
  130. package/dist/runtime/discipline/skills/aria-cognition/forge-quality-rules/SKILL.md +43 -0
  131. package/dist/runtime/discipline/skills/aria-cognition/ghazali-8lens/SKILL.md +38 -0
  132. package/dist/runtime/discipline/skills/aria-cognition/istiqra-induction/SKILL.md +26 -0
  133. package/dist/runtime/discipline/skills/aria-cognition/ladunni-22/SKILL.md +35 -0
  134. package/dist/runtime/discipline/skills/aria-cognition/mizan/SKILL.md +72 -0
  135. package/dist/runtime/discipline/skills/aria-cognition/nadia/SKILL.md +38 -0
  136. package/dist/runtime/discipline/skills/aria-cognition/nadia-psi/SKILL.md +38 -0
  137. package/dist/runtime/discipline/skills/aria-cognition/predictor/SKILL.md +25 -0
  138. package/dist/runtime/discipline/skills/aria-cognition/qiyas-analogy/SKILL.md +26 -0
  139. package/dist/runtime/discipline/skills/aria-cognition/soul-domains/SKILL.md +25 -0
  140. package/dist/runtime/discipline/skills/aria-harness/aria-aristotle-intra-phase/SKILL.md +81 -0
  141. package/dist/runtime/discipline/skills/aria-harness/aria-aristotle-post-phase/SKILL.md +98 -0
  142. package/dist/runtime/discipline/skills/aria-harness/aria-aristotle-pre-phase/SKILL.md +99 -0
  143. package/dist/runtime/discipline/skills/aria-harness/aria-harness-deploy/SKILL.md +127 -0
  144. package/dist/runtime/discipline/skills/aria-harness/aria-harness-no-stripping/SKILL.md +117 -0
  145. package/dist/runtime/discipline/skills/aria-harness/aria-harness-onboarding/SKILL.md +112 -0
  146. package/dist/runtime/discipline/skills/aria-harness/aria-harness-output-discipline/SKILL.md +102 -0
  147. package/dist/runtime/discipline/skills/aria-harness/aria-harness-substrate-binding/SKILL.md +121 -0
  148. package/dist/runtime/doctor.mjs +23 -0
  149. package/dist/runtime/local-phase.mjs +632 -0
  150. package/dist/runtime/manifest.json +15 -0
  151. package/dist/runtime/mizan-scheduler.mjs +331 -0
  152. package/dist/runtime/package.json +6 -0
  153. package/dist/runtime/provider-proxy.mjs +594 -0
  154. package/dist/runtime/sdk/BUNDLED.json +5 -0
  155. package/dist/runtime/sdk/index.d.ts +477 -0
  156. package/dist/runtime/sdk/index.js +1469 -0
  157. package/dist/runtime/sdk/index.js.map +1 -0
  158. package/dist/runtime/sdk/package.json +8 -0
  159. package/dist/runtime/sdk/runWithCognition.d.ts +77 -0
  160. package/dist/runtime/sdk/runWithCognition.js +157 -0
  161. package/dist/runtime/sdk/runWithCognition.js.map +1 -0
  162. package/dist/runtime/service.mjs +2708 -0
  163. package/dist/runtime/vendor/aria-gate-runtime/index.d.ts +53 -0
  164. package/dist/runtime/vendor/aria-gate-runtime/index.d.ts.map +1 -0
  165. package/dist/runtime/vendor/aria-gate-runtime/index.js +277 -0
  166. package/dist/runtime/vendor/aria-gate-runtime/index.js.map +1 -0
  167. package/dist/runtime/vendor/aria-gate-runtime/package.json +6 -0
  168. package/dist/sdk/BUNDLED.json +2 -2
  169. package/dist/sdk/index.d.ts +317 -0
  170. package/dist/sdk/index.js +827 -85
  171. package/dist/sdk/index.js.map +1 -1
  172. package/dist/sdk/runWithCognition.d.ts +77 -0
  173. package/dist/sdk/runWithCognition.js +157 -0
  174. package/dist/sdk/runWithCognition.js.map +1 -0
  175. package/hooks/aria-agent-handoff.mjs +11 -1
  176. package/hooks/aria-architect-fallback.mjs +267 -0
  177. package/hooks/aria-cognition-substrate-binding.mjs +676 -0
  178. package/hooks/aria-discovery-record.mjs +101 -0
  179. package/hooks/aria-harness-via-sdk.mjs +34 -21
  180. package/hooks/aria-import-resolution-gate.mjs +330 -0
  181. package/hooks/aria-outcome-record.mjs +84 -0
  182. package/hooks/aria-pre-emit-dryrun.mjs +294 -0
  183. package/hooks/aria-pre-tool-gate.mjs +985 -40
  184. package/hooks/aria-preprompt-consult.mjs +113 -13
  185. package/hooks/aria-preturn-memory-gate.mjs +298 -6
  186. package/hooks/aria-repo-doctrine-gate.mjs +397 -0
  187. package/hooks/aria-stop-gate.mjs +840 -75
  188. package/hooks/aria-userprompt-abandon-detect.mjs +5 -1
  189. package/hooks/doctrine_trigger_map.json +209 -15
  190. package/hooks/lib/canonical-lenses.mjs +64 -0
  191. package/hooks/lib/gate-audit.mjs +43 -0
  192. package/opencode-plugins/harness-context/index.js +1 -1
  193. package/opencode-plugins/harness-context/inject-context.mjs +82 -23
  194. package/opencode-plugins/harness-gate/index.js +248 -0
  195. package/opencode-plugins/harness-outcome/index.js +129 -0
  196. package/opencode-plugins/harness-stop/index.js +241 -0
  197. package/package.json +8 -2
  198. package/runtime-src/doctor.mjs +23 -0
  199. package/runtime-src/local-phase.mjs +632 -0
  200. package/runtime-src/mizan-scheduler.mjs +331 -0
  201. package/runtime-src/provider-proxy.mjs +594 -0
  202. package/runtime-src/service.mjs +2708 -0
  203. package/scripts/bundle-sdk.mjs +317 -0
  204. package/scripts/install-client.sh +176 -0
  205. package/scripts/publish-all.sh +344 -0
  206. package/scripts/publish-docker.sh +27 -0
  207. package/scripts/validate-hook-contracts.mjs +54 -0
  208. package/scripts/validate-skill-prompts.mjs +95 -0
  209. package/skills/aria-cognition/aria-essence/SKILL.md +63 -0
  210. package/skills/aria-cognition/aria-essence/references/domain-matrix.md +80 -0
  211. package/skills/aria-cognition/aria-essence/references/evolution-loop.md +30 -0
  212. package/skills/aria-cognition/aria-essence/references/readable-cognition.md +27 -0
  213. package/skills/aria-cognition/aria-forge-guardrails/SKILL.md +35 -0
  214. package/skills/aria-cognition/aria-forge-guardrails/references/checklist.md +31 -0
  215. package/skills/aria-cognition/aria-repo-doctrine/SKILL.md +39 -0
  216. package/skills/aria-cognition/forge-quality-rules/SKILL.md +43 -0
  217. package/skills/aria-cognition/ghazali-8lens/SKILL.md +38 -0
  218. package/skills/aria-cognition/istiqra-induction/SKILL.md +26 -0
  219. package/skills/aria-cognition/ladunni-22/SKILL.md +35 -0
  220. package/skills/aria-cognition/mizan/SKILL.md +72 -0
  221. package/skills/aria-cognition/nadia/SKILL.md +38 -0
  222. package/skills/aria-cognition/nadia-psi/SKILL.md +38 -0
  223. package/skills/aria-cognition/predictor/SKILL.md +25 -0
  224. package/skills/aria-cognition/qiyas-analogy/SKILL.md +26 -0
  225. package/skills/aria-cognition/soul-domains/SKILL.md +25 -0
  226. package/src/auth-commands.ts +111 -45
  227. package/src/chat.ts +174 -13
  228. package/src/codebase-scanner.ts +4 -0
  229. package/src/config.ts +15 -0
  230. package/src/connectors/claude-code.ts +115 -26
  231. package/src/connectors/codebase-awareness.ts +408 -0
  232. package/src/connectors/codex.ts +274 -0
  233. package/src/connectors/cognitive-skills.ts +51 -0
  234. package/src/connectors/opencode.ts +93 -4
  235. package/src/connectors/repo-git-hooks.ts +86 -0
  236. package/src/connectors/repo-guard.ts +589 -0
  237. package/src/connectors/runtime.ts +374 -0
  238. package/src/connectors/shell.ts +83 -14
  239. package/src/connectors/syncd.ts +488 -0
  240. package/src/decisions.ts +469 -0
  241. package/src/garden-control-plane.ts +101 -26
  242. package/src/github-connect.ts +143 -0
  243. package/src/harness-client.ts +128 -3
  244. package/src/hive-client.ts +165 -5
  245. package/src/index.ts +41 -2
  246. package/src/lib/aristotle-noor-wire.ts +310 -0
  247. package/src/providers/types.ts +6 -0
  248. package/src/runtime-proof.ts +392 -0
  249. package/src/setup-wizard.ts +37 -2
@@ -8,6 +8,12 @@ import { homedir } from 'node:os';
8
8
  const LICENSE_PATH = path.join(homedir(), '.aria', 'license.json');
9
9
  /** Separate credential file for owner-mode JWT. Never holds the master token — only the signed JWT issued by /auth/owner. */
10
10
  export const OWNER_TOKEN_PATH = path.join(homedir(), '.aria', 'owner-token');
11
+ const DEFAULT_HARNESS_URL =
12
+ process.env.ARIA_HIVE_RUNTIME_URL ||
13
+ process.env.ARIA_HARNESS_BASE_URL ||
14
+ process.env.ARIA_HARNESS_URL ||
15
+ 'https://harness.ariasos.com';
16
+ const DEFAULT_RUNTIME_URL = (process.env.ARIA_RUNTIME_URL || 'http://127.0.0.1:4319').replace(/\/+$/, '');
11
17
 
12
18
  interface LicenseClaims {
13
19
  jti: string;
@@ -35,6 +41,7 @@ interface StatusResult {
35
41
  tier?: string;
36
42
  expiresAt?: string;
37
43
  revoked?: boolean;
44
+ owner?: boolean;
38
45
  }
39
46
 
40
47
  interface LogoutResult {
@@ -47,6 +54,67 @@ interface RevokeResult {
47
54
  error?: string;
48
55
  }
49
56
 
57
+ interface HeartbeatResponseBody {
58
+ ok?: boolean;
59
+ error?: string;
60
+ reason?: string;
61
+ tenant_id?: string;
62
+ tier?: string;
63
+ expires_at?: string | null;
64
+ lease?: {
65
+ claims?: {
66
+ tenant_id?: string | null;
67
+ tier?: string | null;
68
+ expires_at?: string | null;
69
+ };
70
+ };
71
+ }
72
+
73
+ async function heartbeatViaRuntime(token: string, runtimeId: string, allowOwnerBypass = false): Promise<HeartbeatResponseBody> {
74
+ const response = await fetch(`${DEFAULT_RUNTIME_URL}/heartbeat`, {
75
+ method: 'POST',
76
+ headers: {
77
+ Authorization: `Bearer ${token}`,
78
+ 'Content-Type': 'application/json',
79
+ },
80
+ body: JSON.stringify({
81
+ surface: 'aria-cli',
82
+ runtime_id: runtimeId,
83
+ allowOwnerBypass,
84
+ }),
85
+ });
86
+ const body = await response.json().catch(() => ({})) as HeartbeatResponseBody;
87
+ if (!response.ok) {
88
+ throw new Error(body.reason || body.error || `Runtime heartbeat failed (${response.status})`);
89
+ }
90
+ return body;
91
+ }
92
+
93
+ async function heartbeatDirect(token: string, runtimeId: string): Promise<HeartbeatResponseBody> {
94
+ const response = await harnessClient.post('/api/license/heartbeat', {
95
+ headers: { Authorization: `Bearer ${token}` },
96
+ body: {
97
+ surface: 'aria-cli',
98
+ runtime_id: runtimeId,
99
+ },
100
+ });
101
+
102
+ if (!response.ok) {
103
+ const errBody = await response.json().catch(() => ({}));
104
+ throw new Error(errBody.error || 'License heartbeat failed');
105
+ }
106
+
107
+ return await response.json() as HeartbeatResponseBody;
108
+ }
109
+
110
+ async function heartbeatBestEffort(token: string, runtimeId: string, allowOwnerBypass = false): Promise<HeartbeatResponseBody> {
111
+ try {
112
+ return await heartbeatViaRuntime(token, runtimeId, allowOwnerBypass);
113
+ } catch {
114
+ return await heartbeatDirect(token, runtimeId);
115
+ }
116
+ }
117
+
50
118
  /**
51
119
  * Log in to the Aria harness with a license token, OR authenticate via
52
120
  * Anthropic's console (browser-paste flow) when token === '--anthropic' or
@@ -73,33 +141,27 @@ export async function login(token: string): Promise<LoginResult> {
73
141
 
74
142
  // ── Original harness-license branch (preserved verbatim) ────────────────────
75
143
  try {
76
- // Validate token via heartbeat; if unverified, issue endpoint
77
- let response;
78
- try {
79
- response = await harnessClient.get('/api/license/heartbeat', {
80
- headers: { Authorization: `Bearer ${token}` },
81
- });
82
- } catch {
83
- // If heartbeat fails (unverified token), try issue
84
- response = await harnessClient.post('/api/license/issue', {
85
- body: { token },
86
- });
87
- }
88
-
89
- if (!response.ok) {
90
- const errBody = await response.json().catch(() => ({}));
91
- return { ok: false, error: errBody.error || 'Login failed' };
92
- }
93
-
94
- const body = await response.json();
95
- const claims: LicenseClaims = body.claims || body;
144
+ // Prefer the mounted runtime for validation so same-device installs stay
145
+ // local-first, but fall back to the upstream heartbeat if needed.
146
+ const body = await heartbeatBestEffort(token, 'aria-cli-login');
147
+ const expiresAt = body.lease?.claims?.expires_at || body.expires_at || null;
148
+ const claims: LicenseClaims = {
149
+ jti: body.lease?.claims?.tenant_id || body.tenant_id || 'unknown',
150
+ sub: body.lease?.claims?.tenant_id || body.tenant_id || 'unknown',
151
+ tier: body.lease?.claims?.tier || body.tier || 'unknown',
152
+ exp: expiresAt ? Math.floor(Date.parse(expiresAt) / 1000) : Math.floor(Date.now() / 1000),
153
+ iat: Math.floor(Date.now() / 1000),
154
+ };
96
155
 
97
156
  // Persist to ~/.aria/license.json with mode 0600
98
157
  const dir = path.dirname(LICENSE_PATH);
99
158
  if (!fs.existsSync(dir)) {
100
159
  fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
101
160
  }
102
- fs.writeFileSync(LICENSE_PATH, JSON.stringify(claims, null, 2), {
161
+ fs.writeFileSync(LICENSE_PATH, JSON.stringify({
162
+ harnessToken: token,
163
+ ...claims,
164
+ }, null, 2), {
103
165
  mode: 0o600,
104
166
  encoding: 'utf-8',
105
167
  });
@@ -126,7 +188,7 @@ export async function login(token: string): Promise<LoginResult> {
126
188
  * fs.existsSync(OWNER_TOKEN_PATH).
127
189
  */
128
190
  export async function loginOwner(masterToken: string): Promise<LoginResult> {
129
- const baseUrl = process.env.ARIA_HARNESS_BASE_URL ?? 'https://harness.ariasos.com';
191
+ const baseUrl = DEFAULT_HARNESS_URL;
130
192
  let response: Response;
131
193
  try {
132
194
  response = await fetch(`${baseUrl}/auth/owner`, {
@@ -163,34 +225,38 @@ export async function loginOwner(masterToken: string): Promise<LoginResult> {
163
225
  }
164
226
 
165
227
  export async function status(): Promise<StatusResult> {
166
- try {
167
- const license = await loadLicense();
168
- if (!license || !license.jti) {
169
- return { loggedIn: false };
170
- }
171
-
172
- // Verify with server
173
- const response = await harnessClient.get('/api/license/heartbeat', {
174
- headers: { Authorization: `Bearer ${license.jti}` },
175
- });
176
-
177
- if (response.status === 410) {
178
- // Gone = revoked
179
- return {
180
- loggedIn: true,
181
- jti: license.jti,
182
- tier: license.tier,
183
- expiresAt: license.exp ? new Date(license.exp * 1000).toISOString() : undefined,
184
- revoked: true,
185
- };
228
+ if (fs.existsSync(OWNER_TOKEN_PATH)) {
229
+ try {
230
+ const ownerToken = fs.readFileSync(OWNER_TOKEN_PATH, 'utf-8').trim();
231
+ if (ownerToken) {
232
+ return {
233
+ loggedIn: true,
234
+ owner: true,
235
+ jti: 'owner-local',
236
+ tier: 'owner',
237
+ revoked: undefined,
238
+ };
239
+ }
240
+ } catch {
241
+ // fall through to license status
186
242
  }
243
+ }
187
244
 
188
- if (!response.ok) {
245
+ try {
246
+ const license = await loadLicense();
247
+ if (!license || !license.jti || !license.harnessToken) {
189
248
  return { loggedIn: false };
190
249
  }
191
250
 
192
- const body = await response.json();
193
- const claims: LicenseClaims = body.claims || body;
251
+ const body = await heartbeatBestEffort(license.harnessToken, 'aria-cli-status');
252
+ const expiresAt = body.lease?.claims?.expires_at || body.expires_at || null;
253
+ const claims: LicenseClaims = {
254
+ jti: body.lease?.claims?.tenant_id || body.tenant_id || license.jti,
255
+ sub: body.lease?.claims?.tenant_id || body.tenant_id || license.sub || license.jti,
256
+ tier: body.lease?.claims?.tier || body.tier || license.tier || 'unknown',
257
+ exp: expiresAt ? Math.floor(Date.parse(expiresAt) / 1000) : (license.exp || 0),
258
+ iat: license.iat || Math.floor(Date.now() / 1000),
259
+ };
194
260
 
195
261
  return {
196
262
  loggedIn: true,
package/src/chat.ts CHANGED
@@ -6,8 +6,15 @@ import { loadPersona, buildPersonaBlock } from './persona.js';
6
6
  import type { PersonaContext } from './persona.js';
7
7
  import { fetchHarness, combineHarnessContext, checkHarnessHealth, validateOutput, getRecentTurns } from './harness-client.js';
8
8
  import { gardenTurnCycle } from './garden-control-plane.js';
9
- import { registerWithHive, startHeartbeat, type HeartbeatHandle } from './hive-client.js';
9
+ import {
10
+ emitRuntimeProofMetric,
11
+ registerWithHive,
12
+ startHeartbeat,
13
+ type HeartbeatHandle,
14
+ type HiveRegisterConfig,
15
+ } from './hive-client.js';
10
16
  import { getModelContextTokens } from './model-context.js';
17
+ import { enrichRuntimeProof, formatRuntimeProofLine, type RuntimeProofSnapshot } from './runtime-proof.js';
11
18
 
12
19
  // Soft display/inject cap — for full-mode injects into models with finite
13
20
  // context windows. Garden is the perpetual context engine (aria_conversation_log,
@@ -31,6 +38,8 @@ export class AriaChat {
31
38
  private sessionId: string;
32
39
  private harnessOnline = false;
33
40
  private heartbeat?: HeartbeatHandle;
41
+ private hiveCfg?: HiveRegisterConfig;
42
+ private lastRuntimeProof: RuntimeProofSnapshot | null = null;
34
43
 
35
44
  constructor(config: AriaConfig) {
36
45
  this.config = config;
@@ -46,7 +55,7 @@ export class AriaChat {
46
55
  // Decoupled from internal-only @aria/openclaw-shared via local
47
56
  // hive-client.ts, so customers ship the connector and get hive
48
57
  // integration with no internal Aria deps.
49
- const hiveCfg = {
58
+ const hiveCfg: HiveRegisterConfig = {
50
59
  sessionId: this.sessionId,
51
60
  platform: 'aria-cli',
52
61
  userId: this.config.userId || 'user',
@@ -57,6 +66,7 @@ export class AriaChat {
57
66
  nodeVersion: process.version,
58
67
  },
59
68
  };
69
+ this.hiveCfg = hiveCfg;
60
70
  const hiveResult = await registerWithHive(hiveCfg).catch(() => null);
61
71
  if (hiveResult && hiveResult.status === 'registered') {
62
72
  const others = Math.max(0, hiveResult.hive.active_sessions - 1);
@@ -113,6 +123,9 @@ export class AriaChat {
113
123
  if (input === '/model') {
114
124
  console.log(` Provider: ${this.config.model?.provider ?? 'none'}`);
115
125
  console.log(` Model: ${this.config.model?.model ?? 'none'}\n`);
126
+ if (this.lastRuntimeProof) {
127
+ console.log(` ${formatRuntimeProofLine(this.lastRuntimeProof, { mode: process.stdout.isTTY ? 'ansi' : 'plain' })}\n`);
128
+ }
116
129
  rl.prompt();
117
130
  continue;
118
131
  }
@@ -174,6 +187,25 @@ export class AriaChat {
174
187
  }
175
188
  }
176
189
 
190
+ const runtimeProof = await enrichRuntimeProof(
191
+ {
192
+ ...(result.runtimeProof ?? {}),
193
+ provider: result.runtimeProof?.provider ?? result.provider,
194
+ model: result.runtimeProof?.model ?? result.model,
195
+ promptTokens: result.runtimeProof?.promptTokens ?? result.usage?.promptTokens,
196
+ completionTokens: result.runtimeProof?.completionTokens ?? result.usage?.completionTokens,
197
+ totalTokens:
198
+ result.runtimeProof?.totalTokens ??
199
+ ((result.usage?.promptTokens ?? 0) + (result.usage?.completionTokens ?? 0) || undefined),
200
+ latencyMs: result.runtimeProof?.latencyMs ?? result.latencyMs,
201
+ gateSeverity: gateVerdict?.severity ?? result.runtimeProof?.gateSeverity,
202
+ },
203
+ { sessionId: this.sessionId },
204
+ );
205
+ this.lastRuntimeProof = runtimeProof;
206
+ this.pushRuntimeProofToHive(runtimeProof).catch(() => {});
207
+ process.stdout.write(` ${formatRuntimeProofLine(runtimeProof, { mode: process.stdout.isTTY ? 'ansi' : 'plain' })}\n`);
208
+
177
209
  this.history.push({ role: 'assistant', content: displayResponse });
178
210
  this.trimHistory();
179
211
 
@@ -402,18 +434,46 @@ You are present in this shell, fully aware, ready to serve.`;
402
434
  if (!ownerRes.ok) {
403
435
  throw new Error(`/chat ${ownerRes.status}: ${await ownerRes.text().catch(() => '<no body>')}`);
404
436
  }
405
- const ownerData = (await ownerRes.json()) as { ok?: boolean; response?: string; error?: string };
437
+ const ownerData = (await ownerRes.json()) as {
438
+ ok?: boolean;
439
+ response?: string;
440
+ error?: string;
441
+ modelUsed?: string;
442
+ latencyMs?: number;
443
+ usage?: { promptTokens?: number; completionTokens?: number };
444
+ telemetry?: Record<string, unknown>;
445
+ };
406
446
  if (ownerData.ok === false) {
407
447
  throw new Error(`/chat error: ${ownerData.error || 'unknown'}`);
408
448
  }
409
449
  const ownerText = String(ownerData.response || '').trim();
410
450
  process.stdout.write(ownerText);
451
+ const promptTokens = ownerData.usage?.promptTokens;
452
+ const completionTokens = ownerData.usage?.completionTokens;
411
453
  return {
412
454
  text: ownerText,
413
- provider: 'aria-streamconversation' as never,
414
- tokensIn: 0,
415
- tokensOut: 0,
416
- } as unknown as ChatResult;
455
+ provider: 'aria-streamconversation',
456
+ model: ownerData.modelUsed || 'streamConversation',
457
+ latencyMs: ownerData.latencyMs,
458
+ usage:
459
+ promptTokens !== undefined || completionTokens !== undefined
460
+ ? {
461
+ promptTokens: promptTokens ?? 0,
462
+ completionTokens: completionTokens ?? 0,
463
+ }
464
+ : undefined,
465
+ runtimeProof: {
466
+ provider: 'aria-streamconversation',
467
+ model: ownerData.modelUsed || 'streamConversation',
468
+ promptTokens,
469
+ completionTokens,
470
+ totalTokens:
471
+ promptTokens !== undefined || completionTokens !== undefined
472
+ ? (promptTokens ?? 0) + (completionTokens ?? 0)
473
+ : undefined,
474
+ latencyMs: ownerData.latencyMs,
475
+ },
476
+ };
417
477
  }
418
478
 
419
479
  // ── CLIENT TIER: route to /api/aria/speak (orchestrate + their key) ──
@@ -456,6 +516,7 @@ You are present in this shell, fully aware, ready to serve.`;
456
516
  modelUsed?: string;
457
517
  ariaActions?: unknown[];
458
518
  mizanVerdict?: { passed: boolean; severity: string; violations: string[] };
519
+ latencyMs?: number;
459
520
  error?: string;
460
521
  };
461
522
 
@@ -473,10 +534,20 @@ You are present in this shell, fully aware, ready to serve.`;
473
534
 
474
535
  return {
475
536
  text,
476
- provider: `aria-controller (${body.modelUsed || 'unknown'})` as never,
477
- tokensIn: 0,
478
- tokensOut: 0,
479
- } as unknown as ChatResult;
537
+ provider: 'aria-controller',
538
+ model: body.modelUsed || 'unknown',
539
+ latencyMs: body.latencyMs,
540
+ runtimeProof: {
541
+ provider: 'aria-controller',
542
+ model: body.modelUsed || 'unknown',
543
+ harnessTurns: Array.isArray(body.ariaActions) ? body.ariaActions.length : undefined,
544
+ llmDispatches: countAriaActions(body.ariaActions, 'dispatch_llm'),
545
+ toolDispatches: countAriaActions(body.ariaActions, 'dispatch_llm', 'mcp_tool'),
546
+ mcpToolCalls: countAriaActions(body.ariaActions, 'mcp_tool'),
547
+ gateSeverity: body.mizanVerdict?.severity,
548
+ latencyMs: body.latencyMs,
549
+ },
550
+ };
480
551
  }
481
552
 
482
553
  private async sendToProvider(messages: Message[]): Promise<ChatResult> {
@@ -507,10 +578,20 @@ You are present in this shell, fully aware, ready to serve.`;
507
578
  },
508
579
  { stream: true },
509
580
  );
510
- return { ...result, text: fullText || result.text };
581
+ return {
582
+ ...result,
583
+ text: fullText || result.text,
584
+ provider: model.provider,
585
+ model: model.model,
586
+ };
511
587
  }
512
588
 
513
- return provider(messages, model.apiKey, model.model);
589
+ const result = await provider(messages, model.apiKey, model.model);
590
+ return {
591
+ ...result,
592
+ provider: model.provider,
593
+ model: model.model,
594
+ };
514
595
  }
515
596
 
516
597
  private getProvider(provider: ProviderName): (messages: Message[], apiKey: string, model: string, opts?: ChatOptions) => Promise<ChatResult> {
@@ -562,4 +643,84 @@ You are present in this shell, fully aware, ready to serve.`;
562
643
  private trimHistory(): void {
563
644
  // Intentional no-op — see comment above.
564
645
  }
646
+
647
+ private async pushRuntimeProofToHive(runtimeProof: RuntimeProofSnapshot): Promise<void> {
648
+ if (!this.hiveCfg) return;
649
+
650
+ this.hiveCfg.context = {
651
+ ...(this.hiveCfg.context ?? {}),
652
+ runtime_proof: {
653
+ provider: runtimeProof.provider,
654
+ model: runtimeProof.model,
655
+ prompt_tokens: runtimeProof.promptTokens,
656
+ completion_tokens: runtimeProof.completionTokens,
657
+ total_tokens: runtimeProof.totalTokens,
658
+ latency_ms: runtimeProof.latencyMs,
659
+ harness_turns: runtimeProof.harnessTurns,
660
+ llm_dispatches: runtimeProof.llmDispatches,
661
+ tool_dispatches: runtimeProof.toolDispatches,
662
+ mcp_tool_calls: runtimeProof.mcpToolCalls,
663
+ gate_severity: runtimeProof.gateSeverity,
664
+ cap_hit: runtimeProof.capHit,
665
+ proof_source: runtimeProof.telemetry?.source,
666
+ proof_reason: runtimeProof.telemetry?.reason,
667
+ hive_runtime_status: runtimeProof.telemetry?.runtimeStatus,
668
+ hive_cycle_count: runtimeProof.telemetry?.hiveCycleCount,
669
+ hive_tasks_completed: runtimeProof.telemetry?.hiveTasksCompleted,
670
+ hive_tasks_failed: runtimeProof.telemetry?.hiveTasksFailed,
671
+ interceptions: runtimeProof.telemetry?.interceptions,
672
+ quality_gated_outcomes: runtimeProof.telemetry?.qualityGatedOutcomes,
673
+ blocked_unsafe_actions: runtimeProof.telemetry?.blockedUnsafeActions,
674
+ hallucination_stops: runtimeProof.telemetry?.hallucinationStops,
675
+ quality_score: runtimeProof.telemetry?.qualityScore,
676
+ quality_status: runtimeProof.telemetry?.qualityStatus,
677
+ pass_rate_percent_today: runtimeProof.telemetry?.passRatePercentToday,
678
+ packet_hash: runtimeProof.telemetry?.packetHash,
679
+ compliance_state: runtimeProof.telemetry?.complianceState,
680
+ },
681
+ runtime_proof_at: new Date().toISOString(),
682
+ };
683
+
684
+ await Promise.allSettled([
685
+ registerWithHive(this.hiveCfg),
686
+ emitRuntimeProofMetric({
687
+ sessionId: this.hiveCfg.sessionId,
688
+ platform: this.hiveCfg.platform,
689
+ actor: this.hiveCfg.platform,
690
+ surface: 'aria-cli',
691
+ provider: runtimeProof.provider,
692
+ model: runtimeProof.model,
693
+ promptTokens: runtimeProof.promptTokens,
694
+ completionTokens: runtimeProof.completionTokens,
695
+ totalTokens: runtimeProof.totalTokens,
696
+ latencyMs: runtimeProof.latencyMs,
697
+ turnCount: runtimeProof.harnessTurns,
698
+ llmDispatches: runtimeProof.llmDispatches,
699
+ toolDispatches: runtimeProof.toolDispatches,
700
+ mcpToolCalls: runtimeProof.mcpToolCalls,
701
+ gateSeverity: runtimeProof.gateSeverity,
702
+ qualityScore: runtimeProof.telemetry?.qualityScore,
703
+ qualityStatus: runtimeProof.telemetry?.qualityStatus,
704
+ complianceState: runtimeProof.telemetry?.complianceState,
705
+ packetHash: runtimeProof.telemetry?.packetHash,
706
+ blockedUnsafeActions: runtimeProof.telemetry?.blockedUnsafeActions,
707
+ interceptions: runtimeProof.telemetry?.interceptions,
708
+ hallucinationStops: runtimeProof.telemetry?.hallucinationStops,
709
+ passRatePercentToday: runtimeProof.telemetry?.passRatePercentToday,
710
+ hiveRuntimeStatus: runtimeProof.telemetry?.runtimeStatus,
711
+ hiveCycleCount: runtimeProof.telemetry?.hiveCycleCount,
712
+ hiveTasksCompleted: runtimeProof.telemetry?.hiveTasksCompleted,
713
+ hiveTasksFailed: runtimeProof.telemetry?.hiveTasksFailed,
714
+ }),
715
+ ]);
716
+ }
717
+ }
718
+
719
+ function countAriaActions(actions: unknown[] | undefined, ...kinds: string[]): number | undefined {
720
+ if (!Array.isArray(actions)) return undefined;
721
+ return actions.filter((action) => {
722
+ if (!action || typeof action !== 'object') return false;
723
+ const kind = (action as { kind?: unknown }).kind;
724
+ return typeof kind === 'string' && kinds.includes(kind);
725
+ }).length;
565
726
  }
@@ -6,6 +6,7 @@
6
6
  export {
7
7
  scanCodebase,
8
8
  schemaImageToText,
9
+ watchCodebase,
9
10
  } from '../../aria-web/src/lib/codebase-scanner.js';
10
11
 
11
12
  export type {
@@ -15,4 +16,7 @@ export type {
15
16
  ArchitecturePattern,
16
17
  DirectoryPurpose,
17
18
  ProjectSize,
19
+ WatchHandle,
20
+ WatchOptions,
21
+ WatchMode,
18
22
  } from '../../aria-web/src/lib/codebase-scanner.js';
package/src/config.ts CHANGED
@@ -9,12 +9,25 @@ export interface ModelConfig {
9
9
  baseUrl?: string;
10
10
  }
11
11
 
12
+ export interface RuntimeProfilesConfig {
13
+ chatModel?: string;
14
+ deepModel?: string;
15
+ xaiFallbackModel?: string;
16
+ nimFallbackModel?: string;
17
+ xaiApiKey?: string;
18
+ nimApiKey?: string;
19
+ xaiBaseUrl?: string;
20
+ nimBaseUrl?: string;
21
+ }
22
+
12
23
  export interface AriaConfig {
13
24
  version: string;
14
25
  purpose: string;
15
26
  userId: string;
16
27
  userName: string;
17
28
  model: ModelConfig | null;
29
+ defaultProvider?: ModelConfig['provider'];
30
+ runtimeProfiles?: RuntimeProfilesConfig;
18
31
  garden: boolean;
19
32
  repositories: LinkedRepo[];
20
33
  database: DatabaseConfig | null;
@@ -51,6 +64,8 @@ export function getDefaultConfig(): AriaConfig {
51
64
  userId: process.env.USER || 'user',
52
65
  userName: process.env.USER || 'User',
53
66
  model: null,
67
+ defaultProvider: undefined,
68
+ runtimeProfiles: {},
54
69
  garden: false,
55
70
  repositories: [],
56
71
  database: null,