@agentworkforce/deploy 0.0.0 → 3.0.3

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 (43) hide show
  1. package/dist/bundle.js +19 -2
  2. package/dist/bundle.js.map +1 -1
  3. package/dist/bundle.test.js +40 -0
  4. package/dist/bundle.test.js.map +1 -1
  5. package/dist/deploy.d.ts.map +1 -1
  6. package/dist/deploy.js +52 -26
  7. package/dist/deploy.js.map +1 -1
  8. package/dist/deploy.test.js +126 -10
  9. package/dist/deploy.test.js.map +1 -1
  10. package/dist/index.d.ts +7 -3
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +57 -3
  13. package/dist/index.js.map +1 -1
  14. package/dist/login.d.ts +30 -0
  15. package/dist/login.d.ts.map +1 -1
  16. package/dist/login.js +263 -0
  17. package/dist/login.js.map +1 -1
  18. package/dist/modes/cloud.d.ts +13 -14
  19. package/dist/modes/cloud.d.ts.map +1 -1
  20. package/dist/modes/cloud.js +717 -15
  21. package/dist/modes/cloud.js.map +1 -1
  22. package/dist/modes/cloud.test.d.ts +2 -0
  23. package/dist/modes/cloud.test.d.ts.map +1 -0
  24. package/dist/modes/cloud.test.js +506 -0
  25. package/dist/modes/cloud.test.js.map +1 -0
  26. package/dist/modes/dev.d.ts.map +1 -1
  27. package/dist/modes/dev.js +2 -0
  28. package/dist/modes/dev.js.map +1 -1
  29. package/dist/modes/input-values.test.d.ts +2 -0
  30. package/dist/modes/input-values.test.d.ts.map +1 -0
  31. package/dist/modes/input-values.test.js +242 -0
  32. package/dist/modes/input-values.test.js.map +1 -0
  33. package/dist/modes/sandbox.d.ts +1 -1
  34. package/dist/modes/sandbox.d.ts.map +1 -1
  35. package/dist/modes/sandbox.js +4 -2
  36. package/dist/modes/sandbox.js.map +1 -1
  37. package/dist/runtime-context.d.ts +3 -0
  38. package/dist/runtime-context.d.ts.map +1 -0
  39. package/dist/runtime-context.js +40 -0
  40. package/dist/runtime-context.js.map +1 -0
  41. package/dist/types.d.ts +28 -0
  42. package/dist/types.d.ts.map +1 -1
  43. package/package.json +8 -8
package/dist/login.d.ts CHANGED
@@ -15,10 +15,40 @@ export interface WorkspaceAuth {
15
15
  token: string;
16
16
  }>;
17
17
  }
18
+ export interface WorkspaceAuthToken {
19
+ token: string;
20
+ }
21
+ export interface StoredWorkspaceLogin {
22
+ workspace?: string;
23
+ token: string;
24
+ refreshToken?: string;
25
+ expiresAt?: string;
26
+ cloudUrl?: string;
27
+ }
18
28
  /**
19
29
  * Environment-backed fallback resolver: reads `WORKFORCE_WORKSPACE_ID`
20
30
  * and `WORKFORCE_WORKSPACE_TOKEN` from `process.env`. Useful in CI and as
21
31
  * a sane default before the CLI wires up the OAuth flow.
22
32
  */
23
33
  export declare function envWorkspaceAuth(): WorkspaceAuth;
34
+ /**
35
+ * Resolve the workspace token for mode launchers that need to call cloud
36
+ * APIs directly. The deploy orchestrator resolves workspace identity before
37
+ * launch; this helper keeps the token lookup in the auth module until the
38
+ * browser/keychain login flow replaces the env fallback.
39
+ */
40
+ export declare function resolveWorkspaceTokenFromEnv(workspace: string): WorkspaceAuthToken;
41
+ export declare function resolveWorkspaceToken(args: {
42
+ workspace: string;
43
+ cloudUrl: string;
44
+ io: DeployIO;
45
+ noPrompt?: boolean;
46
+ }): Promise<WorkspaceAuthToken>;
47
+ export declare function loadWorkspaceToken(workspace: string): Promise<StoredWorkspaceLogin | null>;
48
+ export declare function storeWorkspaceToken(login: StoredWorkspaceLogin): Promise<void>;
49
+ export declare function loginWithBrowser(args: {
50
+ cloudUrl: string;
51
+ workspace: string;
52
+ io: DeployIO;
53
+ }): Promise<StoredWorkspaceLogin>;
24
54
  //# sourceMappingURL=login.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,gBAAgB,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;QACnE,SAAS,EAAE,MAAM,CAAC;QAClB,mEAAmE;QACnE,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAwBhD"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,gBAAgB,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;QACnE,SAAS,EAAE,MAAM,CAAC;QAClB,mEAAmE;QACnE,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAwBhD;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,CAQlF;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,QAAQ,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoB9B;AAED,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAYhG;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,QAAQ,CAAC;CACd,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoFhC"}
