@aria_asi/cli 0.2.36 → 0.2.37

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 (195) hide show
  1. package/CLIENT-ONBOARDING.md +4 -2
  2. package/bin/aria.js +11 -7
  3. package/dist/aria-connector/src/auth.d.ts +14 -0
  4. package/dist/aria-connector/src/auth.d.ts.map +1 -1
  5. package/dist/aria-connector/src/auth.js +103 -1
  6. package/dist/aria-connector/src/auth.js.map +1 -1
  7. package/dist/aria-connector/src/chat.d.ts.map +1 -1
  8. package/dist/aria-connector/src/chat.js +13 -8
  9. package/dist/aria-connector/src/chat.js.map +1 -1
  10. package/dist/aria-connector/src/config.d.ts +6 -1
  11. package/dist/aria-connector/src/config.d.ts.map +1 -1
  12. package/dist/aria-connector/src/config.js.map +1 -1
  13. package/dist/aria-connector/src/connectors/claude-code.d.ts.map +1 -1
  14. package/dist/aria-connector/src/connectors/claude-code.js +50 -6
  15. package/dist/aria-connector/src/connectors/claude-code.js.map +1 -1
  16. package/dist/aria-connector/src/connectors/codex.d.ts.map +1 -1
  17. package/dist/aria-connector/src/connectors/codex.js +310 -10
  18. package/dist/aria-connector/src/connectors/codex.js.map +1 -1
  19. package/dist/aria-connector/src/connectors/opencode.d.ts.map +1 -1
  20. package/dist/aria-connector/src/connectors/opencode.js +35 -11
  21. package/dist/aria-connector/src/connectors/opencode.js.map +1 -1
  22. package/dist/aria-connector/src/connectors/repo-guard.d.ts +10 -0
  23. package/dist/aria-connector/src/connectors/repo-guard.d.ts.map +1 -1
  24. package/dist/aria-connector/src/connectors/repo-guard.js +110 -164
  25. package/dist/aria-connector/src/connectors/repo-guard.js.map +1 -1
  26. package/dist/aria-connector/src/connectors/runtime.d.ts.map +1 -1
  27. package/dist/aria-connector/src/connectors/runtime.js +17 -7
  28. package/dist/aria-connector/src/connectors/runtime.js.map +1 -1
  29. package/dist/aria-connector/src/connectors/shell.d.ts.map +1 -1
  30. package/dist/aria-connector/src/connectors/shell.js +12 -8
  31. package/dist/aria-connector/src/connectors/shell.js.map +1 -1
  32. package/dist/aria-connector/src/harness-client.d.ts +3 -1
  33. package/dist/aria-connector/src/harness-client.d.ts.map +1 -1
  34. package/dist/aria-connector/src/harness-client.js +7 -20
  35. package/dist/aria-connector/src/harness-client.js.map +1 -1
  36. package/dist/aria-connector/src/model-context.d.ts.map +1 -1
  37. package/dist/aria-connector/src/model-context.js +5 -0
  38. package/dist/aria-connector/src/model-context.js.map +1 -1
  39. package/dist/aria-connector/src/providers/types.d.ts +1 -1
  40. package/dist/aria-connector/src/providers/types.d.ts.map +1 -1
  41. package/dist/aria-connector/src/providers/xai.d.ts +3 -0
  42. package/dist/aria-connector/src/providers/xai.d.ts.map +1 -0
  43. package/dist/aria-connector/src/providers/xai.js +40 -0
  44. package/dist/aria-connector/src/providers/xai.js.map +1 -0
  45. package/dist/aria-connector/src/setup-wizard.js +1 -0
  46. package/dist/aria-connector/src/setup-wizard.js.map +1 -1
  47. package/dist/aria-connector/src/types.d.ts +2 -0
  48. package/dist/aria-connector/src/types.d.ts.map +1 -1
  49. package/dist/assets/hooks/aria-cognition-substrate-binding.mjs +51 -9
  50. package/dist/assets/hooks/aria-first-class-coach.mjs +129 -0
  51. package/dist/assets/hooks/aria-harness-via-sdk.mjs +33 -6
  52. package/dist/assets/hooks/aria-pre-tool-gate.mjs +33 -8
  53. package/dist/assets/hooks/aria-preprompt-consult.mjs +5 -6
  54. package/dist/assets/hooks/aria-preturn-memory-gate.mjs +5 -0
  55. package/dist/assets/hooks/aria-repo-doctrine-gate.mjs +15 -0
  56. package/dist/assets/hooks/aria-stop-gate.mjs +125 -17
  57. package/dist/assets/hooks/doctrine_trigger_map.json +11 -0
  58. package/dist/assets/hooks/lib/emergency-gateoff-impl.mjs +39 -0
  59. package/dist/assets/hooks/lib/emergency-gateoff.mjs +6 -0
  60. package/dist/assets/hooks/lib/first-class-coach.mjs +755 -0
  61. package/dist/assets/hooks/lib/skill-autoload-gate-impl.mjs +103 -0
  62. package/dist/assets/hooks/lib/skill-autoload-gate.mjs +1 -14
  63. package/dist/assets/opencode-plugins/harness-context/auth-token.mjs +126 -0
  64. package/dist/assets/opencode-plugins/harness-context/inject-context.mjs +62 -22
  65. package/dist/assets/opencode-plugins/harness-context/task-project-ledger.mjs +290 -0
  66. package/dist/assets/opencode-plugins/harness-gate/index.js +87 -27
  67. package/dist/assets/opencode-plugins/harness-gate/lib/skill-autoload-gate.js +1 -14
  68. package/dist/assets/opencode-plugins/harness-outcome/index.js +29 -24
  69. package/dist/assets/opencode-plugins/harness-stop/index.js +229 -68
  70. package/dist/assets/opencode-plugins/harness-stop/lib/skill-autoload-gate.js +1 -14
  71. package/dist/runtime/auth-token.mjs +121 -0
  72. package/dist/runtime/coach-kernel.mjs +371 -0
  73. package/dist/runtime/codex-bridge.mjs +440 -69
  74. package/dist/runtime/discipline/doctrine_trigger_map.json +11 -0
  75. package/dist/runtime/discipline/skills/aria-cognition/aria-essence/SKILL.md +18 -0
  76. package/dist/runtime/discipline/skills/aria-cognition/aria-forge-guardrails/SKILL.md +18 -0
  77. package/dist/runtime/discipline/skills/aria-cognition/aria-repo-doctrine/SKILL.md +18 -0
  78. package/dist/runtime/discipline/skills/aria-cognition/forge-quality-rules/SKILL.md +18 -0
  79. package/dist/runtime/discipline/skills/aria-cognition/ghazali-8lens/SKILL.md +18 -0
  80. package/dist/runtime/discipline/skills/aria-cognition/istiqra-induction/SKILL.md +18 -0
  81. package/dist/runtime/discipline/skills/aria-cognition/ladunni-22/SKILL.md +18 -0
  82. package/dist/runtime/discipline/skills/aria-cognition/mizan/SKILL.md +18 -0
  83. package/dist/runtime/discipline/skills/aria-cognition/nadia/SKILL.md +18 -0
  84. package/dist/runtime/discipline/skills/aria-cognition/nadia-psi/SKILL.md +18 -0
  85. package/dist/runtime/discipline/skills/aria-cognition/predictor/SKILL.md +18 -0
  86. package/dist/runtime/discipline/skills/aria-cognition/qiyas-analogy/SKILL.md +18 -0
  87. package/dist/runtime/discipline/skills/aria-cognition/soul-domains/SKILL.md +18 -0
  88. package/dist/runtime/discipline/skills/aria-harness/aria-aristotle-intra-phase/SKILL.md +18 -0
  89. package/dist/runtime/discipline/skills/aria-harness/aria-aristotle-post-phase/SKILL.md +18 -0
  90. package/dist/runtime/discipline/skills/aria-harness/aria-aristotle-pre-phase/SKILL.md +18 -0
  91. package/dist/runtime/discipline/skills/aria-harness/aria-harness-deploy/SKILL.md +18 -0
  92. package/dist/runtime/discipline/skills/aria-harness/aria-harness-no-stripping/SKILL.md +18 -0
  93. package/dist/runtime/discipline/skills/aria-harness/aria-harness-onboarding/SKILL.md +18 -0
  94. package/dist/runtime/discipline/skills/aria-harness/aria-harness-output-discipline/SKILL.md +18 -0
  95. package/dist/runtime/discipline/skills/aria-harness/aria-harness-substrate-binding/SKILL.md +18 -0
  96. package/dist/runtime/doctrine_trigger_map.json +11 -0
  97. package/dist/runtime/hooks/aria-cognition-substrate-binding.mjs +51 -9
  98. package/dist/runtime/hooks/aria-first-class-coach.mjs +129 -0
  99. package/dist/runtime/hooks/aria-harness-via-sdk.mjs +33 -6
  100. package/dist/runtime/hooks/aria-pre-tool-gate.mjs +33 -8
  101. package/dist/runtime/hooks/aria-preprompt-consult.mjs +5 -6
  102. package/dist/runtime/hooks/aria-preturn-memory-gate.mjs +5 -0
  103. package/dist/runtime/hooks/aria-repo-doctrine-gate.mjs +15 -0
  104. package/dist/runtime/hooks/aria-stop-gate.mjs +125 -17
  105. package/dist/runtime/hooks/doctrine_trigger_map.json +11 -0
  106. package/dist/runtime/hooks/lib/emergency-gateoff-impl.mjs +39 -0
  107. package/dist/runtime/hooks/lib/emergency-gateoff.mjs +6 -0
  108. package/dist/runtime/hooks/lib/first-class-coach.mjs +755 -0
  109. package/dist/runtime/hooks/lib/skill-autoload-gate-impl.mjs +103 -0
  110. package/dist/runtime/hooks/lib/skill-autoload-gate.mjs +1 -14
  111. package/dist/runtime/local-phase.mjs +8 -0
  112. package/dist/runtime/manifest.json +2 -2
  113. package/dist/runtime/provider-proxy.mjs +136 -33
  114. package/dist/runtime/sdk/BUNDLED.json +2 -2
  115. package/dist/runtime/sdk/auth.d.ts +17 -0
  116. package/dist/runtime/sdk/auth.js +158 -0
  117. package/dist/runtime/sdk/auth.js.map +1 -0
  118. package/dist/runtime/sdk/index.d.ts +8 -1
  119. package/dist/runtime/sdk/index.js +15 -1
  120. package/dist/runtime/sdk/index.js.map +1 -1
  121. package/dist/runtime/service.mjs +1711 -74
  122. package/dist/runtime/task-project-ledger.mjs +290 -0
  123. package/dist/sdk/BUNDLED.json +2 -2
  124. package/dist/sdk/auth.d.ts +17 -0
  125. package/dist/sdk/auth.js +158 -0
  126. package/dist/sdk/auth.js.map +1 -0
  127. package/dist/sdk/index.d.ts +8 -1
  128. package/dist/sdk/index.js +15 -1
  129. package/dist/sdk/index.js.map +1 -1
  130. package/hooks/aria-cognition-substrate-binding.mjs +51 -9
  131. package/hooks/aria-first-class-coach.mjs +129 -0
  132. package/hooks/aria-harness-via-sdk.mjs +33 -6
  133. package/hooks/aria-pre-tool-gate.mjs +33 -8
  134. package/hooks/aria-preprompt-consult.mjs +5 -6
  135. package/hooks/aria-preturn-memory-gate.mjs +5 -0
  136. package/hooks/aria-repo-doctrine-gate.mjs +15 -0
  137. package/hooks/aria-stop-gate.mjs +125 -17
  138. package/hooks/doctrine_trigger_map.json +11 -0
  139. package/hooks/lib/emergency-gateoff-impl.mjs +39 -0
  140. package/hooks/lib/emergency-gateoff.mjs +6 -0
  141. package/hooks/lib/first-class-coach.mjs +755 -0
  142. package/hooks/lib/skill-autoload-gate-impl.mjs +103 -0
  143. package/hooks/lib/skill-autoload-gate.mjs +1 -14
  144. package/opencode-plugins/harness-context/auth-token.mjs +126 -0
  145. package/opencode-plugins/harness-context/inject-context.mjs +62 -22
  146. package/opencode-plugins/harness-context/task-project-ledger.mjs +290 -0
  147. package/opencode-plugins/harness-gate/index.js +87 -27
  148. package/opencode-plugins/harness-gate/lib/skill-autoload-gate.js +1 -14
  149. package/opencode-plugins/harness-outcome/index.js +29 -24
  150. package/opencode-plugins/harness-stop/index.js +229 -68
  151. package/opencode-plugins/harness-stop/lib/skill-autoload-gate.js +1 -14
  152. package/package.json +8 -2
  153. package/runtime-src/auth-token.mjs +121 -0
  154. package/runtime-src/coach-kernel.mjs +371 -0
  155. package/runtime-src/codex-bridge.mjs +440 -69
  156. package/runtime-src/local-phase.mjs +8 -0
  157. package/runtime-src/provider-proxy.mjs +136 -33
  158. package/runtime-src/service.mjs +1711 -74
  159. package/scripts/bundle-sdk.mjs +8 -0
  160. package/scripts/check-client-compatibility.mjs +422 -0
  161. package/scripts/check-coach-kernel.mjs +204 -0
  162. package/scripts/check-managed-runtime-ledger.mjs +107 -0
  163. package/scripts/check-opencode-config-contract.mjs +78 -0
  164. package/scripts/check-quality-ledger.mjs +121 -0
  165. package/scripts/self-test-harness-gates.mjs +179 -11
  166. package/scripts/self-test-repo-guard.mjs +38 -0
  167. package/scripts/validate-skill-prompts.mjs +14 -1
  168. package/skills/aria-cognition/aria-essence/SKILL.md +18 -0
  169. package/skills/aria-cognition/aria-forge-guardrails/SKILL.md +18 -0
  170. package/skills/aria-cognition/aria-repo-doctrine/SKILL.md +18 -0
  171. package/skills/aria-cognition/forge-quality-rules/SKILL.md +18 -0
  172. package/skills/aria-cognition/ghazali-8lens/SKILL.md +18 -0
  173. package/skills/aria-cognition/istiqra-induction/SKILL.md +18 -0
  174. package/skills/aria-cognition/ladunni-22/SKILL.md +18 -0
  175. package/skills/aria-cognition/mizan/SKILL.md +18 -0
  176. package/skills/aria-cognition/nadia/SKILL.md +18 -0
  177. package/skills/aria-cognition/nadia-psi/SKILL.md +18 -0
  178. package/skills/aria-cognition/predictor/SKILL.md +18 -0
  179. package/skills/aria-cognition/qiyas-analogy/SKILL.md +18 -0
  180. package/skills/aria-cognition/soul-domains/SKILL.md +18 -0
  181. package/src/auth.ts +136 -1
  182. package/src/chat.ts +13 -8
  183. package/src/config.ts +6 -1
  184. package/src/connectors/claude-code.ts +62 -18
  185. package/src/connectors/codex.ts +308 -10
  186. package/src/connectors/opencode.ts +35 -12
  187. package/src/connectors/repo-guard.ts +117 -172
  188. package/src/connectors/runtime.ts +19 -7
  189. package/src/connectors/shell.ts +12 -8
  190. package/src/harness-client.ts +8 -22
  191. package/src/model-context.ts +6 -0
  192. package/src/providers/types.ts +1 -1
  193. package/src/providers/xai.ts +55 -0
  194. package/src/setup-wizard.ts +1 -0
  195. package/src/types.ts +2 -0
