@base44-preview/cli 0.1.14-pr.623.50da9d5 → 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 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" ? join27(replacement, currentDoc.split(`
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 join27(separator, docs) {
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: join27,
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 dirname26, join as join36 } from "node:path";
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/agent-skills/pull.ts
229909
- import { dirname as dirname11, join as join18 } from "node:path";
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 dirname8, join as join11 } from "node:path";
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 join5, normalize } from "node:path";
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 = join5(agentsDir, `${name}.${CONFIG_FILE_EXTENSION}`);
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 = join5(agentsDir, `${name}_${i}.${CONFIG_FILE_EXTENSION}`);
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 join6 } from "node:path";
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(join6(dir, `${skill.name}.md`));
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(join6(dir, `${skill.name}.md`), serializeSkillFile(skill));
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 join7 } from "node:path";
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 join7(authDir, AUTH_CONFIG_FILENAME);
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 join8 } from "node:path";
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 ?? join8(connectorsDir, `${connector.type}.${CONFIG_FILE_EXTENSION}`);
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 basename3, dirname as dirname6, join as join9, relative, resolve as resolve2 } from "node:path";
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 = dirname6(configPath);
238533
- const entryPath = join9(functionDir, config.entry);
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) => dirname6(f)));
238566
- const entryFilesWithoutConfig = entryFiles.filter((entryFile) => !configFilesDirs.has(dirname6(entryFile)));
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 = dirname6(entryFile);
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 = relative(functionsDir, functionDir).split(/[/\\]/).join("/");
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 = basename3(entryFile);
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 dirname7, relative as relative2 } from "node:path";
238773
+ import { dirname as dirname9, relative as relative4 } from "node:path";
238614
238774
  async function loadFunctionCode(fn) {
238615
- const functionDir = dirname7(fn.entryPath);
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 = relative2(functionDir, filePath).split(/[/\\]/).join("/");
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 deployOne(fn) {
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 deployOne(fn);
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 join10 } from "node:path";
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 = join10(functionsDir, fn.name);
238689
- const configPath = join10(functionDir, "function.jsonc");
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(join10(functionDir, file.path), file.content);
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 = join10(functionDir, "function.jsonc");
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 = join10(functionDir, file.path);
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 = dirname8(configPath);
238931
- const [entities, functions, agents, agentSkills, connectors, authConfig] = await Promise.all([
238932
- entityResource.readAll(join11(configDir, project.entitiesDir)),
238933
- functionResource.readAll(join11(configDir, project.functionsDir)),
238934
- agentResource.readAll(join11(configDir, project.agentsDir)),
238935
- agentSkillResource.readAll(join11(configDir, project.agentSkillsDir)),
238936
- connectorResource.readAll(join11(configDir, project.connectorsDir)),
238937
- authConfigResource.readAll(join11(configDir, project.authDir))
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 { entities, functions, agents, agentSkills, connectors, authConfig };
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, dirname8(hostConfigPath));
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 dirname9, join as join13 } from "node:path";
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 join12 } from "node:path";
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 = join12(homedir2(), ".base44", "assets", package_default.version);
239342
+ var ASSETS_DIR = join13(homedir2(), ".base44", "assets", package_default.version);
239157
239343
  function getTemplatesDir() {
239158
- return join12(ASSETS_DIR, "templates");
239344
+ return join13(ASSETS_DIR, "templates");
239159
239345
  }
239160
239346
  function getTemplatesIndexPath() {
239161
- return join12(ASSETS_DIR, "templates", "templates.json");
239347
+ return join13(ASSETS_DIR, "templates", "templates.json");
239162
239348
  }
239163
239349
  function getBackendRuntimeDir() {
239164
- return join12(ASSETS_DIR, "backend-runtime");
239350
+ return join13(ASSETS_DIR, "backend-runtime");
239165
239351
  }
239166
239352
  function getDenoWrapperPath() {
239167
- return join12(getBackendRuntimeDir(), "main.ts");
239353
+ return join13(getBackendRuntimeDir(), "main.ts");
239168
239354
  }
