@base44-preview/cli 0.1.14-pr.624.af1a615 → 0.1.14-pr.625.c566f53
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/dist/cli/index.js +499 -163
- package/dist/cli/index.js.map +24 -16
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -31177,7 +31177,7 @@ function cleanDoc(doc) {
|
|
|
31177
31177
|
return mapDoc(doc, (currentDoc) => cleanDocFn(currentDoc));
|
|
31178
31178
|
}
|
|
31179
31179
|
function replaceEndOfLine(doc, replacement = literalline) {
|
|
31180
|
-
return mapDoc(doc, (currentDoc) => typeof currentDoc === "string" ?
|
|
31180
|
+
return mapDoc(doc, (currentDoc) => typeof currentDoc === "string" ? join28(replacement, currentDoc.split(`
|
|
31181
31181
|
`)) : currentDoc);
|
|
31182
31182
|
}
|
|
31183
31183
|
function canBreakFn(doc) {
|
|
@@ -31257,7 +31257,7 @@ function indentIfBreak(contents, options) {
|
|
|
31257
31257
|
negate: options.negate
|
|
31258
31258
|
};
|
|
31259
31259
|
}
|
|
31260
|
-
function
|
|
31260
|
+
function join28(separator, docs) {
|
|
31261
31261
|
assertDoc(separator);
|
|
31262
31262
|
assertDocArray(docs);
|
|
31263
31263
|
const parts = [];
|
|
@@ -31968,7 +31968,7 @@ var init_doc = __esm(() => {
|
|
|
31968
31968
|
MODE_FLAT = Symbol("MODE_FLAT");
|
|
31969
31969
|
DOC_FILL_PRINTED_LENGTH = Symbol("DOC_FILL_PRINTED_LENGTH");
|
|
31970
31970
|
builders = {
|
|
31971
|
-
join:
|
|
31971
|
+
join: join28,
|
|
31972
31972
|
line,
|
|
31973
31973
|
softline,
|
|
31974
31974
|
hardline,
|
|
@@ -228634,6 +228634,10 @@ class InternalError extends SystemError {
|
|
|
228634
228634
|
}
|
|
228635
228635
|
}
|
|
228636
228636
|
|
|
228637
|
+
class ResourceDeploymentError extends SystemError {
|
|
228638
|
+
code = "RESOURCE_DEPLOYMENT_FAILED";
|
|
228639
|
+
}
|
|
228640
|
+
|
|
228637
228641
|
class TypeGenerationError extends SystemError {
|
|
228638
228642
|
code = "TYPE_GENERATION_ERROR";
|
|
228639
228643
|
constructor(message, entityName, cause) {
|
|
@@ -228779,7 +228783,7 @@ function normalizeBase44Env() {
|
|
|
228779
228783
|
loadProjectEnvFiles();
|
|
228780
228784
|
|
|
228781
228785
|
// src/cli/index.ts
|
|
228782
|
-
import { dirname as
|
|
228786
|
+
import { dirname as dirname28, join as join37 } from "node:path";
|
|
228783
228787
|
import { fileURLToPath as fileURLToPath6 } from "node:url";
|
|
228784
228788
|
|
|
228785
228789
|
// ../../node_modules/@clack/core/dist/index.mjs
|
|
@@ -229905,8 +229909,10 @@ var {
|
|
|
229905
229909
|
Help: Help2
|
|
229906
229910
|
} = exports_commander;
|
|
229907
229911
|
|
|
229908
|
-
// src/cli/commands/
|
|
229909
|
-
|
|
229912
|
+
// src/cli/commands/functions/parseNames.ts
|
|
229913
|
+
function parseNames(args) {
|
|
229914
|
+
return args.flatMap((arg) => arg.split(",")).map((n) => n.trim()).filter(Boolean);
|
|
229915
|
+
}
|
|
229910
229916
|
// ../../node_modules/chalk/source/vendor/ansi-styles/index.js
|
|
229911
229917
|
var ANSI_BACKGROUND_OFFSET = 10;
|
|
229912
229918
|
var wrapAnsi16 = (offset = 0) => (code) => `\x1B[${code + offset}m`;
|
|
@@ -230720,6 +230726,7 @@ var ProjectConfigSchema = object({
|
|
|
230720
230726
|
site: SiteConfigSchema.optional(),
|
|
230721
230727
|
entitiesDir: string2().optional().default("entities"),
|
|
230722
230728
|
functionsDir: string2().optional().default("functions"),
|
|
230729
|
+
actorsDir: string2().optional().default("actors"),
|
|
230723
230730
|
agentsDir: string2().optional().default("agents"),
|
|
230724
230731
|
agentSkillsDir: string2().optional().default("agent-skills"),
|
|
230725
230732
|
connectorsDir: string2().optional().default("connectors"),
|
|
@@ -236672,7 +236679,7 @@ async function getSiteUrl() {
|
|
|
236672
236679
|
return result.data.url;
|
|
236673
236680
|
}
|
|
236674
236681
|
// src/core/project/config.ts
|
|
236675
|
-
import { dirname as
|
|
236682
|
+
import { dirname as dirname10, join as join12 } from "node:path";
|
|
236676
236683
|
|
|
236677
236684
|
// src/core/project/plugins.ts
|
|
236678
236685
|
import { createRequire as createRequire2 } from "node:module";
|
|
@@ -236710,6 +236717,159 @@ function markPluginEntities(entities, pluginNamespace) {
|
|
|
236710
236717
|
}));
|
|
236711
236718
|
}
|
|
236712
236719
|
|
|
236720
|
+
// src/core/resources/actor/schema.ts
|
|
236721
|
+
var RESERVED_NAMES = new Set(("await break case catch class const continue debugger default delete do else " + "enum export extends false finally for function if import in instanceof let " + "new null return static super switch this throw true try typeof var void " + "while with yield implements interface package private protected public " + "eval arguments").split(" "));
|
|
236722
|
+
var ActorNameSchema = string2().regex(/^[A-Za-z_][A-Za-z0-9_]{0,127}$(?![\s\S])/, "Actor names must be JavaScript identifiers of at most 128 characters (letters, digits, and underscores)").refine((name) => !RESERVED_NAMES.has(name), {
|
|
236723
|
+
message: "Actor names cannot be JavaScript reserved words"
|
|
236724
|
+
});
|
|
236725
|
+
function validateActorName(name) {
|
|
236726
|
+
const result = ActorNameSchema.safeParse(name);
|
|
236727
|
+
if (!result.success) {
|
|
236728
|
+
throw new SchemaValidationError(`Invalid actor name '${name}'`, result.error);
|
|
236729
|
+
}
|
|
236730
|
+
}
|
|
236731
|
+
var ActorDefinitionSchema = object({
|
|
236732
|
+
name: ActorNameSchema,
|
|
236733
|
+
entry: _enum(["entry.ts", "entry.js"]),
|
|
236734
|
+
entryPath: string2().min(1),
|
|
236735
|
+
filePaths: array(string2()).min(1),
|
|
236736
|
+
source: object({ type: literal("project") })
|
|
236737
|
+
});
|
|
236738
|
+
var ActorDeployPayloadSchema = object({
|
|
236739
|
+
entry: _enum(["entry.ts", "entry.js"]),
|
|
236740
|
+
files: array(object({ path: string2().min(1), content: string2() })).min(1)
|
|
236741
|
+
});
|
|
236742
|
+
var DeployActorResponseSchema = object({
|
|
236743
|
+
status: _enum(["deployed", "unchanged"]),
|
|
236744
|
+
warnings: array(string2()).optional().default([])
|
|
236745
|
+
});
|
|
236746
|
+
var DeleteActorResponseSchema = object({ status: literal("deleted"), handler_name: ActorNameSchema }).transform((data) => ({
|
|
236747
|
+
status: data.status,
|
|
236748
|
+
handlerName: data.handler_name
|
|
236749
|
+
}));
|
|
236750
|
+
|
|
236751
|
+
// src/core/resources/actor/api.ts
|
|
236752
|
+
async function deploySingleActor(name, payload) {
|
|
236753
|
+
validateActorName(name);
|
|
236754
|
+
const input = ActorDeployPayloadSchema.safeParse(payload);
|
|
236755
|
+
if (!input.success)
|
|
236756
|
+
throw new SchemaValidationError("Invalid actor deployment", input.error);
|
|
236757
|
+
let response;
|
|
236758
|
+
try {
|
|
236759
|
+
response = await getAppClient().put(`actors/${encodeURIComponent(name)}`, {
|
|
236760
|
+
json: input.data,
|
|
236761
|
+
timeout: false
|
|
236762
|
+
});
|
|
236763
|
+
} catch (error) {
|
|
236764
|
+
throw await ApiError.fromHttpError(error, `deploying actor "${name}"`);
|
|
236765
|
+
}
|
|
236766
|
+
const result = DeployActorResponseSchema.safeParse(await response.json());
|
|
236767
|
+
if (!result.success)
|
|
236768
|
+
throw new SchemaValidationError("Invalid actor deployment response", result.error);
|
|
236769
|
+
return result.data;
|
|
236770
|
+
}
|
|
236771
|
+
async function deleteSingleActor(name) {
|
|
236772
|
+
validateActorName(name);
|
|
236773
|
+
let response;
|
|
236774
|
+
try {
|
|
236775
|
+
response = await getAppClient().delete(`actors/${encodeURIComponent(name)}`, { timeout: 60000 });
|
|
236776
|
+
} catch (error) {
|
|
236777
|
+
throw await ApiError.fromHttpError(error, `deleting actor "${name}"`);
|
|
236778
|
+
}
|
|
236779
|
+
const result = DeleteActorResponseSchema.safeParse(await response.json());
|
|
236780
|
+
if (!result.success)
|
|
236781
|
+
throw new SchemaValidationError("Invalid actor deletion response", result.error);
|
|
236782
|
+
return result.data;
|
|
236783
|
+
}
|
|
236784
|
+
// src/core/resources/actor/config.ts
|
|
236785
|
+
import { basename as basename3, dirname as dirname6, join as join5, relative } from "node:path";
|
|
236786
|
+
async function readAllActors(actorsDir) {
|
|
236787
|
+
if (!await pathExists(actorsDir))
|
|
236788
|
+
return [];
|
|
236789
|
+
const entries = await globby(ENTRY_FILE_GLOB, {
|
|
236790
|
+
cwd: actorsDir,
|
|
236791
|
+
absolute: true,
|
|
236792
|
+
ignore: ENTRY_IGNORE_DOT_PATHS
|
|
236793
|
+
});
|
|
236794
|
+
const actors = [];
|
|
236795
|
+
const names = new Set;
|
|
236796
|
+
for (const entryPath of entries.sort()) {
|
|
236797
|
+
const actorDir = dirname6(entryPath);
|
|
236798
|
+
const name = relative(actorsDir, actorDir).split(/[/\\]/).join("/");
|
|
236799
|
+
if (!name) {
|
|
236800
|
+
throw new InvalidInputError("entry.ts or entry.js found directly in the actors directory — it must be inside a named subfolder");
|
|
236801
|
+
}
|
|
236802
|
+
if (name.includes("/")) {
|
|
236803
|
+
throw new InvalidInputError(`Invalid actor name '${name}' — actors cannot be nested`);
|
|
236804
|
+
}
|
|
236805
|
+
validateActorName(name);
|
|
236806
|
+
if (names.has(name)) {
|
|
236807
|
+
throw new ConfigInvalidError(`Duplicate actor name "${name}" in ${actorsDir}`, actorsDir);
|
|
236808
|
+
}
|
|
236809
|
+
names.add(name);
|
|
236810
|
+
const filePaths = (await globby(BACKEND_FILE_GLOB, { cwd: actorDir, absolute: true })).sort();
|
|
236811
|
+
const entry = basename3(entryPath) === "entry.js" ? "entry.js" : "entry.ts";
|
|
236812
|
+
actors.push({
|
|
236813
|
+
name,
|
|
236814
|
+
entry,
|
|
236815
|
+
entryPath: join5(actorDir, entry),
|
|
236816
|
+
filePaths,
|
|
236817
|
+
source: { type: "project" }
|
|
236818
|
+
});
|
|
236819
|
+
}
|
|
236820
|
+
return actors;
|
|
236821
|
+
}
|
|
236822
|
+
// src/core/resources/actor/deploy.ts
|
|
236823
|
+
import { dirname as dirname7, relative as relative2 } from "node:path";
|
|
236824
|
+
function actorOperationError(name, error) {
|
|
236825
|
+
return {
|
|
236826
|
+
name,
|
|
236827
|
+
status: "error",
|
|
236828
|
+
error: error instanceof Error ? error.message : String(error),
|
|
236829
|
+
...error instanceof ApiError ? { statusCode: error.statusCode, requestId: error.requestId } : {}
|
|
236830
|
+
};
|
|
236831
|
+
}
|
|
236832
|
+
function describeActorResult(result) {
|
|
236833
|
+
if (result.status !== "error")
|
|
236834
|
+
return `${result.name}: ${result.status}`;
|
|
236835
|
+
const context = [
|
|
236836
|
+
result.statusCode === undefined ? undefined : `HTTP ${result.statusCode}`,
|
|
236837
|
+
result.requestId ? `request ${result.requestId}` : undefined
|
|
236838
|
+
].filter(Boolean).join(", ");
|
|
236839
|
+
return `${result.name}: error — ${result.error}${context ? ` (${context})` : ""}`;
|
|
236840
|
+
}
|
|
236841
|
+
async function deployOne(actor) {
|
|
236842
|
+
const start = Date.now();
|
|
236843
|
+
try {
|
|
236844
|
+
const actorDir = dirname7(actor.entryPath);
|
|
236845
|
+
const files = await Promise.all(actor.filePaths.map(async (filePath) => ({
|
|
236846
|
+
path: relative2(actorDir, filePath).split(/[/\\]/).join("/"),
|
|
236847
|
+
content: await readTextFile(filePath)
|
|
236848
|
+
})));
|
|
236849
|
+
const response = await deploySingleActor(actor.name, {
|
|
236850
|
+
entry: actor.entry,
|
|
236851
|
+
files
|
|
236852
|
+
});
|
|
236853
|
+
return { name: actor.name, ...response, durationMs: Date.now() - start };
|
|
236854
|
+
} catch (error) {
|
|
236855
|
+
return actorOperationError(actor.name, error);
|
|
236856
|
+
}
|
|
236857
|
+
}
|
|
236858
|
+
async function deployActorsSequentially(actors, options) {
|
|
236859
|
+
const results = [];
|
|
236860
|
+
for (const actor of actors) {
|
|
236861
|
+
options?.onStart?.(actor.name);
|
|
236862
|
+
const result = await deployOne(actor);
|
|
236863
|
+
results.push(result);
|
|
236864
|
+
options?.onResult?.(result);
|
|
236865
|
+
}
|
|
236866
|
+
return results;
|
|
236867
|
+
}
|
|
236868
|
+
// src/core/resources/actor/resource.ts
|
|
236869
|
+
var actorResource = {
|
|
236870
|
+
readAll: readAllActors,
|
|
236871
|
+
push: deployActorsSequentially
|
|
236872
|
+
};
|
|
236713
236873
|
// src/core/resources/agent/schema.ts
|
|
236714
236874
|
var EntityOperationSchema = _enum(["create", "update", "delete", "read"]);
|
|
236715
236875
|
var EntityToolConfigSchema = object({
|
|
@@ -236788,7 +236948,7 @@ async function fetchAgents() {
|
|
|
236788
236948
|
return result.data;
|
|
236789
236949
|
}
|
|
236790
236950
|
// src/core/resources/agent/config.ts
|
|
236791
|
-
import { join as
|
|
236951
|
+
import { join as join6, normalize } from "node:path";
|
|
236792
236952
|
import { isDeepStrictEqual } from "node:util";
|
|
236793
236953
|
async function readAgentFile(agentPath) {
|
|
236794
236954
|
const raw = await readJsonFile(agentPath);
|
|
@@ -236833,12 +236993,12 @@ async function readAllAgents(agentsDir) {
|
|
|
236833
236993
|
return [...nameToEntry.values()].map((e) => e.data);
|
|
236834
236994
|
}
|
|
236835
236995
|
function findAvailablePath(agentsDir, name, claimedPaths) {
|
|
236836
|
-
const base =
|
|
236996
|
+
const base = join6(agentsDir, `${name}.${CONFIG_FILE_EXTENSION}`);
|
|
236837
236997
|
if (!claimedPaths.has(base)) {
|
|
236838
236998
|
return base;
|
|
236839
236999
|
}
|
|
236840
237000
|
for (let i = 1;; i++) {
|
|
236841
|
-
const candidate =
|
|
237001
|
+
const candidate = join6(agentsDir, `${name}_${i}.${CONFIG_FILE_EXTENSION}`);
|
|
236842
237002
|
if (!claimedPaths.has(candidate)) {
|
|
236843
237003
|
return candidate;
|
|
236844
237004
|
}
|
|
@@ -236953,7 +237113,7 @@ async function pushAgentSkills(skills) {
|
|
|
236953
237113
|
}
|
|
236954
237114
|
// src/core/resources/agent-skill/config.ts
|
|
236955
237115
|
var import_front_matter = __toESM(require_front_matter(), 1);
|
|
236956
|
-
import { join as
|
|
237116
|
+
import { join as join7 } from "node:path";
|
|
236957
237117
|
|
|
236958
237118
|
// ../../node_modules/yaml/dist/index.js
|
|
236959
237119
|
var composer = require_composer();
|
|
@@ -237039,7 +237199,7 @@ async function writeAgentSkills(dir, remote) {
|
|
|
237039
237199
|
const deleted = [];
|
|
237040
237200
|
for (const skill of existing) {
|
|
237041
237201
|
if (!remoteNames.has(skill.name)) {
|
|
237042
|
-
await deleteFile(
|
|
237202
|
+
await deleteFile(join7(dir, `${skill.name}.md`));
|
|
237043
237203
|
deleted.push(skill.name);
|
|
237044
237204
|
}
|
|
237045
237205
|
}
|
|
@@ -237050,7 +237210,7 @@ async function writeAgentSkills(dir, remote) {
|
|
|
237050
237210
|
if (prev && prev.description === skill.description && prev.body === skill.body) {
|
|
237051
237211
|
continue;
|
|
237052
237212
|
}
|
|
237053
|
-
await writeFile(
|
|
237213
|
+
await writeFile(join7(dir, `${skill.name}.md`), serializeSkillFile(skill));
|
|
237054
237214
|
written.push(skill.name);
|
|
237055
237215
|
}
|
|
237056
237216
|
return { written, deleted };
|
|
@@ -237176,7 +237336,7 @@ async function pushAuthConfigToApi(config) {
|
|
|
237176
237336
|
return result.data.authConfig;
|
|
237177
237337
|
}
|
|
237178
237338
|
// src/core/resources/auth-config/config.ts
|
|
237179
|
-
import { join as
|
|
237339
|
+
import { join as join8 } from "node:path";
|
|
237180
237340
|
import { isDeepStrictEqual as isDeepStrictEqual2 } from "node:util";
|
|
237181
237341
|
var AUTH_CONFIG_FILENAME = `config.${CONFIG_FILE_EXTENSION}`;
|
|
237182
237342
|
var DEFAULT_AUTH_CONFIG = {
|
|
@@ -237192,7 +237352,7 @@ var DEFAULT_AUTH_CONFIG = {
|
|
|
237192
237352
|
useWorkspaceSSO: false
|
|
237193
237353
|
};
|
|
237194
237354
|
function getAuthConfigPath(authDir) {
|
|
237195
|
-
return
|
|
237355
|
+
return join8(authDir, AUTH_CONFIG_FILENAME);
|
|
237196
237356
|
}
|
|
237197
237357
|
async function readAuthConfig(authDir) {
|
|
237198
237358
|
const filePath = getAuthConfigPath(authDir);
|
|
@@ -237844,7 +238004,7 @@ async function removeStripe() {
|
|
|
237844
238004
|
return result.data;
|
|
237845
238005
|
}
|
|
237846
238006
|
// src/core/resources/connector/config.ts
|
|
237847
|
-
import { join as
|
|
238007
|
+
import { join as join9 } from "node:path";
|
|
237848
238008
|
import { isDeepStrictEqual as isDeepStrictEqual3 } from "node:util";
|
|
237849
238009
|
async function readConnectorFile(connectorPath) {
|
|
237850
238010
|
const parsed = await readJsonFile(connectorPath);
|
|
@@ -237905,7 +238065,7 @@ async function writeConnectors(connectorsDir, remoteConnectors) {
|
|
|
237905
238065
|
if (existing && isDeepStrictEqual3(existing.data, connector)) {
|
|
237906
238066
|
continue;
|
|
237907
238067
|
}
|
|
237908
|
-
const filePath = existing?.filePath ??
|
|
238068
|
+
const filePath = existing?.filePath ?? join9(connectorsDir, `${connector.type}.${CONFIG_FILE_EXTENSION}`);
|
|
237909
238069
|
await writeJsonFile(filePath, connector);
|
|
237910
238070
|
written.push(connector.type);
|
|
237911
238071
|
}
|
|
@@ -238511,7 +238671,7 @@ async function fetchFunctionLogs(functionName, filters = {}) {
|
|
|
238511
238671
|
return result.data;
|
|
238512
238672
|
}
|
|
238513
238673
|
// src/core/resources/function/config.ts
|
|
238514
|
-
import { basename as
|
|
238674
|
+
import { basename as basename4, dirname as dirname8, join as join10, relative as relative3, resolve as resolve2 } from "node:path";
|
|
238515
238675
|
async function readSharedFiles(functionsDir) {
|
|
238516
238676
|
const sharedDir = resolve2(functionsDir, "..", "shared");
|
|
238517
238677
|
if (!await pathExists(sharedDir)) {
|
|
@@ -238529,8 +238689,8 @@ async function readFunctionConfig(configPath) {
|
|
|
238529
238689
|
}
|
|
238530
238690
|
async function readFunction(configPath, sharedFiles) {
|
|
238531
238691
|
const config = await readFunctionConfig(configPath);
|
|
238532
|
-
const functionDir =
|
|
238533
|
-
const entryPath =
|
|
238692
|
+
const functionDir = dirname8(configPath);
|
|
238693
|
+
const entryPath = join10(functionDir, config.entry);
|
|
238534
238694
|
if (!await pathExists(entryPath)) {
|
|
238535
238695
|
throw new InvalidInputError(`Function entry file not found: ${entryPath} (referenced in ${configPath})`, {
|
|
238536
238696
|
hints: [{ message: "Check the 'entry' field in your function config" }]
|
|
@@ -238562,18 +238722,18 @@ async function readAllFunctions(functionsDir) {
|
|
|
238562
238722
|
absolute: true,
|
|
238563
238723
|
ignore: ENTRY_IGNORE_DOT_PATHS
|
|
238564
238724
|
});
|
|
238565
|
-
const configFilesDirs = new Set(configFiles.map((f) =>
|
|
238566
|
-
const entryFilesWithoutConfig = entryFiles.filter((entryFile) => !configFilesDirs.has(
|
|
238725
|
+
const configFilesDirs = new Set(configFiles.map((f) => dirname8(f)));
|
|
238726
|
+
const entryFilesWithoutConfig = entryFiles.filter((entryFile) => !configFilesDirs.has(dirname8(entryFile)));
|
|
238567
238727
|
const sharedFiles = await readSharedFiles(functionsDir);
|
|
238568
238728
|
const functionsFromConfig = await Promise.all(configFiles.map((configPath) => readFunction(configPath, sharedFiles)));
|
|
238569
238729
|
const functionsWithoutConfig = await Promise.all(entryFilesWithoutConfig.map(async (entryFile) => {
|
|
238570
|
-
const functionDir =
|
|
238730
|
+
const functionDir = dirname8(entryFile);
|
|
238571
238731
|
const filePaths = await globby(BACKEND_FILE_GLOB, {
|
|
238572
238732
|
cwd: functionDir,
|
|
238573
238733
|
absolute: true
|
|
238574
238734
|
});
|
|
238575
238735
|
const allFilePaths = [...new Set([...filePaths, ...sharedFiles])];
|
|
238576
|
-
const name =
|
|
238736
|
+
const name = relative3(functionsDir, functionDir).split(/[/\\]/).join("/");
|
|
238577
238737
|
if (!name) {
|
|
238578
238738
|
throw new InvalidInputError("entry.ts found directly in the functions directory — it must be inside a named subfolder", {
|
|
238579
238739
|
hints: [
|
|
@@ -238583,7 +238743,7 @@ async function readAllFunctions(functionsDir) {
|
|
|
238583
238743
|
]
|
|
238584
238744
|
});
|
|
238585
238745
|
}
|
|
238586
|
-
const entry =
|
|
238746
|
+
const entry = basename4(entryFile);
|
|
238587
238747
|
const functionData = {
|
|
238588
238748
|
name,
|
|
238589
238749
|
entry,
|
|
@@ -238610,17 +238770,17 @@ async function readAllFunctions(functionsDir) {
|
|
|
238610
238770
|
return functions;
|
|
238611
238771
|
}
|
|
238612
238772
|
// src/core/resources/function/deploy.ts
|
|
238613
|
-
import { dirname as
|
|
238773
|
+
import { dirname as dirname9, relative as relative4 } from "node:path";
|
|
238614
238774
|
async function loadFunctionCode(fn) {
|
|
238615
|
-
const functionDir =
|
|
238775
|
+
const functionDir = dirname9(fn.entryPath);
|
|
238616
238776
|
const resolvedFiles = await Promise.all(fn.filePaths.map(async (filePath) => {
|
|
238617
238777
|
const content = await readTextFile(filePath);
|
|
238618
|
-
const path =
|
|
238778
|
+
const path = relative4(functionDir, filePath).split(/[/\\]/).join("/");
|
|
238619
238779
|
return { path, content };
|
|
238620
238780
|
}));
|
|
238621
238781
|
return { ...fn, files: resolvedFiles };
|
|
238622
238782
|
}
|
|
238623
|
-
async function
|
|
238783
|
+
async function deployOne2(fn) {
|
|
238624
238784
|
const start = Date.now();
|
|
238625
238785
|
try {
|
|
238626
238786
|
const functionWithCode = await loadFunctionCode(fn);
|
|
@@ -238648,7 +238808,7 @@ async function deployFunctionsSequentially(functions, options) {
|
|
|
238648
238808
|
const results = [];
|
|
238649
238809
|
for (const fn of functions) {
|
|
238650
238810
|
options?.onStart?.([fn.name]);
|
|
238651
|
-
const result = await
|
|
238811
|
+
const result = await deployOne2(fn);
|
|
238652
238812
|
results.push(result);
|
|
238653
238813
|
options?.onResult?.(result);
|
|
238654
238814
|
}
|
|
@@ -238679,14 +238839,14 @@ async function pruneRemovedFunctions(localFunctionNames, options) {
|
|
|
238679
238839
|
return results;
|
|
238680
238840
|
}
|
|
238681
238841
|
// src/core/resources/function/pull.ts
|
|
238682
|
-
import { join as
|
|
238842
|
+
import { join as join11 } from "node:path";
|
|
238683
238843
|
import { isDeepStrictEqual as isDeepStrictEqual4 } from "node:util";
|
|
238684
238844
|
async function writeFunctions(functionsDir, functions) {
|
|
238685
238845
|
const written = [];
|
|
238686
238846
|
const skipped = [];
|
|
238687
238847
|
for (const fn of functions) {
|
|
238688
|
-
const functionDir =
|
|
238689
|
-
const configPath =
|
|
238848
|
+
const functionDir = join11(functionsDir, fn.name);
|
|
238849
|
+
const configPath = join11(functionDir, "function.jsonc");
|
|
238690
238850
|
if (await isFunctionUnchanged(functionDir, fn)) {
|
|
238691
238851
|
skipped.push(fn.name);
|
|
238692
238852
|
continue;
|
|
@@ -238700,7 +238860,7 @@ async function writeFunctions(functionsDir, functions) {
|
|
|
238700
238860
|
}
|
|
238701
238861
|
await writeJsonFile(configPath, config);
|
|
238702
238862
|
for (const file of fn.files) {
|
|
238703
|
-
await writeFile(
|
|
238863
|
+
await writeFile(join11(functionDir, file.path), file.content);
|
|
238704
238864
|
}
|
|
238705
238865
|
written.push(fn.name);
|
|
238706
238866
|
}
|
|
@@ -238710,7 +238870,7 @@ async function isFunctionUnchanged(functionDir, fn) {
|
|
|
238710
238870
|
if (!await pathExists(functionDir)) {
|
|
238711
238871
|
return false;
|
|
238712
238872
|
}
|
|
238713
|
-
const configPath =
|
|
238873
|
+
const configPath = join11(functionDir, "function.jsonc");
|
|
238714
238874
|
try {
|
|
238715
238875
|
const localConfig = await readJsonFile(configPath);
|
|
238716
238876
|
if (localConfig.entry !== fn.entry) {
|
|
@@ -238723,7 +238883,7 @@ async function isFunctionUnchanged(functionDir, fn) {
|
|
|
238723
238883
|
return false;
|
|
238724
238884
|
}
|
|
238725
238885
|
for (const file of fn.files) {
|
|
238726
|
-
const filePath =
|
|
238886
|
+
const filePath = join11(functionDir, file.path);
|
|
238727
238887
|
if (!await pathExists(filePath)) {
|
|
238728
238888
|
return false;
|
|
238729
238889
|
}
|
|
@@ -238895,10 +239055,17 @@ class ProjectConfigReader {
|
|
|
238895
239055
|
...pluginResources.functions
|
|
238896
239056
|
];
|
|
238897
239057
|
this.validateFunctionNames(functions, configPath);
|
|
239058
|
+
const functionNames = new Set(functions.map((fn) => fn.name));
|
|
239059
|
+
for (const actor of localResources.actors) {
|
|
239060
|
+
if (functionNames.has(actor.name)) {
|
|
239061
|
+
throw new ConfigInvalidError(`'${actor.name}' exists as both a backend function and an actor`, configPath);
|
|
239062
|
+
}
|
|
239063
|
+
}
|
|
238898
239064
|
return {
|
|
238899
239065
|
project,
|
|
238900
239066
|
entities,
|
|
238901
239067
|
functions,
|
|
239068
|
+
actors: localResources.actors,
|
|
238902
239069
|
agents: localResources.agents,
|
|
238903
239070
|
agentSkills: localResources.agentSkills,
|
|
238904
239071
|
connectors: localResources.connectors,
|
|
@@ -238926,17 +239093,34 @@ class ProjectConfigReader {
|
|
|
238926
239093
|
}
|
|
238927
239094
|
return result.data;
|
|
238928
239095
|
}
|
|
238929
|
-
async readProjectResources(configPath, project) {
|
|
238930
|
-
const configDir =
|
|
238931
|
-
const [
|
|
238932
|
-
|
|
238933
|
-
|
|
238934
|
-
|
|
238935
|
-
|
|
238936
|
-
|
|
238937
|
-
|
|
239096
|
+
async readProjectResources(configPath, project, includeActors = true) {
|
|
239097
|
+
const configDir = dirname10(configPath);
|
|
239098
|
+
const [
|
|
239099
|
+
entities,
|
|
239100
|
+
functions,
|
|
239101
|
+
actors,
|
|
239102
|
+
agents,
|
|
239103
|
+
agentSkills,
|
|
239104
|
+
connectors,
|
|
239105
|
+
authConfig
|
|
239106
|
+
] = await Promise.all([
|
|
239107
|
+
entityResource.readAll(join12(configDir, project.entitiesDir)),
|
|
239108
|
+
functionResource.readAll(join12(configDir, project.functionsDir)),
|
|
239109
|
+
includeActors ? actorResource.readAll(join12(configDir, project.actorsDir)) : Promise.resolve([]),
|
|
239110
|
+
agentResource.readAll(join12(configDir, project.agentsDir)),
|
|
239111
|
+
agentSkillResource.readAll(join12(configDir, project.agentSkillsDir)),
|
|
239112
|
+
connectorResource.readAll(join12(configDir, project.connectorsDir)),
|
|
239113
|
+
authConfigResource.readAll(join12(configDir, project.authDir))
|
|
238938
239114
|
]);
|
|
238939
|
-
return {
|
|
239115
|
+
return {
|
|
239116
|
+
entities,
|
|
239117
|
+
functions,
|
|
239118
|
+
actors,
|
|
239119
|
+
agents,
|
|
239120
|
+
agentSkills,
|
|
239121
|
+
connectors,
|
|
239122
|
+
authConfig
|
|
239123
|
+
};
|
|
238940
239124
|
}
|
|
238941
239125
|
assertPluginProjectDoesNotLoadPlugins(project, configPath) {
|
|
238942
239126
|
if (project.plugin && project.plugins.length > 0) {
|
|
@@ -238957,7 +239141,7 @@ class ProjectConfigReader {
|
|
|
238957
239141
|
this.pluginSourceByNamespace.set(namespace, source);
|
|
238958
239142
|
}
|
|
238959
239143
|
async readPluginConfig(plugin, hostConfigPath) {
|
|
238960
|
-
const pluginRoot = resolvePluginRoot(plugin.source,
|
|
239144
|
+
const pluginRoot = resolvePluginRoot(plugin.source, dirname10(hostConfigPath));
|
|
238961
239145
|
const { configPath } = await this.findConfigOrThrow(pluginRoot);
|
|
238962
239146
|
const project = await this.readConfigFile(configPath);
|
|
238963
239147
|
const namespace = requirePluginNamespace(project, plugin.source, configPath);
|
|
@@ -238965,10 +239149,11 @@ class ProjectConfigReader {
|
|
|
238965
239149
|
return { configPath, namespace, project, source: plugin.source };
|
|
238966
239150
|
}
|
|
238967
239151
|
async readPluginResources(project, configPath, namespace) {
|
|
238968
|
-
const resources = await this.readProjectResources(configPath, project);
|
|
239152
|
+
const resources = await this.readProjectResources(configPath, project, false);
|
|
238969
239153
|
return {
|
|
238970
239154
|
entities: markPluginEntities(resources.entities, namespace),
|
|
238971
239155
|
functions: namespacePluginFunctions(resources.functions, namespace),
|
|
239156
|
+
actors: [],
|
|
238972
239157
|
agents: [],
|
|
238973
239158
|
agentSkills: [],
|
|
238974
239159
|
connectors: [],
|
|
@@ -239007,6 +239192,7 @@ class ProjectConfigReader {
|
|
|
239007
239192
|
return {
|
|
239008
239193
|
entities,
|
|
239009
239194
|
functions,
|
|
239195
|
+
actors: [],
|
|
239010
239196
|
agents: [],
|
|
239011
239197
|
agentSkills: [],
|
|
239012
239198
|
connectors: [],
|
|
@@ -239041,12 +239227,12 @@ async function readProjectSettings(projectRoot) {
|
|
|
239041
239227
|
// src/core/project/template.ts
|
|
239042
239228
|
var import_ejs = __toESM(require_ejs(), 1);
|
|
239043
239229
|
var import_front_matter2 = __toESM(require_front_matter(), 1);
|
|
239044
|
-
import { dirname as
|
|
239230
|
+
import { dirname as dirname11, join as join14 } from "node:path";
|
|
239045
239231
|
|
|
239046
239232
|
// src/core/assets.ts
|
|
239047
239233
|
import { cpSync, existsSync } from "node:fs";
|
|
239048
239234
|
import { homedir as homedir2 } from "node:os";
|
|
239049
|
-
import { join as
|
|
239235
|
+
import { join as join13 } from "node:path";
|
|
239050
239236
|
// package.json
|
|
239051
239237
|
var package_default = {
|
|
239052
239238
|
name: "base44",
|
|
@@ -239153,21 +239339,21 @@ var package_default = {
|
|
|
239153
239339
|
};
|
|
239154
239340
|
|
|
239155
239341
|
// src/core/assets.ts
|
|
239156
|
-
var ASSETS_DIR =
|
|
239342
|
+
var ASSETS_DIR = join13(homedir2(), ".base44", "assets", package_default.version);
|
|
239157
239343
|
function getTemplatesDir() {
|
|
239158
|
-
return
|
|
239344
|
+
return join13(ASSETS_DIR, "templates");
|
|
239159
239345
|
}
|
|
239160
239346
|
function getTemplatesIndexPath() {
|
|
239161
|
-
return
|
|
239347
|
+
return join13(ASSETS_DIR, "templates", "templates.json");
|
|
239162
239348
|
}
|
|
239163
239349
|
function getBackendRuntimeDir() {
|
|
239164
|
-
return
|
|
239350
|
+
return join13(ASSETS_DIR, "backend-runtime");
|
|
239165
239351
|
}
|
|
239166
239352
|
function getDenoWrapperPath() {
|
|
239167
|
-
return
|
|
239353
|
+
return join13(getBackendRuntimeDir(), "main.ts");
|
|
239168
239354
|
}
|
|
239169
239355
|
function getExecWrapperPath() {
|
|
239170
|
-
return
|
|
239356
|
+
return join13(getBackendRuntimeDir(), "exec.ts");
|
|
239171
239357
|
}
|
|
239172
239358
|
function ensureNpmAssets(sourceDir) {
|
|
239173
239359
|
if (existsSync(ASSETS_DIR) && existsSync(getBackendRuntimeDir()))
|
|
@@ -239189,7 +239375,7 @@ async function listTemplates() {
|
|
|
239189
239375
|
}
|
|
239190
239376
|
async function renderTemplate(template, destPath, data, options = {}) {
|
|
239191
239377
|
const { skipExisting = false } = options;
|
|
239192
|
-
const templateDir =
|
|
239378
|
+
const templateDir = join14(getTemplatesDir(), template.path);
|
|
239193
239379
|
const files = await globby("**/*", {
|
|
239194
239380
|
cwd: templateDir,
|
|
239195
239381
|
dot: true,
|
|
@@ -239197,20 +239383,20 @@ async function renderTemplate(template, destPath, data, options = {}) {
|
|
|
239197
239383
|
});
|
|
239198
239384
|
const skipped = [];
|
|
239199
239385
|
for (const file of files) {
|
|
239200
|
-
const srcPath =
|
|
239386
|
+
const srcPath = join14(templateDir, file);
|
|
239201
239387
|
try {
|
|
239202
239388
|
if (file.endsWith(".ejs")) {
|
|
239203
239389
|
const rendered = await import_ejs.default.renderFile(srcPath, data);
|
|
239204
239390
|
const { attributes, body } = import_front_matter2.default(rendered);
|
|
239205
|
-
const destFile = attributes.outputFileName ?
|
|
239206
|
-
const destFilePath =
|
|
239391
|
+
const destFile = attributes.outputFileName ? join14(dirname11(file), attributes.outputFileName) : file.replace(/\.ejs$/, "");
|
|
239392
|
+
const destFilePath = join14(destPath, destFile);
|
|
239207
239393
|
if (skipExisting && await pathExists(destFilePath)) {
|
|
239208
239394
|
skipped.push(destFile);
|
|
239209
239395
|
continue;
|
|
239210
239396
|
}
|
|
239211
239397
|
await writeFile(destFilePath, body);
|
|
239212
239398
|
} else {
|
|
239213
|
-
const destFilePath =
|
|
239399
|
+
const destFilePath = join14(destPath, file);
|
|
239214
239400
|
if (skipExisting && await pathExists(destFilePath)) {
|
|
239215
239401
|
skipped.push(file);
|
|
239216
239402
|
continue;
|
|
@@ -239364,7 +239550,7 @@ async function getSiteFilePaths(outputDir) {
|
|
|
239364
239550
|
// src/core/site/deploy.ts
|
|
239365
239551
|
import { randomUUID } from "node:crypto";
|
|
239366
239552
|
import { tmpdir } from "node:os";
|
|
239367
|
-
import { join as
|
|
239553
|
+
import { join as join15 } from "node:path";
|
|
239368
239554
|
async function deploySite(siteOutputDir) {
|
|
239369
239555
|
if (!await pathExists(siteOutputDir)) {
|
|
239370
239556
|
throw new InvalidInputError(`Output directory does not exist: ${siteOutputDir}. Make sure to build your project first.`, {
|
|
@@ -239385,7 +239571,7 @@ async function deploySite(siteOutputDir) {
|
|
|
239385
239571
|
]
|
|
239386
239572
|
});
|
|
239387
239573
|
}
|
|
239388
|
-
const archivePath =
|
|
239574
|
+
const archivePath = join15(tmpdir(), `base44-site-${randomUUID()}.tar.gz`);
|
|
239389
239575
|
try {
|
|
239390
239576
|
await createArchive(siteOutputDir, archivePath);
|
|
239391
239577
|
return await uploadSite(archivePath);
|
|
@@ -239402,13 +239588,13 @@ async function createArchive(pathToArchive, targetArchivePath) {
|
|
|
239402
239588
|
}
|
|
239403
239589
|
// src/core/site/deployment.ts
|
|
239404
239590
|
import { readFile as readFile3 } from "node:fs/promises";
|
|
239405
|
-
import { join as
|
|
239591
|
+
import { join as join18 } from "node:path";
|
|
239406
239592
|
|
|
239407
239593
|
// src/core/site/manifest.ts
|
|
239408
239594
|
import { createHash } from "node:crypto";
|
|
239409
239595
|
import { createReadStream } from "node:fs";
|
|
239410
239596
|
import { stat } from "node:fs/promises";
|
|
239411
|
-
import { basename as
|
|
239597
|
+
import { basename as basename5, extname, join as join16 } from "node:path";
|
|
239412
239598
|
var MAX_ASSET_COUNT = 1e5;
|
|
239413
239599
|
var ASSETS_IGNORE_FILE = ".assetsignore";
|
|
239414
239600
|
var ALWAYS_IGNORED = new Set([
|
|
@@ -239466,12 +239652,12 @@ async function buildAssetManifest(assetsDir, appId) {
|
|
|
239466
239652
|
followSymbolicLinks: false,
|
|
239467
239653
|
ignoreFiles: [ASSETS_IGNORE_FILE]
|
|
239468
239654
|
});
|
|
239469
|
-
const relativeFilePaths = found.filter((path) => !ALWAYS_IGNORED.has(
|
|
239655
|
+
const relativeFilePaths = found.filter((path) => !ALWAYS_IGNORED.has(basename5(path)));
|
|
239470
239656
|
if (relativeFilePaths.length > MAX_ASSET_COUNT) {
|
|
239471
239657
|
throw new InvalidInputError(`Too many static assets: found ${relativeFilePaths.length}, the limit is ${MAX_ASSET_COUNT} files.`);
|
|
239472
239658
|
}
|
|
239473
239659
|
for (const relativePath of relativeFilePaths.sort()) {
|
|
239474
|
-
const absolutePath =
|
|
239660
|
+
const absolutePath = join16(assetsDir, ...relativePath.split("/"));
|
|
239475
239661
|
const { size } = await stat(absolutePath);
|
|
239476
239662
|
const hash = await hashAssetFile(appId, absolutePath);
|
|
239477
239663
|
manifest[`/${relativePath}`] = { hash, size };
|
|
@@ -239489,7 +239675,7 @@ async function buildAssetManifest(assetsDir, appId) {
|
|
|
239489
239675
|
|
|
239490
239676
|
// src/core/site/modules.ts
|
|
239491
239677
|
import { stat as stat2 } from "node:fs/promises";
|
|
239492
|
-
import { relative as
|
|
239678
|
+
import { relative as relative5, resolve as resolve3, sep } from "node:path";
|
|
239493
239679
|
var MAX_TOTAL_MODULE_BYTES = 40 * 1024 * 1024;
|
|
239494
239680
|
var MODULE_IGNORE = ["wrangler.json", ".dev.vars"];
|
|
239495
239681
|
var RULE_TYPE_TO_MODULE_TYPE = {
|
|
@@ -239509,7 +239695,7 @@ async function collectModules(config) {
|
|
|
239509
239695
|
});
|
|
239510
239696
|
}
|
|
239511
239697
|
const modulesByName = new Map;
|
|
239512
|
-
const entryName = toPosix(
|
|
239698
|
+
const entryName = toPosix(relative5(config.configDir, entryPath));
|
|
239513
239699
|
modulesByName.set(entryName, {
|
|
239514
239700
|
name: entryName,
|
|
239515
239701
|
absolutePath: entryPath,
|
|
@@ -239518,7 +239704,7 @@ async function collectModules(config) {
|
|
|
239518
239704
|
});
|
|
239519
239705
|
const ignore = [...MODULE_IGNORE];
|
|
239520
239706
|
if (config.assetsDirectory?.startsWith(config.configDir + sep)) {
|
|
239521
|
-
ignore.push(`${toPosix(
|
|
239707
|
+
ignore.push(`${toPosix(relative5(config.configDir, config.assetsDirectory))}/**`);
|
|
239522
239708
|
}
|
|
239523
239709
|
for (const rule of config.rules) {
|
|
239524
239710
|
const type = RULE_TYPE_TO_MODULE_TYPE[rule.type];
|
|
@@ -239822,8 +240008,8 @@ async function uploadPresignedAsset(upload, assets) {
|
|
|
239822
240008
|
}
|
|
239823
240009
|
|
|
239824
240010
|
// src/core/site/wrangler-config.ts
|
|
239825
|
-
import { dirname as
|
|
239826
|
-
var WRANGLER_REDIRECT_PATH =
|
|
240011
|
+
import { dirname as dirname12, join as join17, resolve as resolve4 } from "node:path";
|
|
240012
|
+
var WRANGLER_REDIRECT_PATH = join17(".wrangler", "deploy", "config.json");
|
|
239827
240013
|
var RedirectConfigSchema = looseObject({
|
|
239828
240014
|
configPath: string2().min(1)
|
|
239829
240015
|
});
|
|
@@ -239845,7 +240031,7 @@ var WranglerConfigSchema = looseObject({
|
|
|
239845
240031
|
upload_source_maps: boolean2().optional()
|
|
239846
240032
|
});
|
|
239847
240033
|
async function detectFullStackArtifact(projectRoot) {
|
|
239848
|
-
const redirectPath =
|
|
240034
|
+
const redirectPath = join17(projectRoot, WRANGLER_REDIRECT_PATH);
|
|
239849
240035
|
return await pathExists(redirectPath) ? redirectPath : null;
|
|
239850
240036
|
}
|
|
239851
240037
|
async function resolveWranglerConfig(redirectPath) {
|
|
@@ -239859,7 +240045,7 @@ async function resolveWranglerConfig(redirectPath) {
|
|
|
239859
240045
|
if (config.no_bundle !== true) {
|
|
239860
240046
|
throw new InvalidInputError("This framework's output requires bundling; not yet supported. Base44 only deploys pre-bundled Workers output (no_bundle: true).");
|
|
239861
240047
|
}
|
|
239862
|
-
const configDir =
|
|
240048
|
+
const configDir = dirname12(configPath);
|
|
239863
240049
|
const assetsDirectory = config.assets?.directory ? resolve4(configDir, config.assets.directory) : null;
|
|
239864
240050
|
return {
|
|
239865
240051
|
configPath,
|
|
@@ -239882,7 +240068,7 @@ async function resolveRedirectedConfigPath(redirectPath) {
|
|
|
239882
240068
|
if (!result.success) {
|
|
239883
240069
|
throw new ConfigInvalidError(`Invalid deploy redirect file: ${prettifyError(result.error)}`, redirectPath);
|
|
239884
240070
|
}
|
|
239885
|
-
const configPath = resolve4(
|
|
240071
|
+
const configPath = resolve4(dirname12(redirectPath), result.data.configPath);
|
|
239886
240072
|
if (!await pathExists(configPath)) {
|
|
239887
240073
|
throw new ConfigInvalidError(`Wrangler config referenced by ${redirectPath} does not exist: ${configPath}`, redirectPath, {
|
|
239888
240074
|
hints: [{ message: "Rebuild the project to regenerate the artifact" }]
|
|
@@ -239947,7 +240133,7 @@ async function readIndexHtml(assetsDir, assets) {
|
|
|
239947
240133
|
if (!assetsDir || !assets.manifest["/index.html"]) {
|
|
239948
240134
|
throw new InvalidInputError(`No index.html found in "${assetsDir ?? "the site output directory"}" — a static site needs one at the output directory root.`);
|
|
239949
240135
|
}
|
|
239950
|
-
return new Uint8Array(await readFile3(
|
|
240136
|
+
return new Uint8Array(await readFile3(join18(assetsDir, "index.html")));
|
|
239951
240137
|
}
|
|
239952
240138
|
function buildAssetsConfig(assetsConfig, progress) {
|
|
239953
240139
|
if (!assetsConfig)
|
|
@@ -246499,6 +246685,7 @@ function hasResourcesToDeploy(projectData) {
|
|
|
246499
246685
|
project,
|
|
246500
246686
|
entities,
|
|
246501
246687
|
functions,
|
|
246688
|
+
actors,
|
|
246502
246689
|
agents,
|
|
246503
246690
|
agentSkills,
|
|
246504
246691
|
connectors,
|
|
@@ -246507,18 +246694,20 @@ function hasResourcesToDeploy(projectData) {
|
|
|
246507
246694
|
const hasSite = Boolean(project.site?.outputDirectory);
|
|
246508
246695
|
const hasEntities = entities.length > 0;
|
|
246509
246696
|
const hasFunctions = functions.length > 0;
|
|
246697
|
+
const hasActors = actors.length > 0;
|
|
246510
246698
|
const hasAgents = agents.length > 0;
|
|
246511
246699
|
const hasAgentSkills = agentSkills.length > 0;
|
|
246512
246700
|
const hasConnectors = connectors.length > 0;
|
|
246513
246701
|
const hasAuthConfig = authConfig.length > 0;
|
|
246514
246702
|
const hasVisibility = Boolean(project.visibility);
|
|
246515
|
-
return hasEntities || hasFunctions || hasAgents || hasAgentSkills || hasConnectors || hasAuthConfig || hasVisibility || hasSite;
|
|
246703
|
+
return hasEntities || hasFunctions || hasActors || hasAgents || hasAgentSkills || hasConnectors || hasAuthConfig || hasVisibility || hasSite;
|
|
246516
246704
|
}
|
|
246517
246705
|
async function deployAll(projectData, options) {
|
|
246518
246706
|
const {
|
|
246519
246707
|
project,
|
|
246520
246708
|
entities,
|
|
246521
246709
|
functions,
|
|
246710
|
+
actors,
|
|
246522
246711
|
agents,
|
|
246523
246712
|
agentSkills,
|
|
246524
246713
|
connectors,
|
|
@@ -246529,10 +246718,33 @@ async function deployAll(projectData, options) {
|
|
|
246529
246718
|
options?.onVisibilitySet?.(project.visibility);
|
|
246530
246719
|
}
|
|
246531
246720
|
await entityResource.push(entities);
|
|
246532
|
-
await deployFunctionsSequentially(functions, {
|
|
246721
|
+
const functionResults = await deployFunctionsSequentially(functions, {
|
|
246533
246722
|
onStart: options?.onFunctionStart,
|
|
246534
246723
|
onResult: options?.onFunctionResult
|
|
246535
246724
|
});
|
|
246725
|
+
const completedStages = [
|
|
246726
|
+
...project.visibility ? [`Visibility set to ${project.visibility}`] : [],
|
|
246727
|
+
...entities.length ? [`Entities synced: ${entities.length}`] : []
|
|
246728
|
+
];
|
|
246729
|
+
const functionDetails = functionResults.map((result) => `Function ${result.name}: ${result.status}${result.error ? ` — ${result.error}` : ""}`);
|
|
246730
|
+
if (functionResults.some((result) => result.status === "error")) {
|
|
246731
|
+
throw new ResourceDeploymentError("Function deployment failed; remaining deploy stages were not run", {
|
|
246732
|
+
details: [...completedStages, ...functionDetails]
|
|
246733
|
+
});
|
|
246734
|
+
}
|
|
246735
|
+
const actorResults = await deployActorsSequentially(actors, {
|
|
246736
|
+
onStart: options?.onActorStart,
|
|
246737
|
+
onResult: options?.onActorResult
|
|
246738
|
+
});
|
|
246739
|
+
if (actorResults.some((result) => result.status === "error")) {
|
|
246740
|
+
throw new ResourceDeploymentError("Actor deployment failed; remaining deploy stages were not run", {
|
|
246741
|
+
details: [
|
|
246742
|
+
...completedStages,
|
|
246743
|
+
...functionDetails,
|
|
246744
|
+
...actorResults.map(describeActorResult)
|
|
246745
|
+
]
|
|
246746
|
+
});
|
|
246747
|
+
}
|
|
246536
246748
|
await agentSkillResource.push(agentSkills);
|
|
246537
246749
|
await agentResource.push(agents);
|
|
246538
246750
|
await authConfigResource.push(authConfig);
|
|
@@ -247267,6 +247479,118 @@ function formatYaml(data, options = {}) {
|
|
|
247267
247479
|
const replacer = stripEmpty ? stripEmptyReplacer : undefined;
|
|
247268
247480
|
return $stringify(data, replacer, { indent: YAML_INDENT }).trimEnd();
|
|
247269
247481
|
}
|
|
247482
|
+
// src/cli/commands/actors/delete.ts
|
|
247483
|
+
async function deleteActorsAction({ log, jsonMode, runTask }, rawNames) {
|
|
247484
|
+
const names = [...new Set(parseNames(rawNames))];
|
|
247485
|
+
if (!names.length)
|
|
247486
|
+
throw new InvalidInputError("At least one actor name is required");
|
|
247487
|
+
names.forEach(validateActorName);
|
|
247488
|
+
const results = [];
|
|
247489
|
+
for (const name of names) {
|
|
247490
|
+
try {
|
|
247491
|
+
await runTask(`Deleting ${name}...`, () => deleteSingleActor(name), {
|
|
247492
|
+
successMessage: `${name} deleted`,
|
|
247493
|
+
errorMessage: `Failed to delete ${name}`
|
|
247494
|
+
});
|
|
247495
|
+
results.push({ name, status: "deleted" });
|
|
247496
|
+
} catch (error) {
|
|
247497
|
+
if (error instanceof ApiError && error.statusCode === 404) {
|
|
247498
|
+
results.push({ name, status: "not_found" });
|
|
247499
|
+
log.info(`${name} not found`);
|
|
247500
|
+
} else {
|
|
247501
|
+
const result = actorOperationError(name, error);
|
|
247502
|
+
results.push(result);
|
|
247503
|
+
log.error(describeActorResult(result));
|
|
247504
|
+
}
|
|
247505
|
+
}
|
|
247506
|
+
}
|
|
247507
|
+
const summary = {
|
|
247508
|
+
deleted: results.filter((result) => result.status === "deleted").length,
|
|
247509
|
+
notFound: results.filter((result) => result.status === "not_found").length,
|
|
247510
|
+
failed: results.filter((result) => result.status === "error").length
|
|
247511
|
+
};
|
|
247512
|
+
if (summary.failed)
|
|
247513
|
+
throw new ResourceDeploymentError("Actor deletion failed", {
|
|
247514
|
+
details: results.map(describeActorResult)
|
|
247515
|
+
});
|
|
247516
|
+
return {
|
|
247517
|
+
outroMessage: names.length === 1 ? `Actor "${names[0]}" ${summary.deleted ? "deleted" : "not found"}` : `${summary.deleted} deleted, ${summary.notFound} not found`,
|
|
247518
|
+
stdout: jsonMode ? `${JSON.stringify({ actors: results, summary })}
|
|
247519
|
+
` : undefined
|
|
247520
|
+
};
|
|
247521
|
+
}
|
|
247522
|
+
function getDeleteCommand() {
|
|
247523
|
+
return new Base44Command("delete").description("Delete deployed actors").argument("[names...]", "Actor names to delete (required)").action(deleteActorsAction);
|
|
247524
|
+
}
|
|
247525
|
+
|
|
247526
|
+
// src/cli/commands/functions/formatDeployResult.ts
|
|
247527
|
+
function formatDuration(ms) {
|
|
247528
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
247529
|
+
}
|
|
247530
|
+
function formatDeployResult(result, log) {
|
|
247531
|
+
const label = result.name.padEnd(25);
|
|
247532
|
+
if (result.status === "deployed") {
|
|
247533
|
+
const timing = result.durationMs ? theme.styles.dim(` (${formatDuration(result.durationMs)})`) : "";
|
|
247534
|
+
log.success(`${label} deployed${timing}`);
|
|
247535
|
+
} else if (result.status === "unchanged") {
|
|
247536
|
+
log.success(`${label} unchanged`);
|
|
247537
|
+
} else {
|
|
247538
|
+
log.error(`${label} error: ${result.error}`);
|
|
247539
|
+
}
|
|
247540
|
+
}
|
|
247541
|
+
|
|
247542
|
+
// src/cli/commands/actors/deploy.ts
|
|
247543
|
+
async function deployActorsAction({ log, jsonMode }, rawNames) {
|
|
247544
|
+
const names = [...new Set(parseNames(rawNames))];
|
|
247545
|
+
if (rawNames.length && !names.length)
|
|
247546
|
+
throw new InvalidInputError("At least one actor name is required");
|
|
247547
|
+
names.forEach(validateActorName);
|
|
247548
|
+
const { actors, project } = await readProjectConfig();
|
|
247549
|
+
const notFound = names.filter((name) => !actors.some((actor) => actor.name === name));
|
|
247550
|
+
if (notFound.length)
|
|
247551
|
+
throw new InvalidInputError(`Actor not found in project: ${notFound.join(", ")}`);
|
|
247552
|
+
const selected = names.length ? actors.filter((actor) => names.includes(actor.name)) : actors;
|
|
247553
|
+
let completed = 0;
|
|
247554
|
+
if (selected.length)
|
|
247555
|
+
log.info(`Found ${selected.length} ${selected.length === 1 ? "actor" : "actors"} to deploy`);
|
|
247556
|
+
const results = await deployActorsSequentially(selected, {
|
|
247557
|
+
onStart: (name) => log.step(theme.styles.dim(`[${completed + 1}/${selected.length}] Deploying ${name}...`)),
|
|
247558
|
+
onResult: (result) => {
|
|
247559
|
+
completed++;
|
|
247560
|
+
formatDeployResult(result, log);
|
|
247561
|
+
if (result.status !== "error")
|
|
247562
|
+
for (const warning of result.warnings)
|
|
247563
|
+
log.warn(`${result.name}: ${warning}`);
|
|
247564
|
+
}
|
|
247565
|
+
});
|
|
247566
|
+
const summary = {
|
|
247567
|
+
deployed: results.filter((result) => result.status === "deployed").length,
|
|
247568
|
+
unchanged: results.filter((result) => result.status === "unchanged").length,
|
|
247569
|
+
failed: results.filter((result) => result.status === "error").length
|
|
247570
|
+
};
|
|
247571
|
+
const message = Object.entries(summary).filter(([, count]) => count > 0).map(([status, count]) => `${count} ${status}`).join(", ");
|
|
247572
|
+
if (summary.failed) {
|
|
247573
|
+
throw new ResourceDeploymentError(message, {
|
|
247574
|
+
details: results.map(describeActorResult)
|
|
247575
|
+
});
|
|
247576
|
+
}
|
|
247577
|
+
return {
|
|
247578
|
+
outroMessage: message || `No actors found. Create actors in the '${project.actorsDir}' directory.`,
|
|
247579
|
+
stdout: jsonMode ? `${JSON.stringify({ actors: results, summary })}
|
|
247580
|
+
` : undefined
|
|
247581
|
+
};
|
|
247582
|
+
}
|
|
247583
|
+
function getDeployCommand() {
|
|
247584
|
+
return new Base44Command("deploy").description("Deploy actors to Base44").argument("[names...]", "Actor names to deploy (deploys all if omitted)").action(deployActorsAction);
|
|
247585
|
+
}
|
|
247586
|
+
|
|
247587
|
+
// src/cli/commands/actors/index.ts
|
|
247588
|
+
function getActorsCommand() {
|
|
247589
|
+
return new Command2("actors").description("Manage realtime actors").addCommand(getDeployCommand()).addCommand(getDeleteCommand());
|
|
247590
|
+
}
|
|
247591
|
+
|
|
247592
|
+
// src/cli/commands/agent-skills/pull.ts
|
|
247593
|
+
import { dirname as dirname13, join as join19 } from "node:path";
|
|
247270
247594
|
// src/core/utils/dependencies.ts
|
|
247271
247595
|
import { spawnSync as spawnSync2 } from "node:child_process";
|
|
247272
247596
|
function verifyDenoInstalled(context) {
|
|
@@ -247355,7 +247679,7 @@ async function pullAction({
|
|
|
247355
247679
|
runTask
|
|
247356
247680
|
}) {
|
|
247357
247681
|
const { project } = await readProjectConfig();
|
|
247358
|
-
const dir =
|
|
247682
|
+
const dir = join19(dirname13(project.configPath), project.agentSkillsDir);
|
|
247359
247683
|
const remote = await runTask("Fetching agent skills from Base44", () => fetchAgentSkills(), {
|
|
247360
247684
|
successMessage: "Agent skills fetched successfully",
|
|
247361
247685
|
errorMessage: "Failed to fetch agent skills"
|
|
@@ -247411,14 +247735,14 @@ function getAgentSkillsCommand() {
|
|
|
247411
247735
|
}
|
|
247412
247736
|
|
|
247413
247737
|
// src/cli/commands/agents/pull.ts
|
|
247414
|
-
import { dirname as
|
|
247738
|
+
import { dirname as dirname14, join as join20 } from "node:path";
|
|
247415
247739
|
async function pullAgentsAction({
|
|
247416
247740
|
log,
|
|
247417
247741
|
runTask
|
|
247418
247742
|
}) {
|
|
247419
247743
|
const { project } = await readProjectConfig();
|
|
247420
|
-
const configDir =
|
|
247421
|
-
const agentsDir =
|
|
247744
|
+
const configDir = dirname14(project.configPath);
|
|
247745
|
+
const agentsDir = join20(configDir, project.agentsDir);
|
|
247422
247746
|
const remoteAgents = await runTask("Fetching agents from Base44", async () => {
|
|
247423
247747
|
return await fetchAgents();
|
|
247424
247748
|
}, {
|
|
@@ -247488,12 +247812,12 @@ function getAgentsCommand() {
|
|
|
247488
247812
|
}
|
|
247489
247813
|
|
|
247490
247814
|
// src/cli/commands/auth/password-login.ts
|
|
247491
|
-
import { dirname as
|
|
247815
|
+
import { dirname as dirname15, join as join21 } from "node:path";
|
|
247492
247816
|
async function passwordLoginAction({ log, runTask }, action) {
|
|
247493
247817
|
const shouldEnable = action === "enable";
|
|
247494
247818
|
const { project } = await readProjectConfig();
|
|
247495
|
-
const configDir =
|
|
247496
|
-
const authDir =
|
|
247819
|
+
const configDir = dirname15(project.configPath);
|
|
247820
|
+
const authDir = join21(configDir, project.authDir);
|
|
247497
247821
|
const updated = await runTask("Updating local auth config", async () => {
|
|
247498
247822
|
const current = await readAuthConfig(authDir) ?? DEFAULT_AUTH_CONFIG;
|
|
247499
247823
|
const merged = { ...current, enableUsernamePassword: shouldEnable };
|
|
@@ -247513,14 +247837,14 @@ function getPasswordLoginCommand() {
|
|
|
247513
247837
|
}
|
|
247514
247838
|
|
|
247515
247839
|
// src/cli/commands/auth/pull.ts
|
|
247516
|
-
import { dirname as
|
|
247840
|
+
import { dirname as dirname16, join as join22 } from "node:path";
|
|
247517
247841
|
async function pullAuthAction({
|
|
247518
247842
|
log,
|
|
247519
247843
|
runTask
|
|
247520
247844
|
}) {
|
|
247521
247845
|
const { project } = await readProjectConfig();
|
|
247522
|
-
const configDir =
|
|
247523
|
-
const authDir =
|
|
247846
|
+
const configDir = dirname16(project.configPath);
|
|
247847
|
+
const authDir = join22(configDir, project.authDir);
|
|
247524
247848
|
const remoteConfig = await runTask("Fetching auth config from Base44", async () => {
|
|
247525
247849
|
return await pullAuthConfig();
|
|
247526
247850
|
}, {
|
|
@@ -247584,7 +247908,7 @@ function getAuthPushCommand() {
|
|
|
247584
247908
|
}
|
|
247585
247909
|
|
|
247586
247910
|
// src/cli/commands/auth/social-login.ts
|
|
247587
|
-
import { dirname as
|
|
247911
|
+
import { dirname as dirname17, join as join23, resolve as resolve6 } from "node:path";
|
|
247588
247912
|
var PROVIDER_LABELS = {
|
|
247589
247913
|
google: "Google",
|
|
247590
247914
|
microsoft: "Microsoft",
|
|
@@ -247654,8 +247978,8 @@ async function socialLoginAction({ log, isNonInteractive, runTask }, provider, a
|
|
|
247654
247978
|
}
|
|
247655
247979
|
}
|
|
247656
247980
|
const { project } = await readProjectConfig();
|
|
247657
|
-
const configDir =
|
|
247658
|
-
const authDir =
|
|
247981
|
+
const configDir = dirname17(project.configPath);
|
|
247982
|
+
const authDir = join23(configDir, project.authDir);
|
|
247659
247983
|
const { config: updated } = await runTask("Updating local auth config", async () => updateSocialLoginConfig(authDir, provider, shouldEnable, useCustomOAuth && options.clientId ? { clientId: options.clientId } : undefined));
|
|
247660
247984
|
if (clientSecret) {
|
|
247661
247985
|
await runTask("Saving client secret", async () => pushCustomOAuthSecret(provider, clientSecret));
|
|
@@ -247680,7 +248004,7 @@ function getSocialLoginCommand() {
|
|
|
247680
248004
|
}
|
|
247681
248005
|
|
|
247682
248006
|
// src/cli/commands/auth/sso.ts
|
|
247683
|
-
import { dirname as
|
|
248007
|
+
import { dirname as dirname18, join as join24, resolve as resolve7 } from "node:path";
|
|
247684
248008
|
var SSOConfigFileSchema = object({
|
|
247685
248009
|
provider: _enum(Object.values(KNOWN_SSO_PROVIDERS)),
|
|
247686
248010
|
clientId: string2(),
|
|
@@ -247843,8 +248167,8 @@ async function ssoEnableAction({ isNonInteractive, runTask }, options) {
|
|
|
247843
248167
|
throw error;
|
|
247844
248168
|
}
|
|
247845
248169
|
const { project } = await readProjectConfig();
|
|
247846
|
-
const configDir =
|
|
247847
|
-
const authDir =
|
|
248170
|
+
const configDir = dirname18(project.configPath);
|
|
248171
|
+
const authDir = join24(configDir, project.authDir);
|
|
247848
248172
|
await runTask("Updating local auth config", async () => updateSSOConfig(authDir, provider, true));
|
|
247849
248173
|
await runTask("Saving SSO credentials", async () => pushSSOSecrets(secrets));
|
|
247850
248174
|
return {
|
|
@@ -247859,8 +248183,8 @@ async function ssoDisableAction({ log, runTask }, options) {
|
|
|
247859
248183
|
throw new InvalidInputError("Configuration options cannot be used with disable. To disable SSO: base44 auth sso disable");
|
|
247860
248184
|
}
|
|
247861
248185
|
const { project } = await readProjectConfig();
|
|
247862
|
-
const configDir =
|
|
247863
|
-
const authDir =
|
|
248186
|
+
const configDir = dirname18(project.configPath);
|
|
248187
|
+
const authDir = join24(configDir, project.authDir);
|
|
247864
248188
|
const updated = await runTask("Updating local auth config", async () => updateSSOConfig(authDir, null, false));
|
|
247865
248189
|
await runTask("Removing SSO credentials", async () => deleteSSOSecrets());
|
|
247866
248190
|
if (!hasAnyLoginMethod(updated)) {
|
|
@@ -248742,13 +249066,13 @@ function getConnectorsListAvailableCommand() {
|
|
|
248742
249066
|
}
|
|
248743
249067
|
|
|
248744
249068
|
// src/cli/commands/connectors/pull.ts
|
|
248745
|
-
import { dirname as
|
|
249069
|
+
import { dirname as dirname19, join as join25, resolve as resolve8 } from "node:path";
|
|
248746
249070
|
async function resolveConnectorsDir(options) {
|
|
248747
249071
|
if (!getAppContext().projectRoot) {
|
|
248748
249072
|
return resolve8(options.dir ?? "connectors");
|
|
248749
249073
|
}
|
|
248750
249074
|
const { project } = await readProjectConfig();
|
|
248751
|
-
return
|
|
249075
|
+
return join25(dirname19(project.configPath), project.connectorsDir);
|
|
248752
249076
|
}
|
|
248753
249077
|
async function pullConnectorsAction({ log, runTask, jsonMode }, options) {
|
|
248754
249078
|
const connectorsDir = await resolveConnectorsDir(options);
|
|
@@ -249003,43 +249327,22 @@ async function deleteFunctionsAction({ runTask }, names) {
|
|
|
249003
249327
|
parts.push(`${errors} error${errors !== 1 ? "s" : ""}`);
|
|
249004
249328
|
return { outroMessage: parts.join(", ") };
|
|
249005
249329
|
}
|
|
249006
|
-
function
|
|
249330
|
+
function parseNames2(args) {
|
|
249007
249331
|
return args.flatMap((arg) => arg.split(",")).map((n) => n.trim()).filter(Boolean);
|
|
249008
249332
|
}
|
|
249009
249333
|
function validateNames(command) {
|
|
249010
|
-
const names =
|
|
249334
|
+
const names = parseNames2(command.args);
|
|
249011
249335
|
if (names.length === 0) {
|
|
249012
249336
|
command.error("At least one function name is required");
|
|
249013
249337
|
}
|
|
249014
249338
|
}
|
|
249015
|
-
function
|
|
249339
|
+
function getDeleteCommand2() {
|
|
249016
249340
|
return new Base44Command("delete").description("Delete deployed functions").argument("<names...>", "Function names to delete").hook("preAction", validateNames).action(async (ctx, rawNames) => {
|
|
249017
|
-
const names =
|
|
249341
|
+
const names = parseNames2(rawNames);
|
|
249018
249342
|
return deleteFunctionsAction(ctx, names);
|
|
249019
249343
|
});
|
|
249020
249344
|
}
|
|
249021
249345
|
|
|
249022
|
-
// src/cli/commands/functions/formatDeployResult.ts
|
|
249023
|
-
function formatDuration(ms) {
|
|
249024
|
-
return `${(ms / 1000).toFixed(1)}s`;
|
|
249025
|
-
}
|
|
249026
|
-
function formatDeployResult(result, log) {
|
|
249027
|
-
const label = result.name.padEnd(25);
|
|
249028
|
-
if (result.status === "deployed") {
|
|
249029
|
-
const timing = result.durationMs ? theme.styles.dim(` (${formatDuration(result.durationMs)})`) : "";
|
|
249030
|
-
log.success(`${label} deployed${timing}`);
|
|
249031
|
-
} else if (result.status === "unchanged") {
|
|
249032
|
-
log.success(`${label} unchanged`);
|
|
249033
|
-
} else {
|
|
249034
|
-
log.error(`${label} error: ${result.error}`);
|
|
249035
|
-
}
|
|
249036
|
-
}
|
|
249037
|
-
|
|
249038
|
-
// src/cli/commands/functions/parseNames.ts
|
|
249039
|
-
function parseNames2(args) {
|
|
249040
|
-
return args.flatMap((arg) => arg.split(",")).map((n) => n.trim()).filter(Boolean);
|
|
249041
|
-
}
|
|
249042
|
-
|
|
249043
249346
|
// src/cli/commands/functions/deploy.ts
|
|
249044
249347
|
function resolveFunctionsToDeploy(names, allFunctions) {
|
|
249045
249348
|
if (names.length === 0)
|
|
@@ -249126,9 +249429,9 @@ async function deployFunctionsAction({ log }, names, options) {
|
|
|
249126
249429
|
}
|
|
249127
249430
|
return { outroMessage: buildDeploySummary(results) };
|
|
249128
249431
|
}
|
|
249129
|
-
function
|
|
249432
|
+
function getDeployCommand2() {
|
|
249130
249433
|
return new Base44Command("deploy").description("Deploy functions to Base44").argument("[names...]", "Function names to deploy (deploys all if omitted)").option("--force", "Delete remote functions not found locally").action(async (ctx, rawNames, options) => {
|
|
249131
|
-
const names =
|
|
249434
|
+
const names = parseNames(rawNames);
|
|
249132
249435
|
return deployFunctionsAction(ctx, names, options);
|
|
249133
249436
|
});
|
|
249134
249437
|
}
|
|
@@ -249156,11 +249459,11 @@ function getListCommand() {
|
|
|
249156
249459
|
}
|
|
249157
249460
|
|
|
249158
249461
|
// src/cli/commands/functions/pull.ts
|
|
249159
|
-
import { dirname as
|
|
249462
|
+
import { dirname as dirname20, join as join26 } from "node:path";
|
|
249160
249463
|
async function pullFunctionsAction({ log, runTask }, name) {
|
|
249161
249464
|
const { project, functions } = await readProjectConfig();
|
|
249162
|
-
const configDir =
|
|
249163
|
-
const functionsDir =
|
|
249465
|
+
const configDir = dirname20(project.configPath);
|
|
249466
|
+
const functionsDir = join26(configDir, project.functionsDir);
|
|
249164
249467
|
const pluginFunctionNames = new Set(functions.filter((fn) => fn.source.type === "plugin").map((fn) => fn.name));
|
|
249165
249468
|
const remoteFunctions = await runTask("Fetching functions from Base44", async () => {
|
|
249166
249469
|
const { functions } = await listDeployedFunctions();
|
|
@@ -249215,7 +249518,7 @@ function getPullCommand() {
|
|
|
249215
249518
|
|
|
249216
249519
|
// src/cli/commands/functions/index.ts
|
|
249217
249520
|
function getFunctionsCommand() {
|
|
249218
|
-
return new Command2("functions").description("Manage backend functions").addCommand(
|
|
249521
|
+
return new Command2("functions").description("Manage backend functions").addCommand(getDeployCommand2()).addCommand(getDeleteCommand2()).addCommand(getListCommand()).addCommand(getPullCommand());
|
|
249219
249522
|
}
|
|
249220
249523
|
|
|
249221
249524
|
// src/cli/commands/project/site-build.ts
|
|
@@ -249282,11 +249585,11 @@ function getBuildCommand() {
|
|
|
249282
249585
|
}
|
|
249283
249586
|
|
|
249284
249587
|
// src/cli/commands/project/create.ts
|
|
249285
|
-
import { basename as
|
|
249588
|
+
import { basename as basename6, resolve as resolve10 } from "node:path";
|
|
249286
249589
|
var import_kebabCase = __toESM(require_kebabCase(), 1);
|
|
249287
249590
|
|
|
249288
249591
|
// src/cli/commands/project/scaffold-shared.ts
|
|
249289
|
-
import { join as
|
|
249592
|
+
import { join as join27 } from "node:path";
|
|
249290
249593
|
var DEFAULT_TEMPLATE_ID = "backend-only";
|
|
249291
249594
|
async function getTemplateById(templateId) {
|
|
249292
249595
|
const templates = await listTemplates();
|
|
@@ -249349,7 +249652,7 @@ async function completeProjectSetup({
|
|
|
249349
249652
|
env: { VITE_BASE44_APP_ID: projectId }
|
|
249350
249653
|
})`${buildCommand}`;
|
|
249351
249654
|
updateMessage("Deploying site...");
|
|
249352
|
-
return await deploySite(
|
|
249655
|
+
return await deploySite(join27(resolvedPath, outputDirectory));
|
|
249353
249656
|
}, {
|
|
249354
249657
|
successMessage: theme.colors.base44Orange("Site deployed successfully"),
|
|
249355
249658
|
errorMessage: "Failed to deploy site"
|
|
@@ -249447,8 +249750,8 @@ async function createInteractive(options, ctx) {
|
|
|
249447
249750
|
name: () => {
|
|
249448
249751
|
return options.name ? Promise.resolve(options.name) : Ze({
|
|
249449
249752
|
message: "What is the name of your project?",
|
|
249450
|
-
placeholder:
|
|
249451
|
-
initialValue:
|
|
249753
|
+
placeholder: basename6(process.cwd()),
|
|
249754
|
+
initialValue: basename6(process.cwd()),
|
|
249452
249755
|
validate: (value) => {
|
|
249453
249756
|
if (!value || value.trim().length === 0) {
|
|
249454
249757
|
return "Every project deserves a name";
|
|
@@ -249564,7 +249867,15 @@ async function deployAction(ctx, options = {}) {
|
|
|
249564
249867
|
outroMessage: "No resources found to deploy"
|
|
249565
249868
|
};
|
|
249566
249869
|
}
|
|
249567
|
-
const {
|
|
249870
|
+
const {
|
|
249871
|
+
project,
|
|
249872
|
+
entities,
|
|
249873
|
+
functions,
|
|
249874
|
+
actors,
|
|
249875
|
+
agents,
|
|
249876
|
+
connectors,
|
|
249877
|
+
authConfig
|
|
249878
|
+
} = projectData;
|
|
249568
249879
|
const summaryLines = [];
|
|
249569
249880
|
if (entities.length > 0) {
|
|
249570
249881
|
summaryLines.push(` - ${entities.length} ${entities.length === 1 ? "entity" : "entities"}`);
|
|
@@ -249572,6 +249883,9 @@ async function deployAction(ctx, options = {}) {
|
|
|
249572
249883
|
if (functions.length > 0) {
|
|
249573
249884
|
summaryLines.push(` - ${functions.length} ${functions.length === 1 ? "function" : "functions"}`);
|
|
249574
249885
|
}
|
|
249886
|
+
if (actors.length > 0) {
|
|
249887
|
+
summaryLines.push(` - ${actors.length} ${actors.length === 1 ? "actor" : "actors"}`);
|
|
249888
|
+
}
|
|
249575
249889
|
if (agents.length > 0) {
|
|
249576
249890
|
summaryLines.push(` - ${agents.length} ${agents.length === 1 ? "agent" : "agents"}`);
|
|
249577
249891
|
}
|
|
@@ -249605,6 +249919,7 @@ ${summaryLines.join(`
|
|
|
249605
249919
|
await maybeBuildBeforeDeploy(ctx, project, options.build);
|
|
249606
249920
|
let functionCompleted = 0;
|
|
249607
249921
|
const functionTotal = functions.length;
|
|
249922
|
+
let actorCompleted = 0;
|
|
249608
249923
|
const result = await deployAll(projectData, {
|
|
249609
249924
|
onVisibilitySet: (level) => {
|
|
249610
249925
|
log.success(`App visibility set to ${level}`);
|
|
@@ -249616,6 +249931,16 @@ ${summaryLines.join(`
|
|
|
249616
249931
|
onFunctionResult: (r) => {
|
|
249617
249932
|
functionCompleted++;
|
|
249618
249933
|
formatDeployResult(r, log);
|
|
249934
|
+
},
|
|
249935
|
+
onActorStart: (name) => {
|
|
249936
|
+
log.step(theme.styles.dim(`[${actorCompleted + 1}/${actors.length}] Deploying ${name}...`));
|
|
249937
|
+
},
|
|
249938
|
+
onActorResult: (result) => {
|
|
249939
|
+
actorCompleted++;
|
|
249940
|
+
formatDeployResult(result, log);
|
|
249941
|
+
if (result.status !== "error")
|
|
249942
|
+
for (const warning of result.warnings)
|
|
249943
|
+
log.warn(`${result.name}: ${warning}`);
|
|
249619
249944
|
}
|
|
249620
249945
|
});
|
|
249621
249946
|
const connectorResults = result.connectorResults ?? [];
|
|
@@ -249630,8 +249955,8 @@ ${summaryLines.join(`
|
|
|
249630
249955
|
}
|
|
249631
249956
|
return { outroMessage: "App deployed successfully" };
|
|
249632
249957
|
}
|
|
249633
|
-
function
|
|
249634
|
-
return new Base44Command("deploy").description("Deploy all project resources (entities, functions, agents, connectors, and site)").option("-y, --yes", "Skip confirmation prompt").option("--build", "Build the site before deploying (skips the prompt)").option("--no-build", "Deploy without building (skips the prompt)").action(deployAction);
|
|
249958
|
+
function getDeployCommand3() {
|
|
249959
|
+
return new Base44Command("deploy").description("Deploy all project resources (entities, functions, actors, agents, connectors, and site)").option("-y, --yes", "Skip confirmation prompt").option("--build", "Build the site before deploying (skips the prompt)").option("--no-build", "Deploy without building (skips the prompt)").action(deployAction);
|
|
249635
249960
|
}
|
|
249636
249961
|
async function handleOAuthConnectors(connectorResults, isNonInteractive, options, log) {
|
|
249637
249962
|
const needsOAuth = filterPendingOAuth(connectorResults);
|
|
@@ -250117,11 +250442,11 @@ async function logsAction(ctx, options) {
|
|
|
250117
250442
|
function getLogsCommand() {
|
|
250118
250443
|
return new Base44Command("logs").description("Fetch function logs for this app").option("--function <names>", "Filter by function name(s), comma-separated. If omitted, fetches logs for all deployed functions").option("--since <datetime>", "Show logs from this time. ISO datetime or relative shorthand (e.g. 1h, 30m, 2d)", normalizeDatetime).option("--until <datetime>", "Show logs until this time. ISO datetime or relative shorthand (e.g. 1h, 30m, 2d)", normalizeDatetime).addOption(new Option2("--level <level>", "Filter by log level").choices([
|
|
250119
250444
|
...LogLevelSchema.options
|
|
250120
|
-
])).option("-n, --limit <n>", "Results per page (1-1000; the server returns at most 500)").option("-f, --follow", "Stream new logs as they arrive").addOption(new Option2("--order <order>", "Sort order").choices(["asc", "desc"])).addOption(new Option2("--env <env>", "Which deployment to read logs from: preview (current draft) or prod (published).
|
|
250445
|
+
])).option("-n, --limit <n>", "Results per page (1-1000; the server returns at most 500)").option("-f, --follow", "Stream new logs as they arrive").addOption(new Option2("--order <order>", "Sort order").choices(["asc", "desc"])).addOption(new Option2("--env <env>", "Which deployment to read logs from: preview (current draft) or prod (published). Default: preview").choices([...LogEnvSchema.options])).action(logsAction);
|
|
250121
250446
|
}
|
|
250122
250447
|
|
|
250123
250448
|
// src/cli/commands/project/scaffold.ts
|
|
250124
|
-
import { basename as
|
|
250449
|
+
import { basename as basename7, resolve as resolve11 } from "node:path";
|
|
250125
250450
|
function resolveAppId(options) {
|
|
250126
250451
|
const appId = options.appId;
|
|
250127
250452
|
if (!appId) {
|
|
@@ -250138,7 +250463,7 @@ async function scaffoldAction(ctx, name, options, command) {
|
|
|
250138
250463
|
const { log, runTask } = ctx;
|
|
250139
250464
|
const appId = resolveAppId(command.optsWithGlobals());
|
|
250140
250465
|
const resolvedPath = resolve11("./");
|
|
250141
|
-
const projectName = (name ??
|
|
250466
|
+
const projectName = (name ?? basename7(resolvedPath)).trim();
|
|
250142
250467
|
const template = await getTemplateById("backend-only");
|
|
250143
250468
|
log.info(`Scaffolding project at ${resolvedPath}`);
|
|
250144
250469
|
const { projectId } = await runTask("Setting up your project...", async () => {
|
|
@@ -250746,10 +251071,12 @@ var EMPTY_TEMPLATE = import_common_tags.stripIndent`
|
|
|
250746
251071
|
// Auto-generated by Base44 CLI - DO NOT EDIT
|
|
250747
251072
|
// Regenerate with: base44 types
|
|
250748
251073
|
//
|
|
250749
|
-
// No entities, functions, agents, or connectors found in project.
|
|
250750
|
-
// Add resources to base44/entities/, base44/functions/, base44/agents/, or base44/connectors/
|
|
251074
|
+
// No entities, functions, actors, agents, or connectors found in project.
|
|
251075
|
+
// Add resources to base44/entities/, base44/functions/, base44/actors/, base44/agents/, or base44/connectors/
|
|
250751
251076
|
// and run \`base44 types generate\` again.
|
|
250752
251077
|
|
|
251078
|
+
import '@base44/sdk';
|
|
251079
|
+
|
|
250753
251080
|
declare module '@base44/sdk' {
|
|
250754
251081
|
// No types to augment - add resources and regenerate
|
|
250755
251082
|
}
|
|
@@ -250759,8 +251086,8 @@ async function generateTypesFile(input) {
|
|
|
250759
251086
|
await writeFile(getTypesOutputPath(input.projectRoot), content);
|
|
250760
251087
|
}
|
|
250761
251088
|
async function generateContent(input) {
|
|
250762
|
-
const { entities, functions, agents, connectors } = input;
|
|
250763
|
-
if (!entities.length && !functions.length && !agents.length && !connectors.length) {
|
|
251089
|
+
const { entities, functions, actors, agents, connectors } = input;
|
|
251090
|
+
if (!entities.length && !functions.length && !actors.length && !agents.length && !connectors.length) {
|
|
250764
251091
|
return EMPTY_TEMPLATE;
|
|
250765
251092
|
}
|
|
250766
251093
|
const entityInterfaces = await Promise.all(entities.map((e) => compileEntity(e)));
|
|
@@ -250770,12 +251097,14 @@ async function generateContent(input) {
|
|
|
250770
251097
|
entities.map((e) => `"${e.name}": ${toPascalCase(e.name)};`)
|
|
250771
251098
|
],
|
|
250772
251099
|
["FunctionNameRegistry", functions.map((f) => `"${f.name}": true;`)],
|
|
251100
|
+
["ActorNameRegistry", actors.map((actor) => `"${actor.name}": true;`)],
|
|
250773
251101
|
["AgentNameRegistry", agents.map((a) => `"${a.name}": true;`)],
|
|
250774
251102
|
["ConnectorTypeRegistry", connectors.map((c) => `"${c.type}": true;`)]
|
|
250775
251103
|
];
|
|
250776
251104
|
const registries = registryEntries.filter(([, entries]) => entries.length > 0).map(([name, entries]) => registry2(name, entries));
|
|
250777
251105
|
return [
|
|
250778
251106
|
HEADER2,
|
|
251107
|
+
"import '@base44/sdk';",
|
|
250779
251108
|
entityInterfaces.join(`
|
|
250780
251109
|
|
|
250781
251110
|
`),
|
|
@@ -250820,10 +251149,10 @@ function toPascalCase(name) {
|
|
|
250820
251149
|
return name.split(/[-_\s]+/).map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join("");
|
|
250821
251150
|
}
|
|
250822
251151
|
// src/core/types/update-project.ts
|
|
250823
|
-
import { join as
|
|
251152
|
+
import { join as join30 } from "node:path";
|
|
250824
251153
|
var TYPES_INCLUDE_PATH = `${PROJECT_SUBDIR}/${TYPES_OUTPUT_SUBDIR}/*.d.ts`;
|
|
250825
251154
|
async function updateProjectConfig(projectRoot) {
|
|
250826
|
-
const tsconfigPath =
|
|
251155
|
+
const tsconfigPath = join30(projectRoot, "tsconfig.json");
|
|
250827
251156
|
if (!await pathExists(tsconfigPath)) {
|
|
250828
251157
|
return false;
|
|
250829
251158
|
}
|
|
@@ -250847,12 +251176,13 @@ var TYPES_FILE_PATH = "base44/.types/types.d.ts";
|
|
|
250847
251176
|
async function generateTypesAction({
|
|
250848
251177
|
runTask
|
|
250849
251178
|
}) {
|
|
250850
|
-
const { entities, functions, agents, connectors, project } = await readProjectConfig();
|
|
251179
|
+
const { entities, functions, actors, agents, connectors, project } = await readProjectConfig();
|
|
250851
251180
|
await runTask("Generating types", async () => {
|
|
250852
251181
|
await generateTypesFile({
|
|
250853
251182
|
projectRoot: project.root,
|
|
250854
251183
|
entities,
|
|
250855
251184
|
functions,
|
|
251185
|
+
actors,
|
|
250856
251186
|
agents,
|
|
250857
251187
|
connectors
|
|
250858
251188
|
});
|
|
@@ -251287,7 +251617,7 @@ function createDevLogger(label, labelColor = theme.styles.dim) {
|
|
|
251287
251617
|
// src/cli/dev/dev-server/main.ts
|
|
251288
251618
|
var import_cors = __toESM(require_lib4(), 1);
|
|
251289
251619
|
var import_express6 = __toESM(require_express(), 1);
|
|
251290
|
-
import { dirname as
|
|
251620
|
+
import { dirname as dirname26, join as join36 } from "node:path";
|
|
251291
251621
|
|
|
251292
251622
|
// ../../node_modules/get-port/index.js
|
|
251293
251623
|
import net from "node:net";
|
|
@@ -251417,7 +251747,7 @@ var $tmpName = promisify11(tmp.tmpName);
|
|
|
251417
251747
|
|
|
251418
251748
|
// src/cli/dev/dev-server/function-manager.ts
|
|
251419
251749
|
import { spawn as spawn2 } from "node:child_process";
|
|
251420
|
-
import { dirname as
|
|
251750
|
+
import { dirname as dirname23, join as join31 } from "node:path";
|
|
251421
251751
|
import { pathToFileURL } from "node:url";
|
|
251422
251752
|
|
|
251423
251753
|
// src/cli/dev/dev-server/base-function-manager.ts
|
|
@@ -251522,7 +251852,7 @@ class FunctionManager extends BaseFunctionManager {
|
|
|
251522
251852
|
}
|
|
251523
251853
|
spawnFunction(func, port) {
|
|
251524
251854
|
this.logger.log(`Spawning function "${func.name}" on port ${port}`);
|
|
251525
|
-
const importMapPath =
|
|
251855
|
+
const importMapPath = join31(dirname23(this.wrapperPath), "import-map.json");
|
|
251526
251856
|
const process2 = spawn2("deno", ["run", "--allow-all", "--import-map", importMapPath, this.wrapperPath], {
|
|
251527
251857
|
env: {
|
|
251528
251858
|
...globalThis.process.env,
|
|
@@ -251596,7 +251926,7 @@ class FunctionManager extends BaseFunctionManager {
|
|
|
251596
251926
|
import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2 } from "node:fs";
|
|
251597
251927
|
import { isBuiltin } from "node:module";
|
|
251598
251928
|
import { homedir as homedir3 } from "node:os";
|
|
251599
|
-
import { join as
|
|
251929
|
+
import { join as join33 } from "node:path";
|
|
251600
251930
|
import { pathToFileURL as pathToFileURL6 } from "node:url";
|
|
251601
251931
|
var depsPromise;
|
|
251602
251932
|
function loadDeps() {
|
|
@@ -251717,9 +252047,9 @@ export default {
|
|
|
251717
252047
|
};
|
|
251718
252048
|
`;
|
|
251719
252049
|
function ensureBundlerConfig() {
|
|
251720
|
-
const dir =
|
|
252050
|
+
const dir = join33(homedir3(), ".base44", "function-bundler");
|
|
251721
252051
|
mkdirSync2(dir, { recursive: true });
|
|
251722
|
-
const configPath =
|
|
252052
|
+
const configPath = join33(dir, "deno.json");
|
|
251723
252053
|
writeFileSync2(configPath, `${JSON.stringify({ nodeModulesDir: "auto" }, null, 2)}
|
|
251724
252054
|
`);
|
|
251725
252055
|
return configPath;
|
|
@@ -253189,7 +253519,7 @@ function createCustomIntegrationRoutes(remoteProxy, logger) {
|
|
|
253189
253519
|
|
|
253190
253520
|
// src/cli/dev/dev-server/watcher.ts
|
|
253191
253521
|
import { EventEmitter as EventEmitter4 } from "node:events";
|
|
253192
|
-
import { relative as
|
|
253522
|
+
import { relative as relative9 } from "node:path";
|
|
253193
253523
|
|
|
253194
253524
|
// ../../node_modules/chokidar/index.js
|
|
253195
253525
|
import { EventEmitter as EventEmitter3 } from "node:events";
|
|
@@ -254874,7 +255204,7 @@ class WatchBase44 extends EventEmitter4 {
|
|
|
254874
255204
|
ignoreInitial: true
|
|
254875
255205
|
});
|
|
254876
255206
|
watcher.on("all", import_debounce.default(async (_event, path) => {
|
|
254877
|
-
this.emit("change", name,
|
|
255207
|
+
this.emit("change", name, relative9(targetPath, path));
|
|
254878
255208
|
}, WATCH_DEBOUNCE_MS));
|
|
254879
255209
|
watcher.on("error", (err) => {
|
|
254880
255210
|
this.logger.error(`Watch handler failed for ${targetPath}`, err);
|
|
@@ -254911,6 +255241,11 @@ async function createDevServer(options) {
|
|
|
254911
255241
|
next();
|
|
254912
255242
|
});
|
|
254913
255243
|
const devLogger = createDevLogger("backend", theme.styles.info);
|
|
255244
|
+
app.use("/api/apps/:appId/actors", (_req, res) => {
|
|
255245
|
+
const message = "Actors are not available in local development";
|
|
255246
|
+
devLogger.error(message);
|
|
255247
|
+
res.status(500).json({ error: message });
|
|
255248
|
+
});
|
|
254914
255249
|
const functionManager = await createFunctionRuntime(functions, devLogger, options.denoWrapperPath);
|
|
254915
255250
|
const functionRoutes = createFunctionRouter(functionManager, devLogger);
|
|
254916
255251
|
app.use("/api/apps/:appId/functions", functionRoutes);
|
|
@@ -254981,8 +255316,8 @@ async function createDevServer(options) {
|
|
|
254981
255316
|
broadcastEntityEvent(io, appId, entityName, event);
|
|
254982
255317
|
};
|
|
254983
255318
|
const base44ConfigWatcher = new WatchBase44({
|
|
254984
|
-
functions:
|
|
254985
|
-
entities:
|
|
255319
|
+
functions: join36(dirname26(project.configPath), project.functionsDir),
|
|
255320
|
+
entities: join36(dirname26(project.configPath), project.entitiesDir)
|
|
254986
255321
|
}, devLogger);
|
|
254987
255322
|
base44ConfigWatcher.on("change", async (name) => {
|
|
254988
255323
|
try {
|
|
@@ -255510,7 +255845,7 @@ function createProgram(context) {
|
|
|
255510
255845
|
program.addCommand(getScaffoldCommand());
|
|
255511
255846
|
program.addCommand(getDashboardCommand());
|
|
255512
255847
|
program.addCommand(getBuildCommand());
|
|
255513
|
-
program.addCommand(
|
|
255848
|
+
program.addCommand(getDeployCommand3());
|
|
255514
255849
|
program.addCommand(getVisibilityCommand());
|
|
255515
255850
|
program.addCommand(getLinkCommand());
|
|
255516
255851
|
program.addCommand(getEjectCommand());
|
|
@@ -255520,6 +255855,7 @@ function createProgram(context) {
|
|
|
255520
255855
|
program.addCommand(getAgentSkillsCommand());
|
|
255521
255856
|
program.addCommand(getConnectorsCommand());
|
|
255522
255857
|
program.addCommand(getFunctionsCommand());
|
|
255858
|
+
program.addCommand(getActorsCommand());
|
|
255523
255859
|
program.addCommand(getWorkflowsCommand());
|
|
255524
255860
|
program.addCommand(getSecretsCommand());
|
|
255525
255861
|
program.addCommand(getSandboxCommand());
|
|
@@ -255538,7 +255874,7 @@ var import_detect_agent = __toESM(require_dist5(), 1);
|
|
|
255538
255874
|
import { release, type } from "node:os";
|
|
255539
255875
|
|
|
255540
255876
|
// ../../node_modules/posthog-node/dist/extensions/error-tracking/modifiers/module.node.mjs
|
|
255541
|
-
import { dirname as
|
|
255877
|
+
import { dirname as dirname27, posix, sep as sep2 } from "path";
|
|
255542
255878
|
function createModulerModifier() {
|
|
255543
255879
|
const getModuleFromFileName = createGetModuleFromFilename();
|
|
255544
255880
|
return async (frames) => {
|
|
@@ -255547,7 +255883,7 @@ function createModulerModifier() {
|
|
|
255547
255883
|
return frames;
|
|
255548
255884
|
};
|
|
255549
255885
|
}
|
|
255550
|
-
function createGetModuleFromFilename(basePath = process.argv[1] ?
|
|
255886
|
+
function createGetModuleFromFilename(basePath = process.argv[1] ? dirname27(process.argv[1]) : process.cwd(), isWindows = sep2 === "\\") {
|
|
255551
255887
|
const normalizedBase = isWindows ? normalizeWindowsPath2(basePath) : basePath;
|
|
255552
255888
|
return (filename) => {
|
|
255553
255889
|
if (!filename)
|
|
@@ -259536,9 +259872,9 @@ function addCommandInfoToErrorReporter(program, errorReporter) {
|
|
|
259536
259872
|
});
|
|
259537
259873
|
}
|
|
259538
259874
|
// src/cli/index.ts
|
|
259539
|
-
var __dirname4 =
|
|
259875
|
+
var __dirname4 = dirname28(fileURLToPath6(import.meta.url));
|
|
259540
259876
|
async function runCLI(options) {
|
|
259541
|
-
ensureNpmAssets(
|
|
259877
|
+
ensureNpmAssets(join37(__dirname4, "../assets"));
|
|
259542
259878
|
const errorReporter = new ErrorReporter;
|
|
259543
259879
|
errorReporter.registerProcessErrorHandlers();
|
|
259544
259880
|
const jsonMode = process.argv.includes("--json");
|
|
@@ -259577,4 +259913,4 @@ export {
|
|
|
259577
259913
|
runCLI
|
|
259578
259914
|
};
|
|
259579
259915
|
|
|
259580
|
-
//# debugId=
|
|
259916
|
+
//# debugId=B6FD4E544C62B70764756E2164756E21
|