@agentworkforce/deploy 0.0.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 (65) hide show
  1. package/dist/bundle.d.ts +22 -0
  2. package/dist/bundle.d.ts.map +1 -0
  3. package/dist/bundle.js +132 -0
  4. package/dist/bundle.js.map +1 -0
  5. package/dist/bundle.test.d.ts +2 -0
  6. package/dist/bundle.test.d.ts.map +1 -0
  7. package/dist/bundle.test.js +92 -0
  8. package/dist/bundle.test.js.map +1 -0
  9. package/dist/connect.d.ts +81 -0
  10. package/dist/connect.d.ts.map +1 -0
  11. package/dist/connect.js +127 -0
  12. package/dist/connect.js.map +1 -0
  13. package/dist/deploy.d.ts +50 -0
  14. package/dist/deploy.d.ts.map +1 -0
  15. package/dist/deploy.js +172 -0
  16. package/dist/deploy.js.map +1 -0
  17. package/dist/deploy.test.d.ts +2 -0
  18. package/dist/deploy.test.d.ts.map +1 -0
  19. package/dist/deploy.test.js +293 -0
  20. package/dist/deploy.test.js.map +1 -0
  21. package/dist/index.d.ts +11 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +10 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/io.d.ts +22 -0
  26. package/dist/io.d.ts.map +1 -0
  27. package/dist/io.js +76 -0
  28. package/dist/io.js.map +1 -0
  29. package/dist/login.d.ts +24 -0
  30. package/dist/login.d.ts.map +1 -0
  31. package/dist/login.js +27 -0
  32. package/dist/login.js.map +1 -0
  33. package/dist/modes/cloud.d.ts +18 -0
  34. package/dist/modes/cloud.d.ts.map +1 -0
  35. package/dist/modes/cloud.js +21 -0
  36. package/dist/modes/cloud.js.map +1 -0
  37. package/dist/modes/dev.d.ts +12 -0
  38. package/dist/modes/dev.d.ts.map +1 -0
  39. package/dist/modes/dev.js +153 -0
  40. package/dist/modes/dev.js.map +1 -0
  41. package/dist/modes/sandbox-client.d.ts +63 -0
  42. package/dist/modes/sandbox-client.d.ts.map +1 -0
  43. package/dist/modes/sandbox-client.js +177 -0
  44. package/dist/modes/sandbox-client.js.map +1 -0
  45. package/dist/modes/sandbox-client.test.d.ts +2 -0
  46. package/dist/modes/sandbox-client.test.d.ts.map +1 -0
  47. package/dist/modes/sandbox-client.test.js +177 -0
  48. package/dist/modes/sandbox-client.test.js.map +1 -0
  49. package/dist/modes/sandbox.d.ts +50 -0
  50. package/dist/modes/sandbox.d.ts.map +1 -0
  51. package/dist/modes/sandbox.js +131 -0
  52. package/dist/modes/sandbox.js.map +1 -0
  53. package/dist/modes/sandbox.test.d.ts +2 -0
  54. package/dist/modes/sandbox.test.d.ts.map +1 -0
  55. package/dist/modes/sandbox.test.js +95 -0
  56. package/dist/modes/sandbox.test.js.map +1 -0
  57. package/dist/preflight.d.ts +14 -0
  58. package/dist/preflight.d.ts.map +1 -0
  59. package/dist/preflight.js +78 -0
  60. package/dist/preflight.js.map +1 -0
  61. package/dist/types.d.ts +140 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +2 -0
  64. package/dist/types.js.map +1 -0
  65. package/package.json +40 -0