package/dist/login.js CHANGED
@@ -1,3 +1,10 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { readFile, mkdir, writeFile } from 'node:fs/promises';
4
+ import { createServer } from 'node:http';
5
+ import { homedir, platform } from 'node:os';
6
+ import path from 'node:path';
7
+ const LOGIN_FILE = path.join(homedir(), '.agentworkforce', 'login.json');
1
8
  /**
2
9
  * Environment-backed fallback resolver: reads `WORKFORCE_WORKSPACE_ID`
3
10
  * and `WORKFORCE_WORKSPACE_TOKEN` from `process.env`. Useful in CI and as
@@ -24,4 +31,260 @@ export function envWorkspaceAuth() {
24
31
  }
25
32
  };
26
33
  }
34
+ /**
35
+ * Resolve the workspace token for mode launchers that need to call cloud
36
+ * APIs directly. The deploy orchestrator resolves workspace identity before
37
+ * launch; this helper keeps the token lookup in the auth module until the
38
+ * browser/keychain login flow replaces the env fallback.
39
+ */
40
+ export function resolveWorkspaceTokenFromEnv(workspace) {
41
+ const token = (process.env.WORKFORCE_WORKSPACE_TOKEN ?? '').trim();
42
+ if (!token) {
43
+ throw new Error(`no workspace token resolved for ${workspace}: run \`workforce login\` or set WORKFORCE_WORKSPACE_TOKEN`);
44
+ }
45
+ return { token };
46
+ }
47
+ export async function resolveWorkspaceToken(args) {
48
+ const fromEnv = (process.env.WORKFORCE_WORKSPACE_TOKEN ?? '').trim();
49
+ if (fromEnv)
50
+ return { token: fromEnv };
51
+ const stored = await loadWorkspaceToken(args.workspace);
52
+ if (stored)
53
+ return { token: stored.token };
54
+ if (args.noPrompt) {
55
+ throw new Error(`no workspace token resolved for ${args.workspace}: run \`workforce login\` or set WORKFORCE_WORKSPACE_TOKEN`);
56
+ }
57
+ args.io.info('cloud: no workspace token found; opening workforce login');
58
+ const login = await loginWithBrowser({
59
+ cloudUrl: args.cloudUrl,
60
+ workspace: args.workspace,
61
+ io: args.io
62
+ });
63
+ return { token: login.token };
64
+ }
65
+ export async function loadWorkspaceToken(workspace) {
66
+ const fromKeychain = await readMacKeychainLogin(workspace);
67
+ if (fromKeychain && !isExpired(fromKeychain.expiresAt)) {
68
+ return fromKeychain;
69
+ }
70
+ const fromFile = await readLoginFile();
71
+ if (fromFile && workspaceMatches(fromFile, workspace) && !isExpired(fromFile.expiresAt)) {
72
+ return fromFile;
73
+ }
74
+ return null;
75
+ }
76
+ export async function storeWorkspaceToken(login) {
77
+ if (await writeMacKeychainLogin(login))
78
+ return;
79
+ await mkdir(path.dirname(LOGIN_FILE), { recursive: true, mode: 0o700 });
80
+ await writeFile(LOGIN_FILE, `${JSON.stringify(login, null, 2)}\n`, {
81
+ encoding: 'utf8',
82
+ mode: 0o600
83
+ });
84
+ }
85
+ export async function loginWithBrowser(args) {
86
+ const state = randomUUID();
87
+ return await new Promise((resolve, reject) => {
88
+ let settled = false;
89
+ const server = createServer((request, response) => {
90
+ const requestUrl = new URL(request.url ?? '/', 'http://127.0.0.1');
91
+ if (requestUrl.pathname !== '/callback') {
92
+ response.statusCode = 404;
93
+ response.end('not found');
94
+ return;
95
+ }
96
+ if (requestUrl.searchParams.get('state') !== state) {
97
+ response.statusCode = 400;
98
+ response.end('invalid state');
99
+ settleError(new Error('login callback returned an invalid state'));
100
+ return;
101
+ }
102
+ const error = requestUrl.searchParams.get('error');
103
+ if (error) {
104
+ response.statusCode = 400;
105
+ response.end('login failed');
106
+ settleError(new Error(error));
107
+ return;
108
+ }
109
+ const token = requestUrl.searchParams.get('access_token')?.trim();
110
+ const refreshToken = requestUrl.searchParams.get('refresh_token')?.trim() || undefined;
111
+ const expiresAt = requestUrl.searchParams.get('access_token_expires_at')?.trim() || undefined;
112
+ const cloudUrl = requestUrl.searchParams.get('api_url')?.trim() || args.cloudUrl;
113
+ if (!token) {
114
+ response.statusCode = 400;
115
+ response.end('missing token');
116
+ settleError(new Error('login callback did not include a workspace token'));
117
+ return;
118
+ }
119
+ response.statusCode = 200;
120
+ response.end('workforce login complete; you can close this tab');
121
+ const login = {
122
+ workspace: args.workspace,
123
+ token,
124
+ cloudUrl,
125
+ ...(refreshToken ? { refreshToken } : {}),
126
+ ...(expiresAt ? { expiresAt } : {})
127
+ };
128
+ void storeWorkspaceToken(login).finally(() => settle(login));
129
+ });
130
+ function settle(login) {
131
+ if (settled)
132
+ return;
133
+ settled = true;
134
+ server.close();
135
+ resolve(login);
136
+ }
137
+ function settleError(error) {
138
+ if (settled)
139
+ return;
140
+ settled = true;
141
+ server.close();
142
+ reject(error);
143
+ }
144
+ server.on('error', settleError);
145
+ server.listen(0, '127.0.0.1', () => {
146
+ const address = server.address();
147
+ if (!address || typeof address === 'string') {
148
+ settleError(new Error('failed to start local login callback server'));
149
+ return;
150
+ }
151
+ const callback = new URL('/callback', `http://127.0.0.1:${address.port}`);
152
+ const loginUrl = new URL('/cli-auth', args.cloudUrl);
153
+ loginUrl.searchParams.set('redirect_uri', callback.toString());
154
+ loginUrl.searchParams.set('state', state);
155
+ args.io.info(`cloud: login URL ${loginUrl.toString()}`);
156
+ tryOpenBrowser(loginUrl.toString());
157
+ });
158
+ setTimeout(() => settleError(new Error('timed out waiting for workforce login')), 5 * 60_000).unref();
159
+ });
160
+ }
161
+ async function readLoginFile() {
162
+ const raw = await readFile(LOGIN_FILE, 'utf8').catch(() => '');
163
+ if (!raw.trim())
164
+ return null;
165
+ return parseStoredLogin(raw);
166
+ }
167
+ async function readMacKeychainLogin(workspace) {
168
+ if (platform() !== 'darwin')
169
+ return null;
170
+ const serviceNames = [
171
+ `agentworkforce:${workspace}`,
172
+ `workforce:${workspace}`,
173
+ 'agentworkforce',
174
+ 'workforce'
175
+ ];
176
+ for (const service of serviceNames) {
177
+ const stdout = await execSecurity(['find-generic-password', '-s', service, '-w']);
178
+ const parsed = parseStoredLogin(stdout.trim());
179
+ if (parsed && workspaceMatches(parsed, workspace))
180
+ return parsed;
181
+ if (parsed)
182
+ continue;
183
+ if (stdout.trim()) {
184
+ return {
185
+ workspace,
186
+ token: stdout.trim()
187
+ };
188
+ }
189
+ }
190
+ return null;
191
+ }
192
+ async function writeMacKeychainLogin(login) {
193
+ if (platform() !== 'darwin')
194
+ return false;
195
+ const workspace = login.workspace ?? 'default';
196
+ const payload = JSON.stringify(login);
197
+ return await execSecurityOk([
198
+ 'add-generic-password',
199
+ '-U',
200
+ '-s',
201
+ `agentworkforce:${workspace}`,
202
+ '-a',
203
+ workspace,
204
+ '-w',
205
+ payload
206
+ ]);
207
+ }
208
+ function execSecurity(args) {
209
+ return new Promise((resolve) => {
210
+ const child = spawn('security', args, { stdio: ['ignore', 'pipe', 'ignore'] });
211
+ let stdout = '';
212
+ child.stdout.setEncoding('utf8');
213
+ child.stdout.on('data', (chunk) => {
214
+ stdout += chunk;
215
+ });
216
+ child.on('error', () => resolve(''));
217
+ child.on('close', (code) => resolve(code === 0 ? stdout : ''));
218
+ });
219
+ }
220
+ function execSecurityOk(args) {
221
+ return new Promise((resolve) => {
222
+ const child = spawn('security', args, { stdio: 'ignore' });
223
+ child.on('error', () => resolve(false));
224
+ child.on('close', (code) => resolve(code === 0));
225
+ });
226
+ }
227
+ function parseStoredLogin(raw) {
228
+ const trimmed = raw.trim();
229
+ if (!trimmed)
230
+ return null;
231
+ if (!trimmed.startsWith('{')) {
232
+ return { token: trimmed };
233
+ }
234
+ try {
235
+ const parsed = JSON.parse(trimmed);
236
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
237
+ return null;
238
+ const record = parsed;
239
+ const token = typeof record.token === 'string'
240
+ ? record.token
241
+ : typeof record.accessToken === 'string'
242
+ ? record.accessToken
243
+ : '';
244
+ if (!token.trim())
245
+ return null;
246
+ const workspace = typeof record.workspace === 'string'
247
+ ? record.workspace
248
+ : typeof record.workspaceId === 'string'
249
+ ? record.workspaceId
250
+ : undefined;
251
+ const expiresAt = typeof record.expiresAt === 'string'
252
+ ? record.expiresAt
253
+ : typeof record.accessTokenExpiresAt === 'string'
254
+ ? record.accessTokenExpiresAt
255
+ : undefined;
256
+ return {
257
+ token: token.trim(),
258
+ ...(workspace ? { workspace } : {}),
259
+ ...(typeof record.refreshToken === 'string' ? { refreshToken: record.refreshToken } : {}),
260
+ ...(expiresAt ? { expiresAt } : {}),
261
+ ...(typeof record.cloudUrl === 'string' ? { cloudUrl: record.cloudUrl } : {})
262
+ };
263
+ }
264
+ catch {
265
+ return null;
266
+ }
267
+ }
268
+ function workspaceMatches(login, workspace) {
269
+ return !login.workspace || login.workspace === workspace;
270
+ }
271
+ function isExpired(expiresAt) {
272
+ if (!expiresAt)
273
+ return false;
274
+ const millis = Date.parse(expiresAt);
275
+ return Number.isNaN(millis) ? false : millis <= Date.now();
276
+ }
277
+ function tryOpenBrowser(url) {
278
+ const command = platform() === 'darwin'
279
+ ? 'open'
280
+ : platform() === 'win32'
281
+ ? 'cmd'
282
+ : 'xdg-open';
283
+ const args = platform() === 'win32' ? ['/c', 'start', '', url] : [url];
284
+ const child = spawn(command, args, { stdio: 'ignore', detached: true });
285
+ child.on('error', () => {
286
+ // The login URL was already printed; browser launch is best-effort.
287
+ });
288
+ child.unref();
289
+ }
27
290
  //# sourceMappingURL=login.js.map