@@ -0,0 +1,290 @@
1
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, appendFileSync } from 'node:fs';
2
+ import { createHash } from 'node:crypto';
3
+ import { homedir } from 'node:os';
4
+ import { basename, dirname, join } from 'node:path';
5
+
6
+ export const TASK_PROJECT_LEDGER_VERSION = 'aria.task_project_ledger.v1';
7
+
8
+ const CLAIM_RX = /\b(?:first[- ]class|production[- ]ready|ready|complete|completed|done|verified|gold[- ]standard|shipped|fixed|landed)\b/i;
9
+ const MAX_LEDGER_EVENTS = 500;
10
+
11
+ export const TASK_PROJECT_QUALITY_GATES = [
12
+ { id: 'ledger_created', readinessRequired: true, description: 'A durable task/project ledger exists before work proceeds.' },
13
+ { id: 'intent_boundary', readinessRequired: true, description: 'The ledger records what task or project is being attempted.' },
14
+ { id: 'scope_boundary', readinessRequired: true, description: 'The ledger records platform and phase boundaries.' },
15
+ { id: 'execution_trace', readinessRequired: false, description: 'The ledger records execution, tool, workflow, or background events.' },
16
+ { id: 'verification_trace', readinessRequired: true, description: 'The ledger records real verification evidence before completion/readiness claims.' },
17
+ { id: 'post_turn_writeback', readinessRequired: false, description: 'The ledger records post-turn or outcome writeback.' },
18
+ { id: 'final_claim_guard', readinessRequired: true, description: 'The ledger guards final claims against missing evidence.' },
19
+ ];
20
+
21
+ function stableHash(value = '') {
22
+ return createHash('sha256').update(String(value || 'unknown')).digest('hex').slice(0, 20);
23
+ }
24
+
25
+ function firstString(...values) {
26
+ for (const value of values) {
27
+ if (typeof value === 'string' && value.trim()) return value.trim();
28
+ if (typeof value === 'number' && Number.isFinite(value)) return String(value);
29
+ }
30
+ return '';
31
+ }
32
+
33
+ function compactHint(value = '') {
34
+ const raw = String(value || '').trim();
35
+ if (!raw) return 'unknown';
36
+ const tail = raw.includes('/') ? basename(raw) : raw;
37
+ return tail.replace(/[^a-zA-Z0-9._-]+/g, '-').slice(0, 80) || 'unknown';
38
+ }
39
+
40
+ function readJsonFile(path) {
41
+ try {
42
+ if (!existsSync(path)) return null;
43
+ return JSON.parse(readFileSync(path, 'utf8'));
44
+ } catch {
45
+ return null;
46
+ }
47
+ }
48
+
49
+ function writeJsonAtomic(path, value) {
50
+ mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
51
+ const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
52
+ writeFileSync(tmp, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 });
53
+ renameSync(tmp, path);
54
+ }
55
+
56
+ function markGate(ledger, gateId, status, evidence = undefined) {
57
+ const gate = ledger.qualityGates?.[gateId];
58
+ if (!gate) return;
59
+ if (gate.status === 'passed' && status !== 'blocked') return;
60
+ gate.status = status;
61
+ gate.updatedAt = ledger.updatedAt;
62
+ if (evidence) gate.evidence = evidence;
63
+ }
64
+
65
+ function hasPromptIntent(event = {}) {
66
+ return Boolean(firstString(
67
+ event.prompt,
68
+ event.userPrompt,
69
+ event.user_input,
70
+ event.message,
71
+ event.text,
72
+ event.body,
73
+ event.sessionID,
74
+ event.sessionId,
75
+ event.context?.prompt,
76
+ event.context?.bodyForAgent
77
+ ));
78
+ }
79
+
80
+ function hasVerificationEvidence(evidence = {}, event = {}) {
81
+ if (evidence.warning_clean === true || evidence.verification === true || evidence.validation_run === true) return true;
82
+ if (event.verified === true || event.validation?.ok === true || event.test?.ok === true) return true;
83
+ const text = firstString(event.verification, event.validation, event.testResult, event.commandResult, evidence.commandResult, evidence.outputPreview);
84
+ return /\b(?:ok|passed|pass|success|succeeded|exit\s*0|0\s*failures?)\b/i.test(text);
85
+ }
86
+
87
+ function isExecutionPhase(phase = '') {
88
+ return ['pre_tool', 'post_tool', 'background_worker', 'task_record', 'task_flow', 'lobster_run', 'approval_resume'].includes(phase);
89
+ }
90
+
91
+ function isPostTurnPhase(phase = '') {
92
+ return ['post_turn', 'outcome_writeback', 'decision_log'].includes(phase);
93
+ }
94
+
95
+ export function taskProjectLedgerRoot(env = process.env) {
96
+ return env.ARIA_TASK_PROJECT_LEDGER_DIR || join(homedir(), '.aria', 'task-project-ledgers');
97
+ }
98
+
99
+ export function resolveTaskProjectIdentity(event = {}, env = process.env) {
100
+ const projectRaw = firstString(
101
+ env.ARIA_PROJECT_ID,
102
+ event.projectId,
103
+ event.project_id,
104
+ event.project,
105
+ event.workspaceDir,
106
+ event.workspace_dir,
107
+ event.cwd,
108
+ event.currentWorkingDirectory,
109
+ event.context?.workspaceDir,
110
+ env.PWD,
111
+ process.cwd()
112
+ );
113
+ const taskRaw = firstString(
114
+ env.ARIA_TASK_ID,
115
+ event.taskId,
116
+ event.task_id,
117
+ event.sessionID,
118
+ event.session_id,
119
+ event.sessionId,
120
+ event.sessionKey,
121
+ event.conversationId,
122
+ event.threadId,
123
+ event.messageId,
124
+ event.transcript_path,
125
+ event.prompt,
126
+ event.message,
127
+ projectRaw
128
+ );
129
+ const projectHash = stableHash(projectRaw || 'unknown-project');
130
+ const taskHash = stableHash(`${projectHash}:${taskRaw || 'unknown-task'}`);
131
+ return {
132
+ projectHash,
133
+ taskHash,
134
+ projectHint: compactHint(projectRaw),
135
+ taskHint: compactHint(taskRaw),
136
+ };
137
+ }
138
+
139
+ export function taskProjectLedgerPaths(identity, env = process.env) {
140
+ const dir = join(taskProjectLedgerRoot(env), identity.projectHash);
141
+ return {
142
+ dir,
143
+ ledgerPath: join(dir, `${identity.taskHash}.json`),
144
+ eventPath: join(dir, `${identity.taskHash}.events.jsonl`),
145
+ };
146
+ }
147
+
148
+ function createTaskProjectLedger(identity, now) {
149
+ const qualityGates = Object.fromEntries(TASK_PROJECT_QUALITY_GATES.map((gate) => [
150
+ gate.id,
151
+ {
152
+ status: gate.id === 'ledger_created' || gate.id === 'final_claim_guard' ? 'passed' : 'pending',
153
+ description: gate.description,
154
+ readinessRequired: gate.readinessRequired,
155
+ updatedAt: now,
156
+ },
157
+ ]));
158
+ return {
159
+ schema: `${TASK_PROJECT_LEDGER_VERSION}.ledger`,
160
+ version: TASK_PROJECT_LEDGER_VERSION,
161
+ ledgerId: `tpl_${identity.projectHash}_${identity.taskHash}`,
162
+ createdAt: now,
163
+ updatedAt: now,
164
+ status: 'active',
165
+ identity,
166
+ controls: {
167
+ readinessClaimAllowed: false,
168
+ readinessClaimRule: 'Completion/readiness claims require all readinessRequired quality gates to pass and no open blockers.',
169
+ },
170
+ qualityGates,
171
+ phaseEvents: [],
172
+ evidence: [],
173
+ openBlockers: [],
174
+ blockedClaims: [],
175
+ };
176
+ }
177
+
178
+ export function readinessMissingGates(ledger = {}) {
179
+ const qualityGates = ledger.qualityGates || {};
180
+ return TASK_PROJECT_QUALITY_GATES
181
+ .filter((gate) => gate.readinessRequired)
182
+ .filter((gate) => qualityGates[gate.id]?.status !== 'passed' && qualityGates[gate.id]?.status !== 'not_applicable')
183
+ .map((gate) => gate.id);
184
+ }
185
+
186
+ export function updateTaskProjectLedger({ platform, phase, source = 'task-project-ledger', event = {}, evidence = {}, env = process.env } = {}) {
187
+ const now = new Date().toISOString();
188
+ const identity = resolveTaskProjectIdentity(event, env);
189
+ const paths = taskProjectLedgerPaths(identity, env);
190
+ const existing = readJsonFile(paths.ledgerPath);
191
+ const ledger = existing?.schema === `${TASK_PROJECT_LEDGER_VERSION}.ledger`
192
+ ? existing
193
+ : createTaskProjectLedger(identity, now);
194
+
195
+ ledger.updatedAt = now;
196
+ ledger.qualityGates = ledger.qualityGates || {};
197
+ for (const gate of TASK_PROJECT_QUALITY_GATES) {
198
+ if (!ledger.qualityGates[gate.id]) {
199
+ ledger.qualityGates[gate.id] = {
200
+ status: 'pending',
201
+ description: gate.description,
202
+ readinessRequired: gate.readinessRequired,
203
+ updatedAt: now,
204
+ };
205
+ }
206
+ }
207
+
208
+ markGate(ledger, 'ledger_created', 'passed', { ledgerPath: paths.ledgerPath });
209
+ if (hasPromptIntent(event) || phase === 'pre_prompt_injection' || phase === 'session_start') markGate(ledger, 'intent_boundary', 'passed', { source, phase });
210
+ if (platform && phase && phase !== 'unknown') markGate(ledger, 'scope_boundary', 'passed', { platform, phase });
211
+ if (isExecutionPhase(phase)) markGate(ledger, 'execution_trace', 'passed', { platform, phase, source });
212
+ if (hasVerificationEvidence(evidence, event)) markGate(ledger, 'verification_trace', 'passed', { source, phase });
213
+ if (isPostTurnPhase(phase)) markGate(ledger, 'post_turn_writeback', 'passed', { platform, phase, source });
214
+ markGate(ledger, 'final_claim_guard', 'passed', { source: 'task_project_ledger_claim_guard' });
215
+
216
+ const row = {
217
+ at: now,
218
+ platform: platform || 'unknown',
219
+ phase: phase || 'unknown',
220
+ source,
221
+ evidence,
222
+ };
223
+ ledger.phaseEvents = Array.isArray(ledger.phaseEvents) ? ledger.phaseEvents : [];
224
+ ledger.phaseEvents.push(row);
225
+ if (ledger.phaseEvents.length > MAX_LEDGER_EVENTS) ledger.phaseEvents = ledger.phaseEvents.slice(-MAX_LEDGER_EVENTS);
226
+ if (Object.keys(evidence || {}).length > 0) {
227
+ ledger.evidence = Array.isArray(ledger.evidence) ? ledger.evidence : [];
228
+ ledger.evidence.push({ at: now, source, phase: row.phase, evidence });
229
+ if (ledger.evidence.length > MAX_LEDGER_EVENTS) ledger.evidence = ledger.evidence.slice(-MAX_LEDGER_EVENTS);
230
+ }
231
+
232
+ const missingReadinessGates = readinessMissingGates(ledger);
233
+ ledger.controls = ledger.controls || {};
234
+ ledger.controls.readinessClaimAllowed = missingReadinessGates.length === 0 && (ledger.openBlockers || []).length === 0;
235
+ ledger.controls.missingReadinessGates = missingReadinessGates;
236
+
237
+ writeJsonAtomic(paths.ledgerPath, ledger);
238
+ mkdirSync(dirname(paths.eventPath), { recursive: true, mode: 0o700 });
239
+ appendFileSync(paths.eventPath, `${JSON.stringify({ schema: `${TASK_PROJECT_LEDGER_VERSION}.event`, ledgerId: ledger.ledgerId, ...row })}\n`, { mode: 0o600 });
240
+ return { ledger, paths, identity };
241
+ }
242
+
243
+ export function formatTaskProjectLedgerContext({ ledger, paths, platform = 'unknown', phase = 'unknown' } = {}) {
244
+ const missing = readinessMissingGates(ledger);
245
+ return [
246
+ '--- ARIA TASK/PROJECT LEDGER CONTRACT ---',
247
+ `version: ${TASK_PROJECT_LEDGER_VERSION}`,
248
+ `ledger_id: ${ledger?.ledgerId || 'unknown'}`,
249
+ `platform: ${platform}`,
250
+ `phase: ${phase}`,
251
+ `project_ref: ${ledger?.identity?.projectHint || 'unknown'}`,
252
+ `task_ref: ${ledger?.identity?.taskHint || 'unknown'}`,
253
+ `ledger_event_count: ${Array.isArray(ledger?.phaseEvents) ? ledger.phaseEvents.length : 0}`,
254
+ `readiness_claim_allowed: ${ledger?.controls?.readinessClaimAllowed === true ? 'true' : 'false'}`,
255
+ `missing_readiness_gates: ${missing.length > 0 ? missing.join(', ') : 'none'}`,
256
+ `ledger_path: ${paths?.ledgerPath || 'unknown'}`,
257
+ 'required_behavior: create/update this ledger for every task and project; use it as the controlling anti-drift artifact before tool use, final claims, and long-running handoff.',
258
+ 'claim_rule: do not say done/complete/ready/verified/fixed/shipped unless this ledger has verification evidence and no open blockers.',
259
+ 'quality_rule: every phase must preserve intent, scope, evidence, verification, recovery, and post-turn writeback where applicable.',
260
+ '--- /ARIA TASK/PROJECT LEDGER CONTRACT ---',
261
+ ].join('\n');
262
+ }
263
+
264
+ export function evaluateTaskProjectClaim({ text = '', ledger = {} } = {}) {
265
+ const claim = CLAIM_RX.test(String(text || ''));
266
+ if (!claim) return { ok: true, claim: false, missingReadinessGates: [], openBlockers: [] };
267
+ const missingReadinessGates = readinessMissingGates(ledger);
268
+ const openBlockers = Array.isArray(ledger.openBlockers) ? ledger.openBlockers : [];
269
+ return {
270
+ ok: missingReadinessGates.length === 0 && openBlockers.length === 0 && ledger.controls?.readinessClaimAllowed === true,
271
+ claim: true,
272
+ missingReadinessGates,
273
+ openBlockers,
274
+ };
275
+ }
276
+
277
+ export function recordBlockedTaskProjectClaim({ ledger, paths, text, evaluation } = {}) {
278
+ if (!ledger || !paths?.ledgerPath) return null;
279
+ const now = new Date().toISOString();
280
+ ledger.blockedClaims = Array.isArray(ledger.blockedClaims) ? ledger.blockedClaims : [];
281
+ ledger.blockedClaims.push({
282
+ at: now,
283
+ textHash: stableHash(text || ''),
284
+ missingReadinessGates: evaluation?.missingReadinessGates || [],
285
+ openBlockerCount: evaluation?.openBlockers?.length || 0,
286
+ });
287
+ ledger.updatedAt = now;
288
+ writeJsonAtomic(paths.ledgerPath, ledger);
289
+ return ledger.blockedClaims[ledger.blockedClaims.length - 1];
290
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "bundledAt": "2026-05-03T03:55:56.398Z",
2
+ "bundledAt": "2026-05-04T03:02:47.924Z",
3
3
  "sdkSource": "/home/hamzaibrahim1/rei-ai-brain/harness/packages/harness-http-client/dist",
4
- "files": 9
4
+ "files": 12
5
5
  }
