assistant-ui 0.0.126 → 0.0.127

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 (81) hide show
  1. package/README.md +18 -2
  2. package/dist/codemods/utils/createTransformer.js +1 -2
  3. package/dist/codemods/utils/resolveBinding.js +1 -2
  4. package/dist/codemods/v0-11/content-part-to-message-part.js +1 -2
  5. package/dist/codemods/v0-12/assistant-api-to-aui.js +1 -2
  6. package/dist/codemods/v0-12/event-names-to-camelcase.js +1 -2
  7. package/dist/codemods/v0-12/primitive-if-to-aui-if.js +1 -2
  8. package/dist/codemods/v0-15/aui-accessor-calls-to-properties.js +1 -2
  9. package/dist/codemods/v0-8/ui-package-split.js +1 -2
  10. package/dist/codemods/v0-9/edge-package-split.js +1 -2
  11. package/dist/commands/add.js +1 -2
  12. package/dist/commands/agent.js +1 -2
  13. package/dist/commands/cloud.d.ts.map +1 -1
  14. package/dist/commands/cloud.js +70 -31
  15. package/dist/commands/cloud.js.map +1 -1
  16. package/dist/commands/create.js +1 -2
  17. package/dist/commands/doctor.js +1 -2
  18. package/dist/commands/info.js +1 -2
  19. package/dist/commands/init.js +1 -2
  20. package/dist/commands/mcp.js +1 -2
  21. package/dist/commands/update.js +1 -2
  22. package/dist/commands/upgrade.js +1 -2
  23. package/dist/index.js +1 -2
  24. package/dist/lib/agent-skill.d.ts +2 -2
  25. package/dist/lib/agent-skill.js +2 -3
  26. package/dist/lib/agent-skill.js.map +1 -1
  27. package/dist/lib/cloud-abort.js +1 -2
  28. package/dist/lib/cloud-auth.d.ts +1 -0
  29. package/dist/lib/cloud-auth.d.ts.map +1 -1
  30. package/dist/lib/cloud-auth.js +2 -3
  31. package/dist/lib/cloud-auth.js.map +1 -1
  32. package/dist/lib/cloud-config.d.ts +11 -1
  33. package/dist/lib/cloud-config.d.ts.map +1 -1
  34. package/dist/lib/cloud-config.js +52 -16
  35. package/dist/lib/cloud-config.js.map +1 -1
  36. package/dist/lib/cloud-provision.d.ts.map +1 -1
  37. package/dist/lib/cloud-provision.js +7 -3
  38. package/dist/lib/cloud-provision.js.map +1 -1
  39. package/dist/lib/cloud-remote.d.ts +16 -1
  40. package/dist/lib/cloud-remote.d.ts.map +1 -1
  41. package/dist/lib/cloud-remote.js +53 -9
  42. package/dist/lib/cloud-remote.js.map +1 -1
  43. package/dist/lib/cloud-setup-login.js +1 -2
  44. package/dist/lib/cloud-url.js +1 -2
  45. package/dist/lib/create-project.js +1 -2
  46. package/dist/lib/handle-cli-error.js +1 -2
  47. package/dist/lib/install-ai-sdk-lib.js +1 -2
  48. package/dist/lib/install-edge-lib.js +1 -2
  49. package/dist/lib/run-spawn.js +1 -2
  50. package/dist/lib/safe-project-file.d.ts +2 -0
  51. package/dist/lib/safe-project-file.d.ts.map +1 -0
  52. package/dist/lib/safe-project-file.js +25 -0
  53. package/dist/lib/safe-project-file.js.map +1 -0
  54. package/dist/lib/transform.js +1 -2
  55. package/dist/lib/upgrade.js +1 -2
  56. package/dist/lib/utils/config.js +1 -2
  57. package/dist/lib/utils/download.js +1 -2
  58. package/dist/lib/utils/file-scanner.js +1 -2
  59. package/dist/lib/utils/logger.js +1 -2
  60. package/dist/lib/utils/package-installer.js +1 -2
  61. package/dist/lib/utils/package-json.js +1 -2
  62. package/dist/lib/utils/package-manager.js +1 -2
  63. package/dist/lib/utils/registry.js +1 -2
  64. package/dist/lib/utils/workspace.js +1 -2
  65. package/dist/program.js +1 -2
  66. package/dist/run.js +1 -2
  67. package/package.json +3 -3
  68. package/src/commands/cloud.test.ts +156 -0
  69. package/src/commands/cloud.ts +93 -41
  70. package/src/commands/mcp.test.ts +123 -0
  71. package/src/lib/agent-skill.ts +1 -1
  72. package/src/lib/cloud-auth.ts +1 -1
  73. package/src/lib/cloud-config.test.ts +139 -1
  74. package/src/lib/cloud-config.ts +59 -8
  75. package/src/lib/cloud-provision.test.ts +26 -1
  76. package/src/lib/cloud-provision.ts +3 -0
  77. package/src/lib/cloud-remote.test.ts +99 -3
  78. package/src/lib/cloud-remote.ts +93 -7
  79. package/src/lib/safe-project-file.ts +31 -0
  80. package/templates/cloud-harness/components/assistant-ui/elements/thread.aui.tsx +1 -1
  81. package/templates/cloud-harness/package.json +7 -7
package/README.md CHANGED
@@ -107,8 +107,24 @@ Every other `cloud` subcommand runs on Assistant Cloud: the CLI sends it to the
107
107
  cloud management server (`ASSISTANT_UI_CLOUD_URL`, default
108
108
  `https://cloud.assistant-ui.com`) with the saved login and prints the answer,
109
109
  so new commands arrive without a CLI update. Run
110
- `npx assistant-ui@latest cloud help` for the current list, such as
111
- `cloud whoami` and `cloud projects list`.
110
+ `npx assistant-ui@latest cloud help` for the current list and
111
+ `cloud help <command>` for one command's options; `cloud help login`,
112
+ `cloud help logout` and `cloud help setup` are answered locally with their
113
+ flags. The commands cover organizations and projects (`orgs`, `projects list`,
114
+ `show`, `set`, `create`), API keys, hosted harnesses (`harnesses list`, `show`,
115
+ `live`, `create`, `update`) and Pinboard Workers (`workers`, `deployments`,
116
+ `routes`). Every command takes `--json`, and exits 0 on success, 1 on an error
117
+ and 2 on a usage error.
118
+
119
+ Inside a directory set up with `cloud setup`, commands that take `--org` or
120
+ `--project` default to the organization and project in the nearest
121
+ `.assistant-ui/cloud.json`; pass the flags to act on another one.
122
+
123
+ Agents never run destructive commands. Deleting a project or harness,
124
+ shortening data retention and moving a Pinboard Worker's live traffic change
125
+ nothing from the CLI: those commands print the dashboard link (or the API call)
126
+ for a person to act on. In a terminal the CLI also opens the link; pass
127
+ `--no-open` to only print it.
112
128
 
113
129
  When an agent is installing from an active setup wizard, pass its setup-agent
114
130
  URL with `--setup-url <url>` to `cloud login` or `cloud setup`. The wizard shows
