@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
@@ -0,0 +1,392 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { homedir } from 'node:os';
4
+
5
+ export interface RuntimeProofTelemetry {
6
+ available: boolean;
7
+ source?: string;
8
+ reason?: string;
9
+ runtimeStatus?: string;
10
+ hiveCycleCount?: number;
11
+ hiveTasksCompleted?: number;
12
+ hiveTasksFailed?: number;
13
+ turns?: number;
14
+ interceptions?: number;
15
+ qualityGatedOutcomes?: number;
16
+ hallucinationStops?: number;
17
+ blockedUnsafeActions?: number;
18
+ qualityScore?: number;
19
+ qualityStatus?: string;
20
+ complianceState?: string;
21
+ packetHash?: string;
22
+ passRatePercentToday?: number;
23
+ }
24
+
25
+ export interface RuntimeProofSnapshot {
26
+ provider?: string;
27
+ model?: string;
28
+ promptTokens?: number;
29
+ completionTokens?: number;
30
+ totalTokens?: number;
31
+ latencyMs?: number;
32
+ harnessTurns?: number;
33
+ llmDispatches?: number;
34
+ toolDispatches?: number;
35
+ mcpToolCalls?: number;
36
+ gateSeverity?: 'pass' | 'warn' | 'block' | string;
37
+ capHit?: boolean;
38
+ telemetry?: RuntimeProofTelemetry;
39
+ }
40
+
41
+ interface RuntimeProofFetchArgs {
42
+ sessionId: string;
43
+ }
44
+
45
+ interface RuntimeProofFormatOpts {
46
+ mode?: 'ansi' | 'plain';
47
+ }
48
+
49
+ const ANSI_GREY_OPEN = '\x1b[90m';
50
+ const ANSI_RESET = '\x1b[0m';
51
+ const HARNESS_BASE_URL =
52
+ process.env.ARIA_HIVE_RUNTIME_URL ||
53
+ process.env.ARIA_HARNESS_BASE_URL ||
54
+ process.env.ARIA_HARNESS_URL ||
55
+ 'https://harness.ariasos.com';
56
+ const OWNER_TOKEN_PATH = path.join(homedir(), '.aria', 'owner-token');
57
+ const LICENSE_PATH = path.join(homedir(), '.aria', 'license.json');
58
+
59
+ export async function enrichRuntimeProof(
60
+ base: RuntimeProofSnapshot,
61
+ args: RuntimeProofFetchArgs,
62
+ ): Promise<RuntimeProofSnapshot> {
63
+ const telemetry = await fetchRuntimeProofTelemetry(args);
64
+ return {
65
+ ...base,
66
+ telemetry,
67
+ };
68
+ }
69
+
70
+ export async function fetchRuntimeProofTelemetry(
71
+ args: RuntimeProofFetchArgs,
72
+ ): Promise<RuntimeProofTelemetry> {
73
+ const authHeaders = resolveHarnessAuthHeaders();
74
+ const candidates = [
75
+ {
76
+ source: 'aria-telemetry-badge-metrics',
77
+ url: `${HARNESS_BASE_URL}/api/telemetry/badge-metrics?sessionId=${encodeURIComponent(args.sessionId)}&surface=aria-cli`,
78
+ },
79
+ {
80
+ source: 'aria-telemetry-public-proof',
81
+ url: `${HARNESS_BASE_URL}/api/telemetry/public-proof?sessionId=${encodeURIComponent(args.sessionId)}&surface=aria-cli`,
82
+ },
83
+ {
84
+ source: 'aria-telemetry-public-proof-path',
85
+ url: `${HARNESS_BASE_URL}/api/telemetry/public-proof/${encodeURIComponent(args.sessionId)}`,
86
+ },
87
+ {
88
+ source: 'hive-runtime-status',
89
+ url: `${HARNESS_BASE_URL}/hive/status`,
90
+ },
91
+ {
92
+ source: 'hive-runtime-status-api',
93
+ url: `${HARNESS_BASE_URL}/api/hive/status`,
94
+ },
95
+ {
96
+ source: 'proof-layer-summary',
97
+ url: `${HARNESS_BASE_URL}/api/metrics/proof-layer/summary?window=24h`,
98
+ },
99
+ ];
100
+
101
+ let lastReason = 'telemetry endpoint unavailable';
102
+
103
+ for (const candidate of candidates) {
104
+ try {
105
+ const response = await fetch(candidate.url, {
106
+ headers: authHeaders,
107
+ });
108
+
109
+ if (response.status === 401 || response.status === 403 || response.status === 404) {
110
+ lastReason = `${candidate.source}:${response.status}`;
111
+ continue;
112
+ }
113
+
114
+ if (!response.ok) {
115
+ lastReason = `${candidate.source}:${response.status}`;
116
+ continue;
117
+ }
118
+
119
+ const payload = await response.json() as Record<string, unknown>;
120
+ const parsed = parseTelemetryPayload(candidate.source, payload);
121
+ if (parsed.available) {
122
+ return parsed;
123
+ }
124
+ lastReason = parsed.reason || `${candidate.source}:no-proof-fields`;
125
+ } catch (error) {
126
+ lastReason = `${candidate.source}:${error instanceof Error ? error.message : String(error)}`;
127
+ }
128
+ }
129
+
130
+ return {
131
+ available: false,
132
+ reason: lastReason,
133
+ };
134
+ }
135
+
136
+ export function formatRuntimeProofLine(
137
+ proof: RuntimeProofSnapshot,
138
+ opts: RuntimeProofFormatOpts = {},
139
+ ): string {
140
+ const parts: string[] = [];
141
+ const surface = [proof.provider, proof.model].filter(Boolean).join('/');
142
+ if (surface) parts.push(`proof ${surface}`);
143
+ else parts.push('proof');
144
+
145
+ if (proof.promptTokens !== undefined || proof.completionTokens !== undefined || proof.totalTokens !== undefined) {
146
+ const prompt = proof.promptTokens ?? '?';
147
+ const completion = proof.completionTokens ?? '?';
148
+ const total = proof.totalTokens ?? deriveTotalTokens(proof.promptTokens, proof.completionTokens);
149
+ const totalSuffix = total !== undefined ? ` (${total})` : '';
150
+ parts.push(`tok ${prompt}/${completion}${totalSuffix}`);
151
+ }
152
+
153
+ if (proof.harnessTurns !== undefined) parts.push(`turns ${proof.harnessTurns}`);
154
+ if (proof.llmDispatches !== undefined) parts.push(`llm ${proof.llmDispatches}`);
155
+ if (proof.toolDispatches !== undefined) parts.push(`tools ${proof.toolDispatches}`);
156
+ if (proof.mcpToolCalls !== undefined) parts.push(`mcp ${proof.mcpToolCalls}`);
157
+ if (proof.gateSeverity) parts.push(`gate ${proof.gateSeverity}`);
158
+ if (proof.capHit) parts.push('cap hit');
159
+
160
+ if (proof.telemetry?.available) {
161
+ if (proof.telemetry.source) parts.push(`src ${proof.telemetry.source}`);
162
+ if (proof.telemetry.runtimeStatus) parts.push(`hive ${proof.telemetry.runtimeStatus}`);
163
+ if (proof.telemetry.hiveCycleCount !== undefined) parts.push(`cycles ${proof.telemetry.hiveCycleCount}`);
164
+ if (proof.telemetry.hiveTasksCompleted !== undefined) parts.push(`hive-ok ${proof.telemetry.hiveTasksCompleted}`);
165
+ if (proof.telemetry.hiveTasksFailed !== undefined) parts.push(`hive-fail ${proof.telemetry.hiveTasksFailed}`);
166
+ if (proof.telemetry.turns !== undefined && proof.harnessTurns === undefined) {
167
+ parts.push(`tele-turns ${proof.telemetry.turns}`);
168
+ }
169
+ if (proof.telemetry.interceptions !== undefined) parts.push(`intercepts ${proof.telemetry.interceptions}`);
170
+ if (proof.telemetry.qualityGatedOutcomes !== undefined) parts.push(`gated ${proof.telemetry.qualityGatedOutcomes}`);
171
+ if (proof.telemetry.blockedUnsafeActions !== undefined) parts.push(`unsafe ${proof.telemetry.blockedUnsafeActions}`);
172
+ if (proof.telemetry.hallucinationStops !== undefined) parts.push(`hallu ${proof.telemetry.hallucinationStops}`);
173
+ if (proof.telemetry.qualityScore !== undefined) parts.push(`quality ${formatQualityScore(proof.telemetry.qualityScore)}`);
174
+ if (proof.telemetry.qualityStatus) parts.push(`status ${proof.telemetry.qualityStatus}`);
175
+ if (proof.telemetry.passRatePercentToday !== undefined) parts.push(`pass24h ${proof.telemetry.passRatePercentToday}%`);
176
+ if (proof.telemetry.packetHash) parts.push(`packet ${proof.telemetry.packetHash.slice(0, 12)}`);
177
+ if (proof.telemetry.complianceState) parts.push(`compliance ${proof.telemetry.complianceState}`);
178
+ } else if (proof.telemetry?.reason) {
179
+ parts.push(`src ${proof.telemetry.reason}`);
180
+ }
181
+
182
+ if (proof.latencyMs !== undefined) parts.push(`${Math.round(proof.latencyMs)}ms`);
183
+
184
+ const body = parts.join(' | ');
185
+ if ((opts.mode ?? 'plain') === 'ansi') {
186
+ return `${ANSI_GREY_OPEN}${body}${ANSI_RESET}`;
187
+ }
188
+ return body;
189
+ }
190
+
191
+ function parseTelemetryPayload(source: string, payload: Record<string, unknown>): RuntimeProofTelemetry {
192
+ if (source === 'proof-layer-summary') {
193
+ return parseProofLayerSummary(payload);
194
+ }
195
+ if (source === 'hive-runtime-status' || source === 'hive-runtime-status-api') {
196
+ return parseHiveRuntimeStatus(source, payload);
197
+ }
198
+
199
+ const turns = findNumber(payload, ['turns', 'harnessed_turns', 'loop_turns']);
200
+ const interceptions = findNumber(payload, ['interceptions', 'intercepts', 'intercept_count']);
201
+ const qualityGatedOutcomes = findNumber(payload, ['quality_gated_outcomes', 'qualityGatedOutcomes', 'gated_outcomes']);
202
+ const hallucinationStops = findNumber(payload, ['hallucination_stops', 'hallucinationStops', 'hallucination_blocks']);
203
+ const blockedUnsafeActions = findNumber(payload, ['blocked_unsafe_actions', 'blockedUnsafeActions', 'unsafe_blocks']);
204
+ const qualityScore = findNumber(payload, ['quality_score', 'qualityScore']);
205
+ const qualityStatus = findString(payload, ['quality_status', 'qualityStatus']);
206
+ const complianceState = findString(payload, ['compliance_state', 'complianceState']);
207
+ const packetHash = findString(payload, ['packet_hash', 'packetHash', 'harness_packet_hash']);
208
+ const passRatePercentToday = normalizePercent(findNumber(payload, ['pass_rate_percent_today', 'passRatePercentToday', 'pass_rate']));
209
+
210
+ const available =
211
+ turns !== undefined ||
212
+ interceptions !== undefined ||
213
+ qualityGatedOutcomes !== undefined ||
214
+ hallucinationStops !== undefined ||
215
+ blockedUnsafeActions !== undefined ||
216
+ qualityScore !== undefined ||
217
+ qualityStatus !== undefined ||
218
+ complianceState !== undefined ||
219
+ packetHash !== undefined ||
220
+ passRatePercentToday !== undefined;
221
+
222
+ return {
223
+ available,
224
+ source,
225
+ reason: available ? undefined : `${source}:no-proof-fields`,
226
+ turns,
227
+ interceptions,
228
+ qualityGatedOutcomes,
229
+ hallucinationStops,
230
+ blockedUnsafeActions,
231
+ qualityScore,
232
+ qualityStatus,
233
+ complianceState,
234
+ packetHash,
235
+ passRatePercentToday,
236
+ };
237
+ }
238
+
239
+ function parseProofLayerSummary(payload: Record<string, unknown>): RuntimeProofTelemetry {
240
+ const decisions = readObject(payload.decisions);
241
+ const gateBlocks = readObject(payload.gate_blocks);
242
+ const recentIntercepts = Array.isArray(payload.recent_intercepts) ? payload.recent_intercepts : [];
243
+ const passRateRaw = readNumber(decisions?.pass_rate);
244
+ const passRatePercentToday = normalizePercent(passRateRaw);
245
+ const qualityGatedOutcomes = readNumber(gateBlocks?.total);
246
+ const blockedUnsafeActions = readNumber(gateBlocks?.open_blocking);
247
+
248
+ const available =
249
+ passRatePercentToday !== undefined ||
250
+ qualityGatedOutcomes !== undefined ||
251
+ blockedUnsafeActions !== undefined ||
252
+ recentIntercepts.length > 0;
253
+
254
+ return {
255
+ available,
256
+ source: 'proof-layer-summary',
257
+ reason: available ? undefined : 'proof-layer-summary:no-proof-fields',
258
+ interceptions: recentIntercepts.length > 0 ? recentIntercepts.length : undefined,
259
+ qualityGatedOutcomes,
260
+ blockedUnsafeActions,
261
+ passRatePercentToday,
262
+ };
263
+ }
264
+
265
+ function parseHiveRuntimeStatus(source: string, payload: Record<string, unknown>): RuntimeProofTelemetry {
266
+ const runtimeStatus = findString(payload, ['status']);
267
+ const hiveCycleCount = findNumber(payload, ['cycleCount']);
268
+ const hiveTasksCompleted = findNumber(payload, ['tasksCompleted']);
269
+ const hiveTasksFailed = findNumber(payload, ['tasksFailed']);
270
+ const available =
271
+ runtimeStatus !== undefined ||
272
+ hiveCycleCount !== undefined ||
273
+ hiveTasksCompleted !== undefined ||
274
+ hiveTasksFailed !== undefined;
275
+
276
+ return {
277
+ available,
278
+ source,
279
+ reason: available ? undefined : `${source}:no-runtime-fields`,
280
+ runtimeStatus,
281
+ hiveCycleCount,
282
+ hiveTasksCompleted,
283
+ hiveTasksFailed,
284
+ };
285
+ }
286
+
287
+ function resolveHarnessAuthHeaders(): Record<string, string> {
288
+ const ownerToken = readTrimmedFile(OWNER_TOKEN_PATH);
289
+ if (ownerToken) {
290
+ return {
291
+ Authorization: `Bearer ${ownerToken}`,
292
+ 'x-aria-owner': 'true',
293
+ };
294
+ }
295
+
296
+ const licenseToken = readLicenseToken();
297
+ if (licenseToken) {
298
+ return {
299
+ Authorization: `Bearer ${licenseToken}`,
300
+ };
301
+ }
302
+
303
+ return {};
304
+ }
305
+
306
+ function readLicenseToken(): string {
307
+ if (!fs.existsSync(LICENSE_PATH)) return '';
308
+ try {
309
+ const raw = fs.readFileSync(LICENSE_PATH, 'utf-8');
310
+ const parsed = JSON.parse(raw) as { token?: unknown; jti?: unknown };
311
+ if (typeof parsed.token === 'string' && parsed.token.trim()) return parsed.token.trim();
312
+ if (typeof parsed.jti === 'string' && parsed.jti.trim()) return parsed.jti.trim();
313
+ } catch {
314
+ return '';
315
+ }
316
+ return '';
317
+ }
318
+
319
+ function readTrimmedFile(filePath: string): string {
320
+ if (!fs.existsSync(filePath)) return '';
321
+ try {
322
+ return fs.readFileSync(filePath, 'utf-8').trim();
323
+ } catch {
324
+ return '';
325
+ }
326
+ }
327
+
328
+ function deriveTotalTokens(promptTokens?: number, completionTokens?: number): number | undefined {
329
+ if (promptTokens === undefined && completionTokens === undefined) return undefined;
330
+ return (promptTokens ?? 0) + (completionTokens ?? 0);
331
+ }
332
+
333
+ function formatQualityScore(value: number): string {
334
+ if (value <= 1) {
335
+ return `${Math.round(value * 100)}%`;
336
+ }
337
+ return `${Math.round(value)}`;
338
+ }
339
+
340
+ function normalizePercent(value: number | undefined): number | undefined {
341
+ if (value === undefined) return undefined;
342
+ if (value <= 1) return Math.round(value * 100);
343
+ return Math.round(value);
344
+ }
345
+
346
+ function findNumber(root: unknown, keys: string[]): number | undefined {
347
+ const value = findValue(root, new Set(keys));
348
+ return readNumber(value);
349
+ }
350
+
351
+ function findString(root: unknown, keys: string[]): string | undefined {
352
+ const value = findValue(root, new Set(keys));
353
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
354
+ }
355
+
356
+ function findValue(root: unknown, keys: Set<string>, seen = new Set<unknown>()): unknown {
357
+ if (!root || typeof root !== 'object') return undefined;
358
+ if (seen.has(root)) return undefined;
359
+ seen.add(root);
360
+
361
+ if (Array.isArray(root)) {
362
+ for (const item of root) {
363
+ const found = findValue(item, keys, seen);
364
+ if (found !== undefined) return found;
365
+ }
366
+ return undefined;
367
+ }
368
+
369
+ const record = root as Record<string, unknown>;
370
+ for (const [key, value] of Object.entries(record)) {
371
+ if (keys.has(key)) return value;
372
+ }
373
+ for (const value of Object.values(record)) {
374
+ const found = findValue(value, keys, seen);
375
+ if (found !== undefined) return found;
376
+ }
377
+ return undefined;
378
+ }
379
+
380
+ function readObject(value: unknown): Record<string, unknown> | undefined {
381
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;
382
+ return value as Record<string, unknown>;
383
+ }
384
+
385
+ function readNumber(value: unknown): number | undefined {
386
+ if (typeof value === 'number' && Number.isFinite(value)) return value;
387
+ if (typeof value === 'string' && value.trim()) {
388
+ const parsed = Number(value);
389
+ if (Number.isFinite(parsed)) return parsed;
390
+ }
391
+ return undefined;
392
+ }
@@ -22,8 +22,14 @@ import { loadConfig, updateConfig, type AriaConfig, type LinkedRepo } from './co
22
22
  import { scanCodebase, schemaImageToText } from './codebase-scanner.js';
