@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 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: stripOption(args, "--vendors")
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", "goose"];
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: `${normalizedApiBaseUrl}/v1/capture/artifacts`,
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.1.0",
3
+ "version": "0.2.0",
4
4
  "releaseBaseUrl": "https://aegisagentics.com/releases/aegis-agent",
5
- "createdAt": "2026-06-22T18:55:17.615Z",
5
+ "createdAt": "2026-10-01T08:54:06.769Z",
6
6
  "artifacts": {
7
7
  "darwin-arm64": {
8
- "path": "versions/0.1.0/darwin-arm64/aegis-agent.tar.gz",
9
- "sha256": "c11ceb6011c01e9ea2090494b36bf59d98a51058324e338295f68fcf60664fd0",
10
- "sizeBytes": 2155326
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.1.0/darwin-x64/aegis-agent.tar.gz",
14
- "sha256": "0d1e1c8f8584dcbe23b47d12712371daf5faf488b614e8699b22d80a7cd3ef35",
15
- "sizeBytes": 2248676
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.1.0/linux-x64/aegis-agent.tar.gz",
19
- "sha256": "82dffedef43a7fefeb431739536ae6d3f26bd82f20ea826a528ffcd2cdb69517",
20
- "sizeBytes": 2356443
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.1.0",
4
- "description": "Aegis Agent local installer and hook runtime for Codex, Claude, Cursor, and Goose.",
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",