assistant-ui 0.0.125 → 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.
- package/README.md +18 -2
- package/dist/codemods/utils/createTransformer.js +1 -2
- package/dist/codemods/utils/resolveBinding.js +1 -2
- package/dist/codemods/v0-11/content-part-to-message-part.js +1 -2
- package/dist/codemods/v0-12/assistant-api-to-aui.js +1 -2
- package/dist/codemods/v0-12/event-names-to-camelcase.js +1 -2
- package/dist/codemods/v0-12/primitive-if-to-aui-if.js +1 -2
- package/dist/codemods/v0-15/aui-accessor-calls-to-properties.js +1 -2
- package/dist/codemods/v0-8/ui-package-split.js +1 -2
- package/dist/codemods/v0-9/edge-package-split.js +1 -2
- package/dist/commands/add.js +1 -2
- package/dist/commands/agent.js +1 -2
- package/dist/commands/cloud.d.ts.map +1 -1
- package/dist/commands/cloud.js +70 -31
- package/dist/commands/cloud.js.map +1 -1
- package/dist/commands/create.js +1 -2
- package/dist/commands/doctor.js +1 -2
- package/dist/commands/info.js +1 -2
- package/dist/commands/init.js +1 -2
- package/dist/commands/mcp.js +1 -2
- package/dist/commands/update.js +1 -2
- package/dist/commands/upgrade.js +1 -2
- package/dist/index.js +1 -2
- package/dist/lib/agent-skill.d.ts +2 -2
- package/dist/lib/agent-skill.js +2 -3
- package/dist/lib/agent-skill.js.map +1 -1
- package/dist/lib/cloud-abort.js +1 -2
- package/dist/lib/cloud-auth.d.ts +1 -0
- package/dist/lib/cloud-auth.d.ts.map +1 -1
- package/dist/lib/cloud-auth.js +2 -3
- package/dist/lib/cloud-auth.js.map +1 -1
- package/dist/lib/cloud-config.d.ts +11 -1
- package/dist/lib/cloud-config.d.ts.map +1 -1
- package/dist/lib/cloud-config.js +52 -16
- package/dist/lib/cloud-config.js.map +1 -1
- package/dist/lib/cloud-provision.d.ts.map +1 -1
- package/dist/lib/cloud-provision.js +7 -3
- package/dist/lib/cloud-provision.js.map +1 -1
- package/dist/lib/cloud-remote.d.ts +16 -1
- package/dist/lib/cloud-remote.d.ts.map +1 -1
- package/dist/lib/cloud-remote.js +53 -9
- package/dist/lib/cloud-remote.js.map +1 -1
- package/dist/lib/cloud-setup-login.js +1 -2
- package/dist/lib/cloud-url.js +1 -2
- package/dist/lib/create-project.js +1 -2
- package/dist/lib/handle-cli-error.js +1 -2
- package/dist/lib/install-ai-sdk-lib.js +1 -2
- package/dist/lib/install-edge-lib.js +1 -2
- package/dist/lib/run-spawn.js +1 -2
- package/dist/lib/safe-project-file.d.ts +2 -0
- package/dist/lib/safe-project-file.d.ts.map +1 -0
- package/dist/lib/safe-project-file.js +25 -0
- package/dist/lib/safe-project-file.js.map +1 -0
- package/dist/lib/transform.js +1 -2
- package/dist/lib/upgrade.js +1 -2
- package/dist/lib/utils/config.js +1 -2
- package/dist/lib/utils/download.js +1 -2
- package/dist/lib/utils/file-scanner.js +1 -2
- package/dist/lib/utils/logger.js +1 -2
- package/dist/lib/utils/package-installer.js +1 -2
- package/dist/lib/utils/package-json.js +1 -2
- package/dist/lib/utils/package-manager.js +1 -2
- package/dist/lib/utils/registry.js +1 -2
- package/dist/lib/utils/workspace.js +1 -2
- package/dist/program.js +1 -2
- package/dist/run.js +1 -2
- package/package.json +7 -7
- package/src/commands/cloud.test.ts +156 -0
- package/src/commands/cloud.ts +93 -41
- package/src/commands/mcp.test.ts +123 -0
- package/src/lib/agent-skill.ts +1 -1
- package/src/lib/cloud-auth.ts +1 -1
- package/src/lib/cloud-config.test.ts +139 -1
- package/src/lib/cloud-config.ts +59 -8
- package/src/lib/cloud-provision.test.ts +26 -1
- package/src/lib/cloud-provision.ts +3 -0
- package/src/lib/cloud-remote.test.ts +99 -3
- package/src/lib/cloud-remote.ts +93 -7
- package/src/lib/safe-project-file.ts +31 -0
- package/templates/cloud-harness/components/assistant-ui/elements/attachment-state.ts +59 -0
- package/templates/cloud-harness/components/assistant-ui/elements/attachment.aui.tsx +11 -44
- package/templates/cloud-harness/components/assistant-ui/elements/thread.aui.tsx +1 -1
- package/templates/cloud-harness/package.json +12 -12
- package/templates/cloud-harness/.gitignore +0 -42
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
|
|
111
|
-
`cloud
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
package/dist/commands/add.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/dist/commands/agent.js
CHANGED
|
@@ -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
|
-
|
|
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;
|
|
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"}
|
package/dist/commands/cloud.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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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"}
|
package/dist/commands/create.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/dist/commands/doctor.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/dist/commands/info.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/dist/commands/init.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/dist/commands/mcp.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/dist/commands/update.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/dist/commands/upgrade.js
CHANGED
|
@@ -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
|
-
|
|
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,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 = "
|
|
4
|
-
export declare const SKILLS_PLUGIN_SOURCE = "gh:assistant-ui/skills/assistant-ui#
|
|
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;
|