23
23
  import { updatePersona } from './persona.js';
24
24
  import { connectClaudeCode } from './connectors/claude-code.js';
25
+ import { connectCodex } from './connectors/codex.js';
26
+ import { connectGitHub, getGitHubStatus } from './github-connect.js';
25
27
 
26
- const HARNESS_URL = process.env.ARIA_HARNESS_BASE_URL || process.env.ARIA_HARNESS_URL || 'https://harness.ariasos.com';
28
+ const HARNESS_URL =
29
+ process.env.ARIA_HIVE_RUNTIME_URL ||
30
+ process.env.ARIA_HARNESS_BASE_URL ||
31
+ process.env.ARIA_HARNESS_URL ||
32
+ 'https://harness.ariasos.com';
27
33
  const HARNESS_TOKEN = process.env.ARIA_HARNESS_TOKEN || '';
28
34
  const ARIA_DIR = join(homedir(), '.aria');
29
35
  const LICENSE_PATH = join(ARIA_DIR, 'license.json');
@@ -98,6 +104,8 @@ export async function runSetupWizard(): Promise<void> {
98
104
  if (!userMessage) userMessage = resp.depthOptions[0]?.signal ?? 'next';
99
105
  }
100
106
 
107
+ await maybeOfferGitHubConnect(ask);
108
+
101
109
  console.log('\n✅ Setup complete. Run `aria status` anytime.\n');