@@ -1,4 +1,4 @@
1
- //#region src/codemods/utils/createTransformer.ts
1
+ // src/codemods/utils/createTransformer.ts
2
2
  function createTransformer(transformFn) {
3
3
  return function transformer(fileInfo, api, options) {
4
4
  const j = api.jscodeshift;
@@ -14,7 +14,6 @@ function createTransformer(transformFn) {
14
14
  return isChanged ? root.toSource() : null;
15
15
  };
16
16
  }
17
- //#endregion
18
17
  export { createTransformer };
19
18
 
20
19
  //# sourceMappingURL=createTransformer.js.map
@@ -1,4 +1,4 @@
1
- //#region src/codemods/utils/resolveBinding.ts
1
+ // src/codemods/utils/resolveBinding.ts
2
2
  const patternBinding = (node, name) => {
3
3
  switch (node?.type) {
4
4
  case "Identifier": return node.name === name ? node : void 0;
@@ -72,7 +72,6 @@ const resolveBinding = (j, path, name) => {
72
72
  if (binding) return binding;
73
73
  }
74
74
  };
75
- //#endregion
76
75
  export { resolveBinding };
77
76
 
78
77
  //# sourceMappingURL=resolveBinding.js.map
@@ -1,6 +1,6 @@
1
1
  import { createTransformer } from "../utils/createTransformer.js";
2
2
  import { resolveBinding } from "../utils/resolveBinding.js";
3
- //#region src/codemods/v0-11/content-part-to-message-part.ts
3
+ // src/codemods/v0-11/content-part-to-message-part.ts
4
4
  const typeRenamingMap = {
5
5
  TextContentPart: "TextMessagePart",
6
6
  ReasoningContentPart: "ReasoningMessagePart",
@@ -184,7 +184,6 @@ const migrateContentPartToMessagePart = createTransformer(({ j, root, markAsChan
184
184
  root.find(j.MemberExpression).forEach(renameContent);
185
185
  root.find(j.JSXMemberExpression).forEach(renameContent);
186
186
  });
187
- //#endregion
188
187
  export { migrateContentPartToMessagePart as default };
189
188
 
190
189
  //# sourceMappingURL=content-part-to-message-part.js.map
@@ -1,6 +1,6 @@
1
1
  import { createTransformer } from "../utils/createTransformer.js";
2
2
  import { resolveBinding } from "../utils/resolveBinding.js";
3
- //#region src/codemods/v0-12/assistant-api-to-aui.ts
3
+ // src/codemods/v0-12/assistant-api-to-aui.ts
4
4
  const hookRenamingMap = {
5
5
  useAssistantApi: "useAui",
6
6
  useAssistantState: "useAuiState",
@@ -112,7 +112,6 @@ const migrateAssistantApiToAui = createTransformer(({ j, root, markAsChanged })
112
112
  }
113
113
  }
114
114
  });
115
- //#endregion
116
115
  export { migrateAssistantApiToAui as default };
117
116
 
118
117
  //# sourceMappingURL=assistant-api-to-aui.js.map
@@ -1,5 +1,5 @@
1
1
  import { createTransformer } from "../utils/createTransformer.js";
2
- //#region src/codemods/v0-12/event-names-to-camelcase.ts
2
+ // src/codemods/v0-12/event-names-to-camelcase.ts
3
3
  const eventNameMap = {
4
4
  "thread.run-start": "thread.runStart",
5
5
  "thread.run-end": "thread.runEnd",
@@ -33,7 +33,6 @@ const migrateEventNamesToCamelCase = createTransformer(({ j, root, markAsChanged
33
33
  });
34
34
  });
35
35
  });
36
- //#endregion
37
36
  export { migrateEventNamesToCamelCase as default };
38
37
 
39
38
  //# sourceMappingURL=event-names-to-camelcase.js.map
@@ -1,6 +1,6 @@
1
1
  import { createTransformer } from "../utils/createTransformer.js";
2
2
  import { resolveBinding } from "../utils/resolveBinding.js";
3
- //#region src/codemods/v0-12/primitive-if-to-aui-if.ts
3
+ // src/codemods/v0-12/primitive-if-to-aui-if.ts
4
4
  const primitiveMap = {
5
5
  ThreadPrimitive: {
6
6
  empty: (v) => ({
@@ -221,7 +221,6 @@ const migratePrimitiveIfToAuiIf = createTransformer(({ j, root, markAsChanged })
221
221
  convertElementToAuiIf(path, buildConditionString(j, fragments), primitive.declaration);
222
222
  });
223
223
  });
224
- //#endregion
225
224
  export { migratePrimitiveIfToAuiIf as default };
226
225
 
227
226
  //# sourceMappingURL=primitive-if-to-aui-if.js.map
@@ -1,6 +1,6 @@
1
1
  import { createTransformer } from "../utils/createTransformer.js";
2
2
  import { resolveBinding } from "../utils/resolveBinding.js";
3
- //#region src/codemods/v0-15/aui-accessor-calls-to-properties.ts
3
+ // src/codemods/v0-15/aui-accessor-calls-to-properties.ts
4
4
  const NULLARY_SCOPES = /* @__PURE__ */ new Set([
5
5
  "threads",
6
6
  "threadListItem",
@@ -80,7 +80,6 @@ const auiAccessorCallsToProperties = createTransformer(({ j, root, markAsChanged
80
80
  markAsChanged();
81
81
  });
82
82
  });
83
- //#endregion
84
83
  export { auiAccessorCallsToProperties as default };
85
84
 
86
85
  //# sourceMappingURL=aui-accessor-calls-to-properties.js.map
@@ -1,5 +1,5 @@
1
1
  import { createTransformer } from "../utils/createTransformer.js";
2
- //#region src/codemods/v0-8/ui-package-split.ts
2
+ // src/codemods/v0-8/ui-package-split.ts
3
3
  const reactUIExports = [
4
4
  "ThreadConfigProvider",
5
5
  "useThreadConfig",
@@ -97,7 +97,6 @@ const migrateAssistantUI = createTransformer(({ j, root, markAsChanged }) => {
97
97
  }
98
98
  });
99
99
  });
100
- //#endregion
101
100
  export { migrateAssistantUI as default };
102
101
 
103
102
  //# sourceMappingURL=ui-package-split.js.map
@@ -1,5 +1,5 @@
1
1
  import { createTransformer } from "../utils/createTransformer.js";
2
- //#region src/codemods/v0-9/edge-package-split.ts
2
+ // src/codemods/v0-9/edge-package-split.ts
3
3
  const reactAiSdkExports = [
4
4
  "useChatRuntime",
5
5
  "CoreMessage",
@@ -42,7 +42,6 @@ const migrateToEdgePackage = createTransformer(({ j, root, markAsChanged }) => {
42
42
  markAsChanged();
43
43
  });
44
44
  });
45
- //#endregion
46
45
  export { migrateToEdgePackage as default };
47
46
 
48
47
  //# sourceMappingURL=edge-package-split.js.map
