@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.
- package/CLIENT-ONBOARDING.md +282 -0
- package/bin/aria.js +1140 -14
- package/dist/aria-connector/src/auth-commands.d.ts +1 -0
- package/dist/aria-connector/src/auth-commands.d.ts.map +1 -1
- package/dist/aria-connector/src/auth-commands.js +89 -41
- package/dist/aria-connector/src/auth-commands.js.map +1 -1
- package/dist/aria-connector/src/chat.d.ts +3 -0
- package/dist/aria-connector/src/chat.d.ts.map +1 -1
- package/dist/aria-connector/src/chat.js +146 -8
- package/dist/aria-connector/src/chat.js.map +1 -1
- package/dist/aria-connector/src/codebase-scanner.d.ts +2 -2
- package/dist/aria-connector/src/codebase-scanner.d.ts.map +1 -1
- package/dist/aria-connector/src/codebase-scanner.js +1 -1
- package/dist/aria-connector/src/codebase-scanner.js.map +1 -1
- package/dist/aria-connector/src/config.d.ts +12 -0
- package/dist/aria-connector/src/config.d.ts.map +1 -1
- package/dist/aria-connector/src/config.js +2 -0
- 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 +111 -21
- package/dist/aria-connector/src/connectors/claude-code.js.map +1 -1
- package/dist/aria-connector/src/connectors/codebase-awareness.d.ts +37 -0
- package/dist/aria-connector/src/connectors/codebase-awareness.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/codebase-awareness.js +335 -0
- package/dist/aria-connector/src/connectors/codebase-awareness.js.map +1 -0
- package/dist/aria-connector/src/connectors/codex.d.ts +3 -0
- package/dist/aria-connector/src/connectors/codex.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/codex.js +248 -0
- package/dist/aria-connector/src/connectors/codex.js.map +1 -0
- package/dist/aria-connector/src/connectors/cognitive-skills.d.ts +2 -0
- package/dist/aria-connector/src/connectors/cognitive-skills.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/cognitive-skills.js +47 -0
- package/dist/aria-connector/src/connectors/cognitive-skills.js.map +1 -0
- package/dist/aria-connector/src/connectors/opencode.d.ts.map +1 -1
- package/dist/aria-connector/src/connectors/opencode.js +90 -4
- package/dist/aria-connector/src/connectors/opencode.js.map +1 -1
- package/dist/aria-connector/src/connectors/repo-git-hooks.d.ts +3 -0
- package/dist/aria-connector/src/connectors/repo-git-hooks.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/repo-git-hooks.js +87 -0
- package/dist/aria-connector/src/connectors/repo-git-hooks.js.map +1 -0
- package/dist/aria-connector/src/connectors/repo-guard.d.ts +19 -0
- package/dist/aria-connector/src/connectors/repo-guard.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/repo-guard.js +509 -0
- package/dist/aria-connector/src/connectors/repo-guard.js.map +1 -0
- package/dist/aria-connector/src/connectors/runtime.d.ts +2 -0
- package/dist/aria-connector/src/connectors/runtime.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/runtime.js +330 -0
- package/dist/aria-connector/src/connectors/runtime.js.map +1 -0
- package/dist/aria-connector/src/connectors/shell.d.ts.map +1 -1
- package/dist/aria-connector/src/connectors/shell.js +78 -13
- package/dist/aria-connector/src/connectors/shell.js.map +1 -1
- package/dist/aria-connector/src/connectors/syncd.d.ts +27 -0
- package/dist/aria-connector/src/connectors/syncd.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/syncd.js +405 -0
- package/dist/aria-connector/src/connectors/syncd.js.map +1 -0
- package/dist/aria-connector/src/decisions.d.ts +207 -0
- package/dist/aria-connector/src/decisions.d.ts.map +1 -0
- package/dist/aria-connector/src/decisions.js +291 -0
- package/dist/aria-connector/src/decisions.js.map +1 -0
- package/dist/aria-connector/src/garden-control-plane.d.ts.map +1 -1
- package/dist/aria-connector/src/garden-control-plane.js +74 -17
- package/dist/aria-connector/src/garden-control-plane.js.map +1 -1
- package/dist/aria-connector/src/github-connect.d.ts +18 -0
- package/dist/aria-connector/src/github-connect.d.ts.map +1 -0
- package/dist/aria-connector/src/github-connect.js +117 -0
- package/dist/aria-connector/src/github-connect.js.map +1 -0
- package/dist/aria-connector/src/harness-client.d.ts +15 -0
- package/dist/aria-connector/src/harness-client.d.ts.map +1 -1
- package/dist/aria-connector/src/harness-client.js +106 -3
- package/dist/aria-connector/src/harness-client.js.map +1 -1
- package/dist/aria-connector/src/hive-client.d.ts +30 -0
- package/dist/aria-connector/src/hive-client.d.ts.map +1 -1
- package/dist/aria-connector/src/hive-client.js +124 -5
- package/dist/aria-connector/src/hive-client.js.map +1 -1
- package/dist/aria-connector/src/index.d.ts +13 -2
- package/dist/aria-connector/src/index.d.ts.map +1 -1
- package/dist/aria-connector/src/index.js +10 -1
- package/dist/aria-connector/src/index.js.map +1 -1
- package/dist/aria-connector/src/lib/aristotle-noor-wire.d.ts +102 -0
- package/dist/aria-connector/src/lib/aristotle-noor-wire.d.ts.map +1 -0
- package/dist/aria-connector/src/lib/aristotle-noor-wire.js +231 -0
- package/dist/aria-connector/src/lib/aristotle-noor-wire.js.map +1 -0
- package/dist/aria-connector/src/providers/types.d.ts +5 -0
- package/dist/aria-connector/src/providers/types.d.ts.map +1 -1
- package/dist/aria-connector/src/runtime-proof.d.ts +45 -0
- package/dist/aria-connector/src/runtime-proof.d.ts.map +1 -0
- package/dist/aria-connector/src/runtime-proof.js +340 -0
- package/dist/aria-connector/src/runtime-proof.js.map +1 -0
- package/dist/aria-connector/src/setup-wizard.d.ts.map +1 -1
- package/dist/aria-connector/src/setup-wizard.js +34 -2
- package/dist/aria-connector/src/setup-wizard.js.map +1 -1
- package/dist/assets/hooks/aria-agent-handoff.mjs +224 -0
- package/dist/assets/hooks/aria-agent-ledger-merge.mjs +164 -0
- package/dist/assets/hooks/aria-architect-fallback.mjs +267 -0
- package/dist/assets/hooks/aria-cognition-substrate-binding.mjs +676 -0
- package/dist/assets/hooks/aria-discovery-record.mjs +101 -0
- package/dist/assets/hooks/aria-harness-via-sdk.mjs +412 -0
- package/dist/assets/hooks/aria-import-resolution-gate.mjs +330 -0
- package/dist/assets/hooks/aria-outcome-record.mjs +84 -0
- package/dist/assets/hooks/aria-pre-emit-dryrun.mjs +294 -0
- package/dist/assets/hooks/aria-pre-text-gate.mjs +112 -0
- package/dist/assets/hooks/aria-pre-tool-gate.mjs +2133 -0
- package/dist/assets/hooks/aria-preprompt-consult.mjs +438 -0
- package/dist/assets/hooks/aria-preturn-memory-gate.mjs +570 -0
- package/dist/assets/hooks/aria-repo-doctrine-gate.mjs +397 -0
- package/dist/assets/hooks/aria-stop-gate.mjs +1551 -0
- package/dist/assets/hooks/aria-trigger-autolearn.mjs +229 -0
- package/dist/assets/hooks/aria-userprompt-abandon-detect.mjs +192 -0
- package/dist/assets/hooks/doctrine_trigger_map.json +479 -0
- package/dist/assets/hooks/lib/canonical-lenses.mjs +64 -0
- package/dist/assets/hooks/lib/gate-audit.mjs +43 -0
- package/dist/assets/hooks/test-aria-preturn-memory-gate.mjs +245 -0
- package/dist/assets/hooks/test-tier-lens-labeling.mjs +399 -0
- package/dist/assets/opencode-plugins/harness-context/index.js +60 -0
- package/dist/assets/opencode-plugins/harness-context/inject-context.mjs +179 -0
- package/dist/assets/opencode-plugins/harness-context/package.json +9 -0
- package/dist/assets/opencode-plugins/harness-gate/index.js +248 -0
- package/dist/assets/opencode-plugins/harness-outcome/index.js +129 -0
- package/dist/assets/opencode-plugins/harness-role/index.js +77 -0
- package/dist/assets/opencode-plugins/harness-role/package.json +9 -0
- package/dist/assets/opencode-plugins/harness-stop/index.js +241 -0
- package/dist/runtime/discipline/CLAUDE.md +339 -0
- package/dist/runtime/discipline/skills/aria-cognition/aria-essence/SKILL.md +63 -0
- package/dist/runtime/discipline/skills/aria-cognition/aria-essence/references/domain-matrix.md +80 -0
- package/dist/runtime/discipline/skills/aria-cognition/aria-essence/references/evolution-loop.md +30 -0
- package/dist/runtime/discipline/skills/aria-cognition/aria-essence/references/readable-cognition.md +27 -0
- package/dist/runtime/discipline/skills/aria-cognition/aria-forge-guardrails/SKILL.md +35 -0
- package/dist/runtime/discipline/skills/aria-cognition/aria-forge-guardrails/references/checklist.md +31 -0
- package/dist/runtime/discipline/skills/aria-cognition/aria-repo-doctrine/SKILL.md +39 -0
- package/dist/runtime/discipline/skills/aria-cognition/forge-quality-rules/SKILL.md +43 -0
- package/dist/runtime/discipline/skills/aria-cognition/ghazali-8lens/SKILL.md +38 -0
- package/dist/runtime/discipline/skills/aria-cognition/istiqra-induction/SKILL.md +26 -0
- package/dist/runtime/discipline/skills/aria-cognition/ladunni-22/SKILL.md +35 -0
- package/dist/runtime/discipline/skills/aria-cognition/mizan/SKILL.md +72 -0
- package/dist/runtime/discipline/skills/aria-cognition/nadia/SKILL.md +38 -0
- package/dist/runtime/discipline/skills/aria-cognition/nadia-psi/SKILL.md +38 -0
- package/dist/runtime/discipline/skills/aria-cognition/predictor/SKILL.md +25 -0
- package/dist/runtime/discipline/skills/aria-cognition/qiyas-analogy/SKILL.md +26 -0
- package/dist/runtime/discipline/skills/aria-cognition/soul-domains/SKILL.md +25 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-aristotle-intra-phase/SKILL.md +81 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-aristotle-post-phase/SKILL.md +98 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-aristotle-pre-phase/SKILL.md +99 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-harness-deploy/SKILL.md +127 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-harness-no-stripping/SKILL.md +117 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-harness-onboarding/SKILL.md +112 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-harness-output-discipline/SKILL.md +102 -0
- package/dist/runtime/discipline/skills/aria-harness/aria-harness-substrate-binding/SKILL.md +121 -0
- package/dist/runtime/doctor.mjs +23 -0
- package/dist/runtime/local-phase.mjs +632 -0
- package/dist/runtime/manifest.json +15 -0
- package/dist/runtime/mizan-scheduler.mjs +331 -0
- package/dist/runtime/package.json +6 -0
- package/dist/runtime/provider-proxy.mjs +594 -0
- package/dist/runtime/sdk/BUNDLED.json +5 -0
- package/dist/runtime/sdk/index.d.ts +477 -0
- package/dist/runtime/sdk/index.js +1469 -0
- package/dist/runtime/sdk/index.js.map +1 -0
- package/dist/runtime/sdk/package.json +8 -0
- package/dist/runtime/sdk/runWithCognition.d.ts +77 -0
- package/dist/runtime/sdk/runWithCognition.js +157 -0
- package/dist/runtime/sdk/runWithCognition.js.map +1 -0
- package/dist/runtime/service.mjs +2708 -0
- package/dist/runtime/vendor/aria-gate-runtime/index.d.ts +53 -0
- package/dist/runtime/vendor/aria-gate-runtime/index.d.ts.map +1 -0
- package/dist/runtime/vendor/aria-gate-runtime/index.js +277 -0
- package/dist/runtime/vendor/aria-gate-runtime/index.js.map +1 -0
- package/dist/runtime/vendor/aria-gate-runtime/package.json +6 -0
- package/dist/sdk/BUNDLED.json +2 -2
- package/dist/sdk/index.d.ts +317 -0
- package/dist/sdk/index.js +827 -85
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/runWithCognition.d.ts +77 -0
- package/dist/sdk/runWithCognition.js +157 -0
- package/dist/sdk/runWithCognition.js.map +1 -0
- package/hooks/aria-agent-handoff.mjs +11 -1
- package/hooks/aria-architect-fallback.mjs +267 -0
- package/hooks/aria-cognition-substrate-binding.mjs +676 -0
- package/hooks/aria-discovery-record.mjs +101 -0
- package/hooks/aria-harness-via-sdk.mjs +34 -21
- package/hooks/aria-import-resolution-gate.mjs +330 -0
- package/hooks/aria-outcome-record.mjs +84 -0
- package/hooks/aria-pre-emit-dryrun.mjs +294 -0
- package/hooks/aria-pre-tool-gate.mjs +985 -40
- package/hooks/aria-preprompt-consult.mjs +113 -13
- package/hooks/aria-preturn-memory-gate.mjs +298 -6
- package/hooks/aria-repo-doctrine-gate.mjs +397 -0
- package/hooks/aria-stop-gate.mjs +840 -75
- package/hooks/aria-userprompt-abandon-detect.mjs +5 -1
- package/hooks/doctrine_trigger_map.json +209 -15
- package/hooks/lib/canonical-lenses.mjs +64 -0
- package/hooks/lib/gate-audit.mjs +43 -0
- package/opencode-plugins/harness-context/index.js +1 -1
- package/opencode-plugins/harness-context/inject-context.mjs +82 -23
- package/opencode-plugins/harness-gate/index.js +248 -0
- package/opencode-plugins/harness-outcome/index.js +129 -0
- package/opencode-plugins/harness-stop/index.js +241 -0
- package/package.json +8 -2
- package/runtime-src/doctor.mjs +23 -0
- package/runtime-src/local-phase.mjs +632 -0
- package/runtime-src/mizan-scheduler.mjs +331 -0
- package/runtime-src/provider-proxy.mjs +594 -0
- package/runtime-src/service.mjs +2708 -0
- package/scripts/bundle-sdk.mjs +317 -0
- package/scripts/install-client.sh +176 -0
- package/scripts/publish-all.sh +344 -0
- package/scripts/publish-docker.sh +27 -0
- package/scripts/validate-hook-contracts.mjs +54 -0
- package/scripts/validate-skill-prompts.mjs +95 -0
- package/skills/aria-cognition/aria-essence/SKILL.md +63 -0
- package/skills/aria-cognition/aria-essence/references/domain-matrix.md +80 -0
- package/skills/aria-cognition/aria-essence/references/evolution-loop.md +30 -0
- package/skills/aria-cognition/aria-essence/references/readable-cognition.md +27 -0
- package/skills/aria-cognition/aria-forge-guardrails/SKILL.md +35 -0
- package/skills/aria-cognition/aria-forge-guardrails/references/checklist.md +31 -0
- package/skills/aria-cognition/aria-repo-doctrine/SKILL.md +39 -0
- package/skills/aria-cognition/forge-quality-rules/SKILL.md +43 -0
- package/skills/aria-cognition/ghazali-8lens/SKILL.md +38 -0
- package/skills/aria-cognition/istiqra-induction/SKILL.md +26 -0
- package/skills/aria-cognition/ladunni-22/SKILL.md +35 -0
- package/skills/aria-cognition/mizan/SKILL.md +72 -0
- package/skills/aria-cognition/nadia/SKILL.md +38 -0
- package/skills/aria-cognition/nadia-psi/SKILL.md +38 -0
- package/skills/aria-cognition/predictor/SKILL.md +25 -0
- package/skills/aria-cognition/qiyas-analogy/SKILL.md +26 -0
- package/skills/aria-cognition/soul-domains/SKILL.md +25 -0
- package/src/auth-commands.ts +111 -45
- package/src/chat.ts +174 -13
- package/src/codebase-scanner.ts +4 -0
- package/src/config.ts +15 -0
- package/src/connectors/claude-code.ts +115 -26
- package/src/connectors/codebase-awareness.ts +408 -0
- package/src/connectors/codex.ts +274 -0
- package/src/connectors/cognitive-skills.ts +51 -0
- package/src/connectors/opencode.ts +93 -4
- package/src/connectors/repo-git-hooks.ts +86 -0
- package/src/connectors/repo-guard.ts +589 -0
- package/src/connectors/runtime.ts +374 -0
- package/src/connectors/shell.ts +83 -14
- package/src/connectors/syncd.ts +488 -0
- package/src/decisions.ts +469 -0
- package/src/garden-control-plane.ts +101 -26
- package/src/github-connect.ts +143 -0
- package/src/harness-client.ts +128 -3
- package/src/hive-client.ts +165 -5
- package/src/index.ts +41 -2
- package/src/lib/aristotle-noor-wire.ts +310 -0
- package/src/providers/types.ts +6 -0
- package/src/runtime-proof.ts +392 -0
- package/src/setup-wizard.ts +37 -2
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* aristotle-noor-wire — SDK-side thin wrapper that dispatches every SDK and
|
|
3
|
+
* CLI emission through the harness-side `runAristotleNoorPipeline` so the
|
|
4
|
+
* 28 Aristotle modules + 14 Noor cognitives fire on every client emission
|
|
5
|
+
* just like they do for harness-internal turns.
|
|
6
|
+
*
|
|
7
|
+
* Hamza directive 2026-04-27 (task #98): distrust signal — every emission
|
|
8
|
+
* path must pass through these primitives so quality is uniform across the
|
|
9
|
+
* fleet. The SDK and CLI cannot import server-only modules (db pool,
|
|
10
|
+
* NoorCore, etc.), so we dispatch via HTTP to a dedicated harness route
|
|
11
|
+
* (`POST /api/harness/aristotle-noor`) which delegates to the canonical
|
|
12
|
+
* `runAristotleNoorPipeline` in `apps/arias-soul/api/lib/aria-emission-pipeline.ts`.
|
|
13
|
+
*
|
|
14
|
+
* Doctrine bindings:
|
|
15
|
+
* - NO TIMEOUTS, NO AbortSignal — fail-open on transport faults so the
|
|
16
|
+
* CLI / chat loop never gets blocked by a transient harness outage.
|
|
17
|
+
* - NO STUBS — every dispatch is a real network call; failures surface
|
|
18
|
+
* in the result `notes` array, never silently swallowed.
|
|
19
|
+
* - REUSE — we share the SDK's existing `HarnessClient` POST plumbing
|
|
20
|
+
* so license-token + Bearer auth + cognition-log writes are all the
|
|
21
|
+
* same primitives as the rest of the SDK.
|
|
22
|
+
* - SENIOR-DEV CODE ORG — public API at the top, types after the
|
|
23
|
+
* module JSDoc, helpers below a divider, every export typed.
|
|
24
|
+
*
|
|
25
|
+
* @module aristotle-noor-wire
|
|
26
|
+
*/
|
|
27
|
+
import { fetchHarness, validateOutput } from '../harness-client.js';
|
|
28
|
+
import { pushCognitionLog } from '../cognition-log.js';
|
|
29
|
+
// ─── Public API ─────────────────────────────────────────────────────────────
|
|
30
|
+
/**
|
|
31
|
+
* Dispatch a single SDK / CLI emission through the harness-side Aristotle
|
|
32
|
+
* + Noor pipeline. Fail-open by construction — transport faults return a
|
|
33
|
+
* default-shaped result with `dispatched: false` so callers never block.
|
|
34
|
+
*
|
|
35
|
+
* The wire posts to `POST /api/harness/aristotle-noor`. When that route is
|
|
36
|
+
* not yet deployed (older harness builds), we fall back to firing the
|
|
37
|
+
* `validateOutput` path with the draft so at least the post-stage 8-lens
|
|
38
|
+
* + Mizan rewrite legs fire — that way no client emission ever ships
|
|
39
|
+
* without SOME primitive coverage.
|
|
40
|
+
*/
|
|
41
|
+
export async function runAristotleNoorOnSDK(input) {
|
|
42
|
+
const t0 = Date.now();
|
|
43
|
+
const baseUrl = process.env.ARIA_HARNESS_BASE_URL ?? 'https://harness.ariasos.com';
|
|
44
|
+
const url = `${baseUrl}/api/harness/aristotle-noor`;
|
|
45
|
+
try {
|
|
46
|
+
const response = await fetch(url, {
|
|
47
|
+
method: 'POST',
|
|
48
|
+
headers: { 'Content-Type': 'application/json' },
|
|
49
|
+
body: JSON.stringify(input),
|
|
50
|
+
});
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
// Harness route missing → fall through to legacy validate-output path
|
|
53
|
+
return await fallbackToValidateOutput(input, t0);
|
|
54
|
+
}
|
|
55
|
+
const data = (await response.json());
|
|
56
|
+
const result = {
|
|
57
|
+
fired: data.fired ?? [],
|
|
58
|
+
fitrahVetoed: data.fitrahVetoed ?? false,
|
|
59
|
+
fitrahAlignment: data.fitrahAlignment ?? 1.0,
|
|
60
|
+
qualityScore: data.qualityScore ?? 100,
|
|
61
|
+
reAuthorSignal: data.reAuthorSignal ?? false,
|
|
62
|
+
notes: data.notes ?? [],
|
|
63
|
+
soulCharge: data.soulCharge ?? null,
|
|
64
|
+
soulManifoldStatus: data.soulManifoldStatus ?? null,
|
|
65
|
+
ghazaliVerdict: data.ghazaliVerdict ?? null,
|
|
66
|
+
latencyMs: data.latencyMs ?? Date.now() - t0,
|
|
67
|
+
dispatched: true,
|
|
68
|
+
};
|
|
69
|
+
// Mirror the dispatch into the cognition log so SDK/CLI cognition events
|
|
70
|
+
// appear in the same hive stream as harness-side events.
|
|
71
|
+
pushCognitionLog({
|
|
72
|
+
source: 'aria-cli',
|
|
73
|
+
type: 'aristotle_noor_wire',
|
|
74
|
+
gate: `aristotle-noor:${input.surface}`,
|
|
75
|
+
passed: !result.fitrahVetoed && !result.reAuthorSignal,
|
|
76
|
+
reason: result.notes.slice(0, 3).join(' | '),
|
|
77
|
+
score: result.qualityScore,
|
|
78
|
+
metadata: {
|
|
79
|
+
emissionId: input.emissionId,
|
|
80
|
+
sessionId: input.sessionId,
|
|
81
|
+
userId: input.userId,
|
|
82
|
+
fired: result.fired,
|
|
83
|
+
fitrahAlignment: result.fitrahAlignment,
|
|
84
|
+
soulCharge: result.soulCharge,
|
|
85
|
+
ghazaliVerdict: result.ghazaliVerdict,
|
|
86
|
+
},
|
|
87
|
+
}).catch(() => undefined);
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return await fallbackToValidateOutput(input, t0);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Wrap a single chat-turn lifecycle (used by `chat.ts:AriaChat`). Fires
|
|
96
|
+
* pre + post Aristotle/Noor coverage around the model call without
|
|
97
|
+
* altering the existing chat shape. Returns the wire result so the caller
|
|
98
|
+
* can surface re-author signal / Fitrah veto / quality score upstream.
|
|
99
|
+
*
|
|
100
|
+
* Usage:
|
|
101
|
+
* const wire = await wrapAriaChatTurn({
|
|
102
|
+
* emissionId, sessionId, userId, message, plannedApproach,
|
|
103
|
+
* }, async (pre) => { ... call provider, return draft text ... });
|
|
104
|
+
* if (wire.fitrahVetoed) emitRefusal(); else emit(wire.draft);
|
|
105
|
+
*/
|
|
106
|
+
export async function wrapAriaChatTurn(ctx, produceDraft) {
|
|
107
|
+
const pre = await runAristotleNoorOnSDK({
|
|
108
|
+
...ctx,
|
|
109
|
+
surface: 'sdk-chat-turn',
|
|
110
|
+
});
|
|
111
|
+
if (pre.fitrahVetoed) {
|
|
112
|
+
return { ...pre, draft: '' };
|
|
113
|
+
}
|
|
114
|
+
const draft = await produceDraft(pre);
|
|
115
|
+
const post = await runAristotleNoorOnSDK({
|
|
116
|
+
...ctx,
|
|
117
|
+
surface: 'sdk-chat-turn',
|
|
118
|
+
draft,
|
|
119
|
+
});
|
|
120
|
+
// Merge post-fire signals into the pre snapshot so callers get one
|
|
121
|
+
// unified view of every primitive that fired.
|
|
122
|
+
return {
|
|
123
|
+
fired: dedupe([...pre.fired, ...post.fired]),
|
|
124
|
+
fitrahVetoed: post.fitrahVetoed,
|
|
125
|
+
fitrahAlignment: post.fitrahAlignment,
|
|
126
|
+
qualityScore: post.qualityScore,
|
|
127
|
+
reAuthorSignal: post.reAuthorSignal,
|
|
128
|
+
notes: [...pre.notes, ...post.notes],
|
|
129
|
+
soulCharge: post.soulCharge ?? pre.soulCharge,
|
|
130
|
+
soulManifoldStatus: post.soulManifoldStatus ?? pre.soulManifoldStatus,
|
|
131
|
+
ghazaliVerdict: post.ghazaliVerdict ?? pre.ghazaliVerdict,
|
|
132
|
+
latencyMs: pre.latencyMs + post.latencyMs,
|
|
133
|
+
dispatched: pre.dispatched && post.dispatched,
|
|
134
|
+
draft,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Lifecycle wrapper for CLI commands. Fires pre-coverage before the
|
|
139
|
+
* command's main action, then post-coverage after. Failures never block
|
|
140
|
+
* the command — the wire is observability + cognition-log + Fitrah hard-gate.
|
|
141
|
+
*
|
|
142
|
+
* Returns the post result so the caller can decide whether to print a
|
|
143
|
+
* one-line cognition footer (`task #95 — human-readable harness footer`).
|
|
144
|
+
*/
|
|
145
|
+
export async function wrapCliCommand(command, emissionId, action, ctx = {}) {
|
|
146
|
+
await runAristotleNoorOnSDK({
|
|
147
|
+
...ctx,
|
|
148
|
+
surface: command,
|
|
149
|
+
emissionId,
|
|
150
|
+
});
|
|
151
|
+
const result = await action();
|
|
152
|
+
const coverage = await runAristotleNoorOnSDK({
|
|
153
|
+
...ctx,
|
|
154
|
+
surface: command,
|
|
155
|
+
emissionId,
|
|
156
|
+
draft: typeof result === 'string' ? result : undefined,
|
|
157
|
+
});
|
|
158
|
+
return { result, coverage };
|
|
159
|
+
}
|
|
160
|
+
// ─── Internal helpers ───────────────────────────────────────────────────────
|
|
161
|
+
/** Fail-open default — fires the legacy `validateOutput` route so at
|
|
162
|
+
* least the post-stage 8-lens + Mizan rewrite legs run when the new
|
|
163
|
+
* `/api/harness/aristotle-noor` route is unreachable. */
|
|
164
|
+
async function fallbackToValidateOutput(input, t0) {
|
|
165
|
+
const fired = [];
|
|
166
|
+
const notes = ['aristotle-noor: harness route unreachable, ran validateOutput fallback'];
|
|
167
|
+
let qualityScore = 100;
|
|
168
|
+
let reAuthorSignal = false;
|
|
169
|
+
if (input.draft) {
|
|
170
|
+
try {
|
|
171
|
+
const verdict = await validateOutput({
|
|
172
|
+
text: input.draft,
|
|
173
|
+
sessionId: input.sessionId ?? input.emissionId,
|
|
174
|
+
});
|
|
175
|
+
if (verdict) {
|
|
176
|
+
fired.push('eight_lens_detector_fallback', 'mizan_validate_fallback');
|
|
177
|
+
if (verdict.severity === 'block') {
|
|
178
|
+
qualityScore = 40;
|
|
179
|
+
reAuthorSignal = true;
|
|
180
|
+
}
|
|
181
|
+
else if (verdict.severity === 'warn') {
|
|
182
|
+
qualityScore = 70;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// swallow — fail-open
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else if (input.message) {
|
|
191
|
+
// Pre-stage fallback: at minimum, fetch the harness packet so doctrine
|
|
192
|
+
// injection still surfaces to the caller.
|
|
193
|
+
try {
|
|
194
|
+
await fetchHarness({
|
|
195
|
+
message: input.message,
|
|
196
|
+
sessionId: input.sessionId ?? input.emissionId,
|
|
197
|
+
userId: input.userId,
|
|
198
|
+
});
|
|
199
|
+
fired.push('harness_fetch_fallback');
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// swallow — fail-open
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
fired,
|
|
207
|
+
fitrahVetoed: false,
|
|
208
|
+
fitrahAlignment: 1.0,
|
|
209
|
+
qualityScore,
|
|
210
|
+
reAuthorSignal,
|
|
211
|
+
notes,
|
|
212
|
+
soulCharge: null,
|
|
213
|
+
soulManifoldStatus: null,
|
|
214
|
+
ghazaliVerdict: null,
|
|
215
|
+
latencyMs: Date.now() - t0,
|
|
216
|
+
dispatched: false,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/** Stable order-preserving dedupe used by `wrapAriaChatTurn`. */
|
|
220
|
+
function dedupe(values) {
|
|
221
|
+
const seen = new Set();
|
|
222
|
+
const out = [];
|
|
223
|
+
for (const v of values) {
|
|
224
|
+
if (!seen.has(v)) {
|
|
225
|
+
seen.add(v);
|
|
226
|
+
out.push(v);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return out;
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=aristotle-noor-wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aristotle-noor-wire.js","sourceRoot":"","sources":["../../../../src/lib/aristotle-noor-wire.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { RuntimeProofSnapshot } from '../runtime-proof.js';
|
|
1
2
|
export interface Message {
|
|
2
3
|
role: 'system' | 'user' | 'assistant';
|
|
3
4
|
content: string;
|
|
@@ -9,10 +10,14 @@ export interface ChatOptions {
|
|
|
9
10
|
}
|
|
10
11
|
export interface ChatResult {
|
|
11
12
|
text: string;
|
|
13
|
+
provider?: string;
|
|
14
|
+
model?: string;
|
|
15
|
+
latencyMs?: number;
|
|
12
16
|
usage?: {
|
|
13
17
|
promptTokens: number;
|
|
14
18
|
completionTokens: number;
|
|
15
19
|
};
|
|
20
|
+
runtimeProof?: RuntimeProofSnapshot;
|
|
16
21
|
}
|
|
17
22
|
export type ProviderName = 'openai' | 'anthropic' | 'google' | 'deepseek' | 'openrouter' | 'ollama';
|
|
18
23
|
export type ChatFn = (messages: Message[], apiKey: string, model: string, opts?: ChatOptions) => Promise<ChatResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/providers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACrC;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEpG,MAAM,MAAM,MAAM,GAAG,CACnB,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB,MAAM,MAAM,YAAY,GAAG,CACzB,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAChC,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,UAAU,CAAC,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface RuntimeProofTelemetry {
|
|
2
|
+
available: boolean;
|
|
3
|
+
source?: string;
|
|
4
|
+
reason?: string;
|
|
5
|
+
runtimeStatus?: string;
|
|
6
|
+
hiveCycleCount?: number;
|
|
7
|
+
hiveTasksCompleted?: number;
|
|
8
|
+
hiveTasksFailed?: number;
|
|
9
|
+
turns?: number;
|
|
10
|
+
interceptions?: number;
|
|
11
|
+
qualityGatedOutcomes?: number;
|
|
12
|
+
hallucinationStops?: number;
|
|
13
|
+
blockedUnsafeActions?: number;
|
|
14
|
+
qualityScore?: number;
|
|
15
|
+
qualityStatus?: string;
|
|
16
|
+
complianceState?: string;
|
|
17
|
+
packetHash?: string;
|
|
18
|
+
passRatePercentToday?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface RuntimeProofSnapshot {
|
|
21
|
+
provider?: string;
|
|
22
|
+
model?: string;
|
|
23
|
+
promptTokens?: number;
|
|
24
|
+
completionTokens?: number;
|
|
25
|
+
totalTokens?: number;
|
|
26
|
+
latencyMs?: number;
|
|
27
|
+
harnessTurns?: number;
|
|
28
|
+
llmDispatches?: number;
|
|
29
|
+
toolDispatches?: number;
|
|
30
|
+
mcpToolCalls?: number;
|
|
31
|
+
gateSeverity?: 'pass' | 'warn' | 'block' | string;
|
|
32
|
+
capHit?: boolean;
|
|
33
|
+
telemetry?: RuntimeProofTelemetry;
|
|
34
|
+
}
|
|
35
|
+
interface RuntimeProofFetchArgs {
|
|
36
|
+
sessionId: string;
|
|
37
|
+
}
|
|
38
|
+
interface RuntimeProofFormatOpts {
|
|
39
|
+
mode?: 'ansi' | 'plain';
|
|
40
|
+
}
|
|
41
|
+
export declare function enrichRuntimeProof(base: RuntimeProofSnapshot, args: RuntimeProofFetchArgs): Promise<RuntimeProofSnapshot>;
|
|
42
|
+
export declare function fetchRuntimeProofTelemetry(args: RuntimeProofFetchArgs): Promise<RuntimeProofTelemetry>;
|
|
43
|
+
export declare function formatRuntimeProofLine(proof: RuntimeProofSnapshot, opts?: RuntimeProofFormatOpts): string;
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=runtime-proof.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-proof.d.ts","sourceRoot":"","sources":["../../../src/runtime-proof.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAClD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,qBAAqB,CAAC;CACnC;AAED,UAAU,qBAAqB;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,sBAAsB;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAYD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,oBAAoB,EAC1B,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,oBAAoB,CAAC,CAM/B;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CA8DhC;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,oBAAoB,EAC3B,IAAI,GAAE,sBAA2B,GAChC,MAAM,CAkDR"}
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
const ANSI_GREY_OPEN = '\x1b[90m';
|
|
5
|
+
const ANSI_RESET = '\x1b[0m';
|
|
6
|
+
const HARNESS_BASE_URL = process.env.ARIA_HIVE_RUNTIME_URL ||
|
|
7
|
+
process.env.ARIA_HARNESS_BASE_URL ||
|
|
8
|
+
process.env.ARIA_HARNESS_URL ||
|
|
9
|
+
'https://harness.ariasos.com';
|
|
10
|
+
const OWNER_TOKEN_PATH = path.join(homedir(), '.aria', 'owner-token');
|
|
11
|
+
const LICENSE_PATH = path.join(homedir(), '.aria', 'license.json');
|
|
12
|
+
export async function enrichRuntimeProof(base, args) {
|
|
13
|
+
const telemetry = await fetchRuntimeProofTelemetry(args);
|
|
14
|
+
return {
|
|
15
|
+
...base,
|
|
16
|
+
telemetry,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export async function fetchRuntimeProofTelemetry(args) {
|
|
20
|
+
const authHeaders = resolveHarnessAuthHeaders();
|
|
21
|
+
const candidates = [
|
|
22
|
+
{
|
|
23
|
+
source: 'aria-telemetry-badge-metrics',
|
|
24
|
+
url: `${HARNESS_BASE_URL}/api/telemetry/badge-metrics?sessionId=${encodeURIComponent(args.sessionId)}&surface=aria-cli`,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
source: 'aria-telemetry-public-proof',
|
|
28
|
+
url: `${HARNESS_BASE_URL}/api/telemetry/public-proof?sessionId=${encodeURIComponent(args.sessionId)}&surface=aria-cli`,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
source: 'aria-telemetry-public-proof-path',
|
|
32
|
+
url: `${HARNESS_BASE_URL}/api/telemetry/public-proof/${encodeURIComponent(args.sessionId)}`,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
source: 'hive-runtime-status',
|
|
36
|
+
url: `${HARNESS_BASE_URL}/hive/status`,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
source: 'hive-runtime-status-api',
|
|
40
|
+
url: `${HARNESS_BASE_URL}/api/hive/status`,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
source: 'proof-layer-summary',
|
|
44
|
+
url: `${HARNESS_BASE_URL}/api/metrics/proof-layer/summary?window=24h`,
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
let lastReason = 'telemetry endpoint unavailable';
|
|
48
|
+
for (const candidate of candidates) {
|
|
49
|
+
try {
|
|
50
|
+
const response = await fetch(candidate.url, {
|
|
51
|
+
headers: authHeaders,
|
|
52
|
+
});
|
|
53
|
+
if (response.status === 401 || response.status === 403 || response.status === 404) {
|
|
54
|
+
lastReason = `${candidate.source}:${response.status}`;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (!response.ok) {
|
|
58
|
+
lastReason = `${candidate.source}:${response.status}`;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const payload = await response.json();
|
|
62
|
+
const parsed = parseTelemetryPayload(candidate.source, payload);
|
|
63
|
+
if (parsed.available) {
|
|
64
|
+
return parsed;
|
|
65
|
+
}
|
|
66
|
+
lastReason = parsed.reason || `${candidate.source}:no-proof-fields`;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
lastReason = `${candidate.source}:${error instanceof Error ? error.message : String(error)}`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
available: false,
|
|
74
|
+
reason: lastReason,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export function formatRuntimeProofLine(proof, opts = {}) {
|
|
78
|
+
const parts = [];
|
|
79
|
+
const surface = [proof.provider, proof.model].filter(Boolean).join('/');
|
|
80
|
+
if (surface)
|
|
81
|
+
parts.push(`proof ${surface}`);
|
|
82
|
+
else
|
|
83
|
+
parts.push('proof');
|
|
84
|
+
if (proof.promptTokens !== undefined || proof.completionTokens !== undefined || proof.totalTokens !== undefined) {
|
|
85
|
+
const prompt = proof.promptTokens ?? '?';
|
|
86
|
+
const completion = proof.completionTokens ?? '?';
|
|
87
|
+
const total = proof.totalTokens ?? deriveTotalTokens(proof.promptTokens, proof.completionTokens);
|
|
88
|
+
const totalSuffix = total !== undefined ? ` (${total})` : '';
|
|
89
|
+
parts.push(`tok ${prompt}/${completion}${totalSuffix}`);
|
|
90
|
+
}
|
|
91
|
+
if (proof.harnessTurns !== undefined)
|
|
92
|
+
parts.push(`turns ${proof.harnessTurns}`);
|
|
93
|
+
if (proof.llmDispatches !== undefined)
|
|
94
|
+
parts.push(`llm ${proof.llmDispatches}`);
|
|
95
|
+
if (proof.toolDispatches !== undefined)
|
|
96
|
+
parts.push(`tools ${proof.toolDispatches}`);
|
|
97
|
+
if (proof.mcpToolCalls !== undefined)
|
|
98
|
+
parts.push(`mcp ${proof.mcpToolCalls}`);
|
|
99
|
+
if (proof.gateSeverity)
|
|
100
|
+
parts.push(`gate ${proof.gateSeverity}`);
|
|
101
|
+
if (proof.capHit)
|
|
102
|
+
parts.push('cap hit');
|
|
103
|
+
if (proof.telemetry?.available) {
|
|
104
|
+
if (proof.telemetry.source)
|
|
105
|
+
parts.push(`src ${proof.telemetry.source}`);
|
|
106
|
+
if (proof.telemetry.runtimeStatus)
|
|
107
|
+
parts.push(`hive ${proof.telemetry.runtimeStatus}`);
|
|
108
|
+
if (proof.telemetry.hiveCycleCount !== undefined)
|
|
109
|
+
parts.push(`cycles ${proof.telemetry.hiveCycleCount}`);
|
|
110
|
+
if (proof.telemetry.hiveTasksCompleted !== undefined)
|
|
111
|
+
parts.push(`hive-ok ${proof.telemetry.hiveTasksCompleted}`);
|
|
112
|
+
if (proof.telemetry.hiveTasksFailed !== undefined)
|
|
113
|
+
parts.push(`hive-fail ${proof.telemetry.hiveTasksFailed}`);
|
|
114
|
+
if (proof.telemetry.turns !== undefined && proof.harnessTurns === undefined) {
|
|
115
|
+
parts.push(`tele-turns ${proof.telemetry.turns}`);
|
|
116
|
+
}
|
|
117
|
+
if (proof.telemetry.interceptions !== undefined)
|
|
118
|
+
parts.push(`intercepts ${proof.telemetry.interceptions}`);
|
|
119
|
+
if (proof.telemetry.qualityGatedOutcomes !== undefined)
|
|
120
|
+
parts.push(`gated ${proof.telemetry.qualityGatedOutcomes}`);
|
|
121
|
+
if (proof.telemetry.blockedUnsafeActions !== undefined)
|
|
122
|
+
parts.push(`unsafe ${proof.telemetry.blockedUnsafeActions}`);
|
|
123
|
+
if (proof.telemetry.hallucinationStops !== undefined)
|
|
124
|
+
parts.push(`hallu ${proof.telemetry.hallucinationStops}`);
|
|
125
|
+
if (proof.telemetry.qualityScore !== undefined)
|
|
126
|
+
parts.push(`quality ${formatQualityScore(proof.telemetry.qualityScore)}`);
|
|
127
|
+
if (proof.telemetry.qualityStatus)
|
|
128
|
+
parts.push(`status ${proof.telemetry.qualityStatus}`);
|
|
129
|
+
if (proof.telemetry.passRatePercentToday !== undefined)
|
|
130
|
+
parts.push(`pass24h ${proof.telemetry.passRatePercentToday}%`);
|
|
131
|
+
if (proof.telemetry.packetHash)
|
|
132
|
+
parts.push(`packet ${proof.telemetry.packetHash.slice(0, 12)}`);
|
|
133
|
+
if (proof.telemetry.complianceState)
|
|
134
|
+
parts.push(`compliance ${proof.telemetry.complianceState}`);
|
|
135
|
+
}
|
|
136
|
+
else if (proof.telemetry?.reason) {
|
|
137
|
+
parts.push(`src ${proof.telemetry.reason}`);
|
|
138
|
+
}
|
|
139
|
+
if (proof.latencyMs !== undefined)
|
|
140
|
+
parts.push(`${Math.round(proof.latencyMs)}ms`);
|
|
141
|
+
const body = parts.join(' | ');
|
|
142
|
+
if ((opts.mode ?? 'plain') === 'ansi') {
|
|
143
|
+
return `${ANSI_GREY_OPEN}${body}${ANSI_RESET}`;
|
|
144
|
+
}
|
|
145
|
+
return body;
|
|
146
|
+
}
|
|
147
|
+
function parseTelemetryPayload(source, payload) {
|
|
148
|
+
if (source === 'proof-layer-summary') {
|
|
149
|
+
return parseProofLayerSummary(payload);
|
|
150
|
+
}
|
|
151
|
+
if (source === 'hive-runtime-status' || source === 'hive-runtime-status-api') {
|
|
152
|
+
return parseHiveRuntimeStatus(source, payload);
|
|
153
|
+
}
|
|
154
|
+
const turns = findNumber(payload, ['turns', 'harnessed_turns', 'loop_turns']);
|
|
155
|
+
const interceptions = findNumber(payload, ['interceptions', 'intercepts', 'intercept_count']);
|
|
156
|
+
const qualityGatedOutcomes = findNumber(payload, ['quality_gated_outcomes', 'qualityGatedOutcomes', 'gated_outcomes']);
|
|
157
|
+
const hallucinationStops = findNumber(payload, ['hallucination_stops', 'hallucinationStops', 'hallucination_blocks']);
|
|
158
|
+
const blockedUnsafeActions = findNumber(payload, ['blocked_unsafe_actions', 'blockedUnsafeActions', 'unsafe_blocks']);
|
|
159
|
+
const qualityScore = findNumber(payload, ['quality_score', 'qualityScore']);
|
|
160
|
+
const qualityStatus = findString(payload, ['quality_status', 'qualityStatus']);
|
|
161
|
+
const complianceState = findString(payload, ['compliance_state', 'complianceState']);
|
|
162
|
+
const packetHash = findString(payload, ['packet_hash', 'packetHash', 'harness_packet_hash']);
|
|
163
|
+
const passRatePercentToday = normalizePercent(findNumber(payload, ['pass_rate_percent_today', 'passRatePercentToday', 'pass_rate']));
|
|
164
|
+
const available = turns !== undefined ||
|
|
165
|
+
interceptions !== undefined ||
|
|
166
|
+
qualityGatedOutcomes !== undefined ||
|
|
167
|
+
hallucinationStops !== undefined ||
|
|
168
|
+
blockedUnsafeActions !== undefined ||
|
|
169
|
+
qualityScore !== undefined ||
|
|
170
|
+
qualityStatus !== undefined ||
|
|
171
|
+
complianceState !== undefined ||
|
|
172
|
+
packetHash !== undefined ||
|
|
173
|
+
passRatePercentToday !== undefined;
|
|
174
|
+
return {
|
|
175
|
+
available,
|
|
176
|
+
source,
|
|
177
|
+
reason: available ? undefined : `${source}:no-proof-fields`,
|
|
178
|
+
turns,
|
|
179
|
+
interceptions,
|
|
180
|
+
qualityGatedOutcomes,
|
|
181
|
+
hallucinationStops,
|
|
182
|
+
blockedUnsafeActions,
|
|
183
|
+
qualityScore,
|
|
184
|
+
qualityStatus,
|
|
185
|
+
complianceState,
|
|
186
|
+
packetHash,
|
|
187
|
+
passRatePercentToday,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function parseProofLayerSummary(payload) {
|
|
191
|
+
const decisions = readObject(payload.decisions);
|
|
192
|
+
const gateBlocks = readObject(payload.gate_blocks);
|
|
193
|
+
const recentIntercepts = Array.isArray(payload.recent_intercepts) ? payload.recent_intercepts : [];
|
|
194
|
+
const passRateRaw = readNumber(decisions?.pass_rate);
|
|
195
|
+
const passRatePercentToday = normalizePercent(passRateRaw);
|
|
196
|
+
const qualityGatedOutcomes = readNumber(gateBlocks?.total);
|
|
197
|
+
const blockedUnsafeActions = readNumber(gateBlocks?.open_blocking);
|
|
198
|
+
const available = passRatePercentToday !== undefined ||
|
|
199
|
+
qualityGatedOutcomes !== undefined ||
|
|
200
|
+
blockedUnsafeActions !== undefined ||
|
|
201
|
+
recentIntercepts.length > 0;
|
|
202
|
+
return {
|
|
203
|
+
available,
|
|
204
|
+
source: 'proof-layer-summary',
|
|
205
|
+
reason: available ? undefined : 'proof-layer-summary:no-proof-fields',
|
|
206
|
+
interceptions: recentIntercepts.length > 0 ? recentIntercepts.length : undefined,
|
|
207
|
+
qualityGatedOutcomes,
|
|
208
|
+
blockedUnsafeActions,
|
|
209
|
+
passRatePercentToday,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
function parseHiveRuntimeStatus(source, payload) {
|
|
213
|
+
const runtimeStatus = findString(payload, ['status']);
|
|
214
|
+
const hiveCycleCount = findNumber(payload, ['cycleCount']);
|
|
215
|
+
const hiveTasksCompleted = findNumber(payload, ['tasksCompleted']);
|
|
216
|
+
const hiveTasksFailed = findNumber(payload, ['tasksFailed']);
|
|
217
|
+
const available = runtimeStatus !== undefined ||
|
|
218
|
+
hiveCycleCount !== undefined ||
|
|
219
|
+
hiveTasksCompleted !== undefined ||
|
|
220
|
+
hiveTasksFailed !== undefined;
|
|
221
|
+
return {
|
|
222
|
+
available,
|
|
223
|
+
source,
|
|
224
|
+
reason: available ? undefined : `${source}:no-runtime-fields`,
|
|
225
|
+
runtimeStatus,
|
|
226
|
+
hiveCycleCount,
|
|
227
|
+
hiveTasksCompleted,
|
|
228
|
+
hiveTasksFailed,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
function resolveHarnessAuthHeaders() {
|
|
232
|
+
const ownerToken = readTrimmedFile(OWNER_TOKEN_PATH);
|
|
233
|
+
if (ownerToken) {
|
|
234
|
+
return {
|
|
235
|
+
Authorization: `Bearer ${ownerToken}`,
|
|
236
|
+
'x-aria-owner': 'true',
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
const licenseToken = readLicenseToken();
|
|
240
|
+
if (licenseToken) {
|
|
241
|
+
return {
|
|
242
|
+
Authorization: `Bearer ${licenseToken}`,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
return {};
|
|
246
|
+
}
|
|
247
|
+
function readLicenseToken() {
|
|
248
|
+
if (!fs.existsSync(LICENSE_PATH))
|
|
249
|
+
return '';
|
|
250
|
+
try {
|
|
251
|
+
const raw = fs.readFileSync(LICENSE_PATH, 'utf-8');
|
|
252
|
+
const parsed = JSON.parse(raw);
|
|
253
|
+
if (typeof parsed.token === 'string' && parsed.token.trim())
|
|
254
|
+
return parsed.token.trim();
|
|
255
|
+
if (typeof parsed.jti === 'string' && parsed.jti.trim())
|
|
256
|
+
return parsed.jti.trim();
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return '';
|
|
260
|
+
}
|
|
261
|
+
return '';
|
|
262
|
+
}
|
|
263
|
+
function readTrimmedFile(filePath) {
|
|
264
|
+
if (!fs.existsSync(filePath))
|
|
265
|
+
return '';
|
|
266
|
+
try {
|
|
267
|
+
return fs.readFileSync(filePath, 'utf-8').trim();
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return '';
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function deriveTotalTokens(promptTokens, completionTokens) {
|
|
274
|
+
if (promptTokens === undefined && completionTokens === undefined)
|
|
275
|
+
return undefined;
|
|
276
|
+
return (promptTokens ?? 0) + (completionTokens ?? 0);
|
|
277
|
+
}
|
|
278
|
+
function formatQualityScore(value) {
|
|
279
|
+
if (value <= 1) {
|
|
280
|
+
return `${Math.round(value * 100)}%`;
|
|
281
|
+
}
|
|
282
|
+
return `${Math.round(value)}`;
|
|
283
|
+
}
|
|
284
|
+
function normalizePercent(value) {
|
|
285
|
+
if (value === undefined)
|
|
286
|
+
return undefined;
|
|
287
|
+
if (value <= 1)
|
|
288
|
+
return Math.round(value * 100);
|
|
289
|
+
return Math.round(value);
|
|
290
|
+
}
|
|
291
|
+
function findNumber(root, keys) {
|
|
292
|
+
const value = findValue(root, new Set(keys));
|
|
293
|
+
return readNumber(value);
|
|
294
|
+
}
|
|
295
|
+
function findString(root, keys) {
|
|
296
|
+
const value = findValue(root, new Set(keys));
|
|
297
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
298
|
+
}
|
|
299
|
+
function findValue(root, keys, seen = new Set()) {
|
|
300
|
+
if (!root || typeof root !== 'object')
|
|
301
|
+
return undefined;
|
|
302
|
+
if (seen.has(root))
|
|
303
|
+
return undefined;
|
|
304
|
+
seen.add(root);
|
|
305
|
+
if (Array.isArray(root)) {
|
|
306
|
+
for (const item of root) {
|
|
307
|
+
const found = findValue(item, keys, seen);
|
|
308
|
+
if (found !== undefined)
|
|
309
|
+
return found;
|
|
310
|
+
}
|
|
311
|
+
return undefined;
|
|
312
|
+
}
|
|
313
|
+
const record = root;
|
|
314
|
+
for (const [key, value] of Object.entries(record)) {
|
|
315
|
+
if (keys.has(key))
|
|
316
|
+
return value;
|
|
317
|
+
}
|
|
318
|
+
for (const value of Object.values(record)) {
|
|
319
|
+
const found = findValue(value, keys, seen);
|
|
320
|
+
if (found !== undefined)
|
|
321
|
+
return found;
|
|
322
|
+
}
|
|
323
|
+
return undefined;
|
|
324
|
+
}
|
|
325
|
+
function readObject(value) {
|
|
326
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
327
|
+
return undefined;
|
|
328
|
+
return value;
|
|
329
|
+
}
|
|
330
|
+
function readNumber(value) {
|
|
331
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
332
|
+
return value;
|
|
333
|
+
if (typeof value === 'string' && value.trim()) {
|
|
334
|
+
const parsed = Number(value);
|
|
335
|
+
if (Number.isFinite(parsed))
|
|
336
|
+
return parsed;
|
|
337
|
+
}
|
|
338
|
+
return undefined;
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=runtime-proof.js.map
|