@aegisagentics/agent 0.1.0 → 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/README.md +54 -1
- package/npm/install.js +1 -0
- package/npm/lib/cli.js +1 -17
- package/npm/lib/config.js +26 -3
- package/npm/release-manifest.json +11 -11
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Aegis Agent
|
|
2
2
|
|
|
3
|
-
Local installer, hook runtime, and public npm bootstrapper for Aegis ControlTower coding-agent telemetry
|
|
3
|
+
Local installer, hook runtime, and public npm bootstrapper for Aegis ControlTower coding-agent telemetry..
|
|
4
4
|
|
|
5
5
|
`@aegisagentics/agent` installs a native `aegis-agent` runtime, registers supported local agent hooks, and sends safe, governed telemetry to Aegis ControlTower. The npm package is intentionally thin: it does not ship platform binaries. Release binaries are built by CI, checksummed, uploaded to the Aegis website release path, then downloaded and verified during install.
|
|
6
6
|
|
|
@@ -26,6 +26,59 @@ npx -y @aegisagentics/agent codex-plugin uninstall
|
|
|
26
26
|
npx -y @aegisagentics/agent uninstall --vendors codex
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
+
## OpenClaw
|
|
30
|
+
|
|
31
|
+
OpenClaw versions **>=2026.9.6 and <2026.10.0** are supported and qualified
|
|
32
|
+
against **v2026.9.6** and **v2026.9.7**. Use Node.js **>=24.16.0 and <25**, or
|
|
33
|
+
**>=26.1.0 and <27**, on macOS/Linux under the same OS UID. One managed install
|
|
34
|
+
both materializes the Aegis-owned plugin and registers its local path with
|
|
35
|
+
OpenClaw:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
AEGIS_API_KEY="agk_..." npx -y @aegisagentics/agent install \
|
|
39
|
+
--api-base-url "https://api.aegisagentics.com" \
|
|
40
|
+
--otlp-http-base-url "https://otel.aegisagentics.com" \
|
|
41
|
+
--vendors openclaw
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The plugin service launches `aegis-agent openclaw-bridge serve` with a private
|
|
45
|
+
Unix-domain socket. The bridge creates a `0700` parent and `0600` socket, checks
|
|
46
|
+
same-UID peer credentials, accepts bounded length-prefixed frames only, and has
|
|
47
|
+
no TCP listener. Check the local state with `aegis-agent status` and
|
|
48
|
+
`aegis-agent doctor`; remove just this integration with
|
|
49
|
+
`aegis-agent uninstall --vendors openclaw`.
|
|
50
|
+
|
|
51
|
+
Lifecycle facts go through the existing OTLP trace and activity-log paths.
|
|
52
|
+
`log.record` is supplementary: its bounded message stays inside the same-UID
|
|
53
|
+
UDS handoff until Rust redacts it, then it is sent to the authenticated OTLP
|
|
54
|
+
logs endpoint. In the default metadata policy, the installer leaves OpenClaw
|
|
55
|
+
conversation access disabled and does not register `llm_input` or `llm_output`.
|
|
56
|
+
Raw prompt/response candidates require `--capture-policy redacted`; that opt-in
|
|
57
|
+
atomically enables OpenClaw conversation access and the two capture hooks. The
|
|
58
|
+
candidates are uploaded directly with an expiring capture capability and are
|
|
59
|
+
never written to a plugin or bridge spool. Windows, cross-user, remote,
|
|
60
|
+
cross-Pod, and TCP topologies are unsupported.
|
|
61
|
+
|
|
62
|
+
## Claude Code and Cursor
|
|
63
|
+
|
|
64
|
+
Install global per-user hooks for both agents with the same managed command:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
AEGIS_API_KEY="agk_..." npx -y @aegisagentics/agent install \
|
|
68
|
+
--api-base-url "https://api.aegisagentics.com" \
|
|
69
|
+
--otlp-http-base-url "https://otel.aegisagentics.com" \
|
|
70
|
+
--installation-id "agent_install_..." \
|
|
71
|
+
--vendors claude,cursor \
|
|
72
|
+
--capture-policy redacted
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Claude hooks are merged into `~/.claude/settings.json`; Cursor hooks are merged
|
|
76
|
+
into `~/.cursor/hooks.json`. Existing settings and third-party hooks are kept.
|
|
77
|
+
The hooks observe sessions, prompts, responses, tool calls (including Cursor MCP
|
|
78
|
+
tools), and failures. Aegis responses are fail-open and never deny an agent
|
|
79
|
+
action. Remove either integration with `aegis-agent uninstall --vendors claude`
|
|
80
|
+
or `aegis-agent uninstall --vendors cursor`.
|
|
81
|
+
|
|
29
82
|
For local development without downloading a release binary:
|
|
30
83
|
|
|
31
84
|
```bash
|
package/npm/install.js
CHANGED
|
@@ -135,6 +135,7 @@ function printHelp(binaryPath) {
|
|
|
135
135
|
console.log(`Aegis Agent installer bootstrap
|
|
136
136
|
|
|
137
137
|
Usage:
|
|
138
|
+
AEGIS_API_KEY="<agent-key>" npx -y @aegisagentics/agent install --api-base-url "https://controltower.example.com" --otlp-http-base-url "https://otel.controltower.example.com" --installation-id "agent_install_..." --vendors claude,cursor --capture-policy redacted
|
|
138
139
|
AEGIS_API_KEY="<one-time-key>" npx -y @aegisagentics/agent install --api-base-url "https://controltower.example.com" --otlp-http-base-url "https://otel.controltower.example.com" --installation-id "agent_install_..." --vendors codex,claude,cursor
|
|
139
140
|
npx -y @aegisagentics/agent codex-plugin install
|
|
140
141
|
npx -y @aegisagentics/agent codex-plugin uninstall
|
package/npm/lib/cli.js
CHANGED
|
@@ -31,7 +31,7 @@ export function parseBootstrapCommand(args) {
|
|
|
31
31
|
return {
|
|
32
32
|
codexPluginAction: vendors.includes("codex") ? "uninstall" : null,
|
|
33
33
|
kind: "native",
|
|
34
|
-
nativeArgs:
|
|
34
|
+
nativeArgs: args
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
37
|
|
|
@@ -62,19 +62,3 @@ function extractVendorList(args, fallback) {
|
|
|
62
62
|
|
|
63
63
|
return normalizeVendorList(values.length > 0 ? values.join(",") : fallback);
|
|
64
64
|
}
|
|
65
|
-
|
|
66
|
-
function stripOption(args, optionName) {
|
|
67
|
-
const stripped = [];
|
|
68
|
-
for (let index = 0; index < args.length; index += 1) {
|
|
69
|
-
const arg = args[index];
|
|
70
|
-
if (arg === optionName) {
|
|
71
|
-
index += 1;
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
if (arg.startsWith(`${optionName}=`)) {
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
stripped.push(arg);
|
|
78
|
-
}
|
|
79
|
-
return stripped;
|
|
80
|
-
}
|
package/npm/lib/config.js
CHANGED
|
@@ -7,10 +7,12 @@ const VENDOR_ALIASES = new Map([
|
|
|
7
7
|
["claudecode", "claude-code"],
|
|
8
8
|
["codex", "codex"],
|
|
9
9
|
["cursor", "cursor"],
|
|
10
|
-
["goose", "goose"]
|
|
10
|
+
["goose", "goose"],
|
|
11
|
+
["openclaw", "openclaw"],
|
|
12
|
+
["open-claw", "openclaw"]
|
|
11
13
|
]);
|
|
12
14
|
|
|
13
|
-
const VENDOR_ORDER = ["codex", "claude-code", "cursor", "
|
|
15
|
+
const VENDOR_ORDER = ["codex", "claude-code", "cursor", "openclaw"];
|
|
14
16
|
|
|
15
17
|
export function normalizeVendorList(value) {
|
|
16
18
|
const raw = Array.isArray(value) ? value : String(value ?? "").split(",");
|
|
@@ -30,6 +32,9 @@ export function normalizeVendorList(value) {
|
|
|
30
32
|
if (normalized === undefined) {
|
|
31
33
|
throw new Error(`Unknown Aegis agent vendor: ${item}`);
|
|
32
34
|
}
|
|
35
|
+
if (normalized === "goose") {
|
|
36
|
+
throw new Error("The Aegis Goose installer is not available yet.");
|
|
37
|
+
}
|
|
33
38
|
seen.add(normalized);
|
|
34
39
|
}
|
|
35
40
|
|
|
@@ -60,6 +65,7 @@ export function aegisPaths(homeDir = process.env.HOME) {
|
|
|
60
65
|
export function buildLocalConfig({
|
|
61
66
|
agentId,
|
|
62
67
|
apiBaseUrl,
|
|
68
|
+
captureEndpoint,
|
|
63
69
|
capturePolicy,
|
|
64
70
|
installationId,
|
|
65
71
|
activityLogEndpoint,
|
|
@@ -89,12 +95,16 @@ export function buildLocalConfig({
|
|
|
89
95
|
activityLogEndpoint === undefined || activityLogEndpoint === null || String(activityLogEndpoint).trim() === ""
|
|
90
96
|
? `${normalizedApiBaseUrl}/v1/agent-activity/logs`
|
|
91
97
|
: String(activityLogEndpoint).trim().replace(/\/+$/, "");
|
|
98
|
+
const normalizedCaptureEndpoint = normalizeCaptureEndpoint({
|
|
99
|
+
apiBaseUrl: normalizedApiBaseUrl,
|
|
100
|
+
captureEndpoint
|
|
101
|
+
});
|
|
92
102
|
return {
|
|
93
103
|
schemaVersion: "aegis.agent_config.v1",
|
|
94
104
|
agentId,
|
|
95
105
|
apiBaseUrl: normalizedApiBaseUrl,
|
|
96
106
|
activityLogEndpoint: normalizedActivityLogEndpoint,
|
|
97
|
-
captureEndpoint:
|
|
107
|
+
captureEndpoint: normalizedCaptureEndpoint,
|
|
98
108
|
capturePolicy,
|
|
99
109
|
installationId,
|
|
100
110
|
organizationId,
|
|
@@ -104,3 +114,16 @@ export function buildLocalConfig({
|
|
|
104
114
|
workspaceKind
|
|
105
115
|
};
|
|
106
116
|
}
|
|
117
|
+
|
|
118
|
+
function normalizeCaptureEndpoint({ apiBaseUrl, captureEndpoint }) {
|
|
119
|
+
const uploadPath = "/v1/capture/artifact-uploads";
|
|
120
|
+
if (captureEndpoint === undefined || captureEndpoint === null || String(captureEndpoint).trim() === "") {
|
|
121
|
+
return `${apiBaseUrl}${uploadPath}`;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const normalized = String(captureEndpoint).trim().replace(/\/+$/, "");
|
|
125
|
+
const legacyPath = "/v1/capture/artifacts";
|
|
126
|
+
return normalized.endsWith(legacyPath)
|
|
127
|
+
? `${normalized.slice(0, -legacyPath.length)}${uploadPath}`
|
|
128
|
+
: normalized;
|
|
129
|
+
}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "aegis.agent_release_manifest.v1",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"releaseBaseUrl": "https://aegisagentics.com/releases/aegis-agent",
|
|
5
|
-
"createdAt": "2026-
|
|
5
|
+
"createdAt": "2026-10-01T08:54:06.769Z",
|
|
6
6
|
"artifacts": {
|
|
7
7
|
"darwin-arm64": {
|
|
8
|
-
"path": "versions/0.
|
|
9
|
-
"sha256": "
|
|
10
|
-
"sizeBytes":
|
|
8
|
+
"path": "versions/0.2.0/darwin-arm64/aegis-agent.tar.gz",
|
|
9
|
+
"sha256": "be7c13efb0f6f644c44d4f4e8f00e79d7ed0853dec84e9628d05cccfc4eb1a3d",
|
|
10
|
+
"sizeBytes": 2292252
|
|
11
11
|
},
|
|
12
12
|
"darwin-x64": {
|
|
13
|
-
"path": "versions/0.
|
|
14
|
-
"sha256": "
|
|
15
|
-
"sizeBytes":
|
|
13
|
+
"path": "versions/0.2.0/darwin-x64/aegis-agent.tar.gz",
|
|
14
|
+
"sha256": "b5e7b72a9128fa09e36ed81c8859643266fb2b0b2bbe2178c90f8684786f2f1e",
|
|
15
|
+
"sizeBytes": 2392387
|
|
16
16
|
},
|
|
17
17
|
"linux-x64": {
|
|
18
|
-
"path": "versions/0.
|
|
19
|
-
"sha256": "
|
|
20
|
-
"sizeBytes":
|
|
18
|
+
"path": "versions/0.2.0/linux-x64/aegis-agent.tar.gz",
|
|
19
|
+
"sha256": "ce394577fc7d835591f8a9514c571555c3fc20e21403ddf5980e3874b6808ce6",
|
|
20
|
+
"sizeBytes": 2523841
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aegisagentics/agent",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Aegis Agent local installer and hook runtime for Codex, Claude, Cursor, and
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Aegis Agent local installer and hook runtime for Codex, Claude Code, Cursor, and OpenClaw.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|