@@ -4,7 +4,7 @@ import { detectRegistryPlatform, getComponentsJsonStyle, resolveRegistryItemUrl
4
4
  import { SpawnExitError, SpawnSignalError, runSpawn } from "../lib/run-spawn.js";
5
5
  import { dlxCommand, resolvePackageManager, resolvePackageManagerForCwd } from "../lib/utils/package-manager.js";
6
6
  import { Command } from "commander";
7
- //#region src/commands/add.ts
7
+ // src/commands/add.ts
8
8
  function createAddComponentsPlan(params) {
9
9
  const componentsToAdd = params.components.map((c) => {
10
10
  if (!/^[a-zA-Z0-9-/]+$/.test(c)) throw new Error(`Invalid component name: ${c}`);
@@ -58,7 +58,6 @@ const add = new Command().name("add").description("add a component to your proje
58
58
  }
59
59
  logger.success("Components added successfully!");
60
60
  });
61
- //#endregion
62
61
  export { add, createAddComponentsPlan };
63
62
 
64
63
  //# sourceMappingURL=add.js.map
@@ -2,7 +2,7 @@ import { logger } from "../lib/utils/logger.js";
2
2
  import { ensureSkillsPlugin, skillsPluginDir } from "../lib/agent-skill.js";
3
3
  import { Command } from "commander";
4
4
  import { launch } from "@assistant-ui/agent-launcher";
5
- //#region src/commands/agent.ts
5
+ // src/commands/agent.ts
6
6
  async function resolvePluginDir(dry) {
7
7
  if (dry) return skillsPluginDir();
8
8
  try {
@@ -22,7 +22,6 @@ const agent = new Command().name("agent").description("launch Claude Code with a
22
22
  dry
23
23
  });
24
24
  });
25
- //#endregion
26
25
  export { agent };
27
26
 
28
27
  //# sourceMappingURL=agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/commands/cloud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAyC5C,KAAK,YAAY,GAAG;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAkLF,eAAO,MAAM,UAAU,GACrB,WAAW,MAAM,EACjB,SAAS,YAAY,KACpB,OAAO,CAAC,IAAI,CAmId,CAAC;AAIF,eAAO,MAAM,KAAK,SA+Ff,CAAC"}
1
+ {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/commands/cloud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAqC5C,KAAK,YAAY,GAAG;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAuNF,eAAO,MAAM,UAAU,GACrB,WAAW,MAAM,EACjB,SAAS,YAAY,KACpB,OAAO,CAAC,IAAI,CAmId,CAAC;AAIF,eAAO,MAAM,KAAK,SAkHf,CAAC"}
@@ -1,17 +1,17 @@
1
1
  import { logger } from "../lib/utils/logger.js";
2
2
  import { validateCloudUrl } from "../lib/cloud-url.js";
3
- import { cloudAccessToken, cloudAuthConfig, loginToCloud, logoutFromCloud, savedCloudAccessToken } from "../lib/cloud-auth.js";
4
- import { runCloudCommand } from "../lib/cloud-remote.js";
5
- import { mergeCloudEnvironment, readCloudProjectConfig, readOptionalFile, writeCloudProjectConfig } from "../lib/cloud-config.js";
3
+ import { cloudAccessToken, cloudAuthConfig, loginToCloud, logoutFromCloud, openBrowser, savedCloudAccessToken } from "../lib/cloud-auth.js";
4
+ import { runCloudCommand, sendCloudCommand } from "../lib/cloud-remote.js";
5
+ import { findCloudProjectDefaults, mergeCloudEnvironment, readCloudProjectConfig, readOptionalFile, writeCloudProjectConfig } from "../lib/cloud-config.js";
6
6
  import { provisionCloudHarness, resolveProvisionRequest } from "../lib/cloud-provision.js";
7
7
  import { create } from "./create.js";
8
8
  import { Command, Option } from "commander";
9
9
  import path from "node:path";
10
10
  import * as p from "@clack/prompts";
11
- import { createProject, fetchOrganizations, fetchProjects } from "aui-auth/accounts";
11
+ import { fetchOrganizations, fetchProjects } from "aui-auth/accounts";
12
12
  import { access, readFile } from "node:fs/promises";
13
13
  import { fileURLToPath } from "node:url";
14
- //#region src/commands/cloud.ts
14
+ // src/commands/cloud.ts
15
15
  var SetupCancelled = class extends Error {};
16
16
  const answer = (value) => {
17
17
  if (p.isCancel(value)) throw new SetupCancelled();
@@ -35,6 +35,37 @@ const selectResource = async (resources, selected, kind, yes) => {
35
35
  }));
36
36
  return resources.find((resource) => resource.id === id);
37
37
  };
38
+ /**
39
+ * Runs a Cloud command for setup and returns its `--json` output, so setup
40
+ * creates organizations and projects with the same checks and audit rows as
41
+ * `assistant-ui cloud orgs create` and `projects create`.
42
+ */
43
+ const cloudJson = async (apiUrl, token, args) => {
44
+ const response = await sendCloudCommand(apiUrl, [...args, "--json"], token);
45
+ if (response.exitCode !== 0) return {
46
+ ok: false,
47
+ message: (response.stderr ?? "").trim() || `${args.join(" ")} failed.`
48
+ };
49
+ let value;
50
+ try {
51
+ value = JSON.parse(response.stdout ?? "");
52
+ } catch {
53
+ value = null;
54
+ }
55
+ const resource = value;
56
+ if (!resource || ![
57
+ "id",
58
+ "slug",
59
+ "name"
60
+ ].every((key) => typeof resource[key] === "string" && resource[key].trim() !== "")) return {
61
+ ok: false,
62
+ message: `Unexpected response from \`${args.join(" ")} --json\`. Update assistant-ui and try again.`
63
+ };
64
+ return {
65
+ ok: true,
66
+ value
67
+ };
68
+ };
38
69
  const projectSlug = (value) => value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
