@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.
- package/CLIENT-ONBOARDING.md +4 -2
- package/bin/aria.js +11 -7
- package/dist/aria-connector/src/auth.d.ts +14 -0
- package/dist/aria-connector/src/auth.d.ts.map +1 -1
- package/dist/aria-connector/src/auth.js +103 -1
- package/dist/aria-connector/src/auth.js.map +1 -1
- package/dist/aria-connector/src/chat.d.ts.map +1 -1
- package/dist/aria-connector/src/chat.js +13 -8
- package/dist/aria-connector/src/chat.js.map +1 -1
- package/dist/aria-connector/src/config.d.ts +6 -1
- package/dist/aria-connector/src/config.d.ts.map +1 -1
- package/dist/aria-connector/src/config.js.map +1 -1
- package/dist/aria-connector/src/connectors/claude-code.d.ts.map +1 -1
- package/dist/aria-connector/src/connectors/claude-code.js +50 -6
- package/dist/aria-connector/src/connectors/claude-code.js.map +1 -1
- package/dist/aria-connector/src/connectors/codex.d.ts.map +1 -1
- package/dist/aria-connector/src/connectors/codex.js +310 -10
- package/dist/aria-connector/src/connectors/codex.js.map +1 -1
- package/dist/aria-connector/src/connectors/opencode.d.ts.map +1 -1
- package/dist/aria-connector/src/connectors/opencode.js +35 -11
- package/dist/aria-connector/src/connectors/opencode.js.map +1 -1
- package/dist/aria-connector/src/connectors/repo-guard.d.ts +10 -0
- package/dist/aria-connector/src/connectors/repo-guard.d.ts.map +1 -1
- package/dist/aria-connector/src/connectors/repo-guard.js +110 -164
- package/dist/aria-connector/src/connectors/repo-guard.js.map +1 -1
- package/dist/aria-connector/src/connectors/runtime.d.ts.map +1 -1
- package/dist/aria-connector/src/connectors/runtime.js +17 -7
- package/dist/aria-connector/src/connectors/runtime.js.map +1 -1
- package/dist/aria-connector/src/connectors/shell.d.ts.map +1 -1
- package/dist/aria-connector/src/connectors/shell.js +12 -8
- package/dist/aria-connector/src/connectors/shell.js.map +1 -1
- package/dist/aria-connector/src/harness-client.d.ts +3 -1
- package/dist/aria-connector/src/harness-client.d.ts.map +1 -1
- package/dist/aria-connector/src/harness-client.js +7 -20
- package/dist/aria-connector/src/harness-client.js.map +1 -1
- package/dist/aria-connector/src/model-context.d.ts.map +1 -1
- package/dist/aria-connector/src/model-context.js +5 -0
- package/dist/aria-connector/src/model-context.js.map +1 -1
- package/dist/aria-connector/src/providers/types.d.ts +1 -1
- package/dist/aria-connector/src/providers/types.d.ts.map +1 -1
- package/dist/aria-connector/src/providers/xai.d.ts +3 -0
- package/dist/aria-connector/src/providers/xai.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/xai.js +40 -0
- package/dist/aria-connector/src/providers/xai.js.map +1 -0
- package/dist/aria-connector/src/setup-wizard.js +1 -0
- package/dist/aria-connector/src/setup-wizard.js.map +1 -1
- package/dist/aria-connector/src/types.d.ts +2 -0
- package/dist/aria-connector/src/types.d.ts.map +1 -1
- package/dist/assets/hooks/aria-cognition-substrate-binding.mjs +51 -9
- package/dist/assets/hooks/aria-first-class-coach.mjs +129 -0
- package/dist/assets/hooks/aria-harness-via-sdk.mjs +33 -6
- package/dist/assets/hooks/aria-pre-tool-gate.mjs +33 -8
- package/dist/assets/hooks/aria-preprompt-consult.mjs +5 -6
- package/dist/assets/hooks/aria-preturn-memory-gate.mjs +5 -0
- package/dist/assets/hooks/aria-repo-doctrine-gate.mjs +15 -0
- package/dist/assets/hooks/aria-stop-gate.mjs +125 -17
- package/dist/assets/hooks/doctrine_trigger_map.json +11 -0
- package/dist/assets/hooks/lib/emergency-gateoff-impl.mjs +39 -0
- package/dist/assets/hooks/lib/emergency-gateoff.mjs +6 -0
- package/dist/assets/hooks/lib/first-class-coach.mjs +755 -0
- package/dist/assets/hooks/lib/skill-autoload-gate-impl.mjs +103 -0
- package/dist/assets/hooks/lib/skill-autoload-gate.mjs +1 -14
- package/dist/assets/opencode-plugins/harness-context/auth-token.mjs +126 -0
- package/dist/assets/opencode-plugins/harness-context/inject-context.mjs +62 -22
- package/dist/assets/opencode-plugins/harness-context/task-project-ledger.mjs +290 -0
- package/dist/assets/opencode-plugins/harness-gate/index.js +87 -27
- package/dist/assets/opencode-plugins/harness-gate/lib/skill-autoload-gate.js +1 -14
- package/dist/assets/opencode-plugins/harness-outcome/index.js +29 -24
- package/dist/assets/opencode-plugins/harness-stop/index.js +229 -68
- package/dist/assets/opencode-plugins/harness-stop/lib/skill-autoload-gate.js +1 -14
- package/dist/runtime/auth-token.mjs +121 -0
- package/dist/runtime/coach-kernel.mjs +371 -0
- package/dist/runtime/codex-bridge.mjs +440 -69
- package/dist/runtime/discipline/doctrine_trigger_map.json +11 -0
- package/dist/runtime/discipline/skills/aria-cognition/aria-essence/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-cognition/aria-forge-guardrails/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-cognition/aria-repo-doctrine/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-cognition/forge-quality-rules/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-cognition/ghazali-8lens/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-cognition/istiqra-induction/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-cognition/ladunni-22/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-cognition/mizan/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-cognition/nadia/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-cognition/nadia-psi/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-cognition/predictor/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-cognition/qiyas-analogy/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-cognition/soul-domains/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-aristotle-intra-phase/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-aristotle-post-phase/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-aristotle-pre-phase/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-harness-deploy/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-harness-no-stripping/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-harness-onboarding/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-harness-output-discipline/SKILL.md +18 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-harness-substrate-binding/SKILL.md +18 -0
- package/dist/runtime/doctrine_trigger_map.json +11 -0
- package/dist/runtime/hooks/aria-cognition-substrate-binding.mjs +51 -9
- package/dist/runtime/hooks/aria-first-class-coach.mjs +129 -0
- package/dist/runtime/hooks/aria-harness-via-sdk.mjs +33 -6
- package/dist/runtime/hooks/aria-pre-tool-gate.mjs +33 -8
- package/dist/runtime/hooks/aria-preprompt-consult.mjs +5 -6
- package/dist/runtime/hooks/aria-preturn-memory-gate.mjs +5 -0
- package/dist/runtime/hooks/aria-repo-doctrine-gate.mjs +15 -0
- package/dist/runtime/hooks/aria-stop-gate.mjs +125 -17
- package/dist/runtime/hooks/doctrine_trigger_map.json +11 -0
- package/dist/runtime/hooks/lib/emergency-gateoff-impl.mjs +39 -0
- package/dist/runtime/hooks/lib/emergency-gateoff.mjs +6 -0
- package/dist/runtime/hooks/lib/first-class-coach.mjs +755 -0
- package/dist/runtime/hooks/lib/skill-autoload-gate-impl.mjs +103 -0
- package/dist/runtime/hooks/lib/skill-autoload-gate.mjs +1 -14
- package/dist/runtime/local-phase.mjs +8 -0
- package/dist/runtime/manifest.json +2 -2
- package/dist/runtime/provider-proxy.mjs +136 -33
- package/dist/runtime/sdk/BUNDLED.json +2 -2
- package/dist/runtime/sdk/auth.d.ts +17 -0
- package/dist/runtime/sdk/auth.js +158 -0
- package/dist/runtime/sdk/auth.js.map +1 -0
- package/dist/runtime/sdk/index.d.ts +8 -1
- package/dist/runtime/sdk/index.js +15 -1
- package/dist/runtime/sdk/index.js.map +1 -1
- package/dist/runtime/service.mjs +1711 -74
- package/dist/runtime/task-project-ledger.mjs +290 -0
- package/dist/sdk/BUNDLED.json +2 -2
- package/dist/sdk/auth.d.ts +17 -0
- package/dist/sdk/auth.js +158 -0
- package/dist/sdk/auth.js.map +1 -0
- package/dist/sdk/index.d.ts +8 -1
- package/dist/sdk/index.js +15 -1
- package/dist/sdk/index.js.map +1 -1
- package/hooks/aria-cognition-substrate-binding.mjs +51 -9
- package/hooks/aria-first-class-coach.mjs +129 -0
- package/hooks/aria-harness-via-sdk.mjs +33 -6
- package/hooks/aria-pre-tool-gate.mjs +33 -8
- package/hooks/aria-preprompt-consult.mjs +5 -6
- package/hooks/aria-preturn-memory-gate.mjs +5 -0
- package/hooks/aria-repo-doctrine-gate.mjs +15 -0
- package/hooks/aria-stop-gate.mjs +125 -17
- package/hooks/doctrine_trigger_map.json +11 -0
- package/hooks/lib/emergency-gateoff-impl.mjs +39 -0
- package/hooks/lib/emergency-gateoff.mjs +6 -0
- package/hooks/lib/first-class-coach.mjs +755 -0
- package/hooks/lib/skill-autoload-gate-impl.mjs +103 -0
- package/hooks/lib/skill-autoload-gate.mjs +1 -14
- package/opencode-plugins/harness-context/auth-token.mjs +126 -0
- package/opencode-plugins/harness-context/inject-context.mjs +62 -22
- package/opencode-plugins/harness-context/task-project-ledger.mjs +290 -0
- package/opencode-plugins/harness-gate/index.js +87 -27
- package/opencode-plugins/harness-gate/lib/skill-autoload-gate.js +1 -14
- package/opencode-plugins/harness-outcome/index.js +29 -24
- package/opencode-plugins/harness-stop/index.js +229 -68
- package/opencode-plugins/harness-stop/lib/skill-autoload-gate.js +1 -14
- package/package.json +8 -2
- package/runtime-src/auth-token.mjs +121 -0
- package/runtime-src/coach-kernel.mjs +371 -0
- package/runtime-src/codex-bridge.mjs +440 -69
- package/runtime-src/local-phase.mjs +8 -0
- package/runtime-src/provider-proxy.mjs +136 -33
- package/runtime-src/service.mjs +1711 -74
- package/scripts/bundle-sdk.mjs +8 -0
- package/scripts/check-client-compatibility.mjs +422 -0
- package/scripts/check-coach-kernel.mjs +204 -0
- package/scripts/check-managed-runtime-ledger.mjs +107 -0
- package/scripts/check-opencode-config-contract.mjs +78 -0
- package/scripts/check-quality-ledger.mjs +121 -0
- package/scripts/self-test-harness-gates.mjs +179 -11
- package/scripts/self-test-repo-guard.mjs +38 -0
- package/scripts/validate-skill-prompts.mjs +14 -1
- package/skills/aria-cognition/aria-essence/SKILL.md +18 -0
- package/skills/aria-cognition/aria-forge-guardrails/SKILL.md +18 -0
- package/skills/aria-cognition/aria-repo-doctrine/SKILL.md +18 -0
- package/skills/aria-cognition/forge-quality-rules/SKILL.md +18 -0
- package/skills/aria-cognition/ghazali-8lens/SKILL.md +18 -0
- package/skills/aria-cognition/istiqra-induction/SKILL.md +18 -0
- package/skills/aria-cognition/ladunni-22/SKILL.md +18 -0
- package/skills/aria-cognition/mizan/SKILL.md +18 -0
- package/skills/aria-cognition/nadia/SKILL.md +18 -0
- package/skills/aria-cognition/nadia-psi/SKILL.md +18 -0
- package/skills/aria-cognition/predictor/SKILL.md +18 -0
- package/skills/aria-cognition/qiyas-analogy/SKILL.md +18 -0
- package/skills/aria-cognition/soul-domains/SKILL.md +18 -0
- package/src/auth.ts +136 -1
- package/src/chat.ts +13 -8
- package/src/config.ts +6 -1
- package/src/connectors/claude-code.ts +62 -18
- package/src/connectors/codex.ts +308 -10
- package/src/connectors/opencode.ts +35 -12
- package/src/connectors/repo-guard.ts +117 -172
- package/src/connectors/runtime.ts +19 -7
- package/src/connectors/shell.ts +12 -8
- package/src/harness-client.ts +8 -22
- package/src/model-context.ts +6 -0
- package/src/providers/types.ts +1 -1
- package/src/providers/xai.ts +55 -0
- package/src/setup-wizard.ts +1 -0
- 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
|
+
}
|
package/dist/sdk/BUNDLED.json
CHANGED
|
@@ -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'>;
|
package/dist/sdk/auth.js
ADDED
|
@@ -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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"}
|
package/dist/sdk/index.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import { type HarnessAuthResolution } from './auth.js';
|
|
1
2
|
export interface HarnessClientConfig {
|
|
2
3
|
baseUrl: string;
|
|
3
|
-
apiKey
|
|
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.
|
|
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
|