@agentage/cli 0.2.0 → 0.4.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.
Files changed (58) hide show
  1. package/README.md +111 -199
  2. package/dist/cli.js +2 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/agents.d.ts.map +1 -1
  5. package/dist/commands/agents.js +35 -2
  6. package/dist/commands/agents.js.map +1 -1
  7. package/dist/commands/login.d.ts.map +1 -1
  8. package/dist/commands/login.js +71 -3
  9. package/dist/commands/login.js.map +1 -1
  10. package/dist/commands/logout.d.ts.map +1 -1
  11. package/dist/commands/logout.js +22 -2
  12. package/dist/commands/logout.js.map +1 -1
  13. package/dist/commands/machines.d.ts.map +1 -1
  14. package/dist/commands/machines.js +45 -3
  15. package/dist/commands/machines.js.map +1 -1
  16. package/dist/commands/run.d.ts.map +1 -1
  17. package/dist/commands/run.js +113 -15
  18. package/dist/commands/run.js.map +1 -1
  19. package/dist/commands/status.d.ts.map +1 -1
  20. package/dist/commands/status.js +11 -1
  21. package/dist/commands/status.js.map +1 -1
  22. package/dist/daemon/config.d.ts.map +1 -1
  23. package/dist/daemon/config.js +10 -3
  24. package/dist/daemon/config.js.map +1 -1
  25. package/dist/daemon/routes.d.ts.map +1 -1
  26. package/dist/daemon/routes.js +92 -5
  27. package/dist/daemon/routes.js.map +1 -1
  28. package/dist/daemon-entry.js +27 -1
  29. package/dist/daemon-entry.js.map +1 -1
  30. package/dist/hub/auth-callback.d.ts +4 -0
  31. package/dist/hub/auth-callback.d.ts.map +1 -0
  32. package/dist/hub/auth-callback.js +75 -0
  33. package/dist/hub/auth-callback.js.map +1 -0
  34. package/dist/hub/auth.d.ts +21 -0
  35. package/dist/hub/auth.d.ts.map +1 -0
  36. package/dist/hub/auth.js +26 -0
  37. package/dist/hub/auth.js.map +1 -0
  38. package/dist/hub/hub-client.d.ts +33 -0
  39. package/dist/hub/hub-client.d.ts.map +1 -0
  40. package/dist/hub/hub-client.js +64 -0
  41. package/dist/hub/hub-client.js.map +1 -0
  42. package/dist/hub/hub-sync.d.ts +9 -0
  43. package/dist/hub/hub-sync.d.ts.map +1 -0
  44. package/dist/hub/hub-sync.js +150 -0
  45. package/dist/hub/hub-sync.js.map +1 -0
  46. package/dist/hub/hub-ws.d.ts +7 -0
  47. package/dist/hub/hub-ws.d.ts.map +1 -0
  48. package/dist/hub/hub-ws.js +105 -0
  49. package/dist/hub/hub-ws.js.map +1 -0
  50. package/dist/hub/reconnection.d.ts +13 -0
  51. package/dist/hub/reconnection.d.ts.map +1 -0
  52. package/dist/hub/reconnection.js +39 -0
  53. package/dist/hub/reconnection.js.map +1 -0
  54. package/dist/utils/version.d.ts +2 -0
  55. package/dist/utils/version.d.ts.map +1 -0
  56. package/dist/utils/version.js +5 -0
  57. package/dist/utils/version.js.map +1 -0
  58. package/package.json +7 -4
package/README.md CHANGED
@@ -1,222 +1,134 @@
1
- # AgentKit CLI
1
+ # @agentage/cli
2
2
 
