terse-cli 0.9.20 → 0.9.21

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 (118) hide show
  1. package/README.md +1 -1
  2. package/dist/cliUi.d.ts +3 -1
  3. package/dist/cliUi.d.ts.map +1 -1
  4. package/dist/cliUi.js +3 -2
  5. package/dist/cliUi.js.map +1 -1
  6. package/dist/commands/actor.d.ts.map +1 -1
  7. package/dist/commands/actor.js +32 -5
  8. package/dist/commands/actor.js.map +1 -1
  9. package/dist/commands/attach.d.ts +0 -7
  10. package/dist/commands/attach.d.ts.map +1 -1
  11. package/dist/commands/attach.js +220 -189
  12. package/dist/commands/attach.js.map +1 -1
  13. package/dist/commands/deploy.d.ts.map +1 -1
  14. package/dist/commands/deploy.js +15 -3
  15. package/dist/commands/deploy.js.map +1 -1
  16. package/dist/commands/generate.d.ts +0 -4
  17. package/dist/commands/generate.d.ts.map +1 -1
  18. package/dist/commands/generate.js +161 -127
  19. package/dist/commands/generate.js.map +1 -1
  20. package/dist/commands/history.d.ts +0 -15
  21. package/dist/commands/history.d.ts.map +1 -1
  22. package/dist/commands/history.js +139 -105
  23. package/dist/commands/history.js.map +1 -1
  24. package/dist/commands/install.d.ts.map +1 -1
  25. package/dist/commands/install.js +6 -4
  26. package/dist/commands/install.js.map +1 -1
  27. package/dist/commands/integrate.d.ts +0 -48
  28. package/dist/commands/integrate.d.ts.map +1 -1
  29. package/dist/commands/integrate.js +897 -699
  30. package/dist/commands/integrate.js.map +1 -1
  31. package/dist/commands/integrateUse.d.ts +0 -12
  32. package/dist/commands/integrateUse.d.ts.map +1 -1
  33. package/dist/commands/integrateUse.js +132 -98
  34. package/dist/commands/integrateUse.js.map +1 -1
  35. package/dist/commands/listen.d.ts +0 -7
  36. package/dist/commands/listen.d.ts.map +1 -1
  37. package/dist/commands/listen.js +98 -81
  38. package/dist/commands/listen.js.map +1 -1
  39. package/dist/commands/memory.d.ts +0 -21
  40. package/dist/commands/memory.d.ts.map +1 -1
  41. package/dist/commands/memory.js +147 -128
  42. package/dist/commands/memory.js.map +1 -1
  43. package/dist/commands/replay.d.ts +0 -2
  44. package/dist/commands/replay.d.ts.map +1 -1
  45. package/dist/commands/replay.js +37 -28
  46. package/dist/commands/replay.js.map +1 -1
  47. package/dist/commands/resume.d.ts +0 -4
  48. package/dist/commands/resume.d.ts.map +1 -1
  49. package/dist/commands/resume.js +34 -28
  50. package/dist/commands/resume.js.map +1 -1
  51. package/dist/commands/run.d.ts +0 -2
  52. package/dist/commands/run.d.ts.map +1 -1
  53. package/dist/commands/run.js +78 -70
  54. package/dist/commands/run.js.map +1 -1
  55. package/dist/commands/state.d.ts +0 -18
  56. package/dist/commands/state.d.ts.map +1 -1
  57. package/dist/commands/state.js +129 -108
  58. package/dist/commands/state.js.map +1 -1
  59. package/dist/commands/test.d.ts +0 -28
  60. package/dist/commands/test.d.ts.map +1 -1
  61. package/dist/commands/test.js +509 -403
  62. package/dist/commands/test.js.map +1 -1
  63. package/dist/commands/toolRun.d.ts +0 -6
  64. package/dist/commands/toolRun.d.ts.map +1 -1
  65. package/dist/commands/toolRun.js +149 -134
  66. package/dist/commands/toolRun.js.map +1 -1
  67. package/dist/integrationApi.d.ts +0 -15
  68. package/dist/integrationApi.d.ts.map +1 -1
  69. package/dist/integrationApi.js +75 -49
  70. package/dist/integrationApi.js.map +1 -1
  71. package/dist/loadJob.d.ts +0 -11
  72. package/dist/loadJob.d.ts.map +1 -1
  73. package/dist/loadJob.js +54 -46
  74. package/dist/loadJob.js.map +1 -1
  75. package/dist/providers/LanguageProvider.d.ts +0 -29
  76. package/dist/providers/LanguageProvider.d.ts.map +1 -1
  77. package/dist/providers/LanguageProvider.js +3 -0
  78. package/dist/providers/LanguageProvider.js.map +1 -1
  79. package/dist/providers/typescript/TypeScriptProvider.d.ts +0 -24
  80. package/dist/providers/typescript/TypeScriptProvider.d.ts.map +1 -1
  81. package/dist/providers/typescript/TypeScriptProvider.js +113 -113
  82. package/dist/providers/typescript/TypeScriptProvider.js.map +1 -1
  83. package/dist/providers/typescript/runtimes/JobRuntime.d.ts +0 -26
  84. package/dist/providers/typescript/runtimes/JobRuntime.d.ts.map +1 -1
  85. package/dist/providers/typescript/runtimes/JobRuntime.js +51 -18
  86. package/dist/providers/typescript/runtimes/JobRuntime.js.map +1 -1
  87. package/dist/providers/typescript/runtimes/directJobRuntime.d.ts +0 -2
  88. package/dist/providers/typescript/runtimes/directJobRuntime.d.ts.map +1 -1
  89. package/dist/providers/typescript/runtimes/directJobRuntime.js +60 -49
  90. package/dist/providers/typescript/runtimes/directJobRuntime.js.map +1 -1
  91. package/dist/providers/typescript/runtimes/durableJobRuntime.d.ts +0 -2
  92. package/dist/providers/typescript/runtimes/durableJobRuntime.d.ts.map +1 -1
  93. package/dist/providers/typescript/runtimes/durableJobRuntime.js +168 -146
  94. package/dist/providers/typescript/runtimes/durableJobRuntime.js.map +1 -1
  95. package/dist/providers/typescript/runtimes/index.d.ts +0 -3
  96. package/dist/providers/typescript/runtimes/index.d.ts.map +1 -1
  97. package/dist/providers/typescript/runtimes/index.js +5 -2
  98. package/dist/providers/typescript/runtimes/index.js.map +1 -1
  99. package/dist/providers/typescript/runtimes/session.d.ts +0 -4
  100. package/dist/providers/typescript/runtimes/session.d.ts.map +1 -1
  101. package/dist/providers/typescript/runtimes/session.js +78 -64
  102. package/dist/providers/typescript/runtimes/session.js.map +1 -1
  103. package/dist/providers/typescript/terseWorkflow.d.ts +0 -7
  104. package/dist/providers/typescript/terseWorkflow.d.ts.map +1 -1
  105. package/dist/providers/typescript/terseWorkflow.js +12 -7
  106. package/dist/providers/typescript/terseWorkflow.js.map +1 -1
  107. package/dist/runLocalTestJob.d.ts +0 -19
  108. package/dist/runLocalTestJob.d.ts.map +1 -1
  109. package/dist/runLocalTestJob.js +55 -29
  110. package/dist/runLocalTestJob.js.map +1 -1
  111. package/dist/setup.js +1 -1
  112. package/dist/setup.js.map +1 -1
  113. package/dist/sourceArchive.d.ts +1 -1
  114. package/dist/sourceArchive.d.ts.map +1 -1
  115. package/dist/sourceArchive.js +1 -0
  116. package/dist/sourceArchive.js.map +1 -1
  117. package/package.json +3 -4
  118. package/templates/typescript/init/package.json.hbs +1 -2