239169
239355
  function getExecWrapperPath() {
239170
- return join12(getBackendRuntimeDir(), "exec.ts");
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 = join13(getTemplatesDir(), template.path);
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 = join13(templateDir, file);
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 ? join13(dirname9(file), attributes.outputFileName) : file.replace(/\.ejs$/, "");
239206
- const destFilePath = join13(destPath, destFile);
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 = join13(destPath, file);
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 join14 } from "node:path";
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 = join14(tmpdir(), `base44-site-${randomUUID()}.tar.gz`);
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 join17 } from "node:path";
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 basename4, extname, join as join15 } from "node:path";
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(basename4(path)));
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 = join15(assetsDir, ...relativePath.split("/"));
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 relative3, resolve as resolve3, sep } from "node:path";
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(relative3(config.configDir, entryPath));
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(relative3(config.configDir, config.assetsDirectory))}/**`);
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 dirname10, join as join16, resolve as resolve4 } from "node:path";
239826
- var WRANGLER_REDIRECT_PATH = join16(".wrangler", "deploy", "config.json");
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 = join16(projectRoot, WRANGLER_REDIRECT_PATH);
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 = dirname10(configPath);
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(dirname10(redirectPath), result.data.configPath);
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(join17(assetsDir, "index.html")));
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 = join18(dirname11(project.configPath), project.agentSkillsDir);
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 dirname12, join as join19 } from "node:path";
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 = dirname12(project.configPath);
247421
- const agentsDir = join19(configDir, project.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 dirname13, join as join20 } from "node:path";
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 = dirname13(project.configPath);
247496
- const authDir = join20(configDir, project.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 dirname14, join as join21 } from "node:path";
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 = dirname14(project.configPath);
247523
- const authDir = join21(configDir, project.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 dirname15, join as join22, resolve as resolve6 } from "node:path";
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 = dirname15(project.configPath);
247658
- const authDir = join22(configDir, project.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 dirname16, join as join23, resolve as resolve7 } from "node:path";
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 = dirname16(project.configPath);
247847
- const authDir = join23(configDir, project.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 = dirname16(project.configPath);
247863
- const authDir = join23(configDir, project.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 dirname17, join as join24, resolve as resolve8 } from "node:path";
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 join24(dirname17(project.configPath), project.connectorsDir);
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 parseNames(args) {
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 = parseNames(command.args);
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 getDeleteCommand() {
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 = parseNames(rawNames);
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 getDeployCommand() {
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 = parseNames2(rawNames);
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 dirname18, join as join25 } from "node:path";
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 = dirname18(project.configPath);
249163
- const functionsDir = join25(configDir, project.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(getDeployCommand()).addCommand(getDeleteCommand()).addCommand(getListCommand()).addCommand(getPullCommand());
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 basename5, resolve as resolve10 } from "node:path";
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 join26 } from "node:path";
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(join26(resolvedPath, outputDirectory));
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: basename5(process.cwd()),
249451
- initialValue: basename5(process.cwd()),
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 { project, entities, functions, agents, connectors, authConfig } = projectData;
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 getDeployCommand2() {
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);
@@ -250121,7 +250446,7 @@ function getLogsCommand() {
250121
250446
  }
250122
250447
 
250123
250448
  // src/cli/commands/project/scaffold.ts
250124
- import { basename as basename6, resolve as resolve11 } from "node:path";
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 ?? basename6(resolvedPath)).trim();
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 join29 } from "node:path";
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 = join29(projectRoot, "tsconfig.json");
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 dirname24, join as join35 } from "node:path";
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 dirname21, join as join30 } from "node:path";
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 = join30(dirname21(this.wrapperPath), "import-map.json");
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 join31 } from "node:path";
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 = join31(homedir3(), ".base44", "function-bundler");
252050
+ const dir = join33(homedir3(), ".base44", "function-bundler");
251721
252051
  mkdirSync2(dir, { recursive: true });
251722
- const configPath = join31(dir, "deno.json");
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 relative7 } from "node:path";
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, relative7(targetPath, path));
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: join35(dirname24(project.configPath), project.functionsDir),
254985
- entities: join35(dirname24(project.configPath), project.entitiesDir)
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(getDeployCommand2());
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 dirname25, posix, sep as sep2 } from "path";
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] ? dirname25(process.argv[1]) : process.cwd(), isWindows = sep2 === "\\") {
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 = dirname26(fileURLToPath6(import.meta.url));
259875
+ var __dirname4 = dirname28(fileURLToPath6(import.meta.url));
259540
259876
  async function runCLI(options) {
259541
- ensureNpmAssets(join36(__dirname4, "../assets"));
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=DB7474A6029C0A5A64756E2164756E21
259916
+ //# debugId=B6FD4E544C62B70764756E2164756E21