@@ -0,0 +1,17 @@
1
+ export type HarnessAuthTokenSource = 'explicit' | 'env:ARIA_HARNESS_TOKEN' | 'env:ARIA_API_KEY' | 'env:ARIA_MASTER_TOKEN' | 'persisted-client-token' | 'owner-token-file' | 'license:harnessToken' | 'license:token' | 'missing';
2
+ export interface HarnessAuthResolutionOptions {
3
+ explicitToken?: string | null;
4
+ baseUrl?: string;
5
+ clientId?: string;
6
+ tokenScope?: string;
7
+ persistToken?: boolean;
8
+ }
9
+ export interface HarnessAuthResolution {
10
+ token: string;
11
+ source: HarnessAuthTokenSource;
12
+ scope: string;
13
+ persisted: boolean;
14
+ tokenPresent: boolean;
15
+ }
16
+ export declare function resolveHarnessAuthToken(options?: HarnessAuthResolutionOptions): HarnessAuthResolution;
17
+ export declare function getHarnessAuthStatus(options?: HarnessAuthResolutionOptions): Omit<HarnessAuthResolution, 'token'>;
@@ -0,0 +1,158 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ const ARIA_DIR = join(homedir(), '.aria');
6
+ const CLIENT_TOKEN_DIR = join(ARIA_DIR, 'harness-tokens');
7
+ const OWNER_TOKEN_PATH = join(ARIA_DIR, 'owner-token');
8
+ const LICENSE_PATH = join(ARIA_DIR, 'license.json');
9
+ function nonEmpty(value) {
10
+ return typeof value === 'string' && value.trim() ? value.trim() : '';
11
+ }
12
+ function parseJsonFile(path) {
13
+ try {
14
+ if (!existsSync(path))
15
+ return null;
16
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
17
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
18
+ ? parsed
19
+ : null;
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ function readTextFile(path) {
26
+ try {
27
+ if (!existsSync(path))
28
+ return '';
29
+ return readFileSync(path, 'utf8').trim();
30
+ }
31
+ catch {
32
+ return '';
33
+ }
34
+ }
35
+ function hasExplicitClientScope(options) {
36
+ return Boolean(nonEmpty(options.clientId) || nonEmpty(options.tokenScope));
37
+ }
38
+ function scopeFromBaseUrl(baseUrl) {
39
+ try {
40
+ const parsed = new URL(baseUrl);
41
+ const material = `${parsed.protocol}//${parsed.host}`;
42
+ return `base-${createHash('sha256').update(material).digest('hex').slice(0, 16)}`;
43
+ }
44
+ catch {
45
+ return 'default';
46
+ }
47
+ }
48
+ function sanitizeScope(value) {
49
+ const clean = value.trim().replace(/[^a-zA-Z0-9._-]/g, '_').slice(0, 96);
50
+ return clean || 'default';
51
+ }
52
+ function inferScope(options, license) {
53
+ const explicit = nonEmpty(options.tokenScope) || nonEmpty(options.clientId);
54
+ if (explicit)
55
+ return sanitizeScope(explicit);
56
+ const envScope = nonEmpty(process.env.ARIA_HARNESS_CLIENT_ID) ||
57
+ nonEmpty(process.env.ARIA_CLIENT_ID) ||
58
+ nonEmpty(process.env.ARIA_TENANT_ID);
59
+ if (envScope)
60
+ return sanitizeScope(envScope);
61
+ const licenseScope = nonEmpty(license?.jti) || nonEmpty(license?.sub);
62
+ if (licenseScope)
63
+ return sanitizeScope(licenseScope);
64
+ return sanitizeScope(scopeFromBaseUrl(nonEmpty(options.baseUrl)));
65
+ }
66
+ function persistedPath(scope) {
67
+ return join(CLIENT_TOKEN_DIR, `${sanitizeScope(scope)}.json`);
68
+ }
69
+ function readPersistedToken(scope) {
70
+ const parsed = parseJsonFile(persistedPath(scope));
71
+ return nonEmpty(parsed?.token);
72
+ }
73
+ function persistClientToken(scope, token, source) {
74
+ if (!token)
75
+ return false;
76
+ try {
77
+ mkdirSync(CLIENT_TOKEN_DIR, { recursive: true, mode: 0o700 });
78
+ writeFileSync(persistedPath(scope), `${JSON.stringify({ scope, token, source, updatedAt: new Date().toISOString() }, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
79
+ return true;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ function tokenFromEnv() {
86
+ const harness = nonEmpty(process.env.ARIA_HARNESS_TOKEN);
87
+ if (harness)
88
+ return { token: harness, source: 'env:ARIA_HARNESS_TOKEN' };
89
+ const api = nonEmpty(process.env.ARIA_API_KEY);
90
+ if (api)
91
+ return { token: api, source: 'env:ARIA_API_KEY' };
92
+ const master = nonEmpty(process.env.ARIA_MASTER_TOKEN);
93
+ if (master)
94
+ return { token: master, source: 'env:ARIA_MASTER_TOKEN' };
95
+ return { token: '', source: 'missing' };
96
+ }
97
+ function tokenFromLicense(license) {
98
+ const harness = nonEmpty(license?.harnessToken);
99
+ if (harness)
100
+ return { token: harness, source: 'license:harnessToken' };
101
+ const token = nonEmpty(license?.token);
102
+ if (token)
103
+ return { token, source: 'license:token' };
104
+ return { token: '', source: 'missing' };
105
+ }
106
+ export function resolveHarnessAuthToken(options = {}) {
107
+ const license = parseJsonFile(LICENSE_PATH);
108
+ const scope = inferScope(options, license);
109
+ const persistToken = options.persistToken !== false;
110
+ const explicitToken = nonEmpty(options.explicitToken);
111
+ if (explicitToken) {
112
+ const persisted = persistToken ? persistClientToken(scope, explicitToken, 'explicit') : false;
113
+ return { token: explicitToken, source: 'explicit', scope, persisted, tokenPresent: true };
114
+ }
115
+ const env = tokenFromEnv();
116
+ if (env.token) {
117
+ const persisted = persistToken ? persistClientToken(scope, env.token, env.source) : false;
118
+ return { token: env.token, source: env.source, scope, persisted, tokenPresent: true };
119
+ }
120
+ const persistedToken = readPersistedToken(scope);
121
+ if (persistedToken) {
122
+ return {
123
+ token: persistedToken,
124
+ source: 'persisted-client-token',
125
+ scope,
126
+ persisted: true,
127
+ tokenPresent: true,
128
+ };
129
+ }
130
+ if (!hasExplicitClientScope(options) || process.env.ARIA_ALLOW_OWNER_TOKEN_FOR_CLIENT_SCOPE === 'true') {
131
+ const ownerToken = readTextFile(OWNER_TOKEN_PATH);
132
+ if (ownerToken) {
133
+ return {
134
+ token: ownerToken,
135
+ source: 'owner-token-file',
136
+ scope,
137
+ persisted: false,
138
+ tokenPresent: true,
139
+ };
140
+ }
141
+ }
142
+ const licensed = tokenFromLicense(license);
143
+ if (licensed.token) {
144
+ return {
145
+ token: licensed.token,
146
+ source: licensed.source,
147
+ scope,
148
+ persisted: false,
149
+ tokenPresent: true,
150
+ };
151
+ }
152
+ return { token: '', source: 'missing', scope, persisted: false, tokenPresent: false };
153
+ }
154
+ export function getHarnessAuthStatus(options = {}) {
155
+ const { token: _token, ...status } = resolveHarnessAuthToken({ ...options, persistToken: false });
156
+ return status;
157
+ }
158
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,13 @@
1
+ import { type HarnessAuthResolution } from './auth.js';
1
2
  export interface HarnessClientConfig {
2
3
  baseUrl: string;
3
- apiKey: string;
4
+ apiKey?: string;
4
5
  harnessPacketUrl?: string;
5
6
  gardenBaseUrl?: string;
6
7
  workspaceRoot?: string;
8
+ clientId?: string;
9
+ tokenScope?: string;
10
+ persistApiKey?: boolean;
7
11
  }
8
12
  export interface OwnerTier {
9
13
  hamza: boolean;
@@ -303,12 +307,14 @@ export declare class HTTPHarnessClient {
303
307
  private readonly harnessPacketUrl;
304
308
  private readonly gardenBaseUrl?;
305
309
  private readonly workspaceRoot;
310
+ private readonly authResolution;
306
311
  private cachedPacket;
307
312
  private packetLastFetched;
308
313
  private readonly packetTtlMs;
309
314
  private preferredBaseUrl;
310
315
  private readonly baseUrlCandidates;
311
316
  constructor(config: HarnessClientConfig);
317
+ getAuthStatus(): Omit<HarnessAuthResolution, 'token'>;
312
318
  private buildBaseUrlCandidates;
313
319
  private isRouteEligibleForBaseFailover;
314
320
  private candidateUrlsFor;
@@ -533,5 +539,6 @@ export declare const harness: {
533
539
  };
534
540
  export declare function bindingContext(role: string, sessionId: string, stage: string, intendedAction: string, rationale: string): HarnessBindingContext;
535
541
  export declare function getBoundHarnessAndPrompt(context: HarnessBindingContext, plan?: Partial<HarnessPlan>, client?: HTTPHarnessClient): Promise<BoundHarnessPromptResult>;
542
+ export * from './auth.js';
536
543
  export * from './runWithCognition.js';
537
544
  export * from './runWithGovernance.js';
package/dist/sdk/index.js CHANGED
@@ -3,6 +3,7 @@ import { existsSync, readFileSync, statSync } from 'node:fs';
3
3
  import { homedir as _homedir } from 'node:os';
4
4
  import { resolve, isAbsolute } from 'node:path';
5
5
  import { createHash, randomUUID } from 'node:crypto';
6
+ import { resolveHarnessAuthToken } from './auth.js';
6
7
  const CLOUD_RUN_SOUL_URL = 'https://arias-soul-6zp3gtk2ca-uc.a.run.app';
7
8
  const PUBLIC_HARNESS_URL = 'https://harness.ariasos.com';
8
9
  const LOCAL_HARNESS_CANDIDATES = [
@@ -89,6 +90,7 @@ export class HTTPHarnessClient {
89
90
  harnessPacketUrl;
90
91
  gardenBaseUrl;
91
92
  workspaceRoot;
93
+ authResolution;
92
94
  cachedPacket = null;
93
95
  packetLastFetched = 0;
94
96
  packetTtlMs = 60_000;
@@ -96,7 +98,14 @@ export class HTTPHarnessClient {
96
98
  baseUrlCandidates;
97
99
  constructor(config) {
98
100
  this.baseUrl = config.baseUrl.replace(/\/+$/, '');
99
- this.apiKey = config.apiKey;
101
+ this.authResolution = resolveHarnessAuthToken({
102
+ explicitToken: config.apiKey,
103
+ baseUrl: this.baseUrl,
104
+ clientId: config.clientId,
105
+ tokenScope: config.tokenScope,
106
+ persistToken: config.persistApiKey !== false,
107
+ });
108
+ this.apiKey = this.authResolution.token;
100
109
  this.harnessPacketUrl = config.harnessPacketUrl ?? (isMountedRuntimeBaseUrl(this.baseUrl)
101
110
  ? `${this.baseUrl}/packet`
102
111
  : `${this.baseUrl}/api/harness/codex`);
@@ -113,6 +122,10 @@ export class HTTPHarnessClient {
113
122
  // TTL is 5 min (matches handoff TTL). Stale packets trigger normal fetch.
114
123
  this._tryLoadDiskPacket();
115
124
  }
125
+ getAuthStatus() {
126
+ const { token: _token, ...status } = this.authResolution;
127
+ return status;
128
+ }
116
129
  buildBaseUrlCandidates(primaryBaseUrl) {
117
130
  const envFallbacks = String(process.env.ARIA_HARNESS_FALLBACK_URLS || '')
118
131
  .split(',')
@@ -1709,6 +1722,7 @@ export async function getBoundHarnessAndPrompt(context, plan, client) {
1709
1722
  const sdk = client ?? HTTPHarnessClient.getInstance();
1710
1723
  return sdk.getBoundHarnessAndPrompt(context, plan);
1711
1724
  }
1725
+ export * from './auth.js';
1712
1726
  export * from './runWithCognition.js';
1713
1727
  export * from './runWithGovernance.js';
1714
1728
  //# sourceMappingURL=index.js.map