@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
package/src/decisions.ts
ADDED
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dalio decision-log SDK primitives.
|
|
3
|
+
*
|
|
4
|
+
* Covers the full Dalio loop surface:
|
|
5
|
+
* recordDalio — POST /api/decisions
|
|
6
|
+
* evaluatePendingDecisions — POST /api/decisions/evaluate-pending
|
|
7
|
+
* getBlockingIncidents — GET /api/incidents/blocking
|
|
8
|
+
* claimSessionLock — POST /api/hive/session-lock
|
|
9
|
+
* releaseSessionLock — DELETE /api/hive/session-lock/<id>
|
|
10
|
+
* postSessionMessage — POST /api/hive/session-message
|
|
11
|
+
* readSessionMessages — GET /api/hive/session-message
|
|
12
|
+
*
|
|
13
|
+
* Per memory:feedback_sdk_harness_cli_parity.md: every primitive here
|
|
14
|
+
* must have a matching harness server route AND a CLI surface in bin/aria.js.
|
|
15
|
+
* Per memory:feedback_full_harness_binding_must_be_structural.md: harness
|
|
16
|
+
* binding is enforced structurally — calls throw on non-2xx, never silently
|
|
17
|
+
* degrade.
|
|
18
|
+
*
|
|
19
|
+
* No timeouts per memory:feedback_no_timeouts_doctrine.md.
|
|
20
|
+
* No graceful degradation per memory:feedback_no_graceful_degradation.md.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import * as fs from 'node:fs';
|
|
24
|
+
import * as path from 'node:path';
|
|
25
|
+
import { homedir } from 'node:os';
|
|
26
|
+
|
|
27
|
+
// ── Base URL + owner-token resolution (mirrors harness-client.ts pattern) ─────
|
|
28
|
+
|
|
29
|
+
const HARNESS_BASE_URL =
|
|
30
|
+
process.env.ARIA_HIVE_RUNTIME_URL ??
|
|
31
|
+
process.env.ARIA_HARNESS_BASE_URL ??
|
|
32
|
+
process.env.ARIA_HARNESS_URL ??
|
|
33
|
+
'https://harness.ariasos.com';
|
|
34
|
+
|
|
35
|
+
const OWNER_TOKEN_PATH = path.join(homedir(), '.aria', 'owner-token');
|
|
36
|
+
|
|
37
|
+
function ownerHeaders(): Record<string, string> {
|
|
38
|
+
if (!fs.existsSync(OWNER_TOKEN_PATH)) return {};
|
|
39
|
+
const jwt = fs.readFileSync(OWNER_TOKEN_PATH, 'utf-8').trim();
|
|
40
|
+
if (!jwt) return {};
|
|
41
|
+
return { Authorization: `Bearer ${jwt}`, 'x-aria-owner': 'true' };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function baseHeaders(): Record<string, string> {
|
|
45
|
+
return { 'Content-Type': 'application/json', ...ownerHeaders() };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function requireOk(resp: Response, label: string): Promise<Response> {
|
|
49
|
+
if (resp.ok) return resp;
|
|
50
|
+
let detail = resp.statusText;
|
|
51
|
+
try {
|
|
52
|
+
const body = await resp.json() as { error?: string; message?: string };
|
|
53
|
+
detail = body.error ?? body.message ?? detail;
|
|
54
|
+
} catch {
|
|
55
|
+
// ignore parse error — use statusText
|
|
56
|
+
}
|
|
57
|
+
throw new Error(`[aria-connector/${label}] HTTP ${resp.status}: ${detail}`);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// ── Public types ───────────────────────────────────────────────────────────────
|
|
61
|
+
|
|
62
|
+
export interface ExpectedOutcomePredicate {
|
|
63
|
+
predicate: string;
|
|
64
|
+
measurable_type: 'numeric' | 'boolean' | 'state_string';
|
|
65
|
+
threshold?: number | string | boolean;
|
|
66
|
+
eval_window_minutes?: number;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface RecordDalioArgs {
|
|
70
|
+
decision_type: string;
|
|
71
|
+
category: string;
|
|
72
|
+
context: string;
|
|
73
|
+
decision: string;
|
|
74
|
+
reasoning: string;
|
|
75
|
+
expected_outcome: ExpectedOutcomePredicate;
|
|
76
|
+
outcome?: 'pending' | 'success' | 'failure' | 'neutral';
|
|
77
|
+
sessionId?: string;
|
|
78
|
+
anchors?: string[];
|
|
79
|
+
source?: string;
|
|
80
|
+
model_used?: string;
|
|
81
|
+
tags?: string[];
|
|
82
|
+
metadata?: Record<string, unknown>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export interface RecordDalioResult {
|
|
86
|
+
decision_id: string;
|
|
87
|
+
quality_score?: number;
|
|
88
|
+
impact_score?: number;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface EvaluatePendingResult {
|
|
92
|
+
evaluated: number;
|
|
93
|
+
failures: number;
|
|
94
|
+
inferred?: number;
|
|
95
|
+
updated?: number;
|
|
96
|
+
learning_signals?: number;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface BlockingIncident {
|
|
100
|
+
id: string;
|
|
101
|
+
incident_type: string;
|
|
102
|
+
severity: string;
|
|
103
|
+
description: string;
|
|
104
|
+
session_id?: string;
|
|
105
|
+
created_at: string;
|
|
106
|
+
resolved_at?: string | null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface SessionLockArgs {
|
|
110
|
+
filePath: string;
|
|
111
|
+
sessionId: string;
|
|
112
|
+
ttlMinutes: number;
|
|
113
|
+
scopeKind?: 'file' | 'directory' | 'module' | 'symbol';
|
|
114
|
+
scopePath?: string;
|
|
115
|
+
operationKind?: 'additive' | 'refactor' | 'delete' | 'rename';
|
|
116
|
+
ownerSessionId?: string;
|
|
117
|
+
clientId?: string;
|
|
118
|
+
surface?: string;
|
|
119
|
+
staleAfterSeconds?: number;
|
|
120
|
+
urgency?: string;
|
|
121
|
+
proposedMergeOrder?: number;
|
|
122
|
+
intendedPatch?: string;
|
|
123
|
+
currentMode?: 'exclusive_write' | 'additive_only' | 'merge_assist' | 'read_only';
|
|
124
|
+
takeoverIfStale?: boolean;
|
|
125
|
+
metadata?: Record<string, unknown>;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export interface SessionLockResult {
|
|
129
|
+
lock_id: string;
|
|
130
|
+
file_path: string;
|
|
131
|
+
session_id: string;
|
|
132
|
+
scope_kind?: 'file' | 'directory' | 'module' | 'symbol';
|
|
133
|
+
scope_path?: string;
|
|
134
|
+
operation_kind?: 'additive' | 'refactor' | 'delete' | 'rename';
|
|
135
|
+
owner_session_id?: string;
|
|
136
|
+
base_file_hash?: string | null;
|
|
137
|
+
base_blob_sha?: string | null;
|
|
138
|
+
expires_at: string;
|
|
139
|
+
lease_heartbeat_at?: string;
|
|
140
|
+
stale_after_seconds?: number;
|
|
141
|
+
current_mode?: 'exclusive_write' | 'additive_only' | 'merge_assist' | 'read_only';
|
|
142
|
+
proposed_merge_order?: number | null;
|
|
143
|
+
coordination_packet?: Record<string, unknown>;
|
|
144
|
+
stale_takeovers?: number;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export interface SessionLockHeartbeatResult {
|
|
148
|
+
alive: boolean;
|
|
149
|
+
lock_id: string;
|
|
150
|
+
file_path: string;
|
|
151
|
+
expires_at: string;
|
|
152
|
+
lease_heartbeat_at: string;
|
|
153
|
+
heartbeat_count: number;
|
|
154
|
+
stale_after_seconds: number;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export interface SessionLockDriftResult {
|
|
158
|
+
ok: boolean;
|
|
159
|
+
lock_id: string;
|
|
160
|
+
file_path: string;
|
|
161
|
+
drifted: boolean;
|
|
162
|
+
rebase_required: boolean;
|
|
163
|
+
current_mode: 'exclusive_write' | 'additive_only' | 'merge_assist' | 'read_only';
|
|
164
|
+
base_file_hash?: string | null;
|
|
165
|
+
current_file_hash?: string | null;
|
|
166
|
+
base_blob_sha?: string | null;
|
|
167
|
+
current_blob_sha?: string | null;
|
|
168
|
+
base_missing?: boolean;
|
|
169
|
+
diff_preview?: string | null;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export interface SessionMessageArgs {
|
|
173
|
+
fromSessionId: string;
|
|
174
|
+
toSessionId: string;
|
|
175
|
+
topic?: string;
|
|
176
|
+
body: Record<string, unknown>;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export interface SessionMessageResult {
|
|
180
|
+
message_id: string;
|
|
181
|
+
from_session_id: string;
|
|
182
|
+
to_session_id: string;
|
|
183
|
+
topic: string;
|
|
184
|
+
created_at: string;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ── recordDalio ────────────────────────────────────────────────────────────────
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Log a Dalio decision to /api/decisions.
|
|
191
|
+
*
|
|
192
|
+
* Requires a measurable expected_outcome predicate per
|
|
193
|
+
* memory:feedback_dalio_expected_required.md. Gate refuses qualitative prose.
|
|
194
|
+
*
|
|
195
|
+
* Throws on non-2xx — no silent fallback per doctrine.
|
|
196
|
+
*/
|
|
197
|
+
export async function recordDalio(args: RecordDalioArgs): Promise<RecordDalioResult> {
|
|
198
|
+
const payload = {
|
|
199
|
+
decision_type: args.decision_type,
|
|
200
|
+
category: args.category,
|
|
201
|
+
context: args.context,
|
|
202
|
+
decision: args.decision,
|
|
203
|
+
reasoning: args.reasoning,
|
|
204
|
+
expected_outcome: args.expected_outcome,
|
|
205
|
+
outcome: args.outcome ?? 'pending',
|
|
206
|
+
source: args.source ?? 'aria-connector',
|
|
207
|
+
model_used: args.model_used ?? 'unknown',
|
|
208
|
+
tags: args.tags ?? [],
|
|
209
|
+
metadata: {
|
|
210
|
+
...(args.metadata ?? {}),
|
|
211
|
+
...(args.sessionId ? { sessionId: args.sessionId } : {}),
|
|
212
|
+
...(args.anchors?.length ? { anchors: args.anchors } : {}),
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
const resp = await fetch(`${HARNESS_BASE_URL}/api/decisions`, {
|
|
217
|
+
method: 'POST',
|
|
218
|
+
headers: baseHeaders(),
|
|
219
|
+
body: JSON.stringify(payload),
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
await requireOk(resp, 'recordDalio');
|
|
223
|
+
const data = await resp.json() as { decision_id?: string; id?: string; quality_score?: number; impact_score?: number };
|
|
224
|
+
const decision_id = data.decision_id ?? data.id;
|
|
225
|
+
if (!decision_id) {
|
|
226
|
+
throw new Error('[aria-connector/recordDalio] Server returned no decision_id');
|
|
227
|
+
}
|
|
228
|
+
return { decision_id, quality_score: data.quality_score, impact_score: data.impact_score };
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// ── evaluatePendingDecisions ───────────────────────────────────────────────────
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Trigger evaluation of pending decisions at /api/decisions/evaluate-pending.
|
|
235
|
+
*
|
|
236
|
+
* Returns count of evaluated decisions and count of evaluation failures.
|
|
237
|
+
* Throws on non-2xx.
|
|
238
|
+
*/
|
|
239
|
+
export async function evaluatePendingDecisions(): Promise<EvaluatePendingResult> {
|
|
240
|
+
const resp = await fetch(`${HARNESS_BASE_URL}/api/decisions/evaluate-pending`, {
|
|
241
|
+
method: 'POST',
|
|
242
|
+
headers: baseHeaders(),
|
|
243
|
+
body: JSON.stringify({}),
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
await requireOk(resp, 'evaluatePendingDecisions');
|
|
247
|
+
const data = await resp.json() as {
|
|
248
|
+
evaluated?: number;
|
|
249
|
+
inferred?: number;
|
|
250
|
+
updated?: number;
|
|
251
|
+
learning_signals?: number;
|
|
252
|
+
failures?: number;
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
return {
|
|
256
|
+
evaluated: data.evaluated ?? 0,
|
|
257
|
+
failures: data.failures ?? 0,
|
|
258
|
+
inferred: data.inferred,
|
|
259
|
+
updated: data.updated,
|
|
260
|
+
learning_signals: data.learning_signals,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// ── getBlockingIncidents ───────────────────────────────────────────────────────
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Fetch blocking incidents for a session from /api/incidents/blocking.
|
|
268
|
+
*
|
|
269
|
+
* Blocking incidents are injected by the cron evaluator when an expected_outcome
|
|
270
|
+
* predicate fails — they surface in the next harness packet as hard gates.
|
|
271
|
+
* Throws on non-2xx.
|
|
272
|
+
*/
|
|
273
|
+
export async function getBlockingIncidents(sessionId: string): Promise<BlockingIncident[]> {
|
|
274
|
+
const url = `${HARNESS_BASE_URL}/api/incidents/blocking?sessionId=${encodeURIComponent(sessionId)}`;
|
|
275
|
+
const resp = await fetch(url, {
|
|
276
|
+
method: 'GET',
|
|
277
|
+
headers: baseHeaders(),
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
await requireOk(resp, 'getBlockingIncidents');
|
|
281
|
+
const data = await resp.json() as { incidents?: BlockingIncident[]; data?: BlockingIncident[] };
|
|
282
|
+
return data.incidents ?? data.data ?? [];
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// ── claimSessionLock ───────────────────────────────────────────────────────────
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Claim a hive session lock for a file path.
|
|
289
|
+
*
|
|
290
|
+
* Required before editing a file when multiple sessions may be active on the
|
|
291
|
+
* same path per memory:feedback_hive_session_coordination.md. Pre-tool-gate
|
|
292
|
+
* hard-blocks concurrent edits without a valid lock.
|
|
293
|
+
*
|
|
294
|
+
* Throws on non-2xx (including 409 Conflict when lock is already held).
|
|
295
|
+
*/
|
|
296
|
+
export async function claimSessionLock(args: SessionLockArgs): Promise<SessionLockResult> {
|
|
297
|
+
const resp = await fetch(`${HARNESS_BASE_URL}/api/hive/session-lock`, {
|
|
298
|
+
method: 'POST',
|
|
299
|
+
headers: baseHeaders(),
|
|
300
|
+
body: JSON.stringify({
|
|
301
|
+
file_path: args.filePath,
|
|
302
|
+
session_id: args.sessionId,
|
|
303
|
+
ttl_minutes: args.ttlMinutes,
|
|
304
|
+
scope_kind: args.scopeKind,
|
|
305
|
+
scope_path: args.scopePath,
|
|
306
|
+
operation_kind: args.operationKind,
|
|
307
|
+
owner_session_id: args.ownerSessionId,
|
|
308
|
+
client_id: args.clientId,
|
|
309
|
+
surface: args.surface,
|
|
310
|
+
stale_after_seconds: args.staleAfterSeconds,
|
|
311
|
+
urgency: args.urgency,
|
|
312
|
+
proposed_merge_order: args.proposedMergeOrder,
|
|
313
|
+
intended_patch: args.intendedPatch,
|
|
314
|
+
current_mode: args.currentMode,
|
|
315
|
+
takeover_if_stale: args.takeoverIfStale,
|
|
316
|
+
metadata: args.metadata,
|
|
317
|
+
}),
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
await requireOk(resp, 'claimSessionLock');
|
|
321
|
+
const data = await resp.json() as SessionLockResult & { id?: string };
|
|
322
|
+
const lock_id = data.lock_id ?? data.id;
|
|
323
|
+
if (!lock_id) {
|
|
324
|
+
throw new Error('[aria-connector/claimSessionLock] Server returned no lock_id');
|
|
325
|
+
}
|
|
326
|
+
return {
|
|
327
|
+
lock_id,
|
|
328
|
+
file_path: data.file_path ?? args.filePath,
|
|
329
|
+
session_id: data.session_id ?? args.sessionId,
|
|
330
|
+
scope_kind: data.scope_kind ?? args.scopeKind,
|
|
331
|
+
scope_path: data.scope_path ?? args.scopePath,
|
|
332
|
+
operation_kind: data.operation_kind ?? args.operationKind,
|
|
333
|
+
owner_session_id: data.owner_session_id ?? args.ownerSessionId,
|
|
334
|
+
base_file_hash: data.base_file_hash,
|
|
335
|
+
base_blob_sha: data.base_blob_sha,
|
|
336
|
+
expires_at: data.expires_at,
|
|
337
|
+
lease_heartbeat_at: data.lease_heartbeat_at,
|
|
338
|
+
stale_after_seconds: data.stale_after_seconds,
|
|
339
|
+
current_mode: data.current_mode ?? args.currentMode,
|
|
340
|
+
proposed_merge_order: data.proposed_merge_order,
|
|
341
|
+
coordination_packet: data.coordination_packet,
|
|
342
|
+
stale_takeovers: data.stale_takeovers,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// ── releaseSessionLock ─────────────────────────────────────────────────────────
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Release a hive session lock acquired via claimSessionLock.
|
|
350
|
+
*
|
|
351
|
+
* Call this after finishing edits to the locked file path.
|
|
352
|
+
* Throws on non-2xx.
|
|
353
|
+
*/
|
|
354
|
+
export async function releaseSessionLock(lockId: string): Promise<void> {
|
|
355
|
+
const resp = await fetch(`${HARNESS_BASE_URL}/api/hive/session-lock?lock_id=${encodeURIComponent(lockId)}`, {
|
|
356
|
+
method: 'DELETE',
|
|
357
|
+
headers: baseHeaders(),
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
await requireOk(resp, 'releaseSessionLock');
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
export async function heartbeatSessionLock(args: {
|
|
364
|
+
lockId?: string;
|
|
365
|
+
sessionId?: string;
|
|
366
|
+
filePath?: string;
|
|
367
|
+
ttlMinutes?: number;
|
|
368
|
+
staleAfterSeconds?: number;
|
|
369
|
+
}): Promise<SessionLockHeartbeatResult> {
|
|
370
|
+
const resp = await fetch(`${HARNESS_BASE_URL}/api/hive/session-lock`, {
|
|
371
|
+
method: 'PATCH',
|
|
372
|
+
headers: baseHeaders(),
|
|
373
|
+
body: JSON.stringify({
|
|
374
|
+
action: 'heartbeat',
|
|
375
|
+
lock_id: args.lockId,
|
|
376
|
+
session_id: args.sessionId,
|
|
377
|
+
file_path: args.filePath,
|
|
378
|
+
ttl_minutes: args.ttlMinutes,
|
|
379
|
+
stale_after_seconds: args.staleAfterSeconds,
|
|
380
|
+
}),
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
await requireOk(resp, 'heartbeatSessionLock');
|
|
384
|
+
return await resp.json() as SessionLockHeartbeatResult;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
export async function checkSessionLockDrift(args: {
|
|
388
|
+
lockId?: string;
|
|
389
|
+
sessionId?: string;
|
|
390
|
+
filePath?: string;
|
|
391
|
+
}): Promise<SessionLockDriftResult> {
|
|
392
|
+
const resp = await fetch(`${HARNESS_BASE_URL}/api/hive/session-lock`, {
|
|
393
|
+
method: 'PATCH',
|
|
394
|
+
headers: baseHeaders(),
|
|
395
|
+
body: JSON.stringify({
|
|
396
|
+
action: 'check_drift',
|
|
397
|
+
lock_id: args.lockId,
|
|
398
|
+
session_id: args.sessionId,
|
|
399
|
+
file_path: args.filePath,
|
|
400
|
+
}),
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
await requireOk(resp, 'checkSessionLockDrift');
|
|
404
|
+
return await resp.json() as SessionLockDriftResult;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// ── postSessionMessage ─────────────────────────────────────────────────────────
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Post a coordination message from one session to another via the hive.
|
|
411
|
+
*
|
|
412
|
+
* Used before concurrent edits to announce intent and coordinate with parallel
|
|
413
|
+
* sessions per memory:feedback_hive_session_coordination.md.
|
|
414
|
+
* Throws on non-2xx.
|
|
415
|
+
*/
|
|
416
|
+
export async function postSessionMessage(args: SessionMessageArgs): Promise<SessionMessageResult> {
|
|
417
|
+
const resp = await fetch(`${HARNESS_BASE_URL}/api/hive/session-message`, {
|
|
418
|
+
method: 'POST',
|
|
419
|
+
headers: baseHeaders(),
|
|
420
|
+
body: JSON.stringify({
|
|
421
|
+
from_session_id: args.fromSessionId,
|
|
422
|
+
to_session_id: args.toSessionId,
|
|
423
|
+
topic: args.topic,
|
|
424
|
+
body: args.body,
|
|
425
|
+
}),
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
await requireOk(resp, 'postSessionMessage');
|
|
429
|
+
const data = await resp.json() as SessionMessageResult & { id?: string };
|
|
430
|
+
const message_id = data.message_id ?? data.id;
|
|
431
|
+
if (!message_id) {
|
|
432
|
+
throw new Error('[aria-connector/postSessionMessage] Server returned no message_id');
|
|
433
|
+
}
|
|
434
|
+
return {
|
|
435
|
+
message_id,
|
|
436
|
+
from_session_id: data.from_session_id ?? args.fromSessionId,
|
|
437
|
+
to_session_id: data.to_session_id ?? args.toSessionId,
|
|
438
|
+
topic: data.topic ?? args.topic,
|
|
439
|
+
created_at: data.created_at,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// ── readSessionMessages ────────────────────────────────────────────────────────
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Read session messages for a session from /api/hive/session-message.
|
|
447
|
+
*
|
|
448
|
+
* Pass unreadOnly=true (default: true) to fetch only unread messages.
|
|
449
|
+
* Throws on non-2xx.
|
|
450
|
+
*/
|
|
451
|
+
export async function readSessionMessages(args: {
|
|
452
|
+
sessionId: string;
|
|
453
|
+
unreadOnly?: boolean;
|
|
454
|
+
}): Promise<SessionMessageResult[]> {
|
|
455
|
+
const unreadOnly = args.unreadOnly ?? true;
|
|
456
|
+
const url =
|
|
457
|
+
`${HARNESS_BASE_URL}/api/hive/session-message` +
|
|
458
|
+
`?session_id=${encodeURIComponent(args.sessionId)}` +
|
|
459
|
+
`&unread=${unreadOnly ? 'true' : 'false'}`;
|
|
460
|
+
|
|
461
|
+
const resp = await fetch(url, {
|
|
462
|
+
method: 'GET',
|
|
463
|
+
headers: baseHeaders(),
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
await requireOk(resp, 'readSessionMessages');
|
|
467
|
+
const data = await resp.json() as { messages?: SessionMessageResult[]; data?: SessionMessageResult[] };
|
|
468
|
+
return data.messages ?? data.data ?? [];
|
|
469
|
+
}
|
|
@@ -3,7 +3,16 @@
|
|
|
3
3
|
// Every turn: read relevant memories, generate response, write new memories.
|
|
4
4
|
// Projects persist forever. Context is infinite. The harness improves per turn.
|
|
5
5
|
|
|
6
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
7
|
+
import { homedir } from 'node:os';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
|
|
6
10
|
const GARDEN_URL = process.env.GARDEN_SERVICE_URL || 'http://127.0.0.1:8097';
|
|
11
|
+
const HARNESS_URL =
|
|
12
|
+
process.env.ARIA_HARNESS_BASE_URL ||
|
|
13
|
+
process.env.ARIA_HARNESS_URL ||
|
|
14
|
+
'https://harness.ariasos.com';
|
|
15
|
+
const RUNTIME_URL = (process.env.ARIA_RUNTIME_URL || 'http://127.0.0.1:4319').replace(/\/+$/, '');
|
|
7
16
|
|
|
8
17
|
export interface GardenMemory {
|
|
9
18
|
id: string;
|
|
@@ -17,6 +26,52 @@ export interface GardenMemory {
|
|
|
17
26
|
tags: string[];
|
|
18
27
|
}
|
|
19
28
|
|
|
29
|
+
function readLocalToken(): string {
|
|
30
|
+
const ownerTokenPath = join(homedir(), '.aria', 'owner-token');
|
|
31
|
+
if (existsSync(ownerTokenPath)) {
|
|
32
|
+
const token = readFileSync(ownerTokenPath, 'utf8').trim();
|
|
33
|
+
if (token) return token;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const licensePath = join(homedir(), '.aria', 'license.json');
|
|
37
|
+
if (existsSync(licensePath)) {
|
|
38
|
+
try {
|
|
39
|
+
const payload = JSON.parse(readFileSync(licensePath, 'utf8')) as { token?: string; jti?: string };
|
|
40
|
+
return String(payload.token || payload.jti || '').trim();
|
|
41
|
+
} catch {
|
|
42
|
+
return '';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return '';
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function resolveBearerToken(): string {
|
|
50
|
+
return (
|
|
51
|
+
process.env.ARIA_API_KEY ||
|
|
52
|
+
process.env.ARIA_MASTER_TOKEN ||
|
|
53
|
+
process.env.ARIA_TOKEN ||
|
|
54
|
+
readLocalToken()
|
|
55
|
+
).trim();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function postGardenMemory(
|
|
59
|
+
url: string,
|
|
60
|
+
body: Record<string, unknown>,
|
|
61
|
+
headers: Record<string, string> = {},
|
|
62
|
+
): Promise<boolean> {
|
|
63
|
+
const resp = await fetch(url, {
|
|
64
|
+
method: 'POST',
|
|
65
|
+
headers: {
|
|
66
|
+
'Content-Type': 'application/json',
|
|
67
|
+
...headers,
|
|
68
|
+
},
|
|
69
|
+
body: JSON.stringify(body),
|
|
70
|
+
});
|
|
71
|
+
const data = await resp.json().catch(() => ({}));
|
|
72
|
+
return resp.ok && data?.ok !== false;
|
|
73
|
+
}
|
|
74
|
+
|
|
20
75
|
// ── WRITE: Plant memories after every turn ──
|
|
21
76
|
export async function plantGardenMemory(
|
|
22
77
|
type: GardenMemory['type'],
|
|
@@ -28,23 +83,25 @@ export async function plantGardenMemory(
|
|
|
28
83
|
tags: string[] = []
|
|
29
84
|
): Promise<boolean> {
|
|
30
85
|
try {
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
86
|
+
const payload = {
|
|
87
|
+
type,
|
|
88
|
+
content: content.slice(0, 2000),
|
|
89
|
+
intensity: Math.max(0.1, Math.min(1, intensity)),
|
|
90
|
+
sessionId,
|
|
91
|
+
userId,
|
|
92
|
+
projectId,
|
|
93
|
+
tags,
|
|
94
|
+
};
|
|
95
|
+
const token = resolveBearerToken();
|
|
96
|
+
if (token) {
|
|
97
|
+
const namedWrite = await postGardenMemory(
|
|
98
|
+
`${HARNESS_URL.replace(/\/+$/, '')}/api/garden/fire`,
|
|
99
|
+
payload,
|
|
100
|
+
{ Authorization: `Bearer ${token}` },
|
|
101
|
+
).catch(() => false);
|
|
102
|
+
if (namedWrite) return true;
|
|
103
|
+
}
|
|
104
|
+
return await postGardenMemory(`${GARDEN_URL}/garden/fire`, payload);
|
|
48
105
|
} catch {
|
|
49
106
|
return false;
|
|
50
107
|
}
|
|
@@ -60,15 +117,33 @@ export async function gardenTurnCycle(input: {
|
|
|
60
117
|
gateViolations?: string[];
|
|
61
118
|
evolutionEvents?: string[];
|
|
62
119
|
}): Promise<void> {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
120
|
+
const token = resolveBearerToken();
|
|
121
|
+
let wroteConversation = false;
|
|
122
|
+
if (token) {
|
|
123
|
+
wroteConversation = await postGardenMemory(
|
|
124
|
+
`${RUNTIME_URL}/garden/turn`,
|
|
125
|
+
{
|
|
126
|
+
apiKey: token,
|
|
127
|
+
sessionId: input.sessionId,
|
|
128
|
+
message: input.message,
|
|
129
|
+
response: input.response,
|
|
130
|
+
userId: input.userId,
|
|
131
|
+
},
|
|
132
|
+
{ Authorization: `Bearer ${token}` },
|
|
133
|
+
).catch(() => false);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (!wroteConversation) {
|
|
137
|
+
await plantGardenMemory(
|
|
138
|
+
'conversation',
|
|
139
|
+
`User: ${input.message.slice(0, 500)}\nAria: ${input.response.slice(0, 1000)}`,
|
|
140
|
+
0.6,
|
|
141
|
+
input.sessionId,
|
|
142
|
+
input.userId,
|
|
143
|
+
input.projectId,
|
|
144
|
+
['turn', 'conversation']
|
|
145
|
+
);
|
|
146
|
+
}
|
|
72
147
|
|
|
73
148
|
if (input.gateViolations?.length) {
|
|
74
149
|
await plantGardenMemory(
|