package/dist/login.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAgBA;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,KAAK,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;YACrC,oEAAoE;YACpE,mEAAmE;YACnE,kEAAkE;YAClE,cAAc;YACd,MAAM,SAAS,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAChF,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACnE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,EAAE,CAAC,KAAK,CACN,+FAA+F,CAChG,CAAC;gBACF,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,EAAE,CAAC,KAAK,CACN,kGAAkG,CACnG,CAAC;gBACF,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC5D,CAAC;YACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC9B,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,17 @@
1
- import type { ModeLauncher } from '../types.js';
1
+ import type { ModeLaunchHandle, ModeLauncher } from '../types.js';
2
+ type CloudDeployStatus = 'starting' | 'active' | 'failed' | 'cancelled';
3
+ export interface CloudRunHandle extends ModeLaunchHandle {
4
+ agentId: string;
5
+ deploymentId: string;
6
+ status: CloudDeployStatus;
7
+ }
2
8
  /**
3
- * Workforce-cloud-hosted deploy mode. Uploads the bundle to the workforce
4
- * cloud deployments endpoint and lets the cloud runtime host the agent.
5
- *
6
- * The endpoint (`POST /api/v1/workspaces/:id/deployments`) is part of the
7
- * proactive-runtime backend roadmap and is not yet live. Until it is,
8
- * `--mode cloud` returns a clean error that points users at the working
9
- * modes (`--mode sandbox` and `--mode dev`).
10
- *
11
- * When the endpoint ships, the implementation flow is:
12
- * 1. POST persona.json + agent.bundle.mjs + runner.mjs as multipart.
13
- * 2. Receive `{ deploymentId, statusUrl }`.
14
- * 3. Poll `statusUrl` until the cloud reports `running`.
15
- * 4. Return a handle whose `stop()` calls DELETE on the deployment.
9
+ * Cloud-hosted deploy mode. Uploads the deploy-ready persona bundle to a
10
+ * workforce-compatible cloud endpoint. The implementation is intentionally
11
+ * OSS-generic: callers may point at any compatible runtime with
12
+ * `--cloud-url`, `WORKFORCE_CLOUD_URL`, or `persona.cloud.deployUrl`; the
13
+ * production AgentRelay URL is only the final default.
16
14
  */
17
15
  export declare const cloudLauncher: ModeLauncher;
16
+ export {};
18
17
  //# sourceMappingURL=cloud.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/modes/cloud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,YAAY,EACb,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,aAAa,EAAE,YAM3B,CAAC"}
1
+ {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/modes/cloud.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,gBAAgB,EAChB,YAAY,EACb,MAAM,aAAa,CAAC;AAarB,KAAK,iBAAiB,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAIxE,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AA+CD;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,EAAE,YAmI3B,CAAC"}