package/README.md CHANGED
@@ -10,7 +10,7 @@ Write actors in Python or TypeScript, generate typed clients for your app, and d
10
10
  npx terse-cli install
11
11
  ```
12
12
 
13
- Node.js 22.19 or later with npm is required to start the CLI. One confirmation authorizes installing the global `terse` command and missing or outdated prerequisites. Setup checks for uv 0.6.13+, Python 3.11+, and Bun 1.4.2+, and verifies each installation. Python is installed through uv. New uv installations use version 0.11.31 with a verified installer checksum.
13
+ Node.js 22.19 or later with npm is required to start the CLI. One confirmation authorizes installing the global `terse` command and missing or outdated prerequisites. Setup checks for Bun 1.4.2+ and verifies the installation.
14
14
 
15
15
  For unattended setup, use `npx terse-cli install --non-interactive --yes`. `--yes` authorizes installations; `--non-interactive` alone never grants installation permission. Authentication and optional Claude Code permissions remain separate choices.
16
16
 
package/dist/cliUi.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import { type SpinnerResult } from "@clack/prompts";
2
- export declare function createSpinner(): SpinnerResult;
2
+ export declare function createSpinner(options?: {
3
+ withGuide?: boolean;
4
+ }): SpinnerResult;
3
5
  export declare function interceptConsole(onLine: (line: string) => void): () => void;
4
6
  export declare function createRunIndicator(title: string): {
5
7
  start(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"cliUi.d.ts","sourceRoot":"","sources":["../src/cliUi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,gBAAgB,CAAA;AAIjE,wBAAgB,aAAa,IAAI,aAAa,CAO7C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAS3E;AAID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM;;kBAU1B,MAAM;mBAKL,MAAM;qBAIJ,MAAM;kBAIT,MAAM;EAK3B;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAaxH;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAIlD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAI,GAAG,MAAM,CAQvE"}
1
+ {"version":3,"file":"cliUi.d.ts","sourceRoot":"","sources":["../src/cliUi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,gBAAgB,CAAA;AAIjE,wBAAgB,aAAa,CAAC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,aAAa,CAQlF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAS3E;AAID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM;;kBAU1B,MAAM;mBAKL,MAAM;qBAIJ,MAAM;kBAIT,MAAM;EAK3B;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAaxH;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAIlD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAI,GAAG,MAAM,CAQvE"}
package/dist/cliUi.js CHANGED
@@ -1,10 +1,11 @@
1
1
  import { log, spinner } from "@clack/prompts";
2
2
  import chalk from "chalk";
3
3
  import { format } from "node:util";
4
- export function createSpinner() {
4
+ export function createSpinner(options = {}) {
5
5
  if (isInteractiveOutput()) {
6
6
  return spinner({
7
- styleFrame: frame => chalk.hex("#04AB62")(frame)
7
+ styleFrame: frame => chalk.hex("#04AB62")(frame),
8
+ ...options
8
9
  });
9
10
  }
10
11
  return new StaticSpinner();
package/dist/cliUi.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cliUi.js","sourceRoot":"","sources":["../src/cliUi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cliUi.js","sourceRoot":"","sources":["../src/cliUi.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/commands/actor.ts"],"names":[],"mappings":"AAcA,wBAAsB,QAAQ,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DjG"}
1
+ {"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/commands/actor.ts"],"names":[],"mappings":"AAeA,wBAAsB,QAAQ,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFjG"}
@@ -5,6 +5,7 @@ import { DEFAULT_ACTOR_DEV_PORT, DEFAULT_ACTOR_DEV_PROJECT_ID } from "terse-type
5
5
  import { createActorDevOutput, formatActorDevLog } from "../actorDevUi.js";
6
6
  import { assertProjectRoot } from "../assertProjectRoot.js";
7
7
  import { CliError } from "../cliError.js";
8
+ import { createSpinner } from "../cliUi.js";
8
9
  import { ensureDotenvLoaded } from "../dotenv.js";
9
10
  import { loadProjectActorTools, resolveProjectActorTools } from "../projectActorTools.js";
10
11
  import { typeScriptProvider } from "../providers/typescript/TypeScriptProvider.js";
@@ -23,8 +24,26 @@ export async function actorDev(options = {}) {
23
24
  throw new CliError("invalid_port", "--port must be an integer between 1 and 65535.");
24
25
  const apiKey = (process.env.TERSE_ACTOR_SECRET ?? process.env.DURABLE_ACTORS_SECRET)?.trim() || undefined;
25
26
  const project = process.cwd();
26
- if (!python)
27
- await loadProjectActorTools(project);
27
+ const startup = createSpinner({ withGuide: false });
28
+ let starting = true;
29
+ const startupDone = () => {
30
+ if (!starting)
31
+ return;
32
+ starting = false;
33
+ startup.clear();
34
+ };
35
+ startup.start(`Compiling ${entryFile} and starting local actors`);
36
+ let pythonEnv = {};
37
+ try {
38
+ if (python)
39
+ pythonEnv = { DURABLE_ACTORS_PYTHON: await pythonExecutable(project) };
40
+ else
41
+ await loadProjectActorTools(project);
42
+ }
43
+ catch (error) {
44
+ startupDone();
45
+ throw error;
46
+ }
28
47
  const actorTools = python ? import.meta.resolve("terse-sdk/dev") : resolveProjectActorTools(project);
29
48
  const devOptions = { project, projectId, entrypoint: entryFile, port, storage: "local", watch: true, dataDir: process.env.DURABLE_ACTORS_DATA_DIR };
30
49
  const script = `import { runActorDev } from ${JSON.stringify(actorTools)};