102
110
  } finally {
103
111
  rl.close();
@@ -134,6 +142,30 @@ async function callConverse(body: {
134
142
  }
135
143
  }
136
144
 
145
+ async function maybeOfferGitHubConnect(ask: (q: string) => Promise<string>): Promise<void> {
146
+ const status = getGitHubStatus();
147
+ if (!status.ghInstalled || status.authenticated) {
148
+ return;
149
+ }
150
+
151
+ const raw = (await ask('\nOptional: connect GitHub now for repo workflows and private package access? [y/N] ')).trim().toLowerCase();
152
+ if (raw !== 'y' && raw !== 'yes') {
153
+ console.log(' skipping GitHub for now — you can run `aria github connect` later.');
154
+ return;
155
+ }
156
+
157
+ try {
158
+ const result = connectGitHub({ interactive: true });
159
+ if (!result.ok) {
160
+ console.warn(` ⚠ GitHub connect did not complete: ${result.error || 'unknown error'}`);
161
+ return;
162
+ }
163
+ for (const line of result.logs) console.log(` ${line}`);
164
+ } catch (err) {
165
+ console.warn(` ⚠ GitHub connect hit an error: ${err instanceof Error ? err.message : String(err)}`);
166
+ }
167
+ }
168
+
137
169
  async function applyConfigWrites(writes: ConfigWrite[]): Promise<void> {
138
170
  for (const w of writes) {
139
171
  try {
@@ -218,7 +250,10 @@ async function applyConfigWrites(writes: ConfigWrite[]): Promise<void> {
218
250
  // canonical connector entry point.
219
251
  try {
220
252
  const config = loadConfig();
221
- const logs = await connectClaudeCode(config, { force: w.force === true });
253
+ const logs = [
254
+ ...(await connectClaudeCode(config, { force: w.force === true })),
255
+ ...(await connectCodex(config)),
256
+ ];
222
257
  for (const line of logs) console.log(` ${line}`);
223
258
  } catch (err) {
224
259
  console.warn(` ⚠ Gate install hit an error: ${err instanceof Error ? err.message : String(err)}`);