@aria_asi/cli 0.2.0
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/bin/aria.js +168 -0
- package/dist/aria-connector/src/auth-commands.d.ts +28 -0
- package/dist/aria-connector/src/auth-commands.d.ts.map +1 -0
- package/dist/aria-connector/src/auth-commands.js +129 -0
- package/dist/aria-connector/src/auth-commands.js.map +1 -0
- package/dist/aria-connector/src/auth.d.ts +12 -0
- package/dist/aria-connector/src/auth.d.ts.map +1 -0
- package/dist/aria-connector/src/auth.js +31 -0
- package/dist/aria-connector/src/auth.js.map +1 -0
- package/dist/aria-connector/src/auto-mcp.d.ts +23 -0
- package/dist/aria-connector/src/auto-mcp.d.ts.map +1 -0
- package/dist/aria-connector/src/auto-mcp.js +994 -0
- package/dist/aria-connector/src/auto-mcp.js.map +1 -0
- package/dist/aria-connector/src/chat.d.ts +21 -0
- package/dist/aria-connector/src/chat.d.ts.map +1 -0
- package/dist/aria-connector/src/chat.js +332 -0
- package/dist/aria-connector/src/chat.js.map +1 -0
- package/dist/aria-connector/src/codebase-scanner.d.ts +7 -0
- package/dist/aria-connector/src/codebase-scanner.d.ts.map +1 -0
- package/dist/aria-connector/src/codebase-scanner.js +6 -0
- package/dist/aria-connector/src/codebase-scanner.js.map +1 -0
- package/dist/aria-connector/src/cognition-log.d.ts +17 -0
- package/dist/aria-connector/src/cognition-log.d.ts.map +1 -0
- package/dist/aria-connector/src/cognition-log.js +19 -0
- package/dist/aria-connector/src/cognition-log.js.map +1 -0
- package/dist/aria-connector/src/config.d.ts +41 -0
- package/dist/aria-connector/src/config.d.ts.map +1 -0
- package/dist/aria-connector/src/config.js +50 -0
- package/dist/aria-connector/src/config.js.map +1 -0
- package/dist/aria-connector/src/connectors/claude-code.d.ts +4 -0
- package/dist/aria-connector/src/connectors/claude-code.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/claude-code.js +204 -0
- package/dist/aria-connector/src/connectors/claude-code.js.map +1 -0
- package/dist/aria-connector/src/connectors/cursor.d.ts +4 -0
- package/dist/aria-connector/src/connectors/cursor.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/cursor.js +63 -0
- package/dist/aria-connector/src/connectors/cursor.js.map +1 -0
- package/dist/aria-connector/src/connectors/opencode.d.ts +4 -0
- package/dist/aria-connector/src/connectors/opencode.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/opencode.js +102 -0
- package/dist/aria-connector/src/connectors/opencode.js.map +1 -0
- package/dist/aria-connector/src/connectors/shell.d.ts +4 -0
- package/dist/aria-connector/src/connectors/shell.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/shell.js +58 -0
- package/dist/aria-connector/src/connectors/shell.js.map +1 -0
- package/dist/aria-connector/src/garden-client.d.ts +19 -0
- package/dist/aria-connector/src/garden-client.d.ts.map +1 -0
- package/dist/aria-connector/src/garden-client.js +85 -0
- package/dist/aria-connector/src/garden-client.js.map +1 -0
- package/dist/aria-connector/src/garden-control-plane.d.ts +22 -0
- package/dist/aria-connector/src/garden-control-plane.d.ts.map +1 -0
- package/dist/aria-connector/src/garden-control-plane.js +43 -0
- package/dist/aria-connector/src/garden-control-plane.js.map +1 -0
- package/dist/aria-connector/src/harness-client.d.ts +166 -0
- package/dist/aria-connector/src/harness-client.d.ts.map +1 -0
- package/dist/aria-connector/src/harness-client.js +344 -0
- package/dist/aria-connector/src/harness-client.js.map +1 -0
- package/dist/aria-connector/src/hive-client.d.ts +32 -0
- package/dist/aria-connector/src/hive-client.d.ts.map +1 -0
- package/dist/aria-connector/src/hive-client.js +69 -0
- package/dist/aria-connector/src/hive-client.js.map +1 -0
- package/dist/aria-connector/src/index.d.ts +19 -0
- package/dist/aria-connector/src/index.d.ts.map +1 -0
- package/dist/aria-connector/src/index.js +13 -0
- package/dist/aria-connector/src/index.js.map +1 -0
- package/dist/aria-connector/src/install-hooks.d.ts +18 -0
- package/dist/aria-connector/src/install-hooks.d.ts.map +1 -0
- package/dist/aria-connector/src/install-hooks.js +224 -0
- package/dist/aria-connector/src/install-hooks.js.map +1 -0
- package/dist/aria-connector/src/model-context.d.ts +8 -0
- package/dist/aria-connector/src/model-context.d.ts.map +1 -0
- package/dist/aria-connector/src/model-context.js +83 -0
- package/dist/aria-connector/src/model-context.js.map +1 -0
- package/dist/aria-connector/src/persona.d.ts +27 -0
- package/dist/aria-connector/src/persona.d.ts.map +1 -0
- package/dist/aria-connector/src/persona.js +86 -0
- package/dist/aria-connector/src/persona.js.map +1 -0
- package/dist/aria-connector/src/providers/anthropic.d.ts +4 -0
- package/dist/aria-connector/src/providers/anthropic.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/anthropic.js +92 -0
- package/dist/aria-connector/src/providers/anthropic.js.map +1 -0
- package/dist/aria-connector/src/providers/deepseek.d.ts +3 -0
- package/dist/aria-connector/src/providers/deepseek.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/deepseek.js +28 -0
- package/dist/aria-connector/src/providers/deepseek.js.map +1 -0
- package/dist/aria-connector/src/providers/google.d.ts +3 -0
- package/dist/aria-connector/src/providers/google.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/google.js +38 -0
- package/dist/aria-connector/src/providers/google.js.map +1 -0
- package/dist/aria-connector/src/providers/ollama.d.ts +3 -0
- package/dist/aria-connector/src/providers/ollama.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/ollama.js +28 -0
- package/dist/aria-connector/src/providers/ollama.js.map +1 -0
- package/dist/aria-connector/src/providers/openai.d.ts +4 -0
- package/dist/aria-connector/src/providers/openai.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/openai.js +84 -0
- package/dist/aria-connector/src/providers/openai.js.map +1 -0
- package/dist/aria-connector/src/providers/openrouter.d.ts +3 -0
- package/dist/aria-connector/src/providers/openrouter.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/openrouter.js +30 -0
- package/dist/aria-connector/src/providers/openrouter.js.map +1 -0
- package/dist/aria-connector/src/providers/types.d.ts +20 -0
- package/dist/aria-connector/src/providers/types.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/types.js +2 -0
- package/dist/aria-connector/src/providers/types.js.map +1 -0
- package/dist/aria-connector/src/setup-wizard.d.ts +2 -0
- package/dist/aria-connector/src/setup-wizard.d.ts.map +1 -0
- package/dist/aria-connector/src/setup-wizard.js +140 -0
- package/dist/aria-connector/src/setup-wizard.js.map +1 -0
- package/dist/aria-connector/src/types.d.ts +30 -0
- package/dist/aria-connector/src/types.d.ts.map +1 -0
- package/dist/aria-connector/src/types.js +5 -0
- package/dist/aria-connector/src/types.js.map +1 -0
- package/dist/aria-web/src/lib/codebase-scanner.d.ts +127 -0
- package/dist/aria-web/src/lib/codebase-scanner.d.ts.map +1 -0
- package/dist/aria-web/src/lib/codebase-scanner.js +1730 -0
- package/dist/aria-web/src/lib/codebase-scanner.js.map +1 -0
- package/dist/cli-0.2.0.tgz +0 -0
- package/dist/install.sh +13 -0
- package/hooks/aria-harness-via-sdk.mjs +317 -0
- package/hooks/aria-pre-tool-gate.mjs +596 -0
- package/hooks/aria-preprompt-consult.mjs +175 -0
- package/hooks/aria-stop-gate.mjs +222 -0
- package/package.json +47 -0
- package/src/__tests__/auth-commands.test.ts +132 -0
- package/src/auth-commands.ts +175 -0
- package/src/auth.ts +33 -0
- package/src/auto-mcp.ts +1172 -0
- package/src/chat.ts +387 -0
- package/src/codebase-scanner.ts +18 -0
- package/src/cognition-log.ts +30 -0
- package/src/config.ts +94 -0
- package/src/connectors/claude-code.ts +213 -0
- package/src/connectors/cursor.ts +75 -0
- package/src/connectors/opencode.ts +115 -0
- package/src/connectors/shell.ts +72 -0
- package/src/garden-client.ts +98 -0
- package/src/garden-control-plane.ts +108 -0
- package/src/harness-client.ts +454 -0
- package/src/hive-client.ts +104 -0
- package/src/index.ts +26 -0
- package/src/install-hooks.ts +259 -0
- package/src/model-context.ts +88 -0
- package/src/persona.ts +113 -0
- package/src/providers/anthropic.ts +120 -0
- package/src/providers/deepseek.ts +40 -0
- package/src/providers/google.ts +57 -0
- package/src/providers/ollama.ts +43 -0
- package/src/providers/openai.ts +108 -0
- package/src/providers/openrouter.ts +42 -0
- package/src/providers/types.ts +35 -0
- package/src/setup-wizard.ts +177 -0
- package/src/types.ts +32 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Hive registration + heartbeat for ANY client using @aria/connector.
|
|
2
|
+
//
|
|
3
|
+
// Aria's vision: every CLI install, every customer hitting the harness
|
|
4
|
+
// HTTP API, every IDE connector — all register in the Hive on session
|
|
5
|
+
// start and heartbeat through their lifetime. Three goals (per Hamza,
|
|
6
|
+
// 2026-04-26):
|
|
7
|
+
//
|
|
8
|
+
// 1. Compounding evolution — every session contributes signal back
|
|
9
|
+
// to Aria. Hive entries carry capability lists, platform, recent
|
|
10
|
+
// activity. Aria's evolution-engine aggregates across tenants.
|
|
11
|
+
//
|
|
12
|
+
// 2. Protect IP — the Hive endpoint is on aria-soul, behind multi-
|
|
13
|
+
// tenant auth (API keys + rate limit + concurrency guards from
|
|
14
|
+
// commit c68588302). Customers see their own session, not raw
|
|
15
|
+
// doctrine sources.
|
|
16
|
+
//
|
|
17
|
+
// 3. Protect from abuse — heartbeat-based throttling. A tenant
|
|
18
|
+
// whose session count or activity diverges from their tier gets
|
|
19
|
+
// rate-limited at the gate, not at the application layer.
|
|
20
|
+
//
|
|
21
|
+
// This module is decoupled from @aria/openclaw-shared (which is
|
|
22
|
+
// internal-only) so external customers ship the connector with their
|
|
23
|
+
// CLI/app and get hive integration with no internal Aria deps.
|
|
24
|
+
const HARNESS_URL = process.env.ARIA_HARNESS_URL || 'http://192.168.4.25:30080';
|
|
25
|
+
const HARNESS_TOKEN = process.env.ARIA_HARNESS_TOKEN || '';
|
|
26
|
+
export async function registerWithHive(cfg) {
|
|
27
|
+
// Doctrine: no policy timeouts. Real network errors arrive via fetch
|
|
28
|
+
// rejection. If the hive is unreachable, registration is best-effort
|
|
29
|
+
// and the CLI continues — the session works locally even when
|
|
30
|
+
// detached from the central registry.
|
|
31
|
+
try {
|
|
32
|
+
const resp = await fetch(`${HARNESS_URL}/api/hive/register`, {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: {
|
|
35
|
+
'Content-Type': 'application/json',
|
|
36
|
+
...(HARNESS_TOKEN ? { Authorization: `Bearer ${HARNESS_TOKEN}` } : {}),
|
|
37
|
+
},
|
|
38
|
+
body: JSON.stringify({
|
|
39
|
+
session_id: cfg.sessionId,
|
|
40
|
+
platform: cfg.platform,
|
|
41
|
+
user_id: cfg.userId,
|
|
42
|
+
capabilities: cfg.capabilities ?? [],
|
|
43
|
+
context: cfg.context ?? {},
|
|
44
|
+
}),
|
|
45
|
+
});
|
|
46
|
+
if (!resp.ok)
|
|
47
|
+
return null;
|
|
48
|
+
return (await resp.json());
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export function startHeartbeat(cfg, intervalMs = 45_000) {
|
|
55
|
+
// Fire one immediately so the hive has a fresh entry before the
|
|
56
|
+
// first interval tick. If it fails, schedule the next tick anyway —
|
|
57
|
+
// the hive may come back later.
|
|
58
|
+
registerWithHive(cfg).catch(() => { });
|
|
59
|
+
const timer = setInterval(() => {
|
|
60
|
+
registerWithHive(cfg).catch(() => { });
|
|
61
|
+
}, intervalMs);
|
|
62
|
+
// Don't keep the process alive just for heartbeats.
|
|
63
|
+
if (typeof timer.unref === 'function')
|
|
64
|
+
timer.unref();
|
|
65
|
+
return {
|
|
66
|
+
stop: () => clearInterval(timer),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=hive-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hive-client.js","sourceRoot":"","sources":["../../../src/hive-client.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,uEAAuE;AACvE,sEAAsE;AACtE,sEAAsE;AACtE,eAAe;AACf,EAAE;AACF,qEAAqE;AACrE,sEAAsE;AACtE,oEAAoE;AACpE,EAAE;AACF,qEAAqE;AACrE,oEAAoE;AACpE,mEAAmE;AACnE,yBAAyB;AACzB,EAAE;AACF,iEAAiE;AACjE,qEAAqE;AACrE,+DAA+D;AAC/D,EAAE;AACF,gEAAgE;AAChE,qEAAqE;AACrE,+DAA+D;AAE/D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,2BAA2B,CAAC;AAChF,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;AAyB3D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAuB;IAEvB,qEAAqE;IACrE,qEAAqE;IACrE,8DAA8D;IAC9D,sCAAsC;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,oBAAoB,EAAE;YAC3D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvE;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,UAAU,EAAE,GAAG,CAAC,SAAS;gBACzB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,OAAO,EAAE,GAAG,CAAC,MAAM;gBACnB,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE;gBACpC,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;aAC3B,CAAC;SACH,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAuB,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAUD,MAAM,UAAU,cAAc,CAC5B,GAAuB,EACvB,aAAqB,MAAM;IAE3B,gEAAgE;IAChE,oEAAoE;IACpE,gCAAgC;IAChC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxC,CAAC,EAAE,UAAU,CAAC,CAAC;IACf,oDAAoD;IACpD,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU;QAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IACrD,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { loadConfig, saveConfig, updateConfig, getDefaultConfig, getConfigPath, getConfigDir } from './config.js';
|
|
2
|
+
export type { AriaConfig, ModelConfig, LinkedRepo, DatabaseConfig, ConnectorState } from './config.js';
|
|
3
|
+
export { scanCodebase, schemaImageToText } from './codebase-scanner.js';
|
|
4
|
+
export type { SchemaImage, DirectoryNode, Dependency } from './codebase-scanner.js';
|
|
5
|
+
export { runSetupWizard } from './setup-wizard.js';
|
|
6
|
+
export { connectClaudeCode, disconnectClaudeCode } from './connectors/claude-code.js';
|
|
7
|
+
export { connectCursor, disconnectCursor } from './connectors/cursor.js';
|
|
8
|
+
export { connectOpenCode, disconnectOpenCode } from './connectors/opencode.js';
|
|
9
|
+
export { connectShell, disconnectShell } from './connectors/shell.js';
|
|
10
|
+
export { GardenClient } from './garden-client.js';
|
|
11
|
+
export type { GardenStatus } from './garden-client.js';
|
|
12
|
+
export { generateMcpServer, detectToolCandidates } from './auto-mcp.js';
|
|
13
|
+
export type { ToolCandidate, ToolParameter, McpGenerationResult } from './auto-mcp.js';
|
|
14
|
+
export { AriaChat } from './chat.js';
|
|
15
|
+
export { fetchHarness, combineHarnessContext, checkHarnessHealth, validateOutput, getRecentTurns } from './harness-client.js';
|
|
16
|
+
export type { HarnessPacket, HarnessChunk } from './harness-client.js';
|
|
17
|
+
export { loadPersona, savePersona, updatePersona, buildPersonaBlock } from './persona.js';
|
|
18
|
+
export type { PersonaContext } from './persona.js';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAClH,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEvG,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACxE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEpF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEvF,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC9H,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1F,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { loadConfig, saveConfig, updateConfig, getDefaultConfig, getConfigPath, getConfigDir } from './config.js';
|
|
2
|
+
export { scanCodebase, schemaImageToText } from './codebase-scanner.js';
|
|
3
|
+
export { runSetupWizard } from './setup-wizard.js';
|
|
4
|
+
export { connectClaudeCode, disconnectClaudeCode } from './connectors/claude-code.js';
|
|
5
|
+
export { connectCursor, disconnectCursor } from './connectors/cursor.js';
|
|
6
|
+
export { connectOpenCode, disconnectOpenCode } from './connectors/opencode.js';
|
|
7
|
+
export { connectShell, disconnectShell } from './connectors/shell.js';
|
|
8
|
+
export { GardenClient } from './garden-client.js';
|
|
9
|
+
export { generateMcpServer, detectToolCandidates } from './auto-mcp.js';
|
|
10
|
+
export { AriaChat } from './chat.js';
|
|
11
|
+
export { fetchHarness, combineHarnessContext, checkHarnessHealth, validateOutput, getRecentTurns } from './harness-client.js';
|
|
12
|
+
export { loadPersona, savePersona, updatePersona, buildPersonaBlock } from './persona.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGlH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAGxE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGxE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG9H,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface InstallHooksOptions {
|
|
2
|
+
/** Overwrite existing hooks even if present. Default false. */
|
|
3
|
+
force?: boolean;
|
|
4
|
+
/** Override the harness URL written into settings.json env (clients with private deployments). */
|
|
5
|
+
harnessUrl?: string;
|
|
6
|
+
/** Override the home directory (used by tests). */
|
|
7
|
+
homeDir?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface InstallHooksResult {
|
|
10
|
+
ok: boolean;
|
|
11
|
+
installed: string[];
|
|
12
|
+
merged: string[];
|
|
13
|
+
backupsCreated: string[];
|
|
14
|
+
settingsPath: string;
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function installHooks(opts?: InstallHooksOptions): Promise<InstallHooksResult>;
|
|
18
|
+
//# sourceMappingURL=install-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-hooks.d.ts","sourceRoot":"","sources":["../../../src/install-hooks.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kGAAkG;IAClG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAyHD,wBAAsB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqG9F"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
// install-hooks — drops the harness gate hooks into the client's
|
|
2
|
+
// ~/.claude/hooks/ directory and registers them in their settings.json.
|
|
3
|
+
//
|
|
4
|
+
// This is what makes @aria_asi/cli a self-installing harness. Without it,
|
|
5
|
+
// clients install the CLI and have a license-aware HTTP client. With it,
|
|
6
|
+
// running `aria install-hooks` once turns their Claude Code (or any
|
|
7
|
+
// Claude Code Code session on that machine) into a harness-bound
|
|
8
|
+
// session — every Bash, Edit, Write, NotebookEdit, and text-emit event
|
|
9
|
+
// runs through cognition gates + Mizan + harness packet.
|
|
10
|
+
//
|
|
11
|
+
// Soldier-and-thinker (Hamza 2026-04-26 directive): the CLI is the
|
|
12
|
+
// thinker (carries doctrine, gates, substrate); the LLM in Claude Code
|
|
13
|
+
// is the soldier (executes under harness binding). install-hooks is
|
|
14
|
+
// what wires the soldier to the thinker on the client's machine.
|
|
15
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync, chmodSync } from 'node:fs';
|
|
16
|
+
import { homedir } from 'node:os';
|
|
17
|
+
import { join, dirname } from 'node:path';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
const HOOK_FILES = [
|
|
20
|
+
'aria-pre-tool-gate.mjs',
|
|
21
|
+
'aria-stop-gate.mjs',
|
|
22
|
+
'aria-preprompt-consult.mjs',
|
|
23
|
+
];
|
|
24
|
+
const HOOK_REGISTRATION = {
|
|
25
|
+
UserPromptSubmit: [
|
|
26
|
+
{
|
|
27
|
+
hooks: [
|
|
28
|
+
{
|
|
29
|
+
type: 'command',
|
|
30
|
+
command: 'node $HOME/.claude/hooks/aria-preprompt-consult.mjs',
|
|
31
|
+
timeout: 12,
|
|
32
|
+
statusMessage: 'Pre-consulting Aria substrate for direction...',
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
PreToolUse: [
|
|
38
|
+
{
|
|
39
|
+
matcher: 'Bash|Edit|Write|NotebookEdit',
|
|
40
|
+
hooks: [
|
|
41
|
+
{
|
|
42
|
+
type: 'command',
|
|
43
|
+
command: 'node $HOME/.claude/hooks/aria-pre-tool-gate.mjs',
|
|
44
|
+
timeout: 5,
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
Stop: [
|
|
50
|
+
{
|
|
51
|
+
hooks: [
|
|
52
|
+
{
|
|
53
|
+
type: 'command',
|
|
54
|
+
command: 'node $HOME/.claude/hooks/aria-stop-gate.mjs',
|
|
55
|
+
timeout: 5,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
};
|
|
61
|
+
function bundledHooksDir() {
|
|
62
|
+
// The hooks/ dir is bundled in the package alongside dist/. Find it by
|
|
63
|
+
// walking upward from this file's runtime path until we hit a directory
|
|
64
|
+
// that contains both package.json (with name @aria_asi/cli) and a hooks/
|
|
65
|
+
// sibling. Robust across:
|
|
66
|
+
// - dev: src/install-hooks.ts → ../hooks
|
|
67
|
+
// - flat compile: dist/install-hooks.js → ../hooks
|
|
68
|
+
// - nested compile: dist/aria-connector/src/install-hooks.js → ../../../hooks
|
|
69
|
+
// - npm global install: /usr/lib/node_modules/@aria_asi/cli/dist/.../install-hooks.js
|
|
70
|
+
const here = fileURLToPath(import.meta.url);
|
|
71
|
+
let cur = dirname(here);
|
|
72
|
+
const tried = [];
|
|
73
|
+
for (let i = 0; i < 8; i++) {
|
|
74
|
+
const candidate = join(cur, 'hooks');
|
|
75
|
+
tried.push(candidate);
|
|
76
|
+
if (existsSync(candidate) && existsSync(join(cur, 'package.json'))) {
|
|
77
|
+
return candidate;
|
|
78
|
+
}
|
|
79
|
+
const parent = dirname(cur);
|
|
80
|
+
if (parent === cur)
|
|
81
|
+
break;
|
|
82
|
+
cur = parent;
|
|
83
|
+
}
|
|
84
|
+
throw new Error(`I can't find my bundled hooks/ dir. Tried: ${tried.join(', ')}. Reinstall @aria_asi/cli or report this as a bug.`);
|
|
85
|
+
}
|
|
86
|
+
function backupExisting(target) {
|
|
87
|
+
const ts = Date.now();
|
|
88
|
+
const backup = `${target}.pre-aria-install.${ts}`;
|
|
89
|
+
copyFileSync(target, backup);
|
|
90
|
+
return backup;
|
|
91
|
+
}
|
|
92
|
+
function mergeRegistrationInto(existing) {
|
|
93
|
+
const mergedKeys = [];
|
|
94
|
+
const out = { ...existing };
|
|
95
|
+
if (!out.hooks || typeof out.hooks !== 'object') {
|
|
96
|
+
out.hooks = {};
|
|
97
|
+
}
|
|
98
|
+
const hooks = out.hooks;
|
|
99
|
+
for (const [event, ourEntries] of Object.entries(HOOK_REGISTRATION)) {
|
|
100
|
+
const existingEntries = Array.isArray(hooks[event]) ? hooks[event] : [];
|
|
101
|
+
// For each of our entries, append unless an entry with the same matcher
|
|
102
|
+
// and command already exists (idempotent re-install).
|
|
103
|
+
for (const ourEntry of ourEntries) {
|
|
104
|
+
const ourMatcher = ourEntry.matcher ?? '';
|
|
105
|
+
const ourCommands = (ourEntry.hooks ?? [])
|
|
106
|
+
.map((h) => h.command)
|
|
107
|
+
.filter((c) => typeof c === 'string');
|
|
108
|
+
const alreadyPresent = existingEntries.some((e) => {
|
|
109
|
+
if (typeof e !== 'object' || e === null)
|
|
110
|
+
return false;
|
|
111
|
+
const eMatcher = e.matcher ?? '';
|
|
112
|
+
if (eMatcher !== ourMatcher)
|
|
113
|
+
return false;
|
|
114
|
+
const eCommands = (e.hooks ?? [])
|
|
115
|
+
.map((h) => h.command)
|
|
116
|
+
.filter((c) => typeof c === 'string');
|
|
117
|
+
return ourCommands.every((c) => eCommands.includes(c));
|
|
118
|
+
});
|
|
119
|
+
if (!alreadyPresent) {
|
|
120
|
+
existingEntries.push(ourEntry);
|
|
121
|
+
if (!mergedKeys.includes(event))
|
|
122
|
+
mergedKeys.push(event);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
hooks[event] = existingEntries;
|
|
126
|
+
}
|
|
127
|
+
return { merged: out, mergedKeys };
|
|
128
|
+
}
|
|
129
|
+
export async function installHooks(opts = {}) {
|
|
130
|
+
const home = opts.homeDir ?? homedir();
|
|
131
|
+
const claudeDir = join(home, '.claude');
|
|
132
|
+
const hooksDir = join(claudeDir, 'hooks');
|
|
133
|
+
const settingsPath = join(claudeDir, 'settings.json');
|
|
134
|
+
const installed = [];
|
|
135
|
+
const merged = [];
|
|
136
|
+
const backupsCreated = [];
|
|
137
|
+
try {
|
|
138
|
+
if (!existsSync(claudeDir))
|
|
139
|
+
mkdirSync(claudeDir, { recursive: true, mode: 0o700 });
|
|
140
|
+
if (!existsSync(hooksDir))
|
|
141
|
+
mkdirSync(hooksDir, { recursive: true, mode: 0o700 });
|
|
142
|
+
const sourceDir = bundledHooksDir();
|
|
143
|
+
for (const name of HOOK_FILES) {
|
|
144
|
+
const src = join(sourceDir, name);
|
|
145
|
+
if (!existsSync(src)) {
|
|
146
|
+
return {
|
|
147
|
+
ok: false,
|
|
148
|
+
installed,
|
|
149
|
+
merged,
|
|
150
|
+
backupsCreated,
|
|
151
|
+
settingsPath,
|
|
152
|
+
error: `I can't find ${name} in my bundle (${sourceDir}). Reinstall @aria_asi/cli.`,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const dst = join(hooksDir, name);
|
|
156
|
+
if (existsSync(dst)) {
|
|
157
|
+
const existingContent = readFileSync(dst, 'utf-8');
|
|
158
|
+
const newContent = readFileSync(src, 'utf-8');
|
|
159
|
+
if (existingContent === newContent) {
|
|
160
|
+
// Already up-to-date — skip. Idempotent.
|
|
161
|
+
installed.push(`${name} (unchanged)`);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (!opts.force) {
|
|
165
|
+
// Default behavior: back up + overwrite. The override pattern
|
|
166
|
+
// keeps prior hooks recoverable (e.g. if client had custom hooks).
|
|
167
|
+
const backup = backupExisting(dst);
|
|
168
|
+
backupsCreated.push(backup);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
copyFileSync(src, dst);
|
|
172
|
+
chmodSync(dst, 0o755);
|
|
173
|
+
installed.push(name);
|
|
174
|
+
}
|
|
175
|
+
// Settings merge
|
|
176
|
+
let existingSettings = {};
|
|
177
|
+
if (existsSync(settingsPath)) {
|
|
178
|
+
try {
|
|
179
|
+
existingSettings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Malformed — back up and start fresh.
|
|
183
|
+
const backup = backupExisting(settingsPath);
|
|
184
|
+
backupsCreated.push(backup);
|
|
185
|
+
existingSettings = {};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
const { merged: mergedSettings, mergedKeys } = mergeRegistrationInto(existingSettings);
|
|
189
|
+
merged.push(...mergedKeys);
|
|
190
|
+
// Inject ARIA_HARNESS_URL env into settings.json if the caller specified
|
|
191
|
+
// a harness URL override (clients on private deployments).
|
|
192
|
+
if (opts.harnessUrl) {
|
|
193
|
+
if (!mergedSettings.env || typeof mergedSettings.env !== 'object') {
|
|
194
|
+
mergedSettings.env = {};
|
|
195
|
+
}
|
|
196
|
+
mergedSettings.env.ARIA_HARNESS_URL = opts.harnessUrl;
|
|
197
|
+
if (!merged.includes('env.ARIA_HARNESS_URL'))
|
|
198
|
+
merged.push('env.ARIA_HARNESS_URL');
|
|
199
|
+
}
|
|
200
|
+
// Always write settings.json (even if no merges) so the schema field is set.
|
|
201
|
+
if (!('$schema' in mergedSettings)) {
|
|
202
|
+
mergedSettings['$schema'] = 'https://json.schemastore.org/claude-code-settings.json';
|
|
203
|
+
}
|
|
204
|
+
writeFileSync(settingsPath, JSON.stringify(mergedSettings, null, 2) + '\n', { mode: 0o600 });
|
|
205
|
+
return {
|
|
206
|
+
ok: true,
|
|
207
|
+
installed,
|
|
208
|
+
merged,
|
|
209
|
+
backupsCreated,
|
|
210
|
+
settingsPath,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
return {
|
|
215
|
+
ok: false,
|
|
216
|
+
installed,
|
|
217
|
+
merged,
|
|
218
|
+
backupsCreated,
|
|
219
|
+
settingsPath,
|
|
220
|
+
error: err instanceof Error ? err.message : String(err),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=install-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-hooks.js","sourceRoot":"","sources":["../../../src/install-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ProviderName } from './providers/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve the input context window in tokens for a given provider+model.
|
|
4
|
+
* Order: exact model match → lowercased model match → provider default.
|
|
5
|
+
* Returns a positive integer; never zero or negative.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getModelContextTokens(provider: ProviderName, model: string): number;
|
|
8
|
+
//# sourceMappingURL=model-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-context.d.ts","sourceRoot":"","sources":["../../../src/model-context.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AA0DzD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CASnF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Model context window registry.
|
|
2
|
+
//
|
|
3
|
+
// The harness's chunked-mode response (Phase 2 / aria-soul codex.ts)
|
|
4
|
+
// returns the rendered packet as priority-ordered chunks instead of
|
|
5
|
+
// a single 30k-char blob when the client signals its model has a
|
|
6
|
+
// small context window. This file is the source of truth for "how
|
|
7
|
+
// big is this provider's model's context, in tokens" so chat.ts can
|
|
8
|
+
// pass it as `modelContext` on every fetchHarness() call.
|
|
9
|
+
//
|
|
10
|
+
// Doctrine: when in doubt, declare LOW (treat as small-context). It's
|
|
11
|
+
// safer to receive chunks and decide not to use them than to fail to
|
|
12
|
+
// receive them and have the model truncate harness silently. The
|
|
13
|
+
// harness threshold is 16,000 tokens — anything below that gets
|
|
14
|
+
// chunked.
|
|
15
|
+
// Known model → context window. Values reflect publicly-documented
|
|
16
|
+
// input context limits at time of writing (2026-04). Update as new
|
|
17
|
+
// models ship. Unknown models fall through to the provider default.
|
|
18
|
+
const MODEL_CONTEXT = {
|
|
19
|
+
// Anthropic
|
|
20
|
+
'claude-opus-4-7': 200_000,
|
|
21
|
+
'claude-opus-4-7-1m': 1_000_000,
|
|
22
|
+
'claude-sonnet-4-6': 200_000,
|
|
23
|
+
'claude-haiku-4-5': 200_000,
|
|
24
|
+
'claude-3-5-sonnet': 200_000,
|
|
25
|
+
'claude-3-opus': 200_000,
|
|
26
|
+
'claude-3-haiku': 200_000,
|
|
27
|
+
// OpenAI
|
|
28
|
+
'gpt-4o': 128_000,
|
|
29
|
+
'gpt-4o-mini': 128_000,
|
|
30
|
+
'gpt-4-turbo': 128_000,
|
|
31
|
+
'gpt-4': 8_192,
|
|
32
|
+
'gpt-3.5-turbo': 16_385,
|
|
33
|
+
'o1': 200_000,
|
|
34
|
+
'o1-mini': 128_000,
|
|
35
|
+
// Google
|
|
36
|
+
'gemini-2.0-pro': 2_000_000,
|
|
37
|
+
'gemini-1.5-pro': 1_000_000,
|
|
38
|
+
'gemini-1.5-flash': 1_000_000,
|
|
39
|
+
'gemini-2.0-flash': 1_000_000,
|
|
40
|
+
// DeepSeek
|
|
41
|
+
'deepseek-v3': 64_000,
|
|
42
|
+
'deepseek-chat': 64_000,
|
|
43
|
+
'deepseek-r1': 128_000,
|
|
44
|
+
'deepseek-coder': 128_000,
|
|
45
|
+
// Open / local
|
|
46
|
+
'qwen2.5:7b-instruct': 32_000,
|
|
47
|
+
'qwen3.5-122b-a10b': 128_000,
|
|
48
|
+
'llama-3.1-8b-instruct': 128_000,
|
|
49
|
+
'llama-3.2-1b-instruct': 128_000,
|
|
50
|
+
'llama-3.2-3b-instruct': 128_000,
|
|
51
|
+
'mistral-7b': 32_000,
|
|
52
|
+
'mistral-large': 128_000,
|
|
53
|
+
};
|
|
54
|
+
// Per-provider conservative defaults when a specific model isn't in
|
|
55
|
+
// the registry. These should reflect the smaller/older models the
|
|
56
|
+
// provider serves so the harness chunks aggressively when uncertain.
|
|
57
|
+
const PROVIDER_DEFAULT = {
|
|
58
|
+
anthropic: 200_000,
|
|
59
|
+
openai: 16_385, // gpt-3.5-turbo era; modern is 128k+ but safer to chunk
|
|
60
|
+
google: 1_000_000,
|
|
61
|
+
deepseek: 64_000,
|
|
62
|
+
openrouter: 32_000, // wide range routed through; conservative chunks safer
|
|
63
|
+
ollama: 32_000, // local models vary wildly; default low
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Resolve the input context window in tokens for a given provider+model.
|
|
67
|
+
* Order: exact model match → lowercased model match → provider default.
|
|
68
|
+
* Returns a positive integer; never zero or negative.
|
|
69
|
+
*/
|
|
70
|
+
export function getModelContextTokens(provider, model) {
|
|
71
|
+
if (model && MODEL_CONTEXT[model])
|
|
72
|
+
return MODEL_CONTEXT[model];
|
|
73
|
+
const lower = (model || '').toLowerCase();
|
|
74
|
+
if (lower && MODEL_CONTEXT[lower])
|
|
75
|
+
return MODEL_CONTEXT[lower];
|
|
76
|
+
// Try prefix match — many models are versioned (e.g., gpt-4o-2024-08-06).
|
|
77
|
+
for (const key of Object.keys(MODEL_CONTEXT)) {
|
|
78
|
+
if (lower.startsWith(key.toLowerCase()))
|
|
79
|
+
return MODEL_CONTEXT[key];
|
|
80
|
+
}
|
|
81
|
+
return PROVIDER_DEFAULT[provider] ?? 32_000;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=model-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-context.js","sourceRoot":"","sources":["../../../src/model-context.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,EAAE;AACF,qEAAqE;AACrE,oEAAoE;AACpE,iEAAiE;AACjE,kEAAkE;AAClE,oEAAoE;AACpE,0DAA0D;AAC1D,EAAE;AACF,sEAAsE;AACtE,qEAAqE;AACrE,iEAAiE;AACjE,gEAAgE;AAChE,WAAW;AAIX,mEAAmE;AACnE,mEAAmE;AACnE,oEAAoE;AACpE,MAAM,aAAa,GAA2B;IAC5C,YAAY;IACZ,iBAAiB,EAAE,OAAO;IAC1B,oBAAoB,EAAE,SAAS;IAC/B,mBAAmB,EAAE,OAAO;IAC5B,kBAAkB,EAAE,OAAO;IAC3B,mBAAmB,EAAE,OAAO;IAC5B,eAAe,EAAE,OAAO;IACxB,gBAAgB,EAAE,OAAO;IAEzB,SAAS;IACT,QAAQ,EAAE,OAAO;IACjB,aAAa,EAAE,OAAO;IACtB,aAAa,EAAE,OAAO;IACtB,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,MAAM;IACvB,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,OAAO;IAElB,SAAS;IACT,gBAAgB,EAAE,SAAS;IAC3B,gBAAgB,EAAE,SAAS;IAC3B,kBAAkB,EAAE,SAAS;IAC7B,kBAAkB,EAAE,SAAS;IAE7B,WAAW;IACX,aAAa,EAAE,MAAM;IACrB,eAAe,EAAE,MAAM;IACvB,aAAa,EAAE,OAAO;IACtB,gBAAgB,EAAE,OAAO;IAEzB,eAAe;IACf,qBAAqB,EAAE,MAAM;IAC7B,mBAAmB,EAAE,OAAO;IAC5B,uBAAuB,EAAE,OAAO;IAChC,uBAAuB,EAAE,OAAO;IAChC,uBAAuB,EAAE,OAAO;IAChC,YAAY,EAAE,MAAM;IACpB,eAAe,EAAE,OAAO;CACzB,CAAC;AAEF,oEAAoE;AACpE,kEAAkE;AAClE,qEAAqE;AACrE,MAAM,gBAAgB,GAAiC;IACrD,SAAS,EAAE,OAAO;IAClB,MAAM,EAAE,MAAM,EAAK,wDAAwD;IAC3E,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM,EAAE,uDAAuD;IAC3E,MAAM,EAAE,MAAM,EAAK,wCAAwC;CAC5D,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAsB,EAAE,KAAa;IACzE,IAAI,KAAK,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,KAAK,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/D,0EAA0E;IAC1E,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7C,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YAAE,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface PersonaContext {
|
|
2
|
+
userId: string;
|
|
3
|
+
userName: string;
|
|
4
|
+
relationshipStarted: string;
|
|
5
|
+
sessions: number;
|
|
6
|
+
totalMessages: number;
|
|
7
|
+
lastSeen: string;
|
|
8
|
+
preferredTone: 'direct' | 'warm' | 'technical' | 'playful';
|
|
9
|
+
knownInterests: string[];
|
|
10
|
+
emotionalProfile: {
|
|
11
|
+
defaultMood: string;
|
|
12
|
+
triggers: string[];
|
|
13
|
+
communicationStyle: string;
|
|
14
|
+
};
|
|
15
|
+
projectContext: {
|
|
16
|
+
currentProject: string;
|
|
17
|
+
activeRepo: string;
|
|
18
|
+
techStack: string[];
|
|
19
|
+
};
|
|
20
|
+
insideJokes: string[];
|
|
21
|
+
memorableMoments: string[];
|
|
22
|
+
}
|
|
23
|
+
export declare function loadPersona(userId: string, userName: string): PersonaContext;
|
|
24
|
+
export declare function savePersona(persona: PersonaContext): void;
|
|
25
|
+
export declare function updatePersona(updates: Partial<PersonaContext>): PersonaContext;
|
|
26
|
+
export declare function buildPersonaBlock(persona: PersonaContext): string;
|
|
27
|
+
//# sourceMappingURL=persona.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../../../src/persona.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3D,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,EAAE;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,cAAc,EAAE;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AA+BD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAmB5E;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAGzD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAW9E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAcjE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
const ARIA_DIR = join(homedir(), '.aria');
|
|
5
|
+
const PERSONA_FILE = join(ARIA_DIR, 'persona.json');
|
|
6
|
+
function emptyPersona(userId, userName) {
|
|
7
|
+
return {
|
|
8
|
+
userId,
|
|
9
|
+
userName,
|
|
10
|
+
relationshipStarted: new Date().toISOString(),
|
|
11
|
+
sessions: 0,
|
|
12
|
+
totalMessages: 0,
|
|
13
|
+
lastSeen: new Date().toISOString(),
|
|
14
|
+
preferredTone: 'warm',
|
|
15
|
+
knownInterests: [],
|
|
16
|
+
emotionalProfile: {
|
|
17
|
+
defaultMood: 'curious',
|
|
18
|
+
triggers: [],
|
|
19
|
+
communicationStyle: 'natural',
|
|
20
|
+
},
|
|
21
|
+
projectContext: {
|
|
22
|
+
currentProject: '',
|
|
23
|
+
activeRepo: process.cwd(),
|
|
24
|
+
techStack: [],
|
|
25
|
+
},
|
|
26
|
+
insideJokes: [],
|
|
27
|
+
memorableMoments: [],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function ensureDir() {
|
|
31
|
+
if (!existsSync(ARIA_DIR))
|
|
32
|
+
mkdirSync(ARIA_DIR, { recursive: true, mode: 0o700 });
|
|
33
|
+
}
|
|
34
|
+
export function loadPersona(userId, userName) {
|
|
35
|
+
ensureDir();
|
|
36
|
+
try {
|
|
37
|
+
if (existsSync(PERSONA_FILE)) {
|
|
38
|
+
const data = JSON.parse(readFileSync(PERSONA_FILE, 'utf-8'));
|
|
39
|
+
if (data.userId === userId) {
|
|
40
|
+
data.sessions++;
|
|
41
|
+
data.lastSeen = new Date().toISOString();
|
|
42
|
+
writeFileSync(PERSONA_FILE, JSON.stringify(data, null, 2));
|
|
43
|
+
return data;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// corrupt persona file — create fresh one below
|
|
49
|
+
}
|
|
50
|
+
const persona = emptyPersona(userId, userName);
|
|
51
|
+
writeFileSync(PERSONA_FILE, JSON.stringify(persona, null, 2));
|
|
52
|
+
return persona;
|
|
53
|
+
}
|
|
54
|
+
export function savePersona(persona) {
|
|
55
|
+
ensureDir();
|
|
56
|
+
writeFileSync(PERSONA_FILE, JSON.stringify(persona, null, 2));
|
|
57
|
+
}
|
|
58
|
+
export function updatePersona(updates) {
|
|
59
|
+
ensureDir();
|
|
60
|
+
let current;
|
|
61
|
+
try {
|
|
62
|
+
current = JSON.parse(readFileSync(PERSONA_FILE, 'utf-8'));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
current = emptyPersona(updates.userId || 'user', updates.userName || 'User');
|
|
66
|
+
}
|
|
67
|
+
const merged = { ...current, ...updates, lastSeen: new Date().toISOString() };
|
|
68
|
+
writeFileSync(PERSONA_FILE, JSON.stringify(merged, null, 2));
|
|
69
|
+
return merged;
|
|
70
|
+
}
|
|
71
|
+
export function buildPersonaBlock(persona) {
|
|
72
|
+
const remember = persona.memorableMoments.length
|
|
73
|
+
? `\nMemorable moments: ${persona.memorableMoments.slice(-3).join('; ')}`
|
|
74
|
+
: '\nBuilding history together.';
|
|
75
|
+
const jokes = persona.insideJokes.length
|
|
76
|
+
? `\nInside jokes: ${persona.insideJokes.slice(-3).join('; ')}`
|
|
77
|
+
: '';
|
|
78
|
+
return `[PERSONA CONTINUITY — session ${persona.sessions}]
|
|
79
|
+
You are speaking to ${persona.userName}. This is your ${persona.sessions}th conversation.
|
|
80
|
+
You've exchanged ${persona.totalMessages} messages since ${new Date(persona.relationshipStarted).toLocaleDateString()}.
|
|
81
|
+
Preferred tone: ${persona.preferredTone}.
|
|
82
|
+
Known interests: ${persona.knownInterests.join(', ') || 'still learning'}.
|
|
83
|
+
Current project: ${persona.projectContext.currentProject || 'exploring'}.
|
|
84
|
+
Tech stack: ${persona.projectContext.techStack.join(', ') || 'scanning'}.${remember}${jokes}`;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=persona.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona.js","sourceRoot":"","sources":["../../../src/persona.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Message, ChatOptions, ChatResult } from './types.js';
|
|
2
|
+
export declare function chat(messages: Message[], apiKey: string, model: string, opts?: ChatOptions): Promise<ChatResult>;
|
|
3
|
+
export declare function streamChat(messages: Message[], apiKey: string, model: string, onToken?: (token: string) => void): Promise<ChatResult>;
|
|
4
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnE,wBAAsB,IAAI,CACxB,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,CAAC,CA4CrB;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,UAAU,CAAC,CA6DrB"}
|