3
3
  [![CI](https://github.com/agentage/cli/actions/workflows/ci.yml/badge.svg)](https://github.com/agentage/cli/actions/workflows/ci.yml)
4
4
  [![npm version](https://badge.fury.io/js/%40agentage%2Fcli.svg)](https://badge.fury.io/js/%40agentage%2Fcli)
5
5
 
6
- Command-line interface for creating and managing AI agents.
6
+ CLI and daemon for the [Agentage](https://agentage.io) control plane. Discovers local agents, executes them, and connects to the hub for multi-machine orchestration.
7
7
 
8
8
  ## Installation
9
9
 
10
- Install globally:
11
-
12
10
  ```bash
13
11
  npm install -g @agentage/cli
14
12
  ```
15
13
 
16
- Or use with npx:
17
-
18
- ```bash
19
- npx @agentage/cli <command>
20
- ```
21
-
22
14
  ## Quick Start
23
15
 
24
16
  ```bash
25
- # Create a new agent
26
- agent init my-assistant
27
-
28
- # Run the agent
29
- agent run my-assistant "Hello, how are you?"
30
-
31
- # List all agents
32
- agent list
33
- ```
34
-
35
- ## Commands
36
-
37
- ### `agent init [name]`
38
-
39
- Create a new agent configuration file.
40
-
41
- ```bash
42
- # Create agent with default name
43
- agent init
44
-
45
- # Create agent with custom name
46
- agent init my-assistant
47
-
48
- # Create in global directory
49
- agent init my-agent --global
50
- ```
51
-
52
- ### `agent run <name> [prompt]`
53
-
54
- Execute an agent with a prompt.
55
-
56
- ```bash
57
- # Run with default prompt
58
- agent run my-assistant
59
-
60
- # Run with custom prompt
61
- agent run my-assistant "What is TypeScript?"
62
- ```
63
-
64
- ### `agent list`
65
-
66
- List all available agents (local and global).
67
-
68
- ```bash
69
- agent list
70
- ```
71
-
72
- ### `agent publish [path]`
73
-
74
- Publish an agent to the Agentage registry.
75
-
76
- ```bash
77
- # Publish agent in current directory
78
- agent publish
79
-
80
- # Publish specific agent file
81
- agent publish agents/my-agent.agent.md
82
-
83
- # Dry run (validate without publishing)
84
- agent publish --dry-run
85
- ```
86
-
87
- ### `agent install <owner/name>`
88
-
89
- Install an agent from the registry.
90
-
91
- ```bash
92
- # Install latest version
93
- agent install user/my-agent
94
-
95
- # Install specific version
96
- agent install user/my-agent@2025-01-01
97
-
98
- # Install globally
99
- agent install user/my-agent --global
100
- ```
101
-
102
- ### `agent search <query>`
103
-
104
- Search for agents in the registry.
105
-
106
- ```bash
107
- # Search for agents
108
- agent search "code review"
109
-
110
- # Limit results
111
- agent search "ai assistant" --limit 5
112
- ```
113
-
114
- ### `agent login`
115
-
116
- Authenticate with the Agentage registry.
117
-
118
- ```bash
119
- agent login
120
- ```
121
-
122
- ### `agent logout`
123
-
124
- Log out from the registry.
125
-
126
- ```bash
127
- agent logout
128
- ```
129
-
130
- ### `agent whoami`
131
-
132
- Display the currently logged in user.
133
-
134
- ```bash
135
- agent whoami
136
- ```
137
-
138
- ### `agent update`
139
-
140
- Update the CLI to the latest version.
141
-
142
- ```bash
143
- agent update
17
+ # Start the daemon (discovers agents, exposes REST API)
18
+ agentage daemon
19
+
20
+ # List discovered agents
21
+ agentage agents
22
+
23
+ # Run an agent
24
+ agentage run my-agent "Summarize this project"
25
+
26
+ # Check daemon + hub status
27
+ agentage status
28
+ ```
29
+
30
+ ## Daemon
31
+
32
+ The daemon is a lightweight Express server that runs on each machine. It discovers local agents, executes them, and optionally syncs with a central hub.
33
+
34
+ ### API
35
+
36
+ | Method | Endpoint | Description |
37
+ |--------|----------|-------------|
38
+ | `GET` | `/api/health` | Status, version, uptime, machine ID, hub connection |
39
+ | `GET` | `/api/agents` | List discovered agent manifests |
40
+ | `POST` | `/api/agents/refresh` | Re-scan agent directories |
41
+ | `POST` | `/api/agents/:name/run` | Execute an agent (`{ task, config?, context? }`) |
42
+ | `GET` | `/api/runs` | List all runs |
43
+ | `GET` | `/api/runs/:id` | Get run details + output |
44
+ | `POST` | `/api/runs/:id/cancel` | Cancel a running execution |
45
+ | `POST` | `/api/runs/:id/input` | Send input to a waiting agent |
46
+
47
+ Default port: **3100**
48
+
49
+ ### Agent Discovery
50
+
51
+ The daemon scans configured directories for agents:
52
+
53
+ ```
54
+ ~/.agentage/agents/*.agent.md # Global agents
55
+ .agentage/agents/*.agent.md # Workspace agents
56
+ ```
57
+
58
+ Two built-in factories: **markdown** (`.agent.md` files with YAML frontmatter) and **code** (TypeScript/JavaScript modules exporting an Agent).
59
+
60
+ ### Hub Sync
61
+
62
+ When authenticated (`agentage login`), the daemon connects to the hub via WebSocket — registering the machine, syncing agents, and relaying run events.
63
+
64
+ | Method | Endpoint | Description |
65
+ |--------|----------|-------------|
66
+ | `GET` | `/api/hub/machines` | List all hub-connected machines |
67
+ | `GET` | `/api/hub/agents` | Aggregated agents across all machines |
68
+ | `POST` | `/api/hub/runs` | Start a run on any connected machine |
69
+
70
+ ## CLI Commands
71
+
72
+ | Command | Description |
73
+ |---------|-------------|
74
+ | `agentage daemon` | Start the daemon server |
75
+ | `agentage agents` | List discovered agents |
76
+ | `agentage run <name> [task]` | Execute an agent |
77
+ | `agentage runs` | List runs |
78
+ | `agentage machines` | List hub-connected machines |
79
+ | `agentage status` | Show daemon and hub status |
80
+ | `agentage logs` | View daemon logs |
81
+ | `agentage login` | Authenticate with the hub |
82
+ | `agentage logout` | Log out |
83
+
84
+ ## Project Structure
85
+
86
+ ```
87
+ src/
88
+ ├── cli.ts # CLI entry point (commander)
89
+ ├── daemon-entry.ts # Daemon process entry point
90
+ ├── commands/ # CLI command handlers
91
+ │ ├── daemon-cmd.ts # agentage daemon
92
+ │ ├── agents.ts # agentage agents
93
+ │ ├── run.ts # agentage run
94
+ │ ├── runs.ts # agentage runs
95
+ │ ├── machines.ts # agentage machines
96
+ │ ├── status.ts # agentage status
97
+ │ ├── logs.ts # agentage logs
98
+ │ ├── login.ts # agentage login
99
+ │ └── logout.ts # agentage logout
100
+ ├── daemon/ # Daemon server
101
+ │ ├── server.ts # Express + HTTP server setup
102
+ │ ├── routes.ts # REST API routes
103
+ │ ├── config.ts # Daemon configuration
104
+ │ ├── run-manager.ts # Agent execution + run lifecycle
105
+ │ ├── websocket.ts # WebSocket for streaming
106
+ │ └── logger.ts # Structured logging
107
+ ├── discovery/ # Agent discovery
108
+ │ ├── scanner.ts # Directory scanning
109
+ │ ├── markdown-factory.ts # .agent.md parser (gray-matter)
110
+ │ └── code-factory.ts # JS/TS module loader (jiti)
111
+ ├── hub/ # Hub connection
112
+ │ ├── auth.ts # Auth token storage
113
+ │ ├── auth-callback.ts # OAuth callback server
114
+ │ ├── hub-client.ts # Hub REST client
115
+ │ ├── hub-sync.ts # Machine/agent sync
116
+ │ ├── hub-ws.ts # Hub WebSocket client
117
+ │ └── reconnection.ts # Auto-reconnect logic
118
+ └── utils/
119
+ ├── daemon-client.ts # CLI → daemon HTTP client
120
+ ├── ensure-daemon.ts # Auto-start daemon if not running
121
+ └── render.ts # Terminal output formatting
144
122
  ```
145
123
 
146
124
  ## Development
147
125
 
148
- ### Prerequisites
149
-
150
- - Node.js >= 20.0.0
151
- - npm >= 10.0.0
152
-
153
- ### Setup
126
+ Requires Node.js >= 22.0.0.
154
127
 
155
128
  ```bash
156
- # Install dependencies
157
- npm install
158
-
159
- # Run in development mode
160
- npm run dev
161
-
162
- # Build
163
- npm run build
164
-
165
- # Run tests
166
- npm test
167
-
168
- # Run tests with coverage
169
- npm run test:coverage
170
-
171
- # Lint
172
- npm run lint
173
-
174
- # Type check
175
- npm run type-check
176
-
177
- # Full verification (type-check, lint, build, test)
178
- npm run verify
179
- ```
180
-
181
- ### Project Structure
182
-
183
- ```
184
- cli/
185
- ├── src/
186
- │ ├── cli.ts # CLI entry point
187
- │ ├── index.ts # Package exports
188
- │ ├── commands/ # CLI command handlers
189
- │ │ ├── init.ts
190
- │ │ ├── run.ts
191
- │ │ ├── list.ts
192
- │ │ ├── publish.ts
193
- │ │ ├── install.ts
194
- │ │ ├── search.ts
195
- │ │ ├── login.ts
196
- │ │ ├── logout.ts
197
- │ │ ├── whoami.ts
198
- │ │ └── update.ts
199
- │ ├── services/ # API services
200
- │ │ ├── auth.service.ts
201
- │ │ └── registry.service.ts
202
- │ ├── utils/ # Utility functions
203
- │ │ ├── agent-parser.ts
204
- │ │ ├── config.ts
205
- │ │ ├── lockfile.ts
206
- │ │ └── version.ts
207
- │ ├── schemas/ # Zod schemas
208
- │ │ └── agent.schema.ts
209
- │ ├── types/ # TypeScript types
210
- │ │ ├── config.types.ts
211
- │ │ ├── lockfile.types.ts
212
- │ │ └── registry.types.ts
213
- │ └── __mocks__/ # Jest mocks
214
- │ └── chalk.ts
215
- ├── package.json
216
- ├── tsconfig.json
217
- ├── jest.config.js
218
- ├── eslint.config.js
219
- └── README.md
129
+ npm ci
130
+ npm run verify # type-check + lint + format + test + build
131
+ npm run build && npm link # test CLI locally
220
132
  ```
221
133
 
222
134
  ## License
package/dist/cli.js CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from 'commander';
3
+ import { VERSION } from './utils/version.js';
3
4
  import { registerRun } from './commands/run.js';
4
5
  import { registerAgents } from './commands/agents.js';
5
6
  import { registerRuns } from './commands/runs.js';
@@ -10,7 +11,7 @@ import { registerLogout } from './commands/logout.js';
10
11
  import { registerLogs } from './commands/logs.js';
11
12
  import { registerDaemon } from './commands/daemon-cmd.js';
12
13
  const program = new Command();
13
- program.name('agentage').description('Agentage CLI — control plane for AI agents').version('0.2.0');
14
+ program.name('agentage').description('Agentage CLI — control plane for AI agents').version(VERSION);
14
15
  registerRun(program);
15
16
  registerAgents(program);
16
17
  registerRuns(program);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpG,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC1B,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpG,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC1B,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,eAAO,MAAM,cAAc,GAAI,SAAS,OAAO,KAAG,IAkDjD,CAAC"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,eAAO,MAAM,cAAc,GAAI,SAAS,OAAO,KAAG,IAiDjD,CAAC"}
@@ -11,8 +11,7 @@ export const registerAgents = (program) => {
11
11
  .action(async (opts) => {
12
12
  await ensureDaemon();
13
13
  if (opts.all) {
14
- console.error(chalk.red("Not connected to hub. Run 'agentage login' first."));
15
- process.exitCode = 1;
14
+ await listHubAgents(opts.json ?? false);
16
15
  return;
17
16
  }
18
17
  let agents;
@@ -42,4 +41,38 @@ export const registerAgents = (program) => {
42
41
  }
43
42
  });
44
43
  };
44
+ const listHubAgents = async (jsonMode) => {
45
+ let agents;
46
+ try {
47
+ agents = await get('/api/hub/agents');
48
+ }
49
+ catch {
50
+ console.error(chalk.red("Not connected to hub. Run 'agentage login' first."));
51
+ process.exitCode = 1;
52
+ return;
53
+ }
54
+ if (jsonMode) {
55
+ console.log(JSON.stringify(agents, null, 2));
56
+ return;
57
+ }
58
+ if (agents.length === 0) {
59
+ console.log(chalk.gray('No agents found across machines.'));
60
+ return;
61
+ }
62
+ const nameWidth = Math.max(12, ...agents.map((a) => a.name.length)) + 2;
63
+ const machineWidth = Math.max(10, ...agents.map((a) => (a.machines?.name || '').length)) + 2;
64
+ const descWidth = Math.max(12, ...agents.map((a) => (a.description || '').length).slice(0, 40)) + 2;
65
+ console.log(chalk.bold('NAME'.padEnd(nameWidth)) +
66
+ chalk.bold('MACHINE'.padEnd(machineWidth)) +
67
+ chalk.bold('DESCRIPTION'.padEnd(descWidth)) +
68
+ chalk.bold('STATUS'));
69
+ for (const agent of agents) {
70
+ const machineName = agent.machines?.name || '';
71
+ const status = agent.machines?.status === 'online' ? chalk.green('online') : chalk.gray('offline');
72
+ console.log(agent.name.padEnd(nameWidth) +
73
+ machineName.padEnd(machineWidth) +
74
+ (agent.description || '').substring(0, 38).padEnd(descWidth) +
75
+ status);
76
+ }
77
+ };
45
78
  //# sourceMappingURL=agents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAEtD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAQ,EAAE;IACvD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;SAC/C,MAAM,CAAC,OAAO,EAAE,yCAAyC,CAAC;SAC1D,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,IAA0D,EAAE,EAAE;QAC3E,MAAM,YAAY,EAAE,CAAC;QAErB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,MAAuB,CAAC;QAC5B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,GAAG,MAAM,IAAI,CAAkB,qBAAqB,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,GAAG,CAAkB,aAAa,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QACxE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QAEvF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CACrB,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;gBAC1B,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CACzB,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,KAAG,IAQhD,CAAC"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,KAAG,IA4FhD,CAAC"}
@@ -1,11 +1,79 @@
1
1
  import chalk from 'chalk';
2
+ import open from 'open';
3
+ import { ensureDaemon } from '../utils/ensure-daemon.js';
4
+ import { saveAuth } from '../hub/auth.js';
5
+ import { startCallbackServer, getCallbackPort } from '../hub/auth-callback.js';
6
+ import { loadConfig, saveConfig } from '../daemon/config.js';
7
+ const DEFAULT_HUB_URL = 'https://agentage.io';
2
8
  export const registerLogin = (program) => {
3
9
  program
4
10
  .command('login')
5
11
  .description('Authenticate with hub')
6
- .option('--hub <url>', 'Hub URL')
7
- .action(() => {
8
- console.log(chalk.yellow('Hub sync not yet available.'));
12
+ .option('--hub <url>', 'Hub URL', DEFAULT_HUB_URL)
13
+ .option('--token <token>', 'Use access token directly (headless/CI)')
14
+ .action(async (opts) => {
15
+ await ensureDaemon();
16
+ const hubUrl = opts.hub;
17
+ if (opts.token) {
18
+ // Direct token mode — for headless/CI
19
+ console.log(chalk.yellow('Direct token login — skipping browser flow'));
20
+ console.log(chalk.yellow('Note: refresh tokens are not available in direct mode. Session will expire.'));
21
+ const config = loadConfig();
22
+ const authState = {
23
+ session: {
24
+ access_token: opts.token,
25
+ refresh_token: '',
26
+ expires_at: 0,
27
+ },
28
+ user: { id: '', email: '' },
29
+ hub: { url: hubUrl, machineId: config.machine.id },
30
+ };
31
+ saveAuth(authState);
32
+ // Save hub URL to config
33
+ config.hub = { url: hubUrl };
34
+ saveConfig(config);
35
+ console.log(chalk.green('Logged in with token.'));
36
+ process.exit(0);
37
+ }
38
+ // Start callback server, then open browser to hub login page
39
+ console.log('Opening browser for authentication...');
40
+ const authPromise = startCallbackServer();
41
+ // Wait a tick for the server to start, then get the port
42
+ await new Promise((r) => setTimeout(r, 100));
43
+ const port = getCallbackPort();
44
+ if (!port) {
45
+ console.error(chalk.red('Failed to start callback server'));
46
+ process.exitCode = 1;
47
+ return;
48
+ }
49
+ const authUrl = `${hubUrl}/login?cli_port=${port}`;
50
+ try {
51
+ await open(authUrl);
52
+ }
53
+ catch {
54
+ // Browser didn't open — print URL manually
55
+ console.log(chalk.yellow('Could not open browser. Open this URL manually:'));
56
+ console.log(authUrl);
57
+ }
58
+ console.log('Waiting for login...');
59
+ try {
60
+ const authState = await authPromise;
61
+ // Set hub info
62
+ authState.hub.url = hubUrl;
63
+ const config = loadConfig();
64
+ authState.hub.machineId = config.machine.id;
65
+ saveAuth(authState);
66
+ // Save hub URL to config
67
+ config.hub = { url: hubUrl };
68
+ saveConfig(config);
69
+ console.log(chalk.green(`✓ Logged in as ${authState.user.email}`));
70
+ console.log(`Machine "${config.machine.name}" will connect to hub automatically.`);
71
+ process.exit(0);
72
+ }
73
+ catch (err) {
74
+ console.error(chalk.red(`Login failed: ${err instanceof Error ? err.message : String(err)}`));
75
+ process.exitCode = 1;
76
+ }
9
77
  });
10
78
  };
11
79
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAQ,EAAE;IACtD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC;SAChC,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,eAAO,MAAM,cAAc,GAAI,SAAS,OAAO,KAAG,IAOjD,CAAC"}
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,eAAO,MAAM,cAAc,GAAI,SAAS,OAAO,KAAG,IA2BjD,CAAC"}
@@ -1,10 +1,30 @@
1
1
  import chalk from 'chalk';
2
+ import { ensureDaemon } from '../utils/ensure-daemon.js';
3
+ import { readAuth, deleteAuth } from '../hub/auth.js';
4
+ import { createHubClient } from '../hub/hub-client.js';
2
5
  export const registerLogout = (program) => {
3
6
  program
4
7
  .command('logout')
5
8
  .description('Disconnect from hub')
6
- .action(() => {
7
- console.log(chalk.yellow('Hub sync not yet available.'));
9
+ .action(async () => {
10
+ await ensureDaemon();
11
+ const auth = readAuth();
12
+ if (!auth) {
13
+ console.log(chalk.yellow('Not logged in.'));
14
+ return;
15
+ }
16
+ // Best-effort deregister from hub
17
+ try {
18
+ const client = createHubClient(auth.hub.url, auth);
19
+ await client.deregister(auth.hub.machineId);
20
+ }
21
+ catch {
22
+ // Hub may be unreachable — that's fine
23
+ }
24
+ deleteAuth();
25
+ console.log(chalk.green('Disconnected from hub. Machine deregistered.'));
26
+ console.log(chalk.dim('Daemon continues running in standalone mode.'));
27
+ console.log(chalk.dim('Run `agentage daemon restart` to apply.'));
8
28
  });
9
29
  };
10
30
  //# sourceMappingURL=logout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAQ,EAAE;IACvD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAQ,EAAE;IACvD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,YAAY,EAAE,CAAC;QAErB,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,kCAAkC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACnD,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;QAED,UAAU,EAAE,CAAC;QAEb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"machines.d.ts","sourceRoot":"","sources":["../../src/commands/machines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,eAAO,MAAM,gBAAgB,GAAI,SAAS,OAAO,KAAG,IAUnD,CAAC"}
1
+ {"version":3,"file":"machines.d.ts","sourceRoot":"","sources":["../../src/commands/machines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,eAAO,MAAM,gBAAgB,GAAI,SAAS,OAAO,KAAG,IAiDnD,CAAC"}
@@ -1,14 +1,56 @@
1
1
  import chalk from 'chalk';
2
2
  import { ensureDaemon } from '../utils/ensure-daemon.js';
3
+ import { get } from '../utils/daemon-client.js';
3
4
  export const registerMachines = (program) => {
4
5
  program
5
6
  .command('machines')
6
7
  .description('List connected machines')
7
8
  .option('--json', 'JSON output')
8
- .action(async () => {
9
+ .action(async (opts) => {
9
10
  await ensureDaemon();
10
- console.error(chalk.red("Not connected to hub. Run 'agentage login' first."));
11
- process.exitCode = 1;
11
+ let machines;
12
+ try {
13
+ machines = await get('/api/hub/machines');
14
+ }
15
+ catch {
16
+ console.error(chalk.red("Not connected to hub. Run 'agentage login' first."));
17
+ process.exitCode = 1;
18
+ return;
19
+ }
20
+ if (opts.json) {
21
+ console.log(JSON.stringify(machines, null, 2));
22
+ return;
23
+ }
24
+ if (machines.length === 0) {
25
+ console.log(chalk.gray('No machines registered.'));
26
+ return;
27
+ }
28
+ const nameWidth = Math.max(12, ...machines.map((m) => m.name.length)) + 2;
29
+ console.log(chalk.bold('NAME'.padEnd(nameWidth)) +
30
+ chalk.bold('PLATFORM'.padEnd(12)) +
31
+ chalk.bold('STATUS'.padEnd(12)) +
32
+ chalk.bold('LAST SEEN'));
33
+ for (const machine of machines) {
34
+ const status = machine.status === 'online' ? chalk.green('online') : chalk.gray('offline');
35
+ const lastSeen = formatLastSeen(machine.last_seen_at);
36
+ console.log(machine.name.padEnd(nameWidth) +
37
+ machine.platform.padEnd(12) +
38
+ status.padEnd(12 + (status.length - machine.status.length)) +
39
+ chalk.gray(lastSeen));
40
+ }
12
41
  });
13
42
  };
43
+ const formatLastSeen = (iso) => {
44
+ const diff = Date.now() - new Date(iso).getTime();
45
+ const seconds = Math.floor(diff / 1000);
46
+ if (seconds < 5)
47
+ return 'just now';
48
+ if (seconds < 60)
49
+ return `${seconds}s ago`;
50
+ if (seconds < 3600)
51
+ return `${Math.floor(seconds / 60)}m ago`;
52
+ if (seconds < 86400)
53
+ return `${Math.floor(seconds / 3600)}h ago`;
54
+ return `${Math.floor(seconds / 86400)}d ago`;
55
+ };
14
56
  //# sourceMappingURL=machines.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"machines.js","sourceRoot":"","sources":["../../src/commands/machines.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAgB,EAAQ,EAAE;IACzD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,YAAY,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
1
+ {"version":3,"file":"machines.js","sourceRoot":"","sources":["../../src/commands/machines.ts"],"names":[],"mappings":"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"}