39
70
  const organizationForSetup = async (issuer, token, options) => {
40
71
  const organizations = await fetchOrganizations({ issuer }, token);
@@ -49,21 +80,15 @@ const organizationForSetup = async (issuer, token, options) => {
49
80
  if (!slug) throw new Error("No organizations found. Pass --new-org <slug> to create one.");
50
81
  const existing = organizations.find((organization) => organization.slug === slug);
51
82
  if (existing) return existing;
52
- const response = await fetch(`${issuer}/api/oidc/organizations`, {
53
- method: "POST",
54
- headers: {
55
- Authorization: `Bearer ${token}`,
56
- "Content-Type": "application/json"
57
- },
58
- body: JSON.stringify({
59
- name: options.name ?? slug,
60
- slug
61
- }),
62
- signal: AbortSignal.timeout(3e4),
63
- redirect: "error"
64
- });
65
- if (!response.ok) throw new Error(`Could not create organization (${response.status}).`);
66
- return await response.json();
83
+ const created = await cloudJson(options.apiUrl, token, [
84
+ "orgs",
85
+ "create",
86
+ slug,
87
+ "--name",
88
+ options.name ?? slug
89
+ ]);
90
+ if (!created.ok) throw new Error(`Could not create organization: ${created.message}`);
91
+ return created.value;
67
92
  };
68
93
  const projectForSetup = async (issuer, token, organization, directory, options) => {
69
94
  const projects = await fetchProjects({ issuer }, token, { id: organization.id });
@@ -73,16 +98,22 @@ const projectForSetup = async (issuer, token, organization, directory, options)
73
98
  }
74
99
  const slug = options.newProject ?? projectSlug(path.basename(directory));
75
100
  if (!slug) throw new Error("Choose a project slug with --new-project <slug>.");
76
- const created = await createProject({ issuer }, token, { id: organization.id }, {
77
- name: options.name ?? path.basename(directory),
78
- slug
79
- });
80
- if ("reason" in created) {
81
- const existing = projects.find((project) => project.slug === slug);
82
- if (existing) return existing;
83
- throw new Error(`Project slug "${slug}" already exists. Select it with --project or choose another slug.`);
101
+ const existing = projects.find((project) => project.slug === slug);
102
+ if (existing) return existing;
103
+ const created = await cloudJson(options.apiUrl, token, [
104
+ "projects",
105
+ "create",
106
+ slug,
107
+ "--name",
108
+ options.name ?? path.basename(directory),
109
+ "--org",
110
+ organization.id
111
+ ]);
112
+ if (!created.ok) {
113
+ if (/already exists/.test(created.message)) throw new Error(`Project slug "${slug}" already exists. Select it with --project or choose another slug.`);
114
+ throw new Error(`Could not create project: ${created.message}`);
84
115
  }
85
- return created;
116
+ return created.value;
86
117
  };
87
118
  const scaffoldCloudProject = async (directory, options) => {
88
119
  try {
@@ -173,10 +204,19 @@ const setupCloud = async (directory, options) => {
173
204
  logger.info(backend.protocol === "http:" ? `Open ${backend.origin}/#main in two browser windows to try shared chat. Deploy or expose the app to share it with teammates.` : "Open your deployed app and use \"Share this chat\" to invite teammates to the same conversation.");
174
205
  };
175
206
  const DEFAULT_CLOUD_URL = "https://cloud.assistant-ui.com";
176
- const cloud = new Command().name("cloud").description("manage Assistant Cloud (run `assistant-ui cloud help`)").helpOption(false).helpCommand(false).argument("[command...]").allowUnknownOption().allowExcessArguments().action(async (args) => {
207
+ const cloud = new Command().name("cloud").description("manage Assistant Cloud (run `assistant-ui cloud help`)").helpOption(false).helpCommand(false).enablePositionalOptions().option("--no-open", "print dashboard links without opening a browser").argument("[command...]").allowUnknownOption().allowExcessArguments().action(async (args, options) => {
208
+ const local = args[0] === "help" && args.length === 2 ? cloud.commands.find((command) => command.name() === args[1]) : void 0;
209
+ if (local) {
210
+ process.stdout.write(local.helpInformation());
211
+ return;
212
+ }
177
213
  process.exitCode = await runCloudCommand(args, {
178
214
  cloudUrl: process.env.ASSISTANT_UI_CLOUD_URL ?? DEFAULT_CLOUD_URL,
179
215
  accessToken: () => savedCloudAccessToken(cloudAuthConfig()),
216
+ defaults: () => findCloudProjectDefaults(process.cwd()),
217
+ interactive: !!process.stdin.isTTY && !!process.stderr.isTTY && !process.env.CI,
218
+ noOpen: options.open === false,
219
+ openUrl: openBrowser,
180
220
  stdout: (text) => process.stdout.write(text),
181
221
  stderr: (text) => process.stderr.write(text)
182
222
  });
@@ -197,7 +237,6 @@ const cloud = new Command().name("cloud").description("manage Assistant Cloud (r
197
237
  p.cancel("Cloud setup cancelled. Rerun the same command to resume.");
198
238
  }
199
239
  }));
200
- //#endregion
201
240
  export { cloud, setupCloud };
202
241
 
203
242
  //# sourceMappingURL=cloud.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud.js","names":[],"sources":["../../src/commands/cloud.ts"],"sourcesContent":["import { Command, Option } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport {\n createProject,\n fetchOrganizations,\n fetchProjects,\n type AccountsOrganization,\n type AccountsProject,\n} from \"aui-auth/accounts\";\nimport { access, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n cloudAccessToken,\n cloudAuthConfig,\n loginToCloud,\n logoutFromCloud,\n savedCloudAccessToken,\n validateCloudUrl,\n} from \"../lib/cloud-auth\";\nimport { runCloudCommand } from \"../lib/cloud-remote\";\nimport {\n readCloudProjectConfig,\n mergeCloudEnvironment,\n readOptionalFile,\n writeCloudProjectConfig,\n} from \"../lib/cloud-config\";\nimport {\n provisionCloudHarness,\n resolveProvisionRequest,\n} from \"../lib/cloud-provision\";\nimport { logger } from \"../lib/utils/logger\";\nimport { create } from \"./create\";\n\nclass SetupCancelled extends Error {}\n\nconst answer = <T>(value: T | symbol): Exclude<T, symbol> => {\n if (p.isCancel(value)) throw new SetupCancelled();\n return value as Exclude<T, symbol>;\n};\n\ntype SetupOptions = {\n org?: string;\n newOrg?: string;\n project?: string;\n newProject?: string;\n name?: string;\n harnessName?: string;\n backendUrl: string;\n apiUrl: string;\n accessCode?: string;\n setupUrl?: string;\n open?: boolean;\n yes?: boolean;\n skipInstall?: boolean;\n useNpm?: boolean;\n usePnpm?: boolean;\n useYarn?: boolean;\n useBun?: boolean;\n debugSourceRoot?: string;\n};\n\nconst selectResource = async <\n T extends { id: string; slug: string; name: string },\n>(\n resources: T[],\n selected: string | undefined,\n kind: string,\n yes: boolean,\n): Promise<T | null> => {\n if (selected) {\n const resource = resources.find(\n ({ id, slug }) => selected === id || selected === slug,\n );\n if (!resource)\n throw new Error(`${kind} \"${selected}\" was not found in your account.`);\n return resource;\n }\n if (resources.length === 0) return null;\n if (resources.length === 1) return resources[0]!;\n if (yes)\n throw new Error(\n `Choose a ${kind.toLowerCase()} with --${kind.toLowerCase()} when using --yes.`,\n );\n const id = answer(\n await p.select({\n message: `Choose a ${kind.toLowerCase()}`,\n options: resources.map((resource) => ({\n value: resource.id,\n label: `${resource.name} (${resource.slug})`,\n })),\n }),\n );\n return resources.find((resource) => resource.id === id)!;\n};\n\nconst projectSlug = (value: string): string =>\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\nconst organizationForSetup = async (\n issuer: string,\n token: string,\n options: SetupOptions,\n): Promise<AccountsOrganization> => {\n const organizations = await fetchOrganizations({ issuer }, token);\n if (!options.newOrg) {\n const existing = await selectResource(\n organizations,\n options.org,\n \"Org\",\n !!options.yes,\n );\n if (existing) return existing;\n }\n const slug =\n options.newOrg ??\n (options.yes\n ? undefined\n : answer(\n await p.text({\n message: \"Choose a slug for your new organization\",\n validate: (value) =>\n /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value ?? \"\")\n ? undefined\n : \"Use lowercase letters, numbers, and hyphens.\",\n }),\n ));\n if (!slug)\n throw new Error(\n \"No organizations found. Pass --new-org <slug> to create one.\",\n );\n const existing = organizations.find(\n (organization) => organization.slug === slug,\n );\n if (existing) return existing;\n const response = await fetch(`${issuer}/api/oidc/organizations`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ name: options.name ?? slug, slug }),\n signal: AbortSignal.timeout(30_000),\n redirect: \"error\",\n });\n if (!response.ok)\n throw new Error(`Could not create organization (${response.status}).`);\n return (await response.json()) as AccountsOrganization;\n};\n\nconst projectForSetup = async (\n issuer: string,\n token: string,\n organization: AccountsOrganization,\n directory: string,\n options: SetupOptions,\n): Promise<AccountsProject> => {\n const projects = await fetchProjects({ issuer }, token, {\n id: organization.id,\n });\n if (!options.newProject) {\n const existing = await selectResource(\n projects,\n options.project,\n \"Project\",\n !!options.yes,\n );\n if (existing) return existing;\n }\n const slug = options.newProject ?? projectSlug(path.basename(directory));\n if (!slug)\n throw new Error(\"Choose a project slug with --new-project <slug>.\");\n const created = await createProject(\n { issuer },\n token,\n { id: organization.id },\n {\n name: options.name ?? path.basename(directory),\n slug,\n },\n );\n if (\"reason\" in created) {\n const existing = projects.find((project) => project.slug === slug);\n if (existing) return existing;\n throw new Error(\n `Project slug \"${slug}\" already exists. Select it with --project or choose another slug.`,\n );\n }\n return created;\n};\n\nconst scaffoldCloudProject = async (\n directory: string,\n options: SetupOptions,\n): Promise<void> => {\n try {\n await access(path.join(directory, \"package.json\"));\n const marker = JSON.parse(\n await readFile(\n path.join(directory, \".assistant-ui\", \"template.json\"),\n \"utf8\",\n ),\n ) as { template?: string };\n if (marker.template !== \"cloud-harness\")\n throw new Error(\n \"This directory is not a cloud-harness app. Use a new directory.\",\n );\n return;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n if (await readOptionalFile(path.join(directory, \"package.json\"))) {\n throw new Error(\n \"This directory already contains an app. Use a new directory for the multiplayer scaffold.\",\n );\n }\n }\n const packageRoot = path.resolve(\n path.dirname(fileURLToPath(import.meta.url)),\n \"../..\",\n );\n const args = [\n directory,\n \"--template\",\n \"cloud-harness\",\n \"--no-skills\",\n \"--debug-source-root\",\n options.debugSourceRoot ?? packageRoot,\n ];\n if (options.skipInstall) args.push(\"--skip-install\");\n for (const flag of [\"useNpm\", \"usePnpm\", \"useYarn\", \"useBun\"] as const) {\n if (options[flag]) args.push(`--use-${flag.slice(3).toLowerCase()}`);\n }\n await create.parseAsync(args, { from: \"user\" });\n};\n\nexport const setupCloud = async (\n directory: string,\n options: SetupOptions,\n): Promise<void> => {\n if (options.org && options.newOrg)\n throw new Error(\"Choose --org or --new-org.\");\n if (options.project && options.newProject)\n throw new Error(\"Choose --project or --new-project.\");\n validateCloudUrl(options.apiUrl);\n const backend = new URL(options.backendUrl);\n if (backend.username || backend.password || backend.search || backend.hash)\n throw new Error(\n \"Backend URLs must not include credentials, queries, or fragments.\",\n );\n if (\n options.newOrg !== undefined &&\n !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(options.newOrg)\n )\n throw new Error(\n \"Organization slugs must use lowercase letters, numbers, and hyphens.\",\n );\n if (\n backend.protocol !== \"https:\" &&\n !(\n backend.protocol === \"http:\" &&\n [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(backend.hostname)\n )\n ) {\n throw new Error(\n \"Use an HTTPS backend URL or an HTTP localhost URL for development.\",\n );\n }\n const target = path.resolve(directory);\n const previous = await readCloudProjectConfig(target);\n if (previous) {\n if (previous.backendUrl !== backend.href)\n throw new Error(\n \"This harness is configured for another backend URL. Update its backend allowlist in the Cloud dashboard and the backendUrl in .assistant-ui/cloud.json before rerunning setup, or use a new directory.\",\n );\n if (\n (options.project &&\n options.project !== previous.projectId &&\n options.project !== previous.projectSlug) ||\n (options.newProject && options.newProject !== previous.projectSlug) ||\n (options.org &&\n options.org !== previous.organizationId &&\n options.org !== previous.organizationSlug) ||\n (options.newOrg && options.newOrg !== previous.organizationSlug)\n )\n throw new Error(\n \"This directory is already configured for another organization or project. Use a new directory.\",\n );\n const environment = await readOptionalFile(path.join(target, \".env.local\"));\n if (!/^\\s*(?:export\\s+)?ASSISTANT_API_KEY\\s*=\\s*.+/m.test(environment))\n throw new Error(\n \"This project is configured but its .env.local API key is missing. Restore it before running setup again.\",\n );\n const expected = mergeCloudEnvironment(environment, {\n NEXT_PUBLIC_ASSISTANT_BASE_URL: previous.apiOrigin,\n NEXT_PUBLIC_ASSISTANT_HARNESS_URL: previous.harnessOrigin,\n NEXT_PUBLIC_ASSISTANT_WORKSPACE_ID: previous.workspaceId,\n });\n if (expected !== environment)\n throw new Error(\n \"Cloud settings are missing from .env.local. Restore them before running setup again.\",\n );\n logger.success(\n `Already configured: ${previous.projectSlug} / ${previous.harnessId}`,\n );\n return;\n }\n const auth = cloudAuthConfig();\n const token = await cloudAccessToken(auth, {\n noOpen: options.open === false,\n ...(options.setupUrl && { setupUrl: options.setupUrl }),\n print: logger.info,\n });\n const organization = await organizationForSetup(auth.issuer, token, options);\n const project = await projectForSetup(\n auth.issuer,\n token,\n organization,\n target,\n options,\n );\n await scaffoldCloudProject(target, options);\n const accessCode =\n options.accessCode ??\n process.env.ASSISTANT_UI_ACCESS_CODE ??\n (options.yes\n ? undefined\n : answer(\n await p.password({\n message:\n \"Hackathon access code (leave empty if your plan includes harnesses)\",\n }),\n ));\n const request = await resolveProvisionRequest(\n target,\n {\n org_id: organization.id,\n project_id: project.id,\n harness_name: options.harnessName ?? `${project.name} chat`,\n backend_urls: backend.protocol === \"http:\" ? [] : [backend.href],\n allow_localhost: backend.protocol === \"http:\",\n },\n accessCode,\n );\n const result = await provisionCloudHarness(options.apiUrl, token, request);\n await writeCloudProjectConfig(\n target,\n {\n organizationId: organization.id,\n organizationSlug: organization.slug,\n projectId: result.project_id,\n projectSlug: project.slug,\n harnessId: result.harness_id,\n harnessOrigin: result.harness_origin,\n apiOrigin: result.api_origin,\n workspaceId: result.workspace_id,\n backendUrl: backend.href,\n },\n result.api_key,\n );\n logger.success(`Multiplayer chat configured for ${project.name}.`);\n logger.info(`Project: ${target}`);\n logger.info(\n \"Add OPENAI_API_KEY to .env.local, then start the app with your package manager's dev command.\",\n );\n logger.info(\n backend.protocol === \"http:\"\n ? `Open ${backend.origin}/#main in two browser windows to try shared chat. Deploy or expose the app to share it with teammates.`\n : 'Open your deployed app and use \"Share this chat\" to invite teammates to the same conversation.',\n );\n};\n\nconst DEFAULT_CLOUD_URL = \"https://cloud.assistant-ui.com\";\n\nexport const cloud = new Command()\n .name(\"cloud\")\n .description(\"manage Assistant Cloud (run `assistant-ui cloud help`)\")\n .helpOption(false)\n .helpCommand(false)\n .argument(\"[command...]\")\n .allowUnknownOption()\n .allowExcessArguments()\n .action(async (args: string[]) => {\n process.exitCode = await runCloudCommand(args, {\n cloudUrl: process.env.ASSISTANT_UI_CLOUD_URL ?? DEFAULT_CLOUD_URL,\n accessToken: () => savedCloudAccessToken(cloudAuthConfig()),\n stdout: (text) => process.stdout.write(text),\n stderr: (text) => process.stderr.write(text),\n });\n })\n .addCommand(\n new Command(\"login\")\n .description(\"sign in to Assistant Cloud using your browser\")\n .option(\n \"--no-open\",\n \"print the device sign-in URL without opening a browser\",\n )\n .option(\n \"--setup-url <url>\",\n \"show device sign-in in an active setup wizard\",\n )\n .action(async (options: { open?: boolean; setupUrl?: string }) => {\n await loginToCloud(cloudAuthConfig(), {\n noOpen: options.open === false,\n ...(options.setupUrl && { setupUrl: options.setupUrl }),\n print: logger.info,\n });\n }),\n )\n .addCommand(\n new Command(\"logout\")\n .description(\"revoke your CLI login and remove saved credentials\")\n .action(async () => {\n await logoutFromCloud(cloudAuthConfig());\n logger.success(\"Signed out.\");\n }),\n )\n .addCommand(\n new Command(\"setup\")\n .description(\"create a shared AI chat and provision its cloud harness\")\n .argument(\"[directory]\", \"new project directory\", \"multiplayer-chat\")\n .option(\"--org <id-or-slug>\", \"use an existing organization\")\n .option(\"--new-org <slug>\", \"create an organization\")\n .option(\"--project <id-or-slug>\", \"use an existing project\")\n .option(\"--new-project <slug>\", \"create a project\")\n .option(\"--name <name>\", \"display name for a new project or organization\")\n .option(\"--harness-name <name>\", \"name for the multiplayer harness\")\n .option(\n \"--backend-url <url>\",\n \"absolute URL of the app's chat route\",\n \"http://localhost:3000/api/chat\",\n )\n .option(\n \"--api-url <url>\",\n \"Assistant Cloud management URL\",\n process.env.ASSISTANT_UI_CLOUD_URL ?? DEFAULT_CLOUD_URL,\n )\n .option(\n \"--access-code <code>\",\n \"redeem your hackathon harness access code\",\n )\n .option(\n \"--no-open\",\n \"print the device sign-in URL without opening a browser\",\n )\n .option(\n \"--setup-url <url>\",\n \"show device sign-in in an active setup wizard\",\n )\n .option(\"--yes\", \"skip prompts; select resources with flags\")\n .option(\"--skip-install\", \"skip installing scaffold dependencies\")\n .option(\"--use-npm\", \"install with npm\")\n .option(\"--use-pnpm\", \"install with pnpm\")\n .option(\"--use-yarn\", \"install with yarn\")\n .option(\"--use-bun\", \"install with bun\")\n .addOption(\n new Option(\n \"--debug-source-root <path>\",\n \"local assistant-ui source root\",\n ).hideHelp(),\n )\n .action(async (directory: string, options: SetupOptions) => {\n try {\n await setupCloud(directory, options);\n } catch (error) {\n if (!(error instanceof SetupCancelled)) throw error;\n p.cancel(\"Cloud setup cancelled. Rerun the same command to resume.\");\n }\n }),\n );\n"],"mappings":"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"}
1
+ {"version":3,"file":"cloud.js","names":[],"sources":["../../src/commands/cloud.ts"],"sourcesContent":["import { Command, Option } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport { fetchOrganizations, fetchProjects } from \"aui-auth/accounts\";\nimport { access, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n cloudAccessToken,\n cloudAuthConfig,\n loginToCloud,\n logoutFromCloud,\n openBrowser,\n savedCloudAccessToken,\n validateCloudUrl,\n} from \"../lib/cloud-auth\";\nimport { runCloudCommand, sendCloudCommand } from \"../lib/cloud-remote\";\nimport {\n findCloudProjectDefaults,\n readCloudProjectConfig,\n mergeCloudEnvironment,\n readOptionalFile,\n writeCloudProjectConfig,\n} from \"../lib/cloud-config\";\nimport {\n provisionCloudHarness,\n resolveProvisionRequest,\n} from \"../lib/cloud-provision\";\nimport { logger } from \"../lib/utils/logger\";\nimport { create } from \"./create\";\n\nclass SetupCancelled extends Error {}\n\nconst answer = <T>(value: T | symbol): Exclude<T, symbol> => {\n if (p.isCancel(value)) throw new SetupCancelled();\n return value as Exclude<T, symbol>;\n};\n\ntype SetupOptions = {\n org?: string;\n newOrg?: string;\n project?: string;\n newProject?: string;\n name?: string;\n harnessName?: string;\n backendUrl: string;\n apiUrl: string;\n accessCode?: string;\n setupUrl?: string;\n open?: boolean;\n yes?: boolean;\n skipInstall?: boolean;\n useNpm?: boolean;\n usePnpm?: boolean;\n useYarn?: boolean;\n useBun?: boolean;\n debugSourceRoot?: string;\n};\n\nconst selectResource = async <\n T extends { id: string; slug: string; name: string },\n>(\n resources: T[],\n selected: string | undefined,\n kind: string,\n yes: boolean,\n): Promise<T | null> => {\n if (selected) {\n const resource = resources.find(\n ({ id, slug }) => selected === id || selected === slug,\n );\n if (!resource)\n throw new Error(`${kind} \"${selected}\" was not found in your account.`);\n return resource;\n }\n if (resources.length === 0) return null;\n if (resources.length === 1) return resources[0]!;\n if (yes)\n throw new Error(\n `Choose a ${kind.toLowerCase()} with --${kind.toLowerCase()} when using --yes.`,\n );\n const id = answer(\n await p.select({\n message: `Choose a ${kind.toLowerCase()}`,\n options: resources.map((resource) => ({\n value: resource.id,\n label: `${resource.name} (${resource.slug})`,\n })),\n }),\n );\n return resources.find((resource) => resource.id === id)!;\n};\n\ntype SetupResource = { id: string; slug: string; name: string };\n\n/**\n * Runs a Cloud command for setup and returns its `--json` output, so setup\n * creates organizations and projects with the same checks and audit rows as\n * `assistant-ui cloud orgs create` and `projects create`.\n */\nconst cloudJson = async <T>(\n apiUrl: string,\n token: string,\n args: string[],\n): Promise<{ ok: true; value: T } | { ok: false; message: string }> => {\n const response = await sendCloudCommand(apiUrl, [...args, \"--json\"], token);\n if (response.exitCode !== 0)\n return {\n ok: false,\n message: (response.stderr ?? \"\").trim() || `${args.join(\" \")} failed.`,\n };\n let value: unknown;\n try {\n value = JSON.parse(response.stdout ?? \"\");\n } catch {\n value = null;\n }\n const resource = value as Partial<SetupResource> | null;\n if (\n !resource ||\n !([\"id\", \"slug\", \"name\"] as const).every(\n (key) => typeof resource[key] === \"string\" && resource[key].trim() !== \"\",\n )\n )\n return {\n ok: false,\n message: `Unexpected response from \\`${args.join(\" \")} --json\\`. Update assistant-ui and try again.`,\n };\n return { ok: true, value: value as T };\n};\n\nconst projectSlug = (value: string): string =>\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\nconst organizationForSetup = async (\n issuer: string,\n token: string,\n options: SetupOptions,\n): Promise<SetupResource> => {\n const organizations = await fetchOrganizations({ issuer }, token);\n if (!options.newOrg) {\n const existing = await selectResource(\n organizations,\n options.org,\n \"Org\",\n !!options.yes,\n );\n if (existing) return existing;\n }\n const slug =\n options.newOrg ??\n (options.yes\n ? undefined\n : answer(\n await p.text({\n message: \"Choose a slug for your new organization\",\n validate: (value) =>\n /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value ?? \"\")\n ? undefined\n : \"Use lowercase letters, numbers, and hyphens.\",\n }),\n ));\n if (!slug)\n throw new Error(\n \"No organizations found. Pass --new-org <slug> to create one.\",\n );\n const existing = organizations.find(\n (organization) => organization.slug === slug,\n );\n if (existing) return existing;\n const created = await cloudJson<SetupResource>(options.apiUrl, token, [\n \"orgs\",\n \"create\",\n slug,\n \"--name\",\n options.name ?? slug,\n ]);\n if (!created.ok)\n throw new Error(`Could not create organization: ${created.message}`);\n return created.value;\n};\n\nconst projectForSetup = async (\n issuer: string,\n token: string,\n organization: SetupResource,\n directory: string,\n options: SetupOptions,\n): Promise<SetupResource> => {\n const projects = await fetchProjects({ issuer }, token, {\n id: organization.id,\n });\n if (!options.newProject) {\n const existing = await selectResource(\n projects,\n options.project,\n \"Project\",\n !!options.yes,\n );\n if (existing) return existing;\n }\n const slug = options.newProject ?? projectSlug(path.basename(directory));\n if (!slug)\n throw new Error(\"Choose a project slug with --new-project <slug>.\");\n const existing = projects.find((project) => project.slug === slug);\n if (existing) return existing;\n const created = await cloudJson<SetupResource>(options.apiUrl, token, [\n \"projects\",\n \"create\",\n slug,\n \"--name\",\n options.name ?? path.basename(directory),\n \"--org\",\n organization.id,\n ]);\n if (!created.ok) {\n if (/already exists/.test(created.message))\n throw new Error(\n `Project slug \"${slug}\" already exists. Select it with --project or choose another slug.`,\n );\n throw new Error(`Could not create project: ${created.message}`);\n }\n return created.value;\n};\n\nconst scaffoldCloudProject = async (\n directory: string,\n options: SetupOptions,\n): Promise<void> => {\n try {\n await access(path.join(directory, \"package.json\"));\n const marker = JSON.parse(\n await readFile(\n path.join(directory, \".assistant-ui\", \"template.json\"),\n \"utf8\",\n ),\n ) as { template?: string };\n if (marker.template !== \"cloud-harness\")\n throw new Error(\n \"This directory is not a cloud-harness app. Use a new directory.\",\n );\n return;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n if (await readOptionalFile(path.join(directory, \"package.json\"))) {\n throw new Error(\n \"This directory already contains an app. Use a new directory for the multiplayer scaffold.\",\n );\n }\n }\n const packageRoot = path.resolve(\n path.dirname(fileURLToPath(import.meta.url)),\n \"../..\",\n );\n const args = [\n directory,\n \"--template\",\n \"cloud-harness\",\n \"--no-skills\",\n \"--debug-source-root\",\n options.debugSourceRoot ?? packageRoot,\n ];\n if (options.skipInstall) args.push(\"--skip-install\");\n for (const flag of [\"useNpm\", \"usePnpm\", \"useYarn\", \"useBun\"] as const) {\n if (options[flag]) args.push(`--use-${flag.slice(3).toLowerCase()}`);\n }\n await create.parseAsync(args, { from: \"user\" });\n};\n\nexport const setupCloud = async (\n directory: string,\n options: SetupOptions,\n): Promise<void> => {\n if (options.org && options.newOrg)\n throw new Error(\"Choose --org or --new-org.\");\n if (options.project && options.newProject)\n throw new Error(\"Choose --project or --new-project.\");\n validateCloudUrl(options.apiUrl);\n const backend = new URL(options.backendUrl);\n if (backend.username || backend.password || backend.search || backend.hash)\n throw new Error(\n \"Backend URLs must not include credentials, queries, or fragments.\",\n );\n if (\n options.newOrg !== undefined &&\n !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(options.newOrg)\n )\n throw new Error(\n \"Organization slugs must use lowercase letters, numbers, and hyphens.\",\n );\n if (\n backend.protocol !== \"https:\" &&\n !(\n backend.protocol === \"http:\" &&\n [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(backend.hostname)\n )\n ) {\n throw new Error(\n \"Use an HTTPS backend URL or an HTTP localhost URL for development.\",\n );\n }\n const target = path.resolve(directory);\n const previous = await readCloudProjectConfig(target);\n if (previous) {\n if (previous.backendUrl !== backend.href)\n throw new Error(\n \"This harness is configured for another backend URL. Update its backend allowlist in the Cloud dashboard and the backendUrl in .assistant-ui/cloud.json before rerunning setup, or use a new directory.\",\n );\n if (\n (options.project &&\n options.project !== previous.projectId &&\n options.project !== previous.projectSlug) ||\n (options.newProject && options.newProject !== previous.projectSlug) ||\n (options.org &&\n options.org !== previous.organizationId &&\n options.org !== previous.organizationSlug) ||\n (options.newOrg && options.newOrg !== previous.organizationSlug)\n )\n throw new Error(\n \"This directory is already configured for another organization or project. Use a new directory.\",\n );\n const environment = await readOptionalFile(path.join(target, \".env.local\"));\n if (!/^\\s*(?:export\\s+)?ASSISTANT_API_KEY\\s*=\\s*.+/m.test(environment))\n throw new Error(\n \"This project is configured but its .env.local API key is missing. Restore it before running setup again.\",\n );\n const expected = mergeCloudEnvironment(environment, {\n NEXT_PUBLIC_ASSISTANT_BASE_URL: previous.apiOrigin,\n NEXT_PUBLIC_ASSISTANT_HARNESS_URL: previous.harnessOrigin,\n NEXT_PUBLIC_ASSISTANT_WORKSPACE_ID: previous.workspaceId,\n });\n if (expected !== environment)\n throw new Error(\n \"Cloud settings are missing from .env.local. Restore them before running setup again.\",\n );\n logger.success(\n `Already configured: ${previous.projectSlug} / ${previous.harnessId}`,\n );\n return;\n }\n const auth = cloudAuthConfig();\n const token = await cloudAccessToken(auth, {\n noOpen: options.open === false,\n ...(options.setupUrl && { setupUrl: options.setupUrl }),\n print: logger.info,\n });\n const organization = await organizationForSetup(auth.issuer, token, options);\n const project = await projectForSetup(\n auth.issuer,\n token,\n organization,\n target,\n options,\n );\n await scaffoldCloudProject(target, options);\n const accessCode =\n options.accessCode ??\n process.env.ASSISTANT_UI_ACCESS_CODE ??\n (options.yes\n ? undefined\n : answer(\n await p.password({\n message:\n \"Hackathon access code (leave empty if your plan includes harnesses)\",\n }),\n ));\n const request = await resolveProvisionRequest(\n target,\n {\n org_id: organization.id,\n project_id: project.id,\n harness_name: options.harnessName ?? `${project.name} chat`,\n backend_urls: backend.protocol === \"http:\" ? [] : [backend.href],\n allow_localhost: backend.protocol === \"http:\",\n },\n accessCode,\n );\n const result = await provisionCloudHarness(options.apiUrl, token, request);\n await writeCloudProjectConfig(\n target,\n {\n organizationId: organization.id,\n organizationSlug: organization.slug,\n projectId: result.project_id,\n projectSlug: project.slug,\n harnessId: result.harness_id,\n harnessOrigin: result.harness_origin,\n apiOrigin: result.api_origin,\n workspaceId: result.workspace_id,\n backendUrl: backend.href,\n },\n result.api_key,\n );\n logger.success(`Multiplayer chat configured for ${project.name}.`);\n logger.info(`Project: ${target}`);\n logger.info(\n \"Add OPENAI_API_KEY to .env.local, then start the app with your package manager's dev command.\",\n );\n logger.info(\n backend.protocol === \"http:\"\n ? `Open ${backend.origin}/#main in two browser windows to try shared chat. Deploy or expose the app to share it with teammates.`\n : 'Open your deployed app and use \"Share this chat\" to invite teammates to the same conversation.',\n );\n};\n\nconst DEFAULT_CLOUD_URL = \"https://cloud.assistant-ui.com\";\n\nexport const cloud = new Command()\n .name(\"cloud\")\n .description(\"manage Assistant Cloud (run `assistant-ui cloud help`)\")\n .helpOption(false)\n .helpCommand(false)\n // `cloud login --no-open` is login's own flag; `cloud <remote> --no-open`\n // is this one; Commander forwards tokens after `--` without the separator.\n .enablePositionalOptions()\n .option(\"--no-open\", \"print dashboard links without opening a browser\")\n .argument(\"[command...]\")\n .allowUnknownOption()\n .allowExcessArguments()\n .action(async (args: string[], options: { open?: boolean }) => {\n // The server's help knows the local commands only by name; their flags\n // live here, so `help <local command>` is answered on this machine.\n const local =\n args[0] === \"help\" && args.length === 2\n ? cloud.commands.find((command) => command.name() === args[1])\n : undefined;\n if (local) {\n process.stdout.write(local.helpInformation());\n return;\n }\n process.exitCode = await runCloudCommand(args, {\n cloudUrl: process.env.ASSISTANT_UI_CLOUD_URL ?? DEFAULT_CLOUD_URL,\n accessToken: () => savedCloudAccessToken(cloudAuthConfig()),\n defaults: () => findCloudProjectDefaults(process.cwd()),\n interactive:\n !!process.stdin.isTTY && !!process.stderr.isTTY && !process.env.CI,\n noOpen: options.open === false,\n openUrl: openBrowser,\n stdout: (text) => process.stdout.write(text),\n stderr: (text) => process.stderr.write(text),\n });\n })\n .addCommand(\n new Command(\"login\")\n .description(\"sign in to Assistant Cloud using your browser\")\n .option(\n \"--no-open\",\n \"print the device sign-in URL without opening a browser\",\n )\n .option(\n \"--setup-url <url>\",\n \"show device sign-in in an active setup wizard\",\n )\n .action(async (options: { open?: boolean; setupUrl?: string }) => {\n await loginToCloud(cloudAuthConfig(), {\n noOpen: options.open === false,\n ...(options.setupUrl && { setupUrl: options.setupUrl }),\n print: logger.info,\n });\n }),\n )\n .addCommand(\n new Command(\"logout\")\n .description(\"revoke your CLI login and remove saved credentials\")\n .action(async () => {\n await logoutFromCloud(cloudAuthConfig());\n logger.success(\"Signed out.\");\n }),\n )\n .addCommand(\n new Command(\"setup\")\n .description(\"create a shared AI chat and provision its cloud harness\")\n .argument(\"[directory]\", \"new project directory\", \"multiplayer-chat\")\n .option(\"--org <id-or-slug>\", \"use an existing organization\")\n .option(\"--new-org <slug>\", \"create an organization\")\n .option(\"--project <id-or-slug>\", \"use an existing project\")\n .option(\"--new-project <slug>\", \"create a project\")\n .option(\"--name <name>\", \"display name for a new project or organization\")\n .option(\"--harness-name <name>\", \"name for the multiplayer harness\")\n .option(\n \"--backend-url <url>\",\n \"absolute URL of the app's chat route\",\n \"http://localhost:3000/api/chat\",\n )\n .option(\n \"--api-url <url>\",\n \"Assistant Cloud management URL\",\n process.env.ASSISTANT_UI_CLOUD_URL ?? DEFAULT_CLOUD_URL,\n )\n .option(\n \"--access-code <code>\",\n \"redeem your hackathon harness access code\",\n )\n .option(\n \"--no-open\",\n \"print the device sign-in URL without opening a browser\",\n )\n .option(\n \"--setup-url <url>\",\n \"show device sign-in in an active setup wizard\",\n )\n .option(\"--yes\", \"skip prompts; select resources with flags\")\n .option(\"--skip-install\", \"skip installing scaffold dependencies\")\n .option(\"--use-npm\", \"install with npm\")\n .option(\"--use-pnpm\", \"install with pnpm\")\n .option(\"--use-yarn\", \"install with yarn\")\n .option(\"--use-bun\", \"install with bun\")\n .addOption(\n new Option(\n \"--debug-source-root <path>\",\n \"local assistant-ui source root\",\n ).hideHelp(),\n )\n .action(async (directory: string, options: SetupOptions) => {\n try {\n await setupCloud(directory, options);\n } catch (error) {\n if (!(error instanceof SetupCancelled)) throw error;\n p.cancel(\"Cloud setup cancelled. Rerun the same command to resume.\");\n }\n }),\n );\n"],"mappings":"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"}
@@ -8,7 +8,7 @@ import chalk from "chalk";
8
8
  import fs from "node:fs";
9
9
  import path from "node:path";
10
10
  import * as p from "@clack/prompts";
11
- //#region src/commands/create.ts
11
+ // src/commands/create.ts
12
12
  const PROJECT_METADATA = [
13
13
  {
14
14
  name: "default",
@@ -588,7 +588,6 @@ const create = new Command().name("create").description("create a new project").
588
588
  process.exit(1);
589
589
  }
590
590
  });
591
- //#endregion
592
591
  export { DEFAULT_PROJECT_DIRECTORY, PROJECT_METADATA, create, projectNamePromptOptions, resolveCreateProjectDirectory, resolvePresetUrl, resolveProject, resolveProjectDirectoryGuidance, resolveScaffoldSelector };
593
592
 
594
593
  //# sourceMappingURL=create.js.map
@@ -4,7 +4,7 @@ import chalk from "chalk";
4
4
  import * as fs$1 from "node:fs";
5
5
  import * as path$1 from "node:path";
6
6
  import { compare, valid } from "semver";
7
- //#region src/commands/doctor.ts
7
+ // src/commands/doctor.ts
8
8
  const ASSISTANT_UI_PACKAGE_NAMES = /* @__PURE__ */ new Set([
9
9
  "assistant-stream",
10
10
  "assistant-cloud",
@@ -250,7 +250,6 @@ const doctor = new Command().name("doctor").description("Diagnose mismatched or
250
250
  console.log("");
251
251
  if (duplicates.length > 0) process.exitCode = 1;
252
252
  });
253
- //#endregion
254
253
  export { compareSemver, discoverInstalledPackages, doctor, findDuplicates, findOutdated, uniquePackageNames };
255
254
 
256
255
  //# sourceMappingURL=doctor.js.map
@@ -8,7 +8,7 @@ import { detect } from "detect-package-manager";
8
8
  import * as os$1 from "node:os";
9
9
  import { spawnSync } from "node:child_process";
10
10
  import { satisfies } from "semver";
11
- //#region src/commands/info.ts
11
+ // src/commands/info.ts
12
12
  const ASSISTANT_UI_PACKAGES = [
13
13
  "@assistant-ui/react",
14
14
  "@assistant-ui/react-native",
@@ -283,7 +283,6 @@ const info = new Command().name("info").description("Print environment and packa
283
283
  console.log(block);
284
284
  console.log("");
285
285
  });
286
- //#endregion
287
286
  export { findWorkspaceRoot, info, satisfiesRange };
288
287
 
289
288
  //# sourceMappingURL=info.js.map
@@ -6,7 +6,7 @@ import { create } from "./create.js";
6
6
  import { Command, Option } from "commander";
7
7
  import fs from "node:fs";
8
8
  import path from "node:path";
9
- //#region src/commands/init.ts
9
+ // src/commands/init.ts
10
10
  function createExistingProjectInitPlan(params) {
11
11
  const { yes, overwrite } = params;
12
12
  const initArgs = yes ? [
@@ -91,7 +91,6 @@ const init = new Command().name("init").description("initialize assistant-ui in
91
91
  process.exit(1);
92
92
  }
93
93
  });
94
- //#endregion
95
94
  export { createExistingProjectInitPlan, init, isNonInteractiveShell };
96
95
 
97
96
  //# sourceMappingURL=init.js.map
@@ -6,7 +6,7 @@ import path from "node:path";
6
6
  import os from "node:os";
7
7
  import * as p from "@clack/prompts";
8
8
  import { applyEdits, parse, parseTree, stripComments } from "jsonc-parser";
9
- //#region src/commands/mcp.ts
9
+ // src/commands/mcp.ts
10
10
  const HOSTED_MCP_URL = "https://www.assistant-ui.com/mcp";
11
11
  const MCP_CONFIGS = {
12
12
  cursor: {
@@ -274,7 +274,6 @@ const mcp = new Command().name("mcp").description("connect your IDE to the assis
274
274
  process.exit(1);
275
275
  }
276
276
  });
277
- //#endregion
278
277
  export { mcp };
279
278
 
280
279
  //# sourceMappingURL=mcp.js.map
@@ -5,7 +5,7 @@ import { logPackageJsonParseError } from "../lib/utils/package-json.js";
5
5
  import { Command } from "commander";
6
6
  import fs from "node:fs";
7
7
  import path from "node:path";
8
- //#region src/commands/update.ts
8
+ // src/commands/update.ts
9
9
  const update = new Command().name("update").description("Update all '@assistant-ui/*' and 'assistant-*' packages in package.json to latest versions using your package manager.").option("--dry", "Print the package manager command instead of running it.").option("-c, --cwd <cwd>", "the working directory. defaults to the current directory.", process.cwd()).action(async (opts) => {
10
10
  const packageJsonPath = path.join(opts.cwd, "package.json");
11
11
  if (!fs.existsSync(packageJsonPath)) {
@@ -53,7 +53,6 @@ const update = new Command().name("update").description("Update all '@assistant-
53
53
  logger.break();
54
54
  logger.success("All packages updated to latest version!");
55
55
  });
56
- //#endregion
57
56
  export { update };
58
57
 
59
58
  //# sourceMappingURL=update.js.map
@@ -3,7 +3,7 @@ import { transform } from "../lib/transform.js";
3
3
  import { upgrade } from "../lib/upgrade.js";
4
4
  import { Command } from "commander";
5
5
  import debug from "debug";
6
- //#region src/commands/upgrade.ts
6
+ // src/commands/upgrade.ts
7
7
  const error = debug("codemod:error");
8
8
  debug.enable("codemod:*");
9
9
  const addTransformOptions = (command) => {
@@ -33,7 +33,6 @@ const upgradeCommand = addTransformOptions(new Command().command("upgrade").desc
33
33
  process.exit(1);
34
34
  }
35
35
  });
36
- //#endregion
37
36
  export { codemodCommand, upgradeCommand };
38
37
 
39
38
  //# sourceMappingURL=upgrade.js.map
package/dist/index.js CHANGED
@@ -1,8 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { handleCliError } from "./lib/handle-cli-error.js";
3
3
  import { runCli } from "./run.js";
4
- //#region src/index.ts
4
+ // src/index.ts
5
5
  runCli().catch(handleCliError);
6
- //#endregion
7
6
 
8
7
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  import { type PackageManagerName } from "./utils/package-manager.js";
2
2
  export declare const SKILLS_PACKAGE = "assistant-ui/skills";
3
- export declare const SKILLS_COMMIT = "1ba8e9105c504fe4ac2591e432783872d6b3c8ba";
4
- export declare const SKILLS_PLUGIN_SOURCE = "gh:assistant-ui/skills/assistant-ui#1ba8e9105c504fe4ac2591e432783872d6b3c8ba";
3
+ export declare const SKILLS_COMMIT = "b0609e66baff7e19f21053d5492464dcc22ec9c3";
4
+ export declare const SKILLS_PLUGIN_SOURCE = "gh:assistant-ui/skills/assistant-ui#b0609e66baff7e19f21053d5492464dcc22ec9c3";
5
5
  export declare function resolveSkillsInstall(params: {
6
6
  skills?: boolean;
7
7
  stdinIsTTY?: boolean;