@botiverse/hands-cli 0.5.15 → 0.5.17
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/dist/commands/api.js +17 -15
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/login.js +59 -12
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/whoami.js +2 -2
- package/dist/commands/whoami.js.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/agent_auth.d.ts +70 -0
- package/dist/lib/agent_auth.js +318 -0
- package/dist/lib/agent_auth.js.map +1 -0
- package/dist/lib/agent_env.d.ts +33 -0
- package/dist/lib/agent_env.js +112 -0
- package/dist/lib/agent_env.js.map +1 -0
- package/dist/lib/agent_refresh.d.ts +32 -0
- package/dist/lib/agent_refresh.js +323 -0
- package/dist/lib/agent_refresh.js.map +1 -0
- package/dist/lib/api.d.ts +8 -0
- package/dist/lib/api.js +62 -23
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/config.d.ts +11 -4
- package/dist/lib/config.js +61 -13
- package/dist/lib/config.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/api.js
CHANGED
|
@@ -18,8 +18,7 @@
|
|
|
18
18
|
* - Reuses the existing CLI identity/token; no scope escalation.
|
|
19
19
|
*/
|
|
20
20
|
import { readFile, writeFile } from "node:fs/promises";
|
|
21
|
-
import { getApiBase } from "../lib/api.js";
|
|
22
|
-
import { resolveAuthToken } from "../lib/config.js";
|
|
21
|
+
import { getApiBase, agentAwareFetch } from "../lib/api.js";
|
|
23
22
|
const METHODS = new Set(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"]);
|
|
24
23
|
/**
|
|
25
24
|
* Resolve `pathArg` against the Hands API base and enforce that it is a
|
|
@@ -86,19 +85,22 @@ export function registerApiCommand(program) {
|
|
|
86
85
|
? await readFile(opts.data.slice(1), "utf8")
|
|
87
86
|
: opts.data;
|
|
88
87
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
headers
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
88
|
+
// Agent-aware: proactive refresh + one guarded 401 retry in agent mode, same as
|
|
89
|
+
// every other CLI HTTP path. The request is rebuilt per attempt with the bearer.
|
|
90
|
+
const res = await agentAwareFetch((bearer) => {
|
|
91
|
+
const headers = { accept: "application/json" };
|
|
92
|
+
if (bearer)
|
|
93
|
+
headers.authorization = `Bearer ${bearer}`;
|
|
94
|
+
if (body !== undefined)
|
|
95
|
+
headers["content-type"] = "application/json";
|
|
96
|
+
return fetch(target.toString(), {
|
|
97
|
+
method,
|
|
98
|
+
headers,
|
|
99
|
+
...(body !== undefined ? { body } : {}),
|
|
100
|
+
// Never auto-follow a 3xx: a redirect off the API origin would carry
|
|
101
|
+
// the bearer token to the redirect target.
|
|
102
|
+
redirect: "manual",
|
|
103
|
+
});
|
|
102
104
|
});
|
|
103
105
|
const requestId = res.headers.get("x-request-id") ?? res.headers.get("cf-ray");
|
|
104
106
|
const statusLine = `${res.status} ${res.statusText}${requestId ? ` request-id=${requestId}` : ""}`;
|
package/dist/commands/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/commands/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/commands/api.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.js
CHANGED
|
@@ -15,8 +15,11 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { createInterface } from "node:readline/promises";
|
|
17
17
|
import { stdin, stdout } from "node:process";
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
18
|
+
import { rmSync } from "node:fs";
|
|
19
|
+
import { apiRequest, getApiBase, setApiBase, QuiverApiError } from "../lib/api.js";
|
|
20
|
+
import { clearConfig, saveConfig, getConfig, configPath } from "../lib/config.js";
|
|
21
|
+
import { admitAgent, agentAuthPath, HANDS_SERVICE } from "../lib/agent_env.js";
|
|
22
|
+
import { runAgentLogin } from "../lib/agent_auth.js";
|
|
20
23
|
async function promptSecret(message) {
|
|
21
24
|
// Use a raw-mode readline so we can mask input with '*'.
|
|
22
25
|
const rl = createInterface({ input: stdin, output: stdout, terminal: true });
|
|
@@ -61,6 +64,38 @@ export function registerLoginCommands(program) {
|
|
|
61
64
|
.option("--print-url", "Just print the login URL; don't prompt for a token.", false)
|
|
62
65
|
.action(async (opts) => {
|
|
63
66
|
const apiBase = opts.api ?? getApiBase();
|
|
67
|
+
const admission = admitAgent();
|
|
68
|
+
// Managed-agent path (RFC 057): no browser, no paste. Runs agent-login →
|
|
69
|
+
// exchange → store under $SLOCK_HOME. Isolated from the human config.
|
|
70
|
+
if (admission.kind === "agent") {
|
|
71
|
+
if (opts.token) {
|
|
72
|
+
// Never let --token write the human config from inside an agent.
|
|
73
|
+
console.error("✘ In a managed agent environment, run `hands login` without --token (agent-login is used instead).");
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
if (opts.printUrl) {
|
|
77
|
+
console.log("(agent environment) `hands login` runs the non-interactive agent-login flow — no URL to open.");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
setApiBase(apiBase); // exchange must target this API base
|
|
81
|
+
try {
|
|
82
|
+
const session = await runAgentLogin(admission.env);
|
|
83
|
+
console.log(`✔ Agent login complete (service ${HANDS_SERVICE}).`);
|
|
84
|
+
console.log(` Stored under $SLOCK_HOME/agents/$SLOCK_AGENT_ID/integrations/${HANDS_SERVICE}/auth.json`);
|
|
85
|
+
console.log(` access token expires ${session.access_expires_at}; refresh rotates automatically.`);
|
|
86
|
+
console.log(" Subsequent `hands` commands use the stored Hands token directly.");
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
console.error(`✘ Agent login failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (admission.kind === "fail_closed") {
|
|
95
|
+
// Partial/invalid agent markers must never silently use human credentials.
|
|
96
|
+
console.error(`✘ Agent environment is incomplete or invalid (${admission.reason}); refusing to fall back to human login. Fix the agent environment and retry.`);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
64
99
|
const loginUrl = `${apiBase}/api/auth/login?return_to=${encodeURIComponent("/cli/callback")}`;
|
|
65
100
|
if (opts.printUrl) {
|
|
66
101
|
console.log(loginUrl);
|
|
@@ -85,7 +120,7 @@ export function registerLoginCommands(program) {
|
|
|
85
120
|
// Persist the token + apiBase to config file.
|
|
86
121
|
clearConfig();
|
|
87
122
|
saveConfig({ apiBase, authToken: token });
|
|
88
|
-
console.log(`✔ Saved to ${
|
|
123
|
+
console.log(`✔ Saved to ${configPath()}`);
|
|
89
124
|
console.log(` API base: ${apiBase}`);
|
|
90
125
|
// Verify the token works by calling /api/auth/me.
|
|
91
126
|
try {
|
|
@@ -110,22 +145,34 @@ export function registerLoginCommands(program) {
|
|
|
110
145
|
});
|
|
111
146
|
program
|
|
112
147
|
.command("logout")
|
|
113
|
-
.description("Clear the saved Hands
|
|
148
|
+
.description("Clear the saved Hands token (agent store in an agent, else human config).")
|
|
114
149
|
.action(() => {
|
|
150
|
+
const admission = admitAgent();
|
|
151
|
+
if (admission.kind === "agent") {
|
|
152
|
+
// Clear the per-agent store only; never touch the human config.
|
|
153
|
+
const path = agentAuthPath(admission.env);
|
|
154
|
+
try {
|
|
155
|
+
rmSync(path, { force: true });
|
|
156
|
+
console.log(`✔ Agent Hands token cleared (${path}).`);
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
console.error(`✘ Failed to clear agent token: ${e instanceof Error ? e.message : String(e)}`);
|
|
160
|
+
process.exit(1);
|
|
161
|
+
}
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (admission.kind === "fail_closed") {
|
|
165
|
+
console.error(`✘ Agent environment is incomplete or invalid (${admission.reason}).`);
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
115
168
|
const cfg = getConfig();
|
|
116
169
|
if (!cfg.authToken && !cfg.sessionCookie) {
|
|
117
|
-
console.log("Not logged in (no saved Hands
|
|
170
|
+
console.log("Not logged in (no saved Hands token).");
|
|
118
171
|
return;
|
|
119
172
|
}
|
|
120
173
|
clearConfig();
|
|
121
|
-
console.log(`✔ Logged out (token cleared from ${
|
|
174
|
+
console.log(`✔ Logged out (token cleared from ${configPath()}).`);
|
|
122
175
|
});
|
|
123
176
|
}
|
|
124
|
-
function configDisplayPath() {
|
|
125
|
-
// Mirror getConfig's path resolution for display only.
|
|
126
|
-
const xdg = process.env.XDG_CONFIG_HOME;
|
|
127
|
-
const dir = xdg && xdg.length > 0 ? xdg : `${process.env.HOME ?? "~"}/.config`;
|
|
128
|
-
return `${dir}/quiver/auth.json`;
|
|
129
|
-
}
|
|
130
177
|
// Keep the command module side-effect free when imported by tests.
|
|
131
178
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,KAAK,UAAU,YAAY,CAAC,OAAe;IACzC,yDAAyD;IACzD,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAE,EAAE;YACxC,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC5B,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAClD,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;iBAAM,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC3B,SAAS;gBACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAC1C,YAAY;gBACZ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,EAAE,CAAC;gBACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CACL,eAAe,EACf,0DAA0D,CAC3D;SACA,MAAM,CACL,aAAa,EACb,0DAA0D,CAC3D;SACA,MAAM,CAAC,aAAa,EAAE,qDAAqD,EAAE,KAAK,CAAC;SACnF,MAAM,CACL,KAAK,EAAE,IAIN,EAAE,EAAE;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAE/B,yEAAyE;QACzE,sEAAsE;QACtE,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,iEAAiE;gBACjE,OAAO,CAAC,KAAK,CAAC,oGAAoG,CAAC,CAAC;gBACpH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,+FAA+F,CAAC,CAAC;gBAC7G,OAAO;YACT,CAAC;YACD,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,qCAAqC;YAC1D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnD,OAAO,CAAC,GAAG,CAAC,mCAAmC,aAAa,IAAI,CAAC,CAAC;gBAClE,OAAO,CAAC,GAAG,CAAC,kEAAkE,aAAa,YAAY,CAAC,CAAC;gBACzG,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,CAAC,iBAAiB,kCAAkC,CAAC,CAAC;gBACnG,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;YACpF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACrC,2EAA2E;YAC3E,OAAO,CAAC,KAAK,CAAC,iDAAiD,SAAS,CAAC,MAAM,+EAA+E,CAAC,CAAC;YAChK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,GAAG,OAAO,6BAA6B,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAC;QAE9F,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,QAAQ,QAAQ,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,MAAM,YAAY,CACxB,+BAA+B,CAChC,CAAC;YACF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,WAAW,EAAE,CAAC;QACd,UAAU,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;QAEtC,kDAAkD;QAClD,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,cAAc,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACpD,OAAO,CAAC,KAAK,CACX,6DAA6D,CAC9D,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CACF,CAAC;IAEJ,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2EAA2E,CAAC;SACxF,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,gEAAgE;YAChE,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,IAAI,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,iDAAiD,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;YACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,WAAW,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,oCAAoC,UAAU,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACP,CAAC;AAED,mEAAmE"}
|
package/dist/commands/whoami.js
CHANGED
|
@@ -8,8 +8,8 @@ const NO_AUTH_HELP = "Not authenticated. Choose one:\n" +
|
|
|
8
8
|
" • Agents / CI: set HANDS_BEARER_TOKEN to a deploy token\n" +
|
|
9
9
|
" (console → App → Settings → Deploy Tokens; publisher role to release).\n" +
|
|
10
10
|
" • Humans: run `hands login` and paste the browser callback JWT.\n" +
|
|
11
|
-
" • Raft agents: run `
|
|
12
|
-
" the integration session
|
|
11
|
+
" • Raft agents: run `hands login` — it auto-detects the managed agent and completes\n" +
|
|
12
|
+
" the agent-login handshake via your Raft integration session (no URL to open).";
|
|
13
13
|
export function registerWhoamiCommand(program) {
|
|
14
14
|
program
|
|
15
15
|
.command("whoami")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,YAAY,GAChB,kCAAkC;IAClC,6DAA6D;IAC7D,gFAAgF;IAChF,qEAAqE;IACrE,
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,YAAY,GAChB,kCAAkC;IAClC,6DAA6D;IAC7D,gFAAgF;IAChF,qEAAqE;IACrE,wFAAwF;IACxF,qFAAqF,CAAC;AAmBxF,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,QAAQ,EAAE,+BAA+B,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,UAAU,CAAa,cAAc,CAAC,CAAC;YACxD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACzC,OAAO;YACT,CAAC;YACD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,MAAM,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,cAAc,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACpD,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -30,11 +30,16 @@ import { getConfig } from "./lib/config.js";
|
|
|
30
30
|
import { readEnv } from "./lib/env.js";
|
|
31
31
|
import { setApiBase } from "./lib/api.js";
|
|
32
32
|
import { recordCliEvent } from "./lib/logging.js";
|
|
33
|
+
import { createRequire } from "node:module";
|
|
34
|
+
// Single source of truth for the CLI version: read it from package.json at runtime so
|
|
35
|
+
// `--version` can never drift from the published package version. (Previously the string
|
|
36
|
+
// was hardcoded here and had to be bumped in lockstep with package.json by hand.)
|
|
37
|
+
const { version: CLI_VERSION } = createRequire(import.meta.url)("../package.json");
|
|
33
38
|
const program = new Command();
|
|
34
39
|
program
|
|
35
40
|
.name("hands")
|
|
36
41
|
.description("Hands CLI — manage apps, builds, releases from the terminal.")
|
|
37
|
-
.version(
|
|
42
|
+
.version(CLI_VERSION)
|
|
38
43
|
.option("--api <url>", "Hands business API URL (default: https://hands.build or $HANDS_API)")
|
|
39
44
|
.option("--json", "Output machine-readable JSON (suppresses human output)", false)
|
|
40
45
|
.option("--verbose", "Print HTTP request details for debugging", false)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type AgentEnv } from "./agent_env.js";
|
|
2
|
+
/** PKCE S256: 64-byte verifier → 86 unreserved base64url chars (within RFC 7636's
|
|
3
|
+
* 43–128), challenge = unpadded base64url SHA-256. */
|
|
4
|
+
export declare function generatePkce(): {
|
|
5
|
+
verifier: string;
|
|
6
|
+
challenge: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Strictly validate a `raft integration invoke --action agent-login --json` result.
|
|
10
|
+
* Real envelope (verified against the live daemon):
|
|
11
|
+
* { ok:true, data:{ service, action, status, result:{schema,service,grant,expires_at} } }
|
|
12
|
+
* The Hands-owned `result` is closed-key validated; the Raft envelope (outer/data) is
|
|
13
|
+
* validated by exact required values. NO part of stdout is ever echoed in an error.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseAgentLoginInvoke(stdout: string, service: string, now: number): {
|
|
16
|
+
grant: string;
|
|
17
|
+
expires_at: string;
|
|
18
|
+
};
|
|
19
|
+
export interface AgentSession {
|
|
20
|
+
schema: "raft-cli-agent-session.v1";
|
|
21
|
+
token_type: "Bearer";
|
|
22
|
+
access_token: string;
|
|
23
|
+
access_expires_at: string;
|
|
24
|
+
refresh_token: string;
|
|
25
|
+
refresh_expires_at: string | null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Strictly validate the exchange/refresh success body (closed keys + RFC3339).
|
|
29
|
+
* `now` is injected so validation is deterministic: a freshly issued session MUST
|
|
30
|
+
* have a strictly-future access expiry (and refresh expiry, when present) — otherwise
|
|
31
|
+
* we would persist an already-dead session that the very next request must refresh.
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseAgentSession(body: any, now: number): AgentSession;
|
|
34
|
+
export interface StoredAgentAuth extends AgentSession {
|
|
35
|
+
service: string;
|
|
36
|
+
api_base: string;
|
|
37
|
+
updated_at: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Atomic, hardened store write: O_EXCL unique temp in the same dir, 0600, write +
|
|
41
|
+
* fsync + close, atomic rename. Each dir component under $SLOCK_HOME is ensured AND
|
|
42
|
+
* verified 0700 (repairing a pre-existing wide dir). $SLOCK_HOME itself is not chmod'd.
|
|
43
|
+
* On any failure the temp is removed and the previous file is left intact.
|
|
44
|
+
*/
|
|
45
|
+
export declare function writeAgentSession(a: AgentEnv, service: string, session: AgentSession, apiBase: string, now?: () => string): string;
|
|
46
|
+
export declare const MAX_TOKEN_RESPONSE_BYTES: number;
|
|
47
|
+
/**
|
|
48
|
+
* Read a response body with a hard byte cap. If an AbortController is supplied it is
|
|
49
|
+
* aborted when the cap is exceeded (so a still-open connection is torn down, and — in
|
|
50
|
+
* `rotate` — the same controller's deadline keeps covering this read). Falls back to
|
|
51
|
+
* `.text()` for response doubles that expose no stream (still cap-checked).
|
|
52
|
+
*/
|
|
53
|
+
export declare function readBoundedText(res: Response, controller?: AbortController): Promise<string>;
|
|
54
|
+
export interface AgentLoginOptions {
|
|
55
|
+
service?: string;
|
|
56
|
+
now?: number;
|
|
57
|
+
/** Injectable invoke runner for tests; defaults to spawning the pinned wrapper. */
|
|
58
|
+
invoke?: (args: string[]) => {
|
|
59
|
+
status: number | null;
|
|
60
|
+
stdout: string;
|
|
61
|
+
stderr: string;
|
|
62
|
+
};
|
|
63
|
+
/** Injectable fetch for the exchange; defaults to global fetch. */
|
|
64
|
+
fetchImpl?: typeof fetch;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Full agent-login flow: invoke the pinned wrapper → strict-validate grant → exchange
|
|
68
|
+
* → strict-validate session → atomic store. Returns the stored session on success.
|
|
69
|
+
*/
|
|
70
|
+
export declare function runAgentLogin(a: AgentEnv, opts?: AgentLoginOptions): Promise<AgentSession>;
|