@@ -33,7 +52,7 @@ catch (error) { console.error(error instanceof Error ? error.message : String(er
33
52
  const runtime = spawn(process.execPath, ["--input-type=module", "--eval", script], {
34
53
  env: {
35
54
  ...process.env,
36
- ...(python ? { DURABLE_ACTORS_PYTHON: await pythonExecutable(project) } : {}),
55
+ ...pythonEnv,
37
56
  DURABLE_ACTORS_PROJECT_ID: projectId,
38
57
  DURABLE_ACTORS_PROJECT: process.cwd(),
39
58
  DURABLE_ACTORS_ENTRYPOINT: entryFile,
@@ -45,9 +64,16 @@ catch (error) { console.error(error instanceof Error ? error.message : String(er
45
64
  });
46
65
  const actorUrl = `http://127.0.0.1:${port}/v1/projects/${encodeURIComponent(projectId)}/actors`;
47
66
  const output = createInterface({ input: runtime.stdout });
48
- output.on("line", createActorDevOutput({ actorUrl, projectId, apiKey, entryFile }, line => console.log(line)));
67
+ const writeOutput = createActorDevOutput({ actorUrl, projectId, apiKey, entryFile }, line => console.log(line));
68
+ output.on("line", line => {
69
+ startupDone();
70
+ writeOutput(line);
71
+ });
49
72
  const errors = createInterface({ input: runtime.stderr });
50
- errors.on("line", line => console.error(formatActorDevLog(line, chalkStderr)));
73
+ errors.on("line", line => {
74
+ startupDone();
75
+ console.error(formatActorDevLog(line, chalkStderr));
76
+ });
51
77
  let stopping = false;
52
78
  const stop = () => {
53
79
  stopping = true;
@@ -68,6 +94,7 @@ catch (error) { console.error(error instanceof Error ? error.message : String(er
68
94
  });
69
95
  }
70
96
  finally {
97
+ startupDone();
71
98
  process.off("SIGINT", stop);
72
99
  process.off("SIGTERM", stop);
73
100
  runtime.stdin.end();
@@ -1 +1 @@
1
- {"version":3,"file":"actor.js","sourceRoot":"","sources":["../../src/commands/actor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"actor.js","sourceRoot":"","sources":["../../src/commands/actor.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1 @@
1
- import { type NonInteractiveOpts } from "../cliHelpers.js";
2
- import type { LanguageProvider } from "../providers/LanguageProvider.js";
3
- export declare function attach(provider?: LanguageProvider, opts?: AttachOpts): Promise<void>;
4
- export type AttachOpts = NonInteractiveOpts & {
5
- /** Replace the credentials this project already has, without prompting. */
6
- regenerateCredentials?: boolean;
7
- };
8
1
  //# sourceMappingURL=attach.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../src/commands/attach.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,kBAAkB,EAAoB,MAAM,kBAAkB,CAAA;AAG5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAQxE,wBAAsB,MAAM,CAAC,QAAQ,GAAE,gBAAoC,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAkG7G;AAgGD,MAAM,MAAM,UAAU,GAAG,kBAAkB,GAAG;IAC1C,2EAA2E;IAC3E,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAClC,CAAA"}
1
+ {"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../src/commands/attach.ts"],"names":[],"mappings":""}
@@ -1,190 +1,221 @@
1
- import { intro, log, outro } from "@clack/prompts";
2
- import { confirm, select } from "@inquirer/prompts";
3
- import chalk from "chalk";
4
- import fs from "node:fs";
5
- import path from "node:path";
6
- import { fetchWithAuth } from "../api.js";
7
- import { CliError, ErrorCode } from "../cliError.js";
8
- import { isNonInteractive } from "../cliHelpers.js";
9
- import { createSpinner, logNextSteps, printSelfHostedCredentials } from "../cliUi.js";
10
- import { PROJECT_CONFIG_FILENAME, createRemoteProject, enableRemoteSelfHosted, fetchRemoteProjectDetail, readProjectConfig, writeProjectConfig } from "../projectConfig.js";
11
- import { resolveProvider } from "../providers/resolveProvider.js";
12
- import { getProjectAttachedUserName, loginAndPersist } from "./auth.js";
13
- import { resolveApiKeyForOrg } from "./authOrg.js";
14
- import { generate } from "./generate.js";
15
- import { listAndPromptIntegrations } from "./integrate.js";
16
- export async function attach(provider = resolveProvider(), opts) {
17
- const nonInteractive = isNonInteractive(opts);
18
- intro("terse attach");
19
- const cwd = process.cwd();
20
- const projectName = path.basename(cwd);
21
- const existingUserName = await getProjectAttachedUserName(cwd);
22
- if (existingUserName && !opts?.regenerateCredentials) {
23
- log.step(`Already set up for ${chalk.bold(existingUserName)}`);
24
- log.info("This project already has valid CLI credentials, so attach does not need to run again.");
25
- logNextSteps([
26
- `Run ${chalk.cyan("terse integrate")} to connect or review integrations`,
27
- `Run ${chalk.cyan("terse generate")} to refresh generated helpers`,
28
- `Run ${chalk.cyan("terse deploy")} when you're ready to sync jobs`
29
- ]);
30
- outro("Done");
31
- return;
32
- }
33
- log.info(`Attaching Terse to existing project ${chalk.bold(projectName)}`);
34
- log.info("Self-hosted mode keeps your jobs on your own infrastructure via TERSE_REMOTE_SERVER_URL. No source code is uploaded to Terse.");
35
- const result = await loginAndPersist(opts);
36
- let attachApiKey = result?.apiKey ?? null;
37
- let signingSecret;
38
- let projectApiKey;
39
- if (result?.apiKey) {
40
- attachApiKey = await pickOrgForAttach(result.apiKey, nonInteractive);
41
- }
42
- else {
43
- log.info("You can run `terse auth login` later to authenticate.");
44
- }
45
- const existingConfig = readProjectConfig(cwd);
46
- if (attachApiKey && !existingConfig) {
47
- const s = createSpinner();
48
- s.start("Creating Terse project");
49
- try {
50
- const created = await createRemoteProject(attachApiKey, projectName, true);
51
- signingSecret = created.signingSecret;
52
- projectApiKey = created.projectApiKey;
53
- const selfHostedConfig = { ...created.config, selfHosted: true, remoteServerUrl: "" };
54
- writeProjectConfig(cwd, selfHostedConfig);
55
- s.stop(`Created Terse project (${created.config.projectId})`);
56
- log.step(`Created ${PROJECT_CONFIG_FILENAME}`);
57
- log.info(`Self-hosted mode enabled. Set ${chalk.cyan("remoteServerUrl")} in ${PROJECT_CONFIG_FILENAME} before running ${chalk.cyan("terse deploy")}.`);
58
- }
59
- catch (error) {
60
- s.stop(`Failed to create Terse project: ${error.message}`);
61
- log.warn(`You'll need to create a ${PROJECT_CONFIG_FILENAME} manually before running ${chalk.cyan("terse deploy")}.`);
62
- }
63
- }
64
- if (attachApiKey && existingConfig) {
65
- const credentials = await provisionSelfHostedCredentials(attachApiKey, existingConfig.projectId, {
66
- requested: opts?.regenerateCredentials,
67
- nonInteractive
68
- });
69
- enableSelfHostedMode(cwd, existingConfig);
70
- signingSecret = credentials?.signingSecret;
71
- projectApiKey = credentials?.projectApiKey;
72
- }
73
- printSelfHostedCredentials({ apiKey: projectApiKey, apiKeyLabel: "project API key", signingSecret });
74
- log.info("Reviewing integrations");
75
- await listAndPromptIntegrations({
76
- showLifecycle: false,
77
- nonInteractive,
78
- ...(attachApiKey ? { apiKey: attachApiKey } : {})
79
- });
80
- if (canGenerateFromCurrentDirectory(provider, cwd)) {
81
- const s = createSpinner();
82
- s.start("Generating code");
83
- try {
84
- await generate(provider, attachApiKey ? { apiKey: attachApiKey } : undefined);
85
- s.stop("Generated code");
86
- }
87
- catch {
88
- s.stop(`Failed to generate code. Run ${chalk.cyan("terse generate")} manually.`);
89
- }
90
- }
91
- else {
92
- log.warn(`Skipped code generation because this repo is missing ${provider.detectionMarkers.requiredFiles.join(", ")}.`);
93
- log.info(`Add your job entrypoint at ${chalk.cyan(provider.entryFile)}, then run ${chalk.cyan("terse generate")} manually.`);
94
- }
95
- log.info("Next steps");
96
- logNextSteps([
97
- `Install ${chalk.cyan("terse-sdk")} in this repo if you haven't already`,
98
- `Add your Terse job definitions to ${chalk.cyan(provider.entryFile)} and import that file from your app startup path`,
99
- `Set ${chalk.cyan("remoteServerUrl")} in ${chalk.cyan(PROJECT_CONFIG_FILENAME)} before running ${chalk.cyan("terse deploy")}`,
100
- `Run ${chalk.cyan("terse integrate")} to connect integrations`
101
- ]);
102
- log.info(chalk.dim(`If your self-hosted app keeps jobs in another file, use ${chalk.cyan("--entry-file")} with terse test and terse deploy.`));
103
- outro("Done");
104
- }
105
- async function pickOrgForAttach(currentApiKey, nonInteractive) {
106
- const orgsData = await fetchWithAuth("/sdk/me/organizations", currentApiKey);
107
- if (orgsData.organizations.length <= 1 || nonInteractive)
108
- return currentApiKey;
109
- const activeId = orgsData.activeOrganizationId;
110
- const chosenId = await select({
111
- message: "Attach this project to which organization?",
112
- choices: orgsData.organizations.map(o => ({
113
- name: o.id === activeId ? `${o.name} ${chalk.dim("(active)")}` : o.name,
114
- value: o.id
115
- })),
116
- default: activeId
117
- });
118
- if (chosenId === activeId)
119
- return currentApiKey;
120
- const chosen = orgsData.organizations.find(o => o.id === chosenId);
121
- return resolveApiKeyForOrg(chosen.id, chosen.name, currentApiKey);
122
- }
123
- function enableSelfHostedMode(cwd, config) {
124
- if (config.selfHosted)
125
- return;
126
- writeProjectConfig(cwd, { ...config, selfHosted: true, remoteServerUrl: config.remoteServerUrl ?? "" });
127
- log.step(`Enabled self-hosted mode in ${PROJECT_CONFIG_FILENAME}`);
128
- log.info(`This project now runs on your own data plane. Set ${chalk.cyan("remoteServerUrl")} in ${PROJECT_CONFIG_FILENAME} before running ${chalk.cyan("terse deploy")}.`);
129
- }
130
- /**
131
- * The two credentials are only ever issued as a pair, so a project missing either one gets both
132
- * replaced. Anything the project already holds stops working the moment this runs, which is why an
133
- * already-provisioned project needs explicit consent.
134
- */
135
- async function provisionSelfHostedCredentials(apiKey, projectId, params) {
136
- const detail = await fetchProjectDetail(apiKey, projectId);
137
- const holdsCredentials = detail.hasSigningSecret || detail.hasProjectApiKey;
138
- if (holdsCredentials && !params.requested && !(await confirmReplacement(params.nonInteractive)))
139
- return null;
140
- const s = createSpinner();
141
- s.start(holdsCredentials ? "Replacing data plane credentials" : "Generating data plane credentials");
142
- try {
143
- const credentials = await enableRemoteSelfHosted(apiKey, projectId);
144
- s.stop(holdsCredentials ? "Replaced the data plane credentials" : "Generated the data plane credentials");
145
- return credentials;
146
- }
147
- catch (error) {
148
- s.stop("Could not generate the data plane credentials");
149
- throw toCredentialsError(error);
150
- }
151
- }
152
- async function fetchProjectDetail(apiKey, projectId) {
153
- const s = createSpinner();
154
- s.start("Checking data plane credentials");
155
- try {
156
- const detail = await fetchRemoteProjectDetail(apiKey, projectId);
157
- s.stop("Checked data plane credentials");
158
- return detail;
159
- }
160
- catch (error) {
161
- s.stop("Could not check data plane credentials");
162
- throw toCredentialsError(error);
163
- }
164
- }
165
- async function confirmReplacement(nonInteractive) {
166
- const preamble = "This project already has data plane credentials, and Terse cannot show them again.";
167
- if (nonInteractive) {
168
- log.info(`${preamble} Re-run with ${chalk.cyan("--regenerate-credentials")} to replace them.`);
169
- return false;
170
- }
171
- const approved = await confirm({ message: `${preamble} Replace them now?`, default: false });
172
- if (!approved) {
173
- log.info("Kept the existing credentials.");
174
- return false;
175
- }
176
- log.warn("The current credentials stop working immediately. Update your data plane before its next trigger.");
177
- return true;
178
- }
179
- /** An "already provisioned" answer is indistinguishable from a swallowed failure, so this never
180
- * degrades to a warning: attach would go on to report credentials it never confirmed. */
181
- function toCredentialsError(error) {
182
- return new CliError("credentials_unavailable", "Could not provision this project's data plane credentials.", {
183
- detail: `${error.message}\n Re-run \`terse attach\` once the control plane is reachable.`,
184
- exitCode: ErrorCode.GENERIC_ERROR
185
- });
186
- }
187
- function canGenerateFromCurrentDirectory(provider, cwd) {
188
- return provider.detectionMarkers.requiredFiles.every(relativePath => fs.existsSync(path.join(cwd, relativePath)));
189
- }
1
+ "use strict";
2
+ // LEGACY-JOBS: Commented out while Terse is actors-only. Uncomment to restore; see the note in terse-sdk/src/index.ts.
3
+ // import { intro, log, outro } from "@clack/prompts"
4
+ // import { confirm, select } from "@inquirer/prompts"
5
+ // import chalk from "chalk"
6
+ // import fs from "node:fs"
7
+ // import path from "node:path"
8
+ // import type { ProjectEnableSelfHostedResponse, SdkOrganizationsListResponse, TerseProjectConfig } from "terse-types"
9
+ //
10
+ // import { fetchWithAuth } from "../api.js"
11
+ // import { CliError, ErrorCode } from "../cliError.js"
12
+ // import { type NonInteractiveOpts, isNonInteractive } from "../cliHelpers.js"
13
+ // import { createSpinner, logNextSteps, printSelfHostedCredentials } from "../cliUi.js"
14
+ // import { PROJECT_CONFIG_FILENAME, createRemoteProject, enableRemoteSelfHosted, fetchRemoteProjectDetail, readProjectConfig, writeProjectConfig } from "../projectConfig.js"
15
+ // import type { LanguageProvider } from "../providers/LanguageProvider.js"
16
+ // import { resolveProvider } from "../providers/resolveProvider.js"
17
+ //
18
+ // import { getProjectAttachedUserName, loginAndPersist } from "./auth.js"
19
+ // import { resolveApiKeyForOrg } from "./authOrg.js"
20
+ // import { generate } from "./generate.js"
21
+ // import { listAndPromptIntegrations } from "./integrate.js"
22
+ //
23
+ // export async function attach(provider: LanguageProvider = resolveProvider(), opts?: AttachOpts): Promise<void> {
24
+ // const nonInteractive = isNonInteractive(opts)
25
+ // intro("terse attach")
26
+ //
27
+ // const cwd = process.cwd()
28
+ // const projectName = path.basename(cwd)
29
+ //
30
+ // const existingUserName = await getProjectAttachedUserName(cwd)
31
+ //
32
+ // if (existingUserName && !opts?.regenerateCredentials) {
33
+ // log.step(`Already set up for ${chalk.bold(existingUserName)}`)
34
+ // log.info("This project already has valid CLI credentials, so attach does not need to run again.")
35
+ // logNextSteps([
36
+ // `Run ${chalk.cyan("terse integrate")} to connect or review integrations`,
37
+ // `Run ${chalk.cyan("terse generate")} to refresh generated helpers`,
38
+ // `Run ${chalk.cyan("terse deploy")} when you're ready to sync jobs`
39
+ // ])
40
+ // outro("Done")
41
+ // return
42
+ // }
43
+ //
44
+ // log.info(`Attaching Terse to existing project ${chalk.bold(projectName)}`)
45
+ // log.info("Self-hosted mode keeps your jobs on your own infrastructure via TERSE_REMOTE_SERVER_URL. No source code is uploaded to Terse.")
46
+ //
47
+ // const result = await loginAndPersist(opts)
48
+ // let attachApiKey: string | null = result?.apiKey ?? null
49
+ // let signingSecret: string | undefined
50
+ // let projectApiKey: string | undefined
51
+ //
52
+ // if (result?.apiKey) {
53
+ // attachApiKey = await pickOrgForAttach(result.apiKey, nonInteractive)
54
+ // } else {
55
+ // log.info("You can run `terse auth login` later to authenticate.")
56
+ // }
57
+ //
58
+ // const existingConfig = readProjectConfig(cwd)
59
+ //
60
+ // if (attachApiKey && !existingConfig) {
61
+ // const s = createSpinner()
62
+ // s.start("Creating Terse project")
63
+ // try {
64
+ // const created = await createRemoteProject(attachApiKey, projectName, true)
65
+ // signingSecret = created.signingSecret
66
+ // projectApiKey = created.projectApiKey
67
+ // const selfHostedConfig = { ...created.config, selfHosted: true, remoteServerUrl: "" }
68
+ // writeProjectConfig(cwd, selfHostedConfig)
69
+ // s.stop(`Created Terse project (${created.config.projectId})`)
70
+ // log.step(`Created ${PROJECT_CONFIG_FILENAME}`)
71
+ // log.info(`Self-hosted mode enabled. Set ${chalk.cyan("remoteServerUrl")} in ${PROJECT_CONFIG_FILENAME} before running ${chalk.cyan("terse deploy")}.`)
72
+ // } catch (error) {
73
+ // s.stop(`Failed to create Terse project: ${(error as Error).message}`)
74
+ // log.warn(`You'll need to create a ${PROJECT_CONFIG_FILENAME} manually before running ${chalk.cyan("terse deploy")}.`)
75
+ // }
76
+ // }
77
+ //
78
+ // if (attachApiKey && existingConfig) {
79
+ // const credentials = await provisionSelfHostedCredentials(attachApiKey, existingConfig.projectId, {
80
+ // requested: opts?.regenerateCredentials,
81
+ // nonInteractive
82
+ // })
83
+ // enableSelfHostedMode(cwd, existingConfig)
84
+ // signingSecret = credentials?.signingSecret
85
+ // projectApiKey = credentials?.projectApiKey
86
+ // }
87
+ //
88
+ // printSelfHostedCredentials({ apiKey: projectApiKey, apiKeyLabel: "project API key", signingSecret })
89
+ //
90
+ // log.info("Reviewing integrations")
91
+ // await listAndPromptIntegrations({
92
+ // showLifecycle: false,
93
+ // nonInteractive,
94
+ // ...(attachApiKey ? { apiKey: attachApiKey } : {})
95
+ // })
96
+ //
97
+ // if (canGenerateFromCurrentDirectory(provider, cwd)) {
98
+ // const s = createSpinner()
99
+ // s.start("Generating code")
100
+ // try {
101
+ // await generate(provider, attachApiKey ? { apiKey: attachApiKey } : undefined)
102
+ // s.stop("Generated code")
103
+ // } catch {
104
+ // s.stop(`Failed to generate code. Run ${chalk.cyan("terse generate")} manually.`)
105
+ // }
106
+ // } else {
107
+ // log.warn(`Skipped code generation because this repo is missing ${provider.detectionMarkers.requiredFiles.join(", ")}.`)
108
+ // log.info(`Add your job entrypoint at ${chalk.cyan(provider.entryFile)}, then run ${chalk.cyan("terse generate")} manually.`)
109
+ // }
110
+ //
111
+ // log.info("Next steps")
112
+ // logNextSteps([
113
+ // `Install ${chalk.cyan("terse-sdk")} in this repo if you haven't already`,
114
+ // `Add your Terse job definitions to ${chalk.cyan(provider.entryFile)} and import that file from your app startup path`,
115
+ // `Set ${chalk.cyan("remoteServerUrl")} in ${chalk.cyan(PROJECT_CONFIG_FILENAME)} before running ${chalk.cyan("terse deploy")}`,
116
+ // `Run ${chalk.cyan("terse integrate")} to connect integrations`
117
+ // ])
118
+ // log.info(chalk.dim(`If your self-hosted app keeps jobs in another file, use ${chalk.cyan("--entry-file")} with terse test and terse deploy.`))
119
+ //
120
+ // outro("Done")
121
+ // }
122
+ //
123
+ // async function pickOrgForAttach(currentApiKey: string, nonInteractive: boolean): Promise<string> {
124
+ // const orgsData = await fetchWithAuth<SdkOrganizationsListResponse>("/sdk/me/organizations", currentApiKey)
125
+ // if (orgsData.organizations.length <= 1 || nonInteractive) return currentApiKey
126
+ //
127
+ // const activeId = orgsData.activeOrganizationId
128
+ // const chosenId = await select({
129
+ // message: "Attach this project to which organization?",
130
+ // choices: orgsData.organizations.map(o => ({
131
+ // name: o.id === activeId ? `${o.name} ${chalk.dim("(active)")}` : o.name,
132
+ // value: o.id
133
+ // })),
134
+ // default: activeId
135
+ // })
136
+ //
137
+ // if (chosenId === activeId) return currentApiKey
138
+ //
139
+ // const chosen = orgsData.organizations.find(o => o.id === chosenId)!
140
+ // return resolveApiKeyForOrg(chosen.id, chosen.name, currentApiKey)
141
+ // }
142
+ //
143
+ // function enableSelfHostedMode(cwd: string, config: TerseProjectConfig): void {
144
+ // if (config.selfHosted) return
145
+ //
146
+ // writeProjectConfig(cwd, { ...config, selfHosted: true, remoteServerUrl: config.remoteServerUrl ?? "" })
147
+ // log.step(`Enabled self-hosted mode in ${PROJECT_CONFIG_FILENAME}`)
148
+ // log.info(`This project now runs on your own data plane. Set ${chalk.cyan("remoteServerUrl")} in ${PROJECT_CONFIG_FILENAME} before running ${chalk.cyan("terse deploy")}.`)
149
+ // }
150
+ //
151
+ // /**
152
+ // * The two credentials are only ever issued as a pair, so a project missing either one gets both
153
+ // * replaced. Anything the project already holds stops working the moment this runs, which is why an
154
+ // * already-provisioned project needs explicit consent.
155
+ // */
156
+ // async function provisionSelfHostedCredentials(apiKey: string, projectId: string, params: { requested?: boolean; nonInteractive: boolean }): Promise<ProjectEnableSelfHostedResponse | null> {
157
+ // const detail = await fetchProjectDetail(apiKey, projectId)
158
+ // const holdsCredentials = detail.hasSigningSecret || detail.hasProjectApiKey
159
+ //
160
+ // if (holdsCredentials && !params.requested && !(await confirmReplacement(params.nonInteractive))) return null
161
+ //
162
+ // const s = createSpinner()
163
+ // s.start(holdsCredentials ? "Replacing data plane credentials" : "Generating data plane credentials")
164
+ // try {
165
+ // const credentials = await enableRemoteSelfHosted(apiKey, projectId)
166
+ // s.stop(holdsCredentials ? "Replaced the data plane credentials" : "Generated the data plane credentials")
167
+ // return credentials
168
+ // } catch (error) {
169
+ // s.stop("Could not generate the data plane credentials")
170
+ // throw toCredentialsError(error)
171
+ // }
172
+ // }
173
+ //
174
+ // async function fetchProjectDetail(apiKey: string, projectId: string) {
175
+ // const s = createSpinner()
176
+ // s.start("Checking data plane credentials")
177
+ // try {
178
+ // const detail = await fetchRemoteProjectDetail(apiKey, projectId)
179
+ // s.stop("Checked data plane credentials")
180
+ // return detail
181
+ // } catch (error) {
182
+ // s.stop("Could not check data plane credentials")
183
+ // throw toCredentialsError(error)
184
+ // }
185
+ // }
186
+ //
187
+ // async function confirmReplacement(nonInteractive: boolean): Promise<boolean> {
188
+ // const preamble = "This project already has data plane credentials, and Terse cannot show them again."
189
+ // if (nonInteractive) {
190
+ // log.info(`${preamble} Re-run with ${chalk.cyan("--regenerate-credentials")} to replace them.`)
191
+ // return false
192
+ // }
193
+ //
194
+ // const approved = await confirm({ message: `${preamble} Replace them now?`, default: false })
195
+ // if (!approved) {
196
+ // log.info("Kept the existing credentials.")
197
+ // return false
198
+ // }
199
+ //
200
+ // log.warn("The current credentials stop working immediately. Update your data plane before its next trigger.")
201
+ // return true
202
+ // }
203
+ //
204
+ // /** An "already provisioned" answer is indistinguishable from a swallowed failure, so this never
205
+ // * degrades to a warning: attach would go on to report credentials it never confirmed. */
206
+ // function toCredentialsError(error: unknown): CliError {
207
+ // return new CliError("credentials_unavailable", "Could not provision this project's data plane credentials.", {
208
+ // detail: `${(error as Error).message}\n Re-run \`terse attach\` once the control plane is reachable.`,
209
+ // exitCode: ErrorCode.GENERIC_ERROR
210
+ // })
211
+ // }
212
+ //
213
+ // function canGenerateFromCurrentDirectory(provider: LanguageProvider, cwd: string): boolean {
214
+ // return provider.detectionMarkers.requiredFiles.every(relativePath => fs.existsSync(path.join(cwd, relativePath)))
215
+ // }
216
+ //
217
+ // export type AttachOpts = NonInteractiveOpts & {
218
+ // /** Replace the credentials this project already has, without prompting. */
219
+ // regenerateCredentials?: boolean
220
+ // }
190
221
  //# sourceMappingURL=attach.js.map