package/dist/deploy.js ADDED
@@ -0,0 +1,172 @@
1
+ import path from 'node:path';
2
+ import { mkdir } from 'node:fs/promises';
3
+ import { bundleStager } from './bundle.js';
4
+ import { connectIntegrations, envIntegrationResolver } from './connect.js';
5
+ import { createTerminalIO } from './io.js';
6
+ import { envWorkspaceAuth } from './login.js';
7
+ import { devLauncher } from './modes/dev.js';
8
+ import { sandboxLauncher } from './modes/sandbox.js';
9
+ import { cloudLauncher } from './modes/cloud.js';
10
+ import { preflightPersona } from './preflight.js';
11
+ /**
12
+ * Pick the run mode for this deploy. Per the deploy-v1 spec:
13
+ * - Explicit `--mode` always wins.
14
+ * - Otherwise `--mode sandbox` is the default when Daytona creds resolve
15
+ * (BYO env or workforce-managed both count as "resolved" here; the
16
+ * sandbox launcher itself decides which auth path to use).
17
+ * - Otherwise fall back to `--mode dev`.
18
+ *
19
+ * The orchestrator doesn't probe the cloud endpoint here — `--mode cloud`
20
+ * stays opt-in until the M4 endpoint is live.
21
+ */
22
+ export function pickMode(opts) {
23
+ if (opts.mode)
24
+ return opts.mode;
25
+ // Daytona credential probe: BYO env var, or assume workforce-managed via
26
+ // the active workspace (the sandbox launcher gates on its own auth).
27
+ if (process.env.DAYTONA_API_KEY || process.env.WORKFORCE_WORKSPACE_TOKEN) {
28
+ return 'sandbox';
29
+ }
30
+ return 'dev';
31
+ }
32
+ /**
33
+ * Top-level entry. The CLI dispatch case calls this with parsed options
34
+ * and resolvers. Returns a `DeployResult` summarizing the deploy; on
35
+ * failure, throws with an actionable message (no half-deploys).
36
+ *
37
+ * Step ordering — see `docs/plans/deploy-v1.md` §5:
38
+ * 1. Preflight persona (parse, lint, onEvent on disk).
39
+ * 2. Resolve workspace + token.
40
+ * 3. Connect integrations (prompt per provider).
41
+ * 4. Stage bundle to `.workforce/build/<id>/`.
42
+ * 5. Launch in the resolved mode.
43
+ * 6. Return the handle + summary.
44
+ *
45
+ * `dryRun: true` exits cleanly after step 1, returning a minimal result
46
+ * with the warnings collected so far.
47
+ *
48
+ * `bundleOut: <dir>` runs steps 1-4 then exits, skipping launch.
49
+ */
50
+ export async function deploy(opts, resolvers = {}) {
51
+ const io = opts.io ?? createTerminalIO();
52
+ const warnings = [];
53
+ io.info(`workforce deploy → ${opts.personaPath}`);
54
+ const preflight = await preflightPersona(opts.personaPath);
55
+ warnings.push(...preflight.warnings);
56
+ for (const w of preflight.warnings)
57
+ io.warn(w);
58
+ io.info(`persona ${preflight.persona.id}: ${preflight.integrations.length} integration(s), ${preflight.schedules.length} schedule(s)`);
59
+ if (opts.dryRun) {
60
+ io.info('--dry-run: persona validated; exiting before any side effects');
61
+ return {
62
+ deploymentId: preflight.persona.id,
63
+ mode: opts.mode ?? pickMode(opts),
64
+ workspace: opts.workspace ?? '(dry-run)',
65
+ bundleDir: '(dry-run)',
66
+ connectedIntegrations: [],
67
+ schedules: preflight.schedules,
68
+ warnings
69
+ };
70
+ }
71
+ // `--bundle-out` produces a workspace-agnostic artifact, so skip the
72
+ // workspace/integration handshakes entirely. Anyone bundling for CI
73
+ // or inspection shouldn't need credentials they don't yet have.
74
+ if (opts.bundleOut) {
75
+ const bundleDir = path.resolve(opts.bundleOut);
76
+ await mkdir(bundleDir, { recursive: true });
77
+ const stager = resolvers.bundle ?? bundleStager;
78
+ const bundle = await stager.stage({
79
+ personaPath: preflight.personaPath,
80
+ persona: preflight.persona,
81
+ outDir: bundleDir
82
+ });
83
+ io.info(`bundle: staged to ${bundle.runnerPath} (${formatBytes(bundle.sizeBytes)})`);
84
+ io.info(`--bundle-out: bundle ready at ${bundleDir}; skipping launch`);
85
+ return {
86
+ deploymentId: preflight.persona.id,
87
+ mode: opts.mode ?? pickMode(opts),
88
+ workspace: opts.workspace ?? '(bundle-only)',
89
+ bundleDir,
90
+ connectedIntegrations: [],
91
+ schedules: preflight.schedules,
92
+ warnings
93
+ };
94
+ }
95
+ const workspaceAuth = resolvers.workspaceAuth ?? envWorkspaceAuth();
96
+ const { workspace } = await workspaceAuth.resolveWorkspace({
97
+ override: opts.workspace,
98
+ io
99
+ });
100
+ io.info(`workspace: ${workspace}`);
101
+ const connectResult = await connectIntegrations({
102
+ persona: preflight.persona,
103
+ workspace,
104
+ noConnect: opts.noConnect === true,
105
+ io,
106
+ integrations: resolvers.integrations ?? envIntegrationResolver(),
107
+ ...(resolvers.subscription ? { subscription: resolvers.subscription } : {})
108
+ });
109
+ const failed = connectResult.outcomes.filter((o) => o.status === 'failed');
110
+ if (failed.length > 0) {
111
+ throw new Error(`deploy aborted: ${failed.length} integration(s) failed to connect: ${failed.map((f) => f.provider).join(', ')}`);
112
+ }
113
+ const skipped = connectResult.outcomes.filter((o) => o.status === 'skipped');
114
+ if (skipped.length > 0) {
115
+ throw new Error(`deploy aborted: ${skipped.length} integration(s) skipped: ${skipped.map((s) => s.provider).join(', ')}`);
116
+ }
117
+ const connectedIntegrations = connectResult.outcomes
118
+ .filter((o) => o.status === 'already-connected' || o.status === 'connected-now')
119
+ .map((o) => o.provider);
120
+ const bundleDir = path.resolve(path.join(preflight.personaDir, '.workforce', 'build', preflight.persona.id));
121
+ await mkdir(bundleDir, { recursive: true });
122
+ const stager = resolvers.bundle ?? bundleStager;
123
+ const bundle = await stager.stage({
124
+ personaPath: preflight.personaPath,
125
+ persona: preflight.persona,
126
+ outDir: bundleDir
127
+ });
128
+ io.info(`bundle: staged to ${bundle.runnerPath} (${formatBytes(bundle.sizeBytes)})`);
129
+ const mode = opts.mode ?? pickMode(opts);
130
+ io.info(`mode: ${mode}`);
131
+ const launcher = resolveLauncher(mode, resolvers);
132
+ const handle = await launcher.launch({
133
+ persona: preflight.persona,
134
+ bundle,
135
+ workspace,
136
+ io,
137
+ ...(opts.detach ? { detach: true } : {}),
138
+ ...(opts.byoSandbox ? { byoSandbox: true } : {})
139
+ });
140
+ io.info(`launched: ${mode}/${handle.id}`);
141
+ return {
142
+ deploymentId: preflight.persona.id,
143
+ mode,
144
+ workspace,
145
+ bundleDir,
146
+ connectedIntegrations,
147
+ schedules: preflight.schedules,
148
+ runHandle: handle,
149
+ warnings
150
+ };
151
+ }
152
+ function resolveLauncher(mode, resolvers) {
153
+ const supplied = resolvers.modes?.[mode];
154
+ if (supplied)
155
+ return supplied;
156
+ switch (mode) {
157
+ case 'dev':
158
+ return devLauncher;
159
+ case 'sandbox':
160
+ return sandboxLauncher;
161
+ case 'cloud':
162
+ return cloudLauncher;
163
+ }
164
+ }
165
+ function formatBytes(bytes) {
166
+ if (bytes < 1024)
167
+ return `${bytes}B`;
168
+ if (bytes < 1024 * 1024)
169
+ return `${(bytes / 1024).toFixed(1)}KB`;
170
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
171
+ }
172
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=deploy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.test.d.ts","sourceRoot":"","sources":["../src/deploy.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,293 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtemp, rm, writeFile, mkdir } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import os from 'node:os';
6
+ import { deploy } from './deploy.js';
7
+ import { createBufferedIO } from './io.js';
8
+ import { preflightPersona } from './preflight.js';
9
+ function basePersonaJson(overrides = {}) {
10
+ return {
11
+ id: 'demo',
12
+ intent: 'documentation',
13
+ tags: ['documentation'],
14
+ description: 'test persona',
15
+ harness: 'claude',
16
+ model: 'anthropic/claude-3-5-sonnet',
17
+ systemPrompt: 'be helpful',
18
+ harnessSettings: { reasoning: 'medium', timeoutSeconds: 300 },
19
+ cloud: true,
20
+ schedules: [{ name: 'weekly', cron: '0 9 * * 6' }],
21
+ onEvent: './agent.ts',
22
+ ...overrides
23
+ };
24
+ }
25
+ async function withTempPersona(persona, agentSource = 'export default async () => {};') {
26
+ const dir = await mkdtemp(path.join(os.tmpdir(), 'wf-deploy-test-'));
27
+ const personaPath = path.join(dir, 'persona.json');
28
+ await writeFile(personaPath, JSON.stringify(persona, null, 2), 'utf8');
29
+ await writeFile(path.join(dir, 'agent.ts'), agentSource, 'utf8');
30
+ return {
31
+ dir,
32
+ personaPath,
33
+ cleanup: () => rm(dir, { recursive: true, force: true })
34
+ };
35
+ }
36
+ test('preflightPersona accepts a valid deploy-shaped persona', async () => {
37
+ const { personaPath, cleanup } = await withTempPersona(basePersonaJson());
38
+ try {
39
+ const pre = await preflightPersona(personaPath);
40
+ assert.equal(pre.persona.id, 'demo');
41
+ assert.deepEqual(pre.schedules, ['weekly']);
42
+ assert.deepEqual(pre.integrations, []);
43
+ assert.equal(pre.warnings.length, 0);
44
+ }
45
+ finally {
46
+ await cleanup();
47
+ }
48
+ });
49
+ test('preflightPersona refuses when cloud is not true', async () => {
50
+ const { personaPath, cleanup } = await withTempPersona(basePersonaJson({ cloud: false }));
51
+ try {
52
+ await assert.rejects(preflightPersona(personaPath), /not opted into deploy/);
53
+ }
54
+ finally {
55
+ await cleanup();
56
+ }
57
+ });
58
+ test('preflightPersona refuses when no triggers are declared', async () => {
59
+ const { personaPath, cleanup } = await withTempPersona(basePersonaJson({ schedules: undefined, integrations: undefined }));
60
+ try {
61
+ await assert.rejects(preflightPersona(personaPath), /has no triggers/);
62
+ }
63
+ finally {
64
+ await cleanup();
65
+ }
66
+ });
67
+ test('preflightPersona refuses when onEvent file is missing', async () => {
68
+ const { personaPath, cleanup } = await withTempPersona(basePersonaJson({ onEvent: './does-not-exist.ts' }));
69
+ try {
70
+ await assert.rejects(preflightPersona(personaPath), /onEvent file not found/);
71
+ }
72
+ finally {
73
+ await cleanup();
74
+ }
75
+ });
76
+ test('preflightPersona warns on unknown triggers but does not fail', async () => {
77
+ const { personaPath, cleanup } = await withTempPersona(basePersonaJson({
78
+ schedules: undefined,
79
+ integrations: {
80
+ github: { triggers: [{ on: 'pull_request.imagined_event' }] }
81
+ }
82
+ }));
83
+ try {
84
+ const pre = await preflightPersona(personaPath);
85
+ assert.equal(pre.warnings.length, 1);
86
+ assert.match(pre.warnings[0], /pull_request\.imagined_event/);
87
+ }
88
+ finally {
89
+ await cleanup();
90
+ }
91
+ });
92
+ test('deploy --dry-run validates persona and exits before side effects', async () => {
93
+ const { personaPath, cleanup } = await withTempPersona(basePersonaJson());
94
+ const io = createBufferedIO();
95
+ try {
96
+ const result = await deploy({ personaPath, dryRun: true, io });
97
+ assert.equal(result.deploymentId, 'demo');
98
+ assert.deepEqual(result.schedules, ['weekly']);
99
+ assert.ok(io.messages.find((m) => m.message.includes('--dry-run')));
100
+ // No workspace resolution happened.
101
+ assert.ok(!io.messages.find((m) => m.message.startsWith('workspace:')));
102
+ }
103
+ finally {
104
+ await cleanup();
105
+ }
106
+ });
107
+ test('deploy fails clearly when integration is not connected and --no-connect is set', async () => {
108
+ const { personaPath, cleanup } = await withTempPersona(basePersonaJson({ integrations: { github: { triggers: [{ on: 'pull_request.opened' }] } } }));
109
+ const io = createBufferedIO();
110
+ const workspaceAuth = {
111
+ async resolveWorkspace() {
112
+ return { workspace: 'ws-test', token: 'tok' };
113
+ }
114
+ };
115
+ const integrations = {
116
+ async isConnected() {
117
+ return false;
118
+ },
119
+ async connect() {
120
+ throw new Error('should not be called when --no-connect is set');
121
+ }
122
+ };
123
+ try {
124
+ await assert.rejects(deploy({ personaPath, mode: 'dev', noConnect: true, io }, { workspaceAuth, integrations }), /failed to connect/);
125
+ assert.ok(io.messages.find((m) => m.level === 'error' && m.message.includes('--no-connect was passed')));
126
+ }
127
+ finally {
128
+ await cleanup();
129
+ }
130
+ });
131
+ test('deploy stages a bundle and hands off to the resolved launcher', async () => {
132
+ const { personaPath, dir, cleanup } = await withTempPersona(basePersonaJson());
133
+ const io = createBufferedIO();
134
+ let stagedTo = '';
135
+ const bundleStager = {
136
+ async stage(input) {
137
+ stagedTo = input.outDir;
138
+ await mkdir(input.outDir, { recursive: true });
139
+ const runner = path.join(input.outDir, 'runner.mjs');
140
+ const bundle = path.join(input.outDir, 'agent.bundle.mjs');
141
+ const personaCopy = path.join(input.outDir, 'persona.json');
142
+ const pkg = path.join(input.outDir, 'package.json');
143
+ await Promise.all([
144
+ writeFile(runner, '', 'utf8'),
145
+ writeFile(bundle, '', 'utf8'),
146
+ writeFile(personaCopy, '{}', 'utf8'),
147
+ writeFile(pkg, '{}', 'utf8')
148
+ ]);
149
+ return {
150
+ runnerPath: runner,
151
+ bundlePath: bundle,
152
+ personaCopyPath: personaCopy,
153
+ packageJsonPath: pkg,
154
+ sizeBytes: 2
155
+ };
156
+ }
157
+ };
158
+ let launched = 0;
159
+ const devLauncher = {
160
+ async launch(input) {
161
+ launched += 1;
162
+ assert.equal(input.persona.id, 'demo');
163
+ return {
164
+ id: 'pid-1',
165
+ async stop() {
166
+ /* no-op */
167
+ },
168
+ done: Promise.resolve({ code: 0 })
169
+ };
170
+ }
171
+ };
172
+ const workspaceAuth = {
173
+ async resolveWorkspace() {
174
+ return { workspace: 'ws-test', token: 'tok' };
175
+ }
176
+ };
177
+ const integrations = {
178
+ async isConnected() {
179
+ return true;
180
+ },
181
+ async connect() {
182
+ throw new Error('connect should not be called when everything is already connected');
183
+ }
184
+ };
185
+ try {
186
+ const result = await deploy({ personaPath, mode: 'dev', io }, { workspaceAuth, integrations, bundle: bundleStager, modes: { dev: devLauncher } });
187
+ assert.equal(launched, 1);
188
+ assert.equal(result.mode, 'dev');
189
+ assert.equal(result.workspace, 'ws-test');
190
+ assert.ok(result.bundleDir.startsWith(dir));
191
+ assert.equal(stagedTo, result.bundleDir);
192
+ assert.ok(io.messages.find((m) => m.message.includes('launched: dev/pid-1')));
193
+ }
194
+ finally {
195
+ await cleanup();
196
+ }
197
+ });
198
+ test('deploy --bundle-out emits to the supplied dir and skips launch', async () => {
199
+ const { personaPath, cleanup } = await withTempPersona(basePersonaJson());
200
+ const outDir = await mkdtemp(path.join(os.tmpdir(), 'wf-deploy-out-'));
201
+ const io = createBufferedIO();
202
+ let launched = false;
203
+ const devLauncher = {
204
+ async launch() {
205
+ launched = true;
206
+ throw new Error('launch should not run with --bundle-out');
207
+ }
208
+ };
209
+ const bundleStager = {
210
+ async stage(input) {
211
+ await mkdir(input.outDir, { recursive: true });
212
+ const runner = path.join(input.outDir, 'runner.mjs');
213
+ const bundle = path.join(input.outDir, 'agent.bundle.mjs');
214
+ const personaCopy = path.join(input.outDir, 'persona.json');
215
+ const pkg = path.join(input.outDir, 'package.json');
216
+ await Promise.all([
217
+ writeFile(runner, '', 'utf8'),
218
+ writeFile(bundle, '', 'utf8'),
219
+ writeFile(personaCopy, '{}', 'utf8'),
220
+ writeFile(pkg, '{}', 'utf8')
221
+ ]);
222
+ return {
223
+ runnerPath: runner,
224
+ bundlePath: bundle,
225
+ personaCopyPath: personaCopy,
226
+ packageJsonPath: pkg,
227
+ sizeBytes: 1
228
+ };
229
+ }
230
+ };
231
+ try {
232
+ const result = await deploy({ personaPath, mode: 'dev', io, bundleOut: outDir }, {
233
+ workspaceAuth: {
234
+ async resolveWorkspace() {
235
+ return { workspace: 'w', token: 't' };
236
+ }
237
+ },
238
+ integrations: {
239
+ async isConnected() {
240
+ return true;
241
+ },
242
+ async connect() {
243
+ throw new Error('unreachable');
244
+ }
245
+ },
246
+ bundle: bundleStager,
247
+ modes: { dev: devLauncher }
248
+ });
249
+ assert.equal(launched, false);
250
+ assert.equal(result.bundleDir, path.resolve(outDir));
251
+ assert.ok(io.messages.find((m) => m.message.includes('skipping launch')));
252
+ }
253
+ finally {
254
+ await cleanup();
255
+ await rm(outDir, { recursive: true, force: true });
256
+ }
257
+ });
258
+ test('--mode cloud throws a clear "not yet available" error', async () => {
259
+ const { personaPath, cleanup } = await withTempPersona(basePersonaJson());
260
+ const io = createBufferedIO();
261
+ try {
262
+ await assert.rejects(deploy({ personaPath, mode: 'cloud', io }, {
263
+ workspaceAuth: {
264
+ async resolveWorkspace() {
265
+ return { workspace: 'w', token: 't' };
266
+ }
267
+ },
268
+ integrations: {
269
+ async isConnected() {
270
+ return true;
271
+ },
272
+ async connect() {
273
+ throw new Error('unreachable');
274
+ }
275
+ },
276
+ bundle: {
277
+ async stage() {
278
+ return {
279
+ runnerPath: '/tmp/r',
280
+ bundlePath: '/tmp/b',
281
+ personaCopyPath: '/tmp/p',
282
+ packageJsonPath: '/tmp/k',
283
+ sizeBytes: 0
284
+ };
285
+ }
286
+ }
287
+ }), /--mode cloud is not yet available/);
288
+ }
289
+ finally {
290
+ await cleanup();
291
+ }
292
+ });
293
+ //# sourceMappingURL=deploy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.test.js","sourceRoot":"","sources":["../src/deploy.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { deploy, pickMode, type DeployResolvers } from './deploy.js';
2
+ export { preflightPersona } from './preflight.js';
3
+ export { connectIntegrations, envIntegrationResolver, type ConnectAllInput, type ConnectAllResult, type IntegrationConnectResolver, type ProviderSubscriptionResolver } from './connect.js';
4
+ export { envWorkspaceAuth, type WorkspaceAuth } from './login.js';
5
+ export { createTerminalIO, createBufferedIO, type BufferedIO } from './io.js';
6
+ export { bundleStager } from './bundle.js';
7
+ export { devLauncher } from './modes/dev.js';
8
+ export { sandboxLauncher, resolveSandboxAuth, type SandboxAuth } from './modes/sandbox.js';
9
+ export { cloudLauncher } from './modes/cloud.js';
10
+ export type { BundleResult, BundleStageInput, BundleStager, DeployIO, DeployMode, DeployOptions, DeployPreflight, DeployResult, IntegrationConnectOutcome, ModeLaunchHandle, ModeLaunchInput, ModeLauncher } from './types.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EAClC,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACZ,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACb,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export { deploy, pickMode } from './deploy.js';
2
+ export { preflightPersona } from './preflight.js';
3
+ export { connectIntegrations, envIntegrationResolver } from './connect.js';
4
+ export { envWorkspaceAuth } from './login.js';
5
+ export { createTerminalIO, createBufferedIO } from './io.js';
6
+ export { bundleStager } from './bundle.js';
7
+ export { devLauncher } from './modes/dev.js';
8
+ export { sandboxLauncher, resolveSandboxAuth } from './modes/sandbox.js';
9
+ export { cloudLauncher } from './modes/cloud.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAwB,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EAKvB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAsB,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAmB,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAoB,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/io.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import type { DeployIO } from './types.js';
2
+ /**
3
+ * Default IO implementation backed by the terminal. Writes status to
4
+ * stdout/stderr and uses node:readline for interactive prompts. Tests
5
+ * supply a deterministic in-memory IO via `DeployOptions.io`.
6
+ */
7
+ export declare function createTerminalIO(): DeployIO;
8
+ /**
9
+ * Buffered IO collected for assertions. Used by tests to verify the
10
+ * orchestrator's message flow without touching the terminal.
11
+ */
12
+ export interface BufferedIO extends DeployIO {
13
+ messages: Array<{
14
+ level: 'info' | 'warn' | 'error';
15
+ message: string;
16
+ }>;
17
+ /** Queue answers for upcoming prompts; FIFO. */
18
+ scriptAnswers(values: string[]): void;
19
+ scriptConfirmations(values: boolean[]): void;
20
+ }
21
+ export declare function createBufferedIO(): BufferedIO;
22
+ //# sourceMappingURL=io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,QAAQ,CAqC3C;AAED;;;GAGG;AACH,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAC1C,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,gDAAgD;IAChD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtC,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAC9C;AAED,wBAAgB,gBAAgB,IAAI,UAAU,CA6B7C"}
package/dist/io.js ADDED
@@ -0,0 +1,76 @@
1
+ import readline from 'node:readline/promises';
2
+ /**
3
+ * Default IO implementation backed by the terminal. Writes status to
4
+ * stdout/stderr and uses node:readline for interactive prompts. Tests
5
+ * supply a deterministic in-memory IO via `DeployOptions.io`.
6
+ */
7
+ export function createTerminalIO() {
8
+ // One short-lived readline interface per question. Holding a long-
9
+ // lived interface keeps stdin in raw mode and pins the event loop
10
+ // open, so non-interactive callers (`workforce deploy --no-connect`
11
+ // in CI) see `process.exit(0)` hang or get phantom keystrokes.
12
+ async function ask(question) {
13
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
14
+ try {
15
+ return await rl.question(question);
16
+ }
17
+ finally {
18
+ rl.close();
19
+ }
20
+ }
21
+ return {
22
+ info(message) {
23
+ process.stdout.write(`${message}\n`);
24
+ },
25
+ warn(message) {
26
+ process.stderr.write(`! ${message}\n`);
27
+ },
28
+ error(message) {
29
+ process.stderr.write(`x ${message}\n`);
30
+ },
31
+ async prompt(question, opts = {}) {
32
+ const suffix = opts.defaultValue !== undefined ? ` [${opts.defaultValue}]` : '';
33
+ const answer = (await ask(`${question}${suffix} `)).trim();
34
+ return answer.length > 0 ? answer : opts.defaultValue ?? '';
35
+ },
36
+ async confirm(question, opts = {}) {
37
+ const def = opts.defaultValue ?? false;
38
+ const suffix = def ? ' [Y/n]' : ' [y/N]';
39
+ const answer = (await ask(`${question}${suffix} `)).trim().toLowerCase();
40
+ if (answer === '')
41
+ return def;
42
+ return answer === 'y' || answer === 'yes';
43
+ }
44
+ };
45
+ }
46
+ export function createBufferedIO() {
47
+ const messages = [];
48
+ const answerQueue = [];
49
+ const confirmQueue = [];
50
+ return {
51
+ messages,
52
+ info(message) {
53
+ messages.push({ level: 'info', message });
54
+ },
55
+ warn(message) {
56
+ messages.push({ level: 'warn', message });
57
+ },
58
+ error(message) {
59
+ messages.push({ level: 'error', message });
60
+ },
61
+ async prompt(_question, opts) {
62
+ return answerQueue.shift() ?? opts?.defaultValue ?? '';
63
+ },
64
+ async confirm(_question, opts) {
65
+ const next = confirmQueue.shift();
66
+ return next ?? opts?.defaultValue ?? false;
67
+ },
68
+ scriptAnswers(values) {
69
+ answerQueue.push(...values);
70
+ },
71
+ scriptConfirmations(values) {
72
+ confirmQueue.push(...values);
73
+ }
74
+ };
75
+ }
76
+ //# sourceMappingURL=io.js.map
package/dist/io.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"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"}