@hexclave/shared 1.0.63 → 1.0.64

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.
@@ -5,7 +5,7 @@ import { n as MoneyAmount } from "./currency-constants-Cq_q8twn.js";
5
5
  import { g as branchConfigSourceSchema, o as RestrictedReason, t as ConfigAgentRunApi } from "./schema-fields-DZtDQEEO.js";
6
6
  import { i as RefreshToken, r as InternalSession, t as AccessToken } from "./sessions-CI-0TBQb.js";
7
7
  import { J as UserActivityResponse, K as MetricsUserCounts, R as MetricsResponse, a as AnalyticsClickmapKind, c as AnalyticsClickmapResponse, r as AnalyticsClickmapDevice, u as AnalyticsClickmapTokenResponse } from "./admin-metrics-bsOkw4YQ.js";
8
- import { t as EmailOutboxCrud } from "./email-outbox-CYmVerum.js";
8
+ import { t as EmailOutboxCrud } from "./email-outbox-B1wmVPRG.js";
9
9
  import { t as InternalEmailsCrud } from "./emails-Ba4yEaCS.js";
10
10
  import { t as InternalApiKeysCrud } from "./internal-api-keys-D8IYDodH.js";
11
11
  import { t as ProjectPermissionDefinitionsCrud } from "./project-permissions-kdi675F-.js";
@@ -456,4 +456,4 @@ declare class HexclaveAdminInterface extends HexclaveServerInterface {
456
456
  }
457
457
  //#endregion
458
458
  export { AdminDeploymentRunJson as a, ChatContent as c, InternalApiKeyCreateCrudResponse as d, AdminDeploymentEnvVarOptions as i, HexclaveAdminInterface as l, AdminDeploymentDomainJson as n, AdminDeploymentServiceBuildOptions as o, AdminDeploymentEnvVarJson as r, AdminDeploymentServiceJson as s, AdminAuthApplicationOptions as t, InternalApiKeyCreateCrudRequest as u };
459
- //# sourceMappingURL=admin-interface-B9TRKVnU.d.ts.map
459
+ //# sourceMappingURL=admin-interface-DaxVUjl4.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin-interface-B9TRKVnU.d.ts","names":[],"sources":["../src/interface/admin-interface.ts"],"mappings":"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"}
1
+ {"version":3,"file":"admin-interface-DaxVUjl4.d.ts","names":[],"sources":["../src/interface/admin-interface.ts"],"mappings":"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"}
@@ -5,7 +5,7 @@ let _________utils_objects_js = require("../../../utils/objects.js");
5
5
  let _________utils_strings_js = require("../../../utils/strings.js");
6
6
  let ___reminders_js = require("../reminders.js");
7
7
  //#region package.json
8
- var version = "1.0.63";
8
+ var version = "1.0.64";
9
9
  //#endregion
10
10
  //#region \0@oxc-project+runtime@0.137.0/helpers/esm/taggedTemplateLiteral.js
11
11
  function _taggedTemplateLiteral(e, t) {
@@ -47,13 +47,25 @@ const deploymentsSkillSection = require("../../../utils/strings.js").deindent`
47
47
 
48
48
  Note also that the config file usually sits inside \`rootDirectory\`, which means it is uploaded with your source and compiled by the remote build like any other file. If the deployed app doesn't depend on the Hexclave SDK, add \`hexclave.config.ts\` to \`.vercelignore\`: the CLI reads the config from disk before packaging, so the build itself never needs it, and excluding it keeps an SDK import in the config from breaking a build that is otherwise unrelated to Hexclave.
49
49
 
50
- ## Domains
50
+ ## Agent workflow (do this — do not drive the dashboard UI)
51
+
52
+ AI agents must deploy and manage Deployments through the CLI and \`hexclave.config.ts\`, not by clicking around \`app.hexclave.com\` in a browser. The dashboard is a human fallback only.
51
53
 
52
- Every Vercel service gets a Vercel domain autoprovisioned. If you want to attach a custom domain, there are two ways to do so.
54
+ Preferred sequence:
53
55
 
54
- **Option 1 the dashboard.** Visit \`https://app.hexclave.com/projects/<project-id>/deployments\`, click the service of choice, go to the Domains tab, add your domain, and then create the returned DNS records at your DNS provider.
56
+ 1. **Read this skill** (\`https://skill.hexclave.com/deployments\` or the Deployments addendum you already have) and ensure \`deployments-alpha\` is enabled in config as above.
57
+ 2. **Authenticate for cloud deploys** (pick the first that works):
58
+ - If \`HEXCLAVE_SECRET_SERVER_KEY\` (or \`STACK_SECRET_SERVER_KEY\`) **and** \`HEXCLAVE_PROJECT_ID\` (or \`STACK_PROJECT_ID\`) are already in the environment, use them. No login step.
59
+ - Else if \`npx @hexclave/cli@latest whoami\` succeeds, you already have a CLI login session — proceed.
60
+ - Else ask the user to run \`npx @hexclave/cli@latest login\` (or run it for them). That command opens a **one-time browser login page for the human**. Do **not** use the browser yourself to open the Deployments dashboard, click Deploy, or configure the service in the UI. After login returns successfully, continue immediately with the CLI.
61
+ 3. **Write/update \`hexclave.config.ts\`**, then deploy with \`npx @hexclave/cli@latest deploy <service> ...\` (see below). Pass every \`type: "secret"\` env via \`--secret\`.
62
+ 4. **Poll status/logs with \`hexclave exec\`** (snippets below). Do not tell the user to "watch the dashboard" as the primary path.
55
63
 
56
- **Option 2 the CLI.** Here is an example of adding \`app.example.com\` to the service \`api\` and receiving the DNS records that then need to be set with your DNS provider:
64
+ \`deploy\` auth: \`HEXCLAVE_SECRET_SERVER_KEY\` if set, otherwise the \`hexclave login\` session. \`exec --cloud-project-id\` needs the login session (not the secret server key alone).
65
+
66
+ ## Domains
67
+
68
+ Every Vercel service gets a Vercel domain autoprovisioned. Prefer the CLI to attach a custom domain:
57
69
 
58
70
  \`\`\`sh title="Terminal"
59
71
  npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\
@@ -62,6 +74,8 @@ const deploymentsSkillSection = require("../../../utils/strings.js").deindent`
62
74
  return p.getDeploymentServiceDomain('api', 'app.example.com');"
63
75
  \`\`\`
64
76
 
77
+ Humans can also add domains in the dashboard at \`https://app.hexclave.com/projects/<project-id>/deployments\` (service → Domains). Agents should not do that in a browser.
78
+
65
79
  ## Deploying
66
80
 
67
81
  Before deploying, run the service's \`installCommand\` and \`buildCommand\` locally and confirm they succeed. The remote build runs the same commands, but \`deploy\` exits before the build finishes, so a broken build does not fail the command — it surfaces only when you check the run afterwards.
@@ -72,7 +86,7 @@ const deploymentsSkillSection = require("../../../utils/strings.js").deindent`
72
86
  npx @hexclave/cli@latest deploy web --secret db_connection="$DATABASE_URL"
73
87
  \`\`\`
74
88
 
75
- The CLI packages the service's root directory (respecting \`.gitignore\` and \`.vercelignore\`, and always excluding \`node_modules\` and \`.git\`), uploads it, and starts a remote build. Without a config file, the configuration stored in Hexclave governs the deploy, with the root directory resolved against the current directory. It always deploys to production, never prompts, and exits as soon as the build is queued, printing the run id. Follow the build in the dashboard's Deployments tab.
89
+ The CLI packages the service's root directory (respecting \`.gitignore\` and \`.vercelignore\`, and always excluding \`node_modules\` and \`.git\`), uploads it, and starts a remote build. Without a config file, the configuration stored in Hexclave governs the deploy, with the root directory resolved against the current directory. It always deploys to production, never prompts, and exits as soon as the build is queued, printing the run id. Check that run with \`exec\` (next section), not by opening the dashboard.
76
90
 
77
91
  Every secret defined in the service's \`env\` must be passed via \`--secret\` on every deploy — a missing (or misspelled) one fails the deploy before anything is uploaded.
78
92
 
@@ -114,13 +128,15 @@ const deploymentsSkillSection = require("../../../utils/strings.js").deindent`
114
128
 
115
129
  ## Deleting a service
116
130
 
117
- If you want to delete a deployed service, you can do so through the dashboard, or through the CLI like so:
131
+ Prefer the CLI:
118
132
 
119
133
  \`\`\`sh title="Terminal"
120
134
  npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\
121
135
  "const p = await hexclaveServerApp.getProject(); \\
122
136
  await p.deleteDeploymentService('api');"
123
137
  \`\`\`
138
+
139
+ Humans can also delete a service in the dashboard; agents should not.
124
140
  `;
125
141
  //#endregion
126
142
  exports.deploymentsSkillSection = deploymentsSkillSection;
@@ -1 +1 @@
1
- {"version":3,"file":"deployments-skill.js","names":[],"sources":["../../../../src/ai/unified-prompts/skill-site-prompt-parts/deployments-skill.ts"],"sourcesContent":["import { deindent } from \"../../../utils/strings\";\n\n// The Deployments-specific addendum served at https://skill.hexclave.com/deployments.\n// It is appended verbatim after the full base skill, so this section assumes the\n// reader already has the general Hexclave skill (CLI auth, config format, SDKs) in\n// context and only teaches what is specific to the Deployments app.\nexport const deploymentsSkillSection = deindent`\n # Hexclave Deployments\n\n The Deployments app makes deploying a service very easy. You select a type of service to deploy and provide your code, build instructions, run instructions, environment variables, and the code framework. You can set up multiple deployments per Hexclave project — for example, a backend service and a frontend service. Once a service is deployed, it is publicly accessible.\n\n For this iteration of the Deployments app, only the \\`vercel\\` service type is available. It can be used to set up serverless deployments.\n\n To use Hexclave Deployments, you must do a few things. First, the Deployments app must be enabled, by adding \\`deployments-alpha\\` under \\`apps.installed\\`. Second, you must edit your \\`hexclave.config.ts\\` file to add the relevant configuration, as specified below. Both keys are \\`deployments-alpha\\`, not \\`deployments\\` — the app is in alpha and its id says so. Because of the hyphen, quote it.\n\n ## Config\n\n \\`\\`\\`ts title=\"hexclave.config.ts\"\n import type { HexclaveConfig } from \"@hexclave/js/config\"; // replace \\`js\\` with the correct framework SDK package\n\n export const config: HexclaveConfig = {\n apps: {\n installed: {\n authentication: { enabled: true },\n \"deployments-alpha\": { enabled: true },\n },\n },\n \"deployments-alpha\": {\n services: {\n web: {\n type: \"vercel\",\n rootDirectory: \"./\",\n framework: \"nextjs\",\n installCommand: \"pnpm install\",\n buildCommand: \"pnpm build\",\n outputDirectory: \".next\",\n env: {\n \"MY_ENV_VAR\": { value: \"true\" },\n \"DATABASE_CONNECTION_STRING\": { type: \"secret\", key: \"db_connection\" },\n \"NEXT_PUBLIC_HEXCLAVE_PROJECT_ID\": { type: \"connection\", value: \"hexclave.projectId\" },\n },\n },\n },\n },\n };\n \\`\\`\\`\n\n Here, \\`web\\` is the name of your service. \\`type\\` refers to the type of service you want to set up; for now, as mentioned earlier, only \\`vercel\\` is supported. \\`rootDirectory\\` is the directory in which the install and build commands are run, and where the code for your service is found. \\`installCommand\\` is the command run to install your application's dependencies, and \\`buildCommand\\` is what is run to build the necessary packages and files. \\`framework\\` is the framework used by your service; from it and \\`outputDirectory\\`, the run command is inferred.\n\n The \\`HexclaveConfig\\` annotation requires the SDK package it is imported from to be a dependency of the project. If it isn't, either install it or drop the annotation (the config is plain TypeScript — the CLI does not type-check it).\n\n Note also that the config file usually sits inside \\`rootDirectory\\`, which means it is uploaded with your source and compiled by the remote build like any other file. If the deployed app doesn't depend on the Hexclave SDK, add \\`hexclave.config.ts\\` to \\`.vercelignore\\`: the CLI reads the config from disk before packaging, so the build itself never needs it, and excluding it keeps an SDK import in the config from breaking a build that is otherwise unrelated to Hexclave.\n\n ## Domains\n\n Every Vercel service gets a Vercel domain autoprovisioned. If you want to attach a custom domain, there are two ways to do so.\n\n **Option 1 — the dashboard.** Visit \\`https://app.hexclave.com/projects/<project-id>/deployments\\`, click the service of choice, go to the Domains tab, add your domain, and then create the returned DNS records at your DNS provider.\n\n **Option 2 — the CLI.** Here is an example of adding \\`app.example.com\\` to the service \\`api\\` and receiving the DNS records that then need to be set with your DNS provider:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n await p.addDeploymentServiceDomain('api', 'app.example.com'); \\\\\n return p.getDeploymentServiceDomain('api', 'app.example.com');\"\n \\`\\`\\`\n\n ## Deploying\n\n Before deploying, run the service's \\`installCommand\\` and \\`buildCommand\\` locally and confirm they succeed. The remote build runs the same commands, but \\`deploy\\` exits before the build finishes, so a broken build does not fail the command — it surfaces only when you check the run afterwards.\n\n From the directory containing your config file:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest deploy web --secret db_connection=\"$DATABASE_URL\"\n \\`\\`\\`\n\n The CLI packages the service's root directory (respecting \\`.gitignore\\` and \\`.vercelignore\\`, and always excluding \\`node_modules\\` and \\`.git\\`), uploads it, and starts a remote build. Without a config file, the configuration stored in Hexclave governs the deploy, with the root directory resolved against the current directory. It always deploys to production, never prompts, and exits as soon as the build is queued, printing the run id. Follow the build in the dashboard's Deployments tab.\n\n Every secret defined in the service's \\`env\\` must be passed via \\`--secret\\` on every deploy — a missing (or misspelled) one fails the deploy before anything is uploaded.\n\n Options: \\`--config <path>\\` (default: auto-discover \\`hexclave.config.ts\\` in the current directory, dashboard configuration otherwise), \\`--cloud-project-id <id>\\` (default: the \\`HEXCLAVE_PROJECT_ID\\` env var), and \\`--secret KEY=VALUE\\` (repeatable, see above).\n\n You can also deploy through GitHub Actions, like so:\n\n \\`\\`\\`yaml title=\".github/workflows/deploy.yaml\"\n - run: npm i -g @hexclave/cli\n - run: hexclave deploy web --secret db_connection=\"$DATABASE_URL\"\n env:\n HEXCLAVE_PROJECT_ID: \\${{ secrets.HEXCLAVE_PROJECT_ID }}\n HEXCLAVE_SECRET_SERVER_KEY: \\${{ secrets.HEXCLAVE_SECRET_SERVER_KEY }}\n DATABASE_URL: \\${{ secrets.DATABASE_URL }}\n \\`\\`\\`\n\n ## Checking status and debugging failures\n\n Because \\`deploy\\` returns as soon as the build is queued, a successful exit does not mean the deploy succeeded. Check the service to find out:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n const svc = (await p.listDeploymentServices()).find(s => s.id === 'web'); \\\\\n return { status: svc.status, url: svc.url, run: svc.latest_run };\"\n \\`\\`\\`\n\n A service's \\`status\\` is one of \\`not_deployed\\`, \\`queued\\`, \\`building\\`, \\`deployed\\`, \\`failed\\`, or \\`canceled\\`; a run's is \\`queued\\`, \\`building\\`, \\`ready\\`, \\`error\\`, or \\`canceled\\`. Poll until the run leaves \\`queued\\`/\\`building\\`.\n\n A failed run's \\`error\\` field is only a one-line summary (for example \\`Command \"npm run build\" exited with 1\\`). Do not try to guess the cause from it, and do not reproduce the build locally to find out — fetch the actual build output by run id:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n return p.getDeploymentRunLogs('<run-id>');\"\n \\`\\`\\`\n\n \\`deploy\\` prints the run id it started. If you don't have one, \\`listDeploymentRuns('web', { limit: 5 })\\` returns the most recent runs, newest first — call it through \\`exec\\` like the snippets above.\n\n ## Deleting a service\n\n If you want to delete a deployed service, you can do so through the dashboard, or through the CLI like so:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n await p.deleteDeploymentService('api');\"\n \\`\\`\\`\n`;\n"],"mappings":";;AAMA,MAAa,0BAA0B,mCAAA,CAAA,CAAA,QAAQ"}
1
+ {"version":3,"file":"deployments-skill.js","names":[],"sources":["../../../../src/ai/unified-prompts/skill-site-prompt-parts/deployments-skill.ts"],"sourcesContent":["import { deindent } from \"../../../utils/strings\";\n\n// The Deployments-specific addendum served at https://skill.hexclave.com/deployments.\n// It is appended verbatim after the full base skill, so this section assumes the\n// reader already has the general Hexclave skill (CLI auth, config format, SDKs) in\n// context and only teaches what is specific to the Deployments app.\nexport const deploymentsSkillSection = deindent`\n # Hexclave Deployments\n\n The Deployments app makes deploying a service very easy. You select a type of service to deploy and provide your code, build instructions, run instructions, environment variables, and the code framework. You can set up multiple deployments per Hexclave project — for example, a backend service and a frontend service. Once a service is deployed, it is publicly accessible.\n\n For this iteration of the Deployments app, only the \\`vercel\\` service type is available. It can be used to set up serverless deployments.\n\n To use Hexclave Deployments, you must do a few things. First, the Deployments app must be enabled, by adding \\`deployments-alpha\\` under \\`apps.installed\\`. Second, you must edit your \\`hexclave.config.ts\\` file to add the relevant configuration, as specified below. Both keys are \\`deployments-alpha\\`, not \\`deployments\\` — the app is in alpha and its id says so. Because of the hyphen, quote it.\n\n ## Config\n\n \\`\\`\\`ts title=\"hexclave.config.ts\"\n import type { HexclaveConfig } from \"@hexclave/js/config\"; // replace \\`js\\` with the correct framework SDK package\n\n export const config: HexclaveConfig = {\n apps: {\n installed: {\n authentication: { enabled: true },\n \"deployments-alpha\": { enabled: true },\n },\n },\n \"deployments-alpha\": {\n services: {\n web: {\n type: \"vercel\",\n rootDirectory: \"./\",\n framework: \"nextjs\",\n installCommand: \"pnpm install\",\n buildCommand: \"pnpm build\",\n outputDirectory: \".next\",\n env: {\n \"MY_ENV_VAR\": { value: \"true\" },\n \"DATABASE_CONNECTION_STRING\": { type: \"secret\", key: \"db_connection\" },\n \"NEXT_PUBLIC_HEXCLAVE_PROJECT_ID\": { type: \"connection\", value: \"hexclave.projectId\" },\n },\n },\n },\n },\n };\n \\`\\`\\`\n\n Here, \\`web\\` is the name of your service. \\`type\\` refers to the type of service you want to set up; for now, as mentioned earlier, only \\`vercel\\` is supported. \\`rootDirectory\\` is the directory in which the install and build commands are run, and where the code for your service is found. \\`installCommand\\` is the command run to install your application's dependencies, and \\`buildCommand\\` is what is run to build the necessary packages and files. \\`framework\\` is the framework used by your service; from it and \\`outputDirectory\\`, the run command is inferred.\n\n The \\`HexclaveConfig\\` annotation requires the SDK package it is imported from to be a dependency of the project. If it isn't, either install it or drop the annotation (the config is plain TypeScript — the CLI does not type-check it).\n\n Note also that the config file usually sits inside \\`rootDirectory\\`, which means it is uploaded with your source and compiled by the remote build like any other file. If the deployed app doesn't depend on the Hexclave SDK, add \\`hexclave.config.ts\\` to \\`.vercelignore\\`: the CLI reads the config from disk before packaging, so the build itself never needs it, and excluding it keeps an SDK import in the config from breaking a build that is otherwise unrelated to Hexclave.\n\n ## Agent workflow (do this — do not drive the dashboard UI)\n\n AI agents must deploy and manage Deployments through the CLI and \\`hexclave.config.ts\\`, not by clicking around \\`app.hexclave.com\\` in a browser. The dashboard is a human fallback only.\n\n Preferred sequence:\n\n 1. **Read this skill** (\\`https://skill.hexclave.com/deployments\\` or the Deployments addendum you already have) and ensure \\`deployments-alpha\\` is enabled in config as above.\n 2. **Authenticate for cloud deploys** (pick the first that works):\n - If \\`HEXCLAVE_SECRET_SERVER_KEY\\` (or \\`STACK_SECRET_SERVER_KEY\\`) **and** \\`HEXCLAVE_PROJECT_ID\\` (or \\`STACK_PROJECT_ID\\`) are already in the environment, use them. No login step.\n - Else if \\`npx @hexclave/cli@latest whoami\\` succeeds, you already have a CLI login session — proceed.\n - Else ask the user to run \\`npx @hexclave/cli@latest login\\` (or run it for them). That command opens a **one-time browser login page for the human**. Do **not** use the browser yourself to open the Deployments dashboard, click Deploy, or configure the service in the UI. After login returns successfully, continue immediately with the CLI.\n 3. **Write/update \\`hexclave.config.ts\\`**, then deploy with \\`npx @hexclave/cli@latest deploy <service> ...\\` (see below). Pass every \\`type: \"secret\"\\` env via \\`--secret\\`.\n 4. **Poll status/logs with \\`hexclave exec\\`** (snippets below). Do not tell the user to \"watch the dashboard\" as the primary path.\n\n \\`deploy\\` auth: \\`HEXCLAVE_SECRET_SERVER_KEY\\` if set, otherwise the \\`hexclave login\\` session. \\`exec --cloud-project-id\\` needs the login session (not the secret server key alone).\n\n ## Domains\n\n Every Vercel service gets a Vercel domain autoprovisioned. Prefer the CLI to attach a custom domain:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n await p.addDeploymentServiceDomain('api', 'app.example.com'); \\\\\n return p.getDeploymentServiceDomain('api', 'app.example.com');\"\n \\`\\`\\`\n\n Humans can also add domains in the dashboard at \\`https://app.hexclave.com/projects/<project-id>/deployments\\` (service → Domains). Agents should not do that in a browser.\n\n ## Deploying\n\n Before deploying, run the service's \\`installCommand\\` and \\`buildCommand\\` locally and confirm they succeed. The remote build runs the same commands, but \\`deploy\\` exits before the build finishes, so a broken build does not fail the command — it surfaces only when you check the run afterwards.\n\n From the directory containing your config file:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest deploy web --secret db_connection=\"$DATABASE_URL\"\n \\`\\`\\`\n\n The CLI packages the service's root directory (respecting \\`.gitignore\\` and \\`.vercelignore\\`, and always excluding \\`node_modules\\` and \\`.git\\`), uploads it, and starts a remote build. Without a config file, the configuration stored in Hexclave governs the deploy, with the root directory resolved against the current directory. It always deploys to production, never prompts, and exits as soon as the build is queued, printing the run id. Check that run with \\`exec\\` (next section), not by opening the dashboard.\n\n Every secret defined in the service's \\`env\\` must be passed via \\`--secret\\` on every deploy — a missing (or misspelled) one fails the deploy before anything is uploaded.\n\n Options: \\`--config <path>\\` (default: auto-discover \\`hexclave.config.ts\\` in the current directory, dashboard configuration otherwise), \\`--cloud-project-id <id>\\` (default: the \\`HEXCLAVE_PROJECT_ID\\` env var), and \\`--secret KEY=VALUE\\` (repeatable, see above).\n\n You can also deploy through GitHub Actions, like so:\n\n \\`\\`\\`yaml title=\".github/workflows/deploy.yaml\"\n - run: npm i -g @hexclave/cli\n - run: hexclave deploy web --secret db_connection=\"$DATABASE_URL\"\n env:\n HEXCLAVE_PROJECT_ID: \\${{ secrets.HEXCLAVE_PROJECT_ID }}\n HEXCLAVE_SECRET_SERVER_KEY: \\${{ secrets.HEXCLAVE_SECRET_SERVER_KEY }}\n DATABASE_URL: \\${{ secrets.DATABASE_URL }}\n \\`\\`\\`\n\n ## Checking status and debugging failures\n\n Because \\`deploy\\` returns as soon as the build is queued, a successful exit does not mean the deploy succeeded. Check the service to find out:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n const svc = (await p.listDeploymentServices()).find(s => s.id === 'web'); \\\\\n return { status: svc.status, url: svc.url, run: svc.latest_run };\"\n \\`\\`\\`\n\n A service's \\`status\\` is one of \\`not_deployed\\`, \\`queued\\`, \\`building\\`, \\`deployed\\`, \\`failed\\`, or \\`canceled\\`; a run's is \\`queued\\`, \\`building\\`, \\`ready\\`, \\`error\\`, or \\`canceled\\`. Poll until the run leaves \\`queued\\`/\\`building\\`.\n\n A failed run's \\`error\\` field is only a one-line summary (for example \\`Command \"npm run build\" exited with 1\\`). Do not try to guess the cause from it, and do not reproduce the build locally to find out — fetch the actual build output by run id:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n return p.getDeploymentRunLogs('<run-id>');\"\n \\`\\`\\`\n\n \\`deploy\\` prints the run id it started. If you don't have one, \\`listDeploymentRuns('web', { limit: 5 })\\` returns the most recent runs, newest first — call it through \\`exec\\` like the snippets above.\n\n ## Deleting a service\n\n Prefer the CLI:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n await p.deleteDeploymentService('api');\"\n \\`\\`\\`\n\n Humans can also delete a service in the dashboard; agents should not.\n`;\n"],"mappings":";;AAMA,MAAa,0BAA0B,mCAAA,CAAA,CAAA,QAAQ"}
@@ -162,6 +162,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
162
162
  id: string;
163
163
  subject: string;
164
164
  created_at_millis: number;
165
+ html: string | null;
166
+ text: string | null;
165
167
  updated_at_millis: number;
166
168
  tsx_source: string;
167
169
  theme_id: string | null;
@@ -198,8 +200,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
198
200
  has_delivered: boolean;
199
201
  started_rendering_at_millis: number;
200
202
  rendered_at_millis: number;
201
- html: string | null;
202
- text: string | null;
203
203
  is_transactional: boolean;
204
204
  is_high_priority: boolean;
205
205
  notification_category_id: string | null;
@@ -208,6 +208,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
208
208
  id: string;
209
209
  subject: string;
210
210
  created_at_millis: number;
211
+ html: string | null;
212
+ text: string | null;
211
213
  updated_at_millis: number;
212
214
  tsx_source: string;
213
215
  theme_id: string | null;
@@ -244,8 +246,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
244
246
  has_delivered: boolean;
245
247
  started_rendering_at_millis: number;
246
248
  rendered_at_millis: number;
247
- html: string | null;
248
- text: string | null;
249
249
  is_transactional: boolean;
250
250
  is_high_priority: boolean;
251
251
  notification_category_id: string | null;
@@ -254,6 +254,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
254
254
  id: string;
255
255
  subject: string;
256
256
  created_at_millis: number;
257
+ html: string | null;
258
+ text: string | null;
257
259
  updated_at_millis: number;
258
260
  tsx_source: string;
259
261
  theme_id: string | null;
@@ -290,8 +292,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
290
292
  has_delivered: boolean;
291
293
  started_rendering_at_millis: number;
292
294
  rendered_at_millis: number;
293
- html: string | null;
294
- text: string | null;
295
295
  is_transactional: boolean;
296
296
  is_high_priority: boolean;
297
297
  notification_category_id: string | null;
@@ -301,6 +301,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
301
301
  id: string;
302
302
  subject: string;
303
303
  created_at_millis: number;
304
+ html: string | null;
305
+ text: string | null;
304
306
  updated_at_millis: number;
305
307
  tsx_source: string;
306
308
  theme_id: string | null;
@@ -337,8 +339,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
337
339
  has_delivered: boolean;
338
340
  started_rendering_at_millis: number;
339
341
  rendered_at_millis: number;
340
- html: string | null;
341
- text: string | null;
342
342
  is_transactional: boolean;
343
343
  is_high_priority: boolean;
344
344
  notification_category_id: string | null;
@@ -347,10 +347,10 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
347
347
  server_error: string;
348
348
  } | {
349
349
  subject?: string | undefined;
350
- started_rendering_at_millis?: number | undefined;
351
- rendered_at_millis?: number | undefined;
352
350
  html?: string | null | undefined;
353
351
  text?: string | null | undefined;
352
+ started_rendering_at_millis?: number | undefined;
353
+ rendered_at_millis?: number | undefined;
354
354
  is_transactional?: boolean | undefined;
355
355
  is_high_priority?: boolean | undefined;
356
356
  notification_category_id?: string | null | undefined;
@@ -400,6 +400,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
400
400
  id: string;
401
401
  subject: string;
402
402
  created_at_millis: number;
403
+ html: string | null;
404
+ text: string | null;
403
405
  updated_at_millis: number;
404
406
  tsx_source: string;
405
407
  theme_id: string | null;
@@ -436,8 +438,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
436
438
  has_delivered: boolean;
437
439
  started_rendering_at_millis: number;
438
440
  rendered_at_millis: number;
439
- html: string | null;
440
- text: string | null;
441
441
  is_transactional: boolean;
442
442
  is_high_priority: boolean;
443
443
  notification_category_id: string | null;
@@ -448,6 +448,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
448
448
  id: string;
449
449
  subject: string;
450
450
  created_at_millis: number;
451
+ html: string | null;
452
+ text: string | null;
451
453
  updated_at_millis: number;
452
454
  tsx_source: string;
453
455
  theme_id: string | null;
@@ -484,8 +486,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
484
486
  has_delivered: boolean;
485
487
  started_rendering_at_millis: number;
486
488
  rendered_at_millis: number;
487
- html: string | null;
488
- text: string | null;
489
489
  is_transactional: boolean;
490
490
  is_high_priority: boolean;
491
491
  notification_category_id: string | null;
@@ -496,6 +496,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
496
496
  id: string;
497
497
  subject: string;
498
498
  created_at_millis: number;
499
+ html: string | null;
500
+ text: string | null;
499
501
  updated_at_millis: number;
500
502
  tsx_source: string;
501
503
  theme_id: string | null;
@@ -532,8 +534,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
532
534
  has_delivered: boolean;
533
535
  started_rendering_at_millis: number;
534
536
  rendered_at_millis: number;
535
- html: string | null;
536
- text: string | null;
537
537
  is_transactional: boolean;
538
538
  is_high_priority: boolean;
539
539
  notification_category_id: string | null;
@@ -545,6 +545,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
545
545
  id: string;
546
546
  subject: string;
547
547
  created_at_millis: number;
548
+ html: string | null;
549
+ text: string | null;
548
550
  updated_at_millis: number;
549
551
  tsx_source: string;
550
552
  theme_id: string | null;
@@ -581,8 +583,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
581
583
  has_delivered: boolean;
582
584
  started_rendering_at_millis: number;
583
585
  rendered_at_millis: number;
584
- html: string | null;
585
- text: string | null;
586
586
  is_transactional: boolean;
587
587
  is_high_priority: boolean;
588
588
  notification_category_id: string | null;
@@ -595,6 +595,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
595
595
  id: string;
596
596
  subject: string;
597
597
  created_at_millis: number;
598
+ html: string | null;
599
+ text: string | null;
598
600
  updated_at_millis: number;
599
601
  tsx_source: string;
600
602
  theme_id: string | null;
@@ -631,8 +633,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
631
633
  has_delivered: boolean;
632
634
  started_rendering_at_millis: number;
633
635
  rendered_at_millis: number;
634
- html: string | null;
635
- text: string | null;
636
636
  is_transactional: boolean;
637
637
  is_high_priority: boolean;
638
638
  notification_category_id: string | null;
@@ -645,6 +645,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
645
645
  id: string;
646
646
  subject: string;
647
647
  created_at_millis: number;
648
+ html: string | null;
649
+ text: string | null;
648
650
  updated_at_millis: number;
649
651
  tsx_source: string;
650
652
  theme_id: string | null;
@@ -681,8 +683,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
681
683
  has_delivered: boolean;
682
684
  started_rendering_at_millis: number;
683
685
  rendered_at_millis: number;
684
- html: string | null;
685
- text: string | null;
686
686
  is_transactional: boolean;
687
687
  is_high_priority: boolean;
688
688
  notification_category_id: string | null;
@@ -882,6 +882,8 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
882
882
  id: string;
883
883
  subject: string;
884
884
  created_at_millis: number;
885
+ html: string | null;
886
+ text: string | null;
885
887
  updated_at_millis: number;
886
888
  tsx_source: string;
887
889
  theme_id: string | null;
@@ -918,8 +920,6 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
918
920
  has_delivered: boolean;
919
921
  started_rendering_at_millis: number;
920
922
  rendered_at_millis: number;
921
- html: string | null;
922
- text: string | null;
923
923
  is_transactional: boolean;
924
924
  is_high_priority: boolean;
925
925
  notification_category_id: string | null;
@@ -928,6 +928,8 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
928
928
  id: string;
929
929
  subject: string;
930
930
  created_at_millis: number;
931
+ html: string | null;
932
+ text: string | null;
931
933
  updated_at_millis: number;
932
934
  tsx_source: string;
933
935
  theme_id: string | null;
@@ -964,8 +966,6 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
964
966
  has_delivered: boolean;
965
967
  started_rendering_at_millis: number;
966
968
  rendered_at_millis: number;
967
- html: string | null;
968
- text: string | null;
969
969
  is_transactional: boolean;
970
970
  is_high_priority: boolean;
971
971
  notification_category_id: string | null;
@@ -974,6 +974,8 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
974
974
  id: string;
975
975
  subject: string;
976
976
  created_at_millis: number;
977
+ html: string | null;
978
+ text: string | null;
977
979
  updated_at_millis: number;
978
980
  tsx_source: string;
979
981
  theme_id: string | null;
@@ -1010,8 +1012,6 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1010
1012
  has_delivered: boolean;
1011
1013
  started_rendering_at_millis: number;
1012
1014
  rendered_at_millis: number;
1013
- html: string | null;
1014
- text: string | null;
1015
1015
  is_transactional: boolean;
1016
1016
  is_high_priority: boolean;
1017
1017
  notification_category_id: string | null;
@@ -1021,6 +1021,8 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1021
1021
  id: string;
1022
1022
  subject: string;
1023
1023
  created_at_millis: number;
1024
+ html: string | null;
1025
+ text: string | null;
1024
1026
  updated_at_millis: number;
1025
1027
  tsx_source: string;
1026
1028
  theme_id: string | null;
@@ -1057,8 +1059,6 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1057
1059
  has_delivered: boolean;
1058
1060
  started_rendering_at_millis: number;
1059
1061
  rendered_at_millis: number;
1060
- html: string | null;
1061
- text: string | null;
1062
1062
  is_transactional: boolean;
1063
1063
  is_high_priority: boolean;
1064
1064
  notification_category_id: string | null;
@@ -1067,10 +1067,10 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1067
1067
  server_error: string;
1068
1068
  } | {
1069
1069
  subject?: string | undefined;
1070
- started_rendering_at_millis?: number | undefined;
1071
- rendered_at_millis?: number | undefined;
1072
1070
  html?: string | null | undefined;
1073
1071
  text?: string | null | undefined;
1072
+ started_rendering_at_millis?: number | undefined;
1073
+ rendered_at_millis?: number | undefined;
1074
1074
  is_transactional?: boolean | undefined;
1075
1075
  is_high_priority?: boolean | undefined;
1076
1076
  notification_category_id?: string | null | undefined;
@@ -1120,6 +1120,8 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1120
1120
  id: string;
1121
1121
  subject: string;
1122
1122
  created_at_millis: number;
1123
+ html: string | null;
1124
+ text: string | null;
1123
1125
  updated_at_millis: number;
1124
1126
  tsx_source: string;
1125
1127
  theme_id: string | null;
@@ -1156,8 +1158,6 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1156
1158
  has_delivered: boolean;
1157
1159
  started_rendering_at_millis: number;
1158
1160
  rendered_at_millis: number;
1159
- html: string | null;
1160
- text: string | null;
1161
1161
  is_transactional: boolean;
1162
1162
  is_high_priority: boolean;
1163
1163
  notification_category_id: string | null;
@@ -1168,6 +1168,8 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1168
1168
  id: string;
1169
1169
  subject: string;
1170
1170
  created_at_millis: number;
1171
+ html: string | null;
1172
+ text: string | null;
1171
1173
  updated_at_millis: number;
1172
1174
  tsx_source: string;
1173
1175
  theme_id: string | null;
@@ -1204,8 +1206,6 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1204
1206
  has_delivered: boolean;
1205
1207
  started_rendering_at_millis: number;
1206
1208
  rendered_at_millis: number;
1207
- html: string | null;
1208
- text: string | null;
1209
1209
  is_transactional: boolean;
1210
1210
  is_high_priority: boolean;
1211
1211
  notification_category_id: string | null;
@@ -1216,6 +1216,8 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1216
1216
  id: string;
1217
1217
  subject: string;
1218
1218
  created_at_millis: number;
1219
+ html: string | null;
1220
+ text: string | null;
1219
1221
  updated_at_millis: number;
1220
1222
  tsx_source: string;
1221
1223
  theme_id: string | null;
@@ -1252,8 +1254,6 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1252
1254
  has_delivered: boolean;
1253
1255
  started_rendering_at_millis: number;
1254
1256
  rendered_at_millis: number;
1255
- html: string | null;
1256
- text: string | null;
1257
1257
  is_transactional: boolean;
1258
1258
  is_high_priority: boolean;
1259
1259
  notification_category_id: string | null;
@@ -1265,6 +1265,8 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1265
1265
  id: string;
1266
1266
  subject: string;
1267
1267
  created_at_millis: number;
1268
+ html: string | null;
1269
+ text: string | null;
1268
1270
  updated_at_millis: number;
1269
1271
  tsx_source: string;
1270
1272
  theme_id: string | null;
@@ -1301,8 +1303,6 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1301
1303
  has_delivered: boolean;
1302
1304
  started_rendering_at_millis: number;
1303
1305
  rendered_at_millis: number;
1304
- html: string | null;
1305
- text: string | null;
1306
1306
  is_transactional: boolean;
1307
1307
  is_high_priority: boolean;
1308
1308
  notification_category_id: string | null;
@@ -1315,6 +1315,8 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1315
1315
  id: string;
1316
1316
  subject: string;
1317
1317
  created_at_millis: number;
1318
+ html: string | null;
1319
+ text: string | null;
1318
1320
  updated_at_millis: number;
1319
1321
  tsx_source: string;
1320
1322
  theme_id: string | null;
@@ -1351,8 +1353,6 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1351
1353
  has_delivered: boolean;
1352
1354
  started_rendering_at_millis: number;
1353
1355
  rendered_at_millis: number;
1354
- html: string | null;
1355
- text: string | null;
1356
1356
  is_transactional: boolean;
1357
1357
  is_high_priority: boolean;
1358
1358
  notification_category_id: string | null;
@@ -1365,6 +1365,8 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1365
1365
  id: string;
1366
1366
  subject: string;
1367
1367
  created_at_millis: number;
1368
+ html: string | null;
1369
+ text: string | null;
1368
1370
  updated_at_millis: number;
1369
1371
  tsx_source: string;
1370
1372
  theme_id: string | null;
@@ -1401,8 +1403,6 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1401
1403
  has_delivered: boolean;
1402
1404
  started_rendering_at_millis: number;
1403
1405
  rendered_at_millis: number;
1404
- html: string | null;
1405
- text: string | null;
1406
1406
  is_transactional: boolean;
1407
1407
  is_high_priority: boolean;
1408
1408
  notification_category_id: string | null;
@@ -1461,4 +1461,4 @@ declare const emailOutboxCrud: CrudSchemaFromOptions<{
1461
1461
  type EmailOutboxCrud = CrudTypeOf<typeof emailOutboxCrud>;
1462
1462
  //#endregion
1463
1463
  export { emailOutboxUpdateSchema as i, emailOutboxCrud as n, emailOutboxReadSchema as r, EmailOutboxCrud as t };
1464
- //# sourceMappingURL=email-outbox-CYmVerum.d.ts.map
1464
+ //# sourceMappingURL=email-outbox-B1wmVPRG.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"email-outbox-CYmVerum.d.ts","names":[],"sources":["../src/interface/crud/email-outbox.ts"],"mappings":";;;cAiNa,qBAAA,gBAAqB,WAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAmBrB,uBAAA,gBAAuB,YAAA;;;;;;;;;;;;;;aASxB,MAAA;;;;;;;;;;;;;;;cAEC,eAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsBD,eAAA,GAAkB,UAAU,QAAQ,eAAA"}
1
+ {"version":3,"file":"email-outbox-B1wmVPRG.d.ts","names":[],"sources":["../src/interface/crud/email-outbox.ts"],"mappings":";;;cAiNa,qBAAA,gBAAqB,WAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAmBrB,uBAAA,gBAAuB,YAAA;;;;;;;;;;;;;;aASxB,MAAA;;;;;;;;;;;;;;;cAEC,eAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsBD,eAAA,GAAkB,UAAU,QAAQ,eAAA"}
@@ -4,7 +4,7 @@ import { typedEntries } from "../../../utils/objects.js";
4
4
  import { deindent } from "../../../utils/strings.js";
5
5
  import { remindersPrompt } from "../reminders.js";
6
6
  //#region package.json
7
- var version = "1.0.63";
7
+ var version = "1.0.64";
8
8
  //#endregion
9
9
  //#region \0@oxc-project+runtime@0.137.0/helpers/esm/taggedTemplateLiteral.js
10
10
  function _taggedTemplateLiteral(e, t) {
@@ -47,13 +47,25 @@ const deploymentsSkillSection = deindent`
47
47
 
48
48
  Note also that the config file usually sits inside \`rootDirectory\`, which means it is uploaded with your source and compiled by the remote build like any other file. If the deployed app doesn't depend on the Hexclave SDK, add \`hexclave.config.ts\` to \`.vercelignore\`: the CLI reads the config from disk before packaging, so the build itself never needs it, and excluding it keeps an SDK import in the config from breaking a build that is otherwise unrelated to Hexclave.
49
49
 
50
- ## Domains
50
+ ## Agent workflow (do this — do not drive the dashboard UI)
51
+
52
+ AI agents must deploy and manage Deployments through the CLI and \`hexclave.config.ts\`, not by clicking around \`app.hexclave.com\` in a browser. The dashboard is a human fallback only.
51
53
 
52
- Every Vercel service gets a Vercel domain autoprovisioned. If you want to attach a custom domain, there are two ways to do so.
54
+ Preferred sequence:
53
55
 
54
- **Option 1 the dashboard.** Visit \`https://app.hexclave.com/projects/<project-id>/deployments\`, click the service of choice, go to the Domains tab, add your domain, and then create the returned DNS records at your DNS provider.
56
+ 1. **Read this skill** (\`https://skill.hexclave.com/deployments\` or the Deployments addendum you already have) and ensure \`deployments-alpha\` is enabled in config as above.
57
+ 2. **Authenticate for cloud deploys** (pick the first that works):
58
+ - If \`HEXCLAVE_SECRET_SERVER_KEY\` (or \`STACK_SECRET_SERVER_KEY\`) **and** \`HEXCLAVE_PROJECT_ID\` (or \`STACK_PROJECT_ID\`) are already in the environment, use them. No login step.
59
+ - Else if \`npx @hexclave/cli@latest whoami\` succeeds, you already have a CLI login session — proceed.
60
+ - Else ask the user to run \`npx @hexclave/cli@latest login\` (or run it for them). That command opens a **one-time browser login page for the human**. Do **not** use the browser yourself to open the Deployments dashboard, click Deploy, or configure the service in the UI. After login returns successfully, continue immediately with the CLI.
61
+ 3. **Write/update \`hexclave.config.ts\`**, then deploy with \`npx @hexclave/cli@latest deploy <service> ...\` (see below). Pass every \`type: "secret"\` env via \`--secret\`.
62
+ 4. **Poll status/logs with \`hexclave exec\`** (snippets below). Do not tell the user to "watch the dashboard" as the primary path.
55
63
 
56
- **Option 2 the CLI.** Here is an example of adding \`app.example.com\` to the service \`api\` and receiving the DNS records that then need to be set with your DNS provider:
64
+ \`deploy\` auth: \`HEXCLAVE_SECRET_SERVER_KEY\` if set, otherwise the \`hexclave login\` session. \`exec --cloud-project-id\` needs the login session (not the secret server key alone).
65
+
66
+ ## Domains
67
+
68
+ Every Vercel service gets a Vercel domain autoprovisioned. Prefer the CLI to attach a custom domain:
57
69
 
58
70
  \`\`\`sh title="Terminal"
59
71
  npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\
@@ -62,6 +74,8 @@ const deploymentsSkillSection = deindent`
62
74
  return p.getDeploymentServiceDomain('api', 'app.example.com');"
63
75
  \`\`\`
64
76
 
77
+ Humans can also add domains in the dashboard at \`https://app.hexclave.com/projects/<project-id>/deployments\` (service → Domains). Agents should not do that in a browser.
78
+
65
79
  ## Deploying
66
80
 
67
81
  Before deploying, run the service's \`installCommand\` and \`buildCommand\` locally and confirm they succeed. The remote build runs the same commands, but \`deploy\` exits before the build finishes, so a broken build does not fail the command — it surfaces only when you check the run afterwards.
@@ -72,7 +86,7 @@ const deploymentsSkillSection = deindent`
72
86
  npx @hexclave/cli@latest deploy web --secret db_connection="$DATABASE_URL"
73
87
  \`\`\`
74
88
 
75
- The CLI packages the service's root directory (respecting \`.gitignore\` and \`.vercelignore\`, and always excluding \`node_modules\` and \`.git\`), uploads it, and starts a remote build. Without a config file, the configuration stored in Hexclave governs the deploy, with the root directory resolved against the current directory. It always deploys to production, never prompts, and exits as soon as the build is queued, printing the run id. Follow the build in the dashboard's Deployments tab.
89
+ The CLI packages the service's root directory (respecting \`.gitignore\` and \`.vercelignore\`, and always excluding \`node_modules\` and \`.git\`), uploads it, and starts a remote build. Without a config file, the configuration stored in Hexclave governs the deploy, with the root directory resolved against the current directory. It always deploys to production, never prompts, and exits as soon as the build is queued, printing the run id. Check that run with \`exec\` (next section), not by opening the dashboard.
76
90
 
77
91
  Every secret defined in the service's \`env\` must be passed via \`--secret\` on every deploy — a missing (or misspelled) one fails the deploy before anything is uploaded.
78
92
 
@@ -114,13 +128,15 @@ const deploymentsSkillSection = deindent`
114
128
 
115
129
  ## Deleting a service
116
130
 
117
- If you want to delete a deployed service, you can do so through the dashboard, or through the CLI like so:
131
+ Prefer the CLI:
118
132
 
119
133
  \`\`\`sh title="Terminal"
120
134
  npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\
121
135
  "const p = await hexclaveServerApp.getProject(); \\
122
136
  await p.deleteDeploymentService('api');"
123
137
  \`\`\`
138
+
139
+ Humans can also delete a service in the dashboard; agents should not.
124
140
  `;
125
141
  //#endregion
126
142
  export { deploymentsSkillSection };
@@ -1 +1 @@
1
- {"version":3,"file":"deployments-skill.js","names":[],"sources":["../../../../../src/ai/unified-prompts/skill-site-prompt-parts/deployments-skill.ts"],"sourcesContent":["import { deindent } from \"../../../utils/strings\";\n\n// The Deployments-specific addendum served at https://skill.hexclave.com/deployments.\n// It is appended verbatim after the full base skill, so this section assumes the\n// reader already has the general Hexclave skill (CLI auth, config format, SDKs) in\n// context and only teaches what is specific to the Deployments app.\nexport const deploymentsSkillSection = deindent`\n # Hexclave Deployments\n\n The Deployments app makes deploying a service very easy. You select a type of service to deploy and provide your code, build instructions, run instructions, environment variables, and the code framework. You can set up multiple deployments per Hexclave project — for example, a backend service and a frontend service. Once a service is deployed, it is publicly accessible.\n\n For this iteration of the Deployments app, only the \\`vercel\\` service type is available. It can be used to set up serverless deployments.\n\n To use Hexclave Deployments, you must do a few things. First, the Deployments app must be enabled, by adding \\`deployments-alpha\\` under \\`apps.installed\\`. Second, you must edit your \\`hexclave.config.ts\\` file to add the relevant configuration, as specified below. Both keys are \\`deployments-alpha\\`, not \\`deployments\\` — the app is in alpha and its id says so. Because of the hyphen, quote it.\n\n ## Config\n\n \\`\\`\\`ts title=\"hexclave.config.ts\"\n import type { HexclaveConfig } from \"@hexclave/js/config\"; // replace \\`js\\` with the correct framework SDK package\n\n export const config: HexclaveConfig = {\n apps: {\n installed: {\n authentication: { enabled: true },\n \"deployments-alpha\": { enabled: true },\n },\n },\n \"deployments-alpha\": {\n services: {\n web: {\n type: \"vercel\",\n rootDirectory: \"./\",\n framework: \"nextjs\",\n installCommand: \"pnpm install\",\n buildCommand: \"pnpm build\",\n outputDirectory: \".next\",\n env: {\n \"MY_ENV_VAR\": { value: \"true\" },\n \"DATABASE_CONNECTION_STRING\": { type: \"secret\", key: \"db_connection\" },\n \"NEXT_PUBLIC_HEXCLAVE_PROJECT_ID\": { type: \"connection\", value: \"hexclave.projectId\" },\n },\n },\n },\n },\n };\n \\`\\`\\`\n\n Here, \\`web\\` is the name of your service. \\`type\\` refers to the type of service you want to set up; for now, as mentioned earlier, only \\`vercel\\` is supported. \\`rootDirectory\\` is the directory in which the install and build commands are run, and where the code for your service is found. \\`installCommand\\` is the command run to install your application's dependencies, and \\`buildCommand\\` is what is run to build the necessary packages and files. \\`framework\\` is the framework used by your service; from it and \\`outputDirectory\\`, the run command is inferred.\n\n The \\`HexclaveConfig\\` annotation requires the SDK package it is imported from to be a dependency of the project. If it isn't, either install it or drop the annotation (the config is plain TypeScript — the CLI does not type-check it).\n\n Note also that the config file usually sits inside \\`rootDirectory\\`, which means it is uploaded with your source and compiled by the remote build like any other file. If the deployed app doesn't depend on the Hexclave SDK, add \\`hexclave.config.ts\\` to \\`.vercelignore\\`: the CLI reads the config from disk before packaging, so the build itself never needs it, and excluding it keeps an SDK import in the config from breaking a build that is otherwise unrelated to Hexclave.\n\n ## Domains\n\n Every Vercel service gets a Vercel domain autoprovisioned. If you want to attach a custom domain, there are two ways to do so.\n\n **Option 1 — the dashboard.** Visit \\`https://app.hexclave.com/projects/<project-id>/deployments\\`, click the service of choice, go to the Domains tab, add your domain, and then create the returned DNS records at your DNS provider.\n\n **Option 2 — the CLI.** Here is an example of adding \\`app.example.com\\` to the service \\`api\\` and receiving the DNS records that then need to be set with your DNS provider:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n await p.addDeploymentServiceDomain('api', 'app.example.com'); \\\\\n return p.getDeploymentServiceDomain('api', 'app.example.com');\"\n \\`\\`\\`\n\n ## Deploying\n\n Before deploying, run the service's \\`installCommand\\` and \\`buildCommand\\` locally and confirm they succeed. The remote build runs the same commands, but \\`deploy\\` exits before the build finishes, so a broken build does not fail the command — it surfaces only when you check the run afterwards.\n\n From the directory containing your config file:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest deploy web --secret db_connection=\"$DATABASE_URL\"\n \\`\\`\\`\n\n The CLI packages the service's root directory (respecting \\`.gitignore\\` and \\`.vercelignore\\`, and always excluding \\`node_modules\\` and \\`.git\\`), uploads it, and starts a remote build. Without a config file, the configuration stored in Hexclave governs the deploy, with the root directory resolved against the current directory. It always deploys to production, never prompts, and exits as soon as the build is queued, printing the run id. Follow the build in the dashboard's Deployments tab.\n\n Every secret defined in the service's \\`env\\` must be passed via \\`--secret\\` on every deploy — a missing (or misspelled) one fails the deploy before anything is uploaded.\n\n Options: \\`--config <path>\\` (default: auto-discover \\`hexclave.config.ts\\` in the current directory, dashboard configuration otherwise), \\`--cloud-project-id <id>\\` (default: the \\`HEXCLAVE_PROJECT_ID\\` env var), and \\`--secret KEY=VALUE\\` (repeatable, see above).\n\n You can also deploy through GitHub Actions, like so:\n\n \\`\\`\\`yaml title=\".github/workflows/deploy.yaml\"\n - run: npm i -g @hexclave/cli\n - run: hexclave deploy web --secret db_connection=\"$DATABASE_URL\"\n env:\n HEXCLAVE_PROJECT_ID: \\${{ secrets.HEXCLAVE_PROJECT_ID }}\n HEXCLAVE_SECRET_SERVER_KEY: \\${{ secrets.HEXCLAVE_SECRET_SERVER_KEY }}\n DATABASE_URL: \\${{ secrets.DATABASE_URL }}\n \\`\\`\\`\n\n ## Checking status and debugging failures\n\n Because \\`deploy\\` returns as soon as the build is queued, a successful exit does not mean the deploy succeeded. Check the service to find out:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n const svc = (await p.listDeploymentServices()).find(s => s.id === 'web'); \\\\\n return { status: svc.status, url: svc.url, run: svc.latest_run };\"\n \\`\\`\\`\n\n A service's \\`status\\` is one of \\`not_deployed\\`, \\`queued\\`, \\`building\\`, \\`deployed\\`, \\`failed\\`, or \\`canceled\\`; a run's is \\`queued\\`, \\`building\\`, \\`ready\\`, \\`error\\`, or \\`canceled\\`. Poll until the run leaves \\`queued\\`/\\`building\\`.\n\n A failed run's \\`error\\` field is only a one-line summary (for example \\`Command \"npm run build\" exited with 1\\`). Do not try to guess the cause from it, and do not reproduce the build locally to find out — fetch the actual build output by run id:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n return p.getDeploymentRunLogs('<run-id>');\"\n \\`\\`\\`\n\n \\`deploy\\` prints the run id it started. If you don't have one, \\`listDeploymentRuns('web', { limit: 5 })\\` returns the most recent runs, newest first — call it through \\`exec\\` like the snippets above.\n\n ## Deleting a service\n\n If you want to delete a deployed service, you can do so through the dashboard, or through the CLI like so:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n await p.deleteDeploymentService('api');\"\n \\`\\`\\`\n`;\n"],"mappings":";;AAMA,MAAa,0BAA0B,QAAQ"}
1
+ {"version":3,"file":"deployments-skill.js","names":[],"sources":["../../../../../src/ai/unified-prompts/skill-site-prompt-parts/deployments-skill.ts"],"sourcesContent":["import { deindent } from \"../../../utils/strings\";\n\n// The Deployments-specific addendum served at https://skill.hexclave.com/deployments.\n// It is appended verbatim after the full base skill, so this section assumes the\n// reader already has the general Hexclave skill (CLI auth, config format, SDKs) in\n// context and only teaches what is specific to the Deployments app.\nexport const deploymentsSkillSection = deindent`\n # Hexclave Deployments\n\n The Deployments app makes deploying a service very easy. You select a type of service to deploy and provide your code, build instructions, run instructions, environment variables, and the code framework. You can set up multiple deployments per Hexclave project — for example, a backend service and a frontend service. Once a service is deployed, it is publicly accessible.\n\n For this iteration of the Deployments app, only the \\`vercel\\` service type is available. It can be used to set up serverless deployments.\n\n To use Hexclave Deployments, you must do a few things. First, the Deployments app must be enabled, by adding \\`deployments-alpha\\` under \\`apps.installed\\`. Second, you must edit your \\`hexclave.config.ts\\` file to add the relevant configuration, as specified below. Both keys are \\`deployments-alpha\\`, not \\`deployments\\` — the app is in alpha and its id says so. Because of the hyphen, quote it.\n\n ## Config\n\n \\`\\`\\`ts title=\"hexclave.config.ts\"\n import type { HexclaveConfig } from \"@hexclave/js/config\"; // replace \\`js\\` with the correct framework SDK package\n\n export const config: HexclaveConfig = {\n apps: {\n installed: {\n authentication: { enabled: true },\n \"deployments-alpha\": { enabled: true },\n },\n },\n \"deployments-alpha\": {\n services: {\n web: {\n type: \"vercel\",\n rootDirectory: \"./\",\n framework: \"nextjs\",\n installCommand: \"pnpm install\",\n buildCommand: \"pnpm build\",\n outputDirectory: \".next\",\n env: {\n \"MY_ENV_VAR\": { value: \"true\" },\n \"DATABASE_CONNECTION_STRING\": { type: \"secret\", key: \"db_connection\" },\n \"NEXT_PUBLIC_HEXCLAVE_PROJECT_ID\": { type: \"connection\", value: \"hexclave.projectId\" },\n },\n },\n },\n },\n };\n \\`\\`\\`\n\n Here, \\`web\\` is the name of your service. \\`type\\` refers to the type of service you want to set up; for now, as mentioned earlier, only \\`vercel\\` is supported. \\`rootDirectory\\` is the directory in which the install and build commands are run, and where the code for your service is found. \\`installCommand\\` is the command run to install your application's dependencies, and \\`buildCommand\\` is what is run to build the necessary packages and files. \\`framework\\` is the framework used by your service; from it and \\`outputDirectory\\`, the run command is inferred.\n\n The \\`HexclaveConfig\\` annotation requires the SDK package it is imported from to be a dependency of the project. If it isn't, either install it or drop the annotation (the config is plain TypeScript — the CLI does not type-check it).\n\n Note also that the config file usually sits inside \\`rootDirectory\\`, which means it is uploaded with your source and compiled by the remote build like any other file. If the deployed app doesn't depend on the Hexclave SDK, add \\`hexclave.config.ts\\` to \\`.vercelignore\\`: the CLI reads the config from disk before packaging, so the build itself never needs it, and excluding it keeps an SDK import in the config from breaking a build that is otherwise unrelated to Hexclave.\n\n ## Agent workflow (do this — do not drive the dashboard UI)\n\n AI agents must deploy and manage Deployments through the CLI and \\`hexclave.config.ts\\`, not by clicking around \\`app.hexclave.com\\` in a browser. The dashboard is a human fallback only.\n\n Preferred sequence:\n\n 1. **Read this skill** (\\`https://skill.hexclave.com/deployments\\` or the Deployments addendum you already have) and ensure \\`deployments-alpha\\` is enabled in config as above.\n 2. **Authenticate for cloud deploys** (pick the first that works):\n - If \\`HEXCLAVE_SECRET_SERVER_KEY\\` (or \\`STACK_SECRET_SERVER_KEY\\`) **and** \\`HEXCLAVE_PROJECT_ID\\` (or \\`STACK_PROJECT_ID\\`) are already in the environment, use them. No login step.\n - Else if \\`npx @hexclave/cli@latest whoami\\` succeeds, you already have a CLI login session — proceed.\n - Else ask the user to run \\`npx @hexclave/cli@latest login\\` (or run it for them). That command opens a **one-time browser login page for the human**. Do **not** use the browser yourself to open the Deployments dashboard, click Deploy, or configure the service in the UI. After login returns successfully, continue immediately with the CLI.\n 3. **Write/update \\`hexclave.config.ts\\`**, then deploy with \\`npx @hexclave/cli@latest deploy <service> ...\\` (see below). Pass every \\`type: \"secret\"\\` env via \\`--secret\\`.\n 4. **Poll status/logs with \\`hexclave exec\\`** (snippets below). Do not tell the user to \"watch the dashboard\" as the primary path.\n\n \\`deploy\\` auth: \\`HEXCLAVE_SECRET_SERVER_KEY\\` if set, otherwise the \\`hexclave login\\` session. \\`exec --cloud-project-id\\` needs the login session (not the secret server key alone).\n\n ## Domains\n\n Every Vercel service gets a Vercel domain autoprovisioned. Prefer the CLI to attach a custom domain:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n await p.addDeploymentServiceDomain('api', 'app.example.com'); \\\\\n return p.getDeploymentServiceDomain('api', 'app.example.com');\"\n \\`\\`\\`\n\n Humans can also add domains in the dashboard at \\`https://app.hexclave.com/projects/<project-id>/deployments\\` (service → Domains). Agents should not do that in a browser.\n\n ## Deploying\n\n Before deploying, run the service's \\`installCommand\\` and \\`buildCommand\\` locally and confirm they succeed. The remote build runs the same commands, but \\`deploy\\` exits before the build finishes, so a broken build does not fail the command — it surfaces only when you check the run afterwards.\n\n From the directory containing your config file:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest deploy web --secret db_connection=\"$DATABASE_URL\"\n \\`\\`\\`\n\n The CLI packages the service's root directory (respecting \\`.gitignore\\` and \\`.vercelignore\\`, and always excluding \\`node_modules\\` and \\`.git\\`), uploads it, and starts a remote build. Without a config file, the configuration stored in Hexclave governs the deploy, with the root directory resolved against the current directory. It always deploys to production, never prompts, and exits as soon as the build is queued, printing the run id. Check that run with \\`exec\\` (next section), not by opening the dashboard.\n\n Every secret defined in the service's \\`env\\` must be passed via \\`--secret\\` on every deploy — a missing (or misspelled) one fails the deploy before anything is uploaded.\n\n Options: \\`--config <path>\\` (default: auto-discover \\`hexclave.config.ts\\` in the current directory, dashboard configuration otherwise), \\`--cloud-project-id <id>\\` (default: the \\`HEXCLAVE_PROJECT_ID\\` env var), and \\`--secret KEY=VALUE\\` (repeatable, see above).\n\n You can also deploy through GitHub Actions, like so:\n\n \\`\\`\\`yaml title=\".github/workflows/deploy.yaml\"\n - run: npm i -g @hexclave/cli\n - run: hexclave deploy web --secret db_connection=\"$DATABASE_URL\"\n env:\n HEXCLAVE_PROJECT_ID: \\${{ secrets.HEXCLAVE_PROJECT_ID }}\n HEXCLAVE_SECRET_SERVER_KEY: \\${{ secrets.HEXCLAVE_SECRET_SERVER_KEY }}\n DATABASE_URL: \\${{ secrets.DATABASE_URL }}\n \\`\\`\\`\n\n ## Checking status and debugging failures\n\n Because \\`deploy\\` returns as soon as the build is queued, a successful exit does not mean the deploy succeeded. Check the service to find out:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n const svc = (await p.listDeploymentServices()).find(s => s.id === 'web'); \\\\\n return { status: svc.status, url: svc.url, run: svc.latest_run };\"\n \\`\\`\\`\n\n A service's \\`status\\` is one of \\`not_deployed\\`, \\`queued\\`, \\`building\\`, \\`deployed\\`, \\`failed\\`, or \\`canceled\\`; a run's is \\`queued\\`, \\`building\\`, \\`ready\\`, \\`error\\`, or \\`canceled\\`. Poll until the run leaves \\`queued\\`/\\`building\\`.\n\n A failed run's \\`error\\` field is only a one-line summary (for example \\`Command \"npm run build\" exited with 1\\`). Do not try to guess the cause from it, and do not reproduce the build locally to find out — fetch the actual build output by run id:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n return p.getDeploymentRunLogs('<run-id>');\"\n \\`\\`\\`\n\n \\`deploy\\` prints the run id it started. If you don't have one, \\`listDeploymentRuns('web', { limit: 5 })\\` returns the most recent runs, newest first — call it through \\`exec\\` like the snippets above.\n\n ## Deleting a service\n\n Prefer the CLI:\n\n \\`\\`\\`sh title=\"Terminal\"\n npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\\\\n \"const p = await hexclaveServerApp.getProject(); \\\\\n await p.deleteDeploymentService('api');\"\n \\`\\`\\`\n\n Humans can also delete a service in the dashboard; agents should not.\n`;\n"],"mappings":";;AAMA,MAAa,0BAA0B,QAAQ"}
@@ -162,6 +162,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
162
162
  id: string;
163
163
  subject: string;
164
164
  created_at_millis: number;
165
+ html: string | null;
166
+ text: string | null;
165
167
  updated_at_millis: number;
166
168
  tsx_source: string;
167
169
  theme_id: string | null;
@@ -198,8 +200,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
198
200
  has_delivered: boolean;
199
201
  started_rendering_at_millis: number;
200
202
  rendered_at_millis: number;
201
- html: string | null;
202
- text: string | null;
203
203
  is_transactional: boolean;
204
204
  is_high_priority: boolean;
205
205
  notification_category_id: string | null;
@@ -208,6 +208,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
208
208
  id: string;
209
209
  subject: string;
210
210
  created_at_millis: number;
211
+ html: string | null;
212
+ text: string | null;
211
213
  updated_at_millis: number;
212
214
  tsx_source: string;
213
215
  theme_id: string | null;
@@ -244,8 +246,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
244
246
  has_delivered: boolean;
245
247
  started_rendering_at_millis: number;
246
248
  rendered_at_millis: number;
247
- html: string | null;
248
- text: string | null;
249
249
  is_transactional: boolean;
250
250
  is_high_priority: boolean;
251
251
  notification_category_id: string | null;
@@ -254,6 +254,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
254
254
  id: string;
255
255
  subject: string;
256
256
  created_at_millis: number;
257
+ html: string | null;
258
+ text: string | null;
257
259
  updated_at_millis: number;
258
260
  tsx_source: string;
259
261
  theme_id: string | null;
@@ -290,8 +292,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
290
292
  has_delivered: boolean;
291
293
  started_rendering_at_millis: number;
292
294
  rendered_at_millis: number;
293
- html: string | null;
294
- text: string | null;
295
295
  is_transactional: boolean;
296
296
  is_high_priority: boolean;
297
297
  notification_category_id: string | null;
@@ -301,6 +301,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
301
301
  id: string;
302
302
  subject: string;
303
303
  created_at_millis: number;
304
+ html: string | null;
305
+ text: string | null;
304
306
  updated_at_millis: number;
305
307
  tsx_source: string;
306
308
  theme_id: string | null;
@@ -337,8 +339,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
337
339
  has_delivered: boolean;
338
340
  started_rendering_at_millis: number;
339
341
  rendered_at_millis: number;
340
- html: string | null;
341
- text: string | null;
342
342
  is_transactional: boolean;
343
343
  is_high_priority: boolean;
344
344
  notification_category_id: string | null;
@@ -347,10 +347,10 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
347
347
  server_error: string;
348
348
  } | {
349
349
  subject?: string | undefined;
350
- started_rendering_at_millis?: number | undefined;
351
- rendered_at_millis?: number | undefined;
352
350
  html?: string | null | undefined;
353
351
  text?: string | null | undefined;
352
+ started_rendering_at_millis?: number | undefined;
353
+ rendered_at_millis?: number | undefined;
354
354
  is_transactional?: boolean | undefined;
355
355
  is_high_priority?: boolean | undefined;
356
356
  notification_category_id?: string | null | undefined;
@@ -400,6 +400,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
400
400
  id: string;
401
401
  subject: string;
402
402
  created_at_millis: number;
403
+ html: string | null;
404
+ text: string | null;
403
405
  updated_at_millis: number;
404
406
  tsx_source: string;
405
407
  theme_id: string | null;
@@ -436,8 +438,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
436
438
  has_delivered: boolean;
437
439
  started_rendering_at_millis: number;
438
440
  rendered_at_millis: number;
439
- html: string | null;
440
- text: string | null;
441
441
  is_transactional: boolean;
442
442
  is_high_priority: boolean;
443
443
  notification_category_id: string | null;
@@ -448,6 +448,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
448
448
  id: string;
449
449
  subject: string;
450
450
  created_at_millis: number;
451
+ html: string | null;
452
+ text: string | null;
451
453
  updated_at_millis: number;
452
454
  tsx_source: string;
453
455
  theme_id: string | null;
@@ -484,8 +486,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
484
486
  has_delivered: boolean;
485
487
  started_rendering_at_millis: number;
486
488
  rendered_at_millis: number;
487
- html: string | null;
488
- text: string | null;
489
489
  is_transactional: boolean;
490
490
  is_high_priority: boolean;
491
491
  notification_category_id: string | null;
@@ -496,6 +496,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
496
496
  id: string;
497
497
  subject: string;
498
498
  created_at_millis: number;
499
+ html: string | null;
500
+ text: string | null;
499
501
  updated_at_millis: number;
500
502
  tsx_source: string;
501
503
  theme_id: string | null;
@@ -532,8 +534,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
532
534
  has_delivered: boolean;
533
535
  started_rendering_at_millis: number;
534
536
  rendered_at_millis: number;
535
- html: string | null;
536
- text: string | null;
537
537
  is_transactional: boolean;
538
538
  is_high_priority: boolean;
539
539
  notification_category_id: string | null;
@@ -545,6 +545,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
545
545
  id: string;
546
546
  subject: string;
547
547
  created_at_millis: number;
548
+ html: string | null;
549
+ text: string | null;
548
550
  updated_at_millis: number;
549
551
  tsx_source: string;
550
552
  theme_id: string | null;
@@ -581,8 +583,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
581
583
  has_delivered: boolean;
582
584
  started_rendering_at_millis: number;
583
585
  rendered_at_millis: number;
584
- html: string | null;
585
- text: string | null;
586
586
  is_transactional: boolean;
587
587
  is_high_priority: boolean;
588
588
  notification_category_id: string | null;
@@ -595,6 +595,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
595
595
  id: string;
596
596
  subject: string;
597
597
  created_at_millis: number;
598
+ html: string | null;
599
+ text: string | null;
598
600
  updated_at_millis: number;
599
601
  tsx_source: string;
600
602
  theme_id: string | null;
@@ -631,8 +633,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
631
633
  has_delivered: boolean;
632
634
  started_rendering_at_millis: number;
633
635
  rendered_at_millis: number;
634
- html: string | null;
635
- text: string | null;
636
636
  is_transactional: boolean;
637
637
  is_high_priority: boolean;
638
638
  notification_category_id: string | null;
@@ -645,6 +645,8 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
645
645
  id: string;
646
646
  subject: string;
647
647
  created_at_millis: number;
648
+ html: string | null;
649
+ text: string | null;
648
650
  updated_at_millis: number;
649
651
  tsx_source: string;
650
652
  theme_id: string | null;
@@ -681,8 +683,6 @@ declare const emailOutboxReadSchema: import("yup").MixedSchema<{
681
683
  has_delivered: boolean;
682
684
  started_rendering_at_millis: number;
683
685
  rendered_at_millis: number;
684
- html: string | null;
685
- text: string | null;
686
686
  is_transactional: boolean;
687
687
  is_high_priority: boolean;
688
688
  notification_category_id: string | null;
@@ -882,6 +882,8 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
882
882
  id: string;
883
883
  subject: string;
884
884
  created_at_millis: number;
885
+ html: string | null;
886
+ text: string | null;
885
887
  updated_at_millis: number;
886
888
  tsx_source: string;
887
889
  theme_id: string | null;
@@ -918,8 +920,6 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
918
920
  has_delivered: boolean;
919
921
  started_rendering_at_millis: number;
920
922
  rendered_at_millis: number;
921
- html: string | null;
922
- text: string | null;
923
923
  is_transactional: boolean;
924
924
  is_high_priority: boolean;
925
925
  notification_category_id: string | null;
@@ -928,6 +928,8 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
928
928
  id: string;
929
929
  subject: string;
930
930
  created_at_millis: number;
931
+ html: string | null;
932
+ text: string | null;
931
933
  updated_at_millis: number;
932
934
  tsx_source: string;
933
935
  theme_id: string | null;
@@ -964,8 +966,6 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
964
966
  has_delivered: boolean;
965
967
  started_rendering_at_millis: number;
966
968
  rendered_at_millis: number;
967
- html: string | null;
968
- text: string | null;
969
969
  is_transactional: boolean;
970
970
  is_high_priority: boolean;
971
971
  notification_category_id: string | null;
@@ -974,6 +974,8 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
974
974
  id: string;
975
975
  subject: string;
976
976
  created_at_millis: number;
977
+ html: string | null;
978
+ text: string | null;
977
979
  updated_at_millis: number;
978
980
  tsx_source: string;
979
981
  theme_id: string | null;
@@ -1010,8 +1012,6 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1010
1012
  has_delivered: boolean;
1011
1013
  started_rendering_at_millis: number;
1012
1014
  rendered_at_millis: number;
1013
- html: string | null;
1014
- text: string | null;
1015
1015
  is_transactional: boolean;
1016
1016
  is_high_priority: boolean;
1017
1017
  notification_category_id: string | null;
@@ -1021,6 +1021,8 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1021
1021
  id: string;
1022
1022
  subject: string;
1023
1023
  created_at_millis: number;
1024
+ html: string | null;
1025
+ text: string | null;
1024
1026
  updated_at_millis: number;
1025
1027
  tsx_source: string;
1026
1028
  theme_id: string | null;
@@ -1057,8 +1059,6 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1057
1059
  has_delivered: boolean;
1058
1060
  started_rendering_at_millis: number;
1059
1061
  rendered_at_millis: number;
1060
- html: string | null;
1061
- text: string | null;
1062
1062
  is_transactional: boolean;
1063
1063
  is_high_priority: boolean;
1064
1064
  notification_category_id: string | null;
@@ -1067,10 +1067,10 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1067
1067
  server_error: string;
1068
1068
  } | {
1069
1069
  subject?: string | undefined;
1070
- started_rendering_at_millis?: number | undefined;
1071
- rendered_at_millis?: number | undefined;
1072
1070
  html?: string | null | undefined;
1073
1071
  text?: string | null | undefined;
1072
+ started_rendering_at_millis?: number | undefined;
1073
+ rendered_at_millis?: number | undefined;
1074
1074
  is_transactional?: boolean | undefined;
1075
1075
  is_high_priority?: boolean | undefined;
1076
1076
  notification_category_id?: string | null | undefined;
@@ -1120,6 +1120,8 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1120
1120
  id: string;
1121
1121
  subject: string;
1122
1122
  created_at_millis: number;
1123
+ html: string | null;
1124
+ text: string | null;
1123
1125
  updated_at_millis: number;
1124
1126
  tsx_source: string;
1125
1127
  theme_id: string | null;
@@ -1156,8 +1158,6 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1156
1158
  has_delivered: boolean;
1157
1159
  started_rendering_at_millis: number;
1158
1160
  rendered_at_millis: number;
1159
- html: string | null;
1160
- text: string | null;
1161
1161
  is_transactional: boolean;
1162
1162
  is_high_priority: boolean;
1163
1163
  notification_category_id: string | null;
@@ -1168,6 +1168,8 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1168
1168
  id: string;
1169
1169
  subject: string;
1170
1170
  created_at_millis: number;
1171
+ html: string | null;
1172
+ text: string | null;
1171
1173
  updated_at_millis: number;
1172
1174
  tsx_source: string;
1173
1175
  theme_id: string | null;
@@ -1204,8 +1206,6 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1204
1206
  has_delivered: boolean;
1205
1207
  started_rendering_at_millis: number;
1206
1208
  rendered_at_millis: number;
1207
- html: string | null;
1208
- text: string | null;
1209
1209
  is_transactional: boolean;
1210
1210
  is_high_priority: boolean;
1211
1211
  notification_category_id: string | null;
@@ -1216,6 +1216,8 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1216
1216
  id: string;
1217
1217
  subject: string;
1218
1218
  created_at_millis: number;
1219
+ html: string | null;
1220
+ text: string | null;
1219
1221
  updated_at_millis: number;
1220
1222
  tsx_source: string;
1221
1223
  theme_id: string | null;
@@ -1252,8 +1254,6 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1252
1254
  has_delivered: boolean;
1253
1255
  started_rendering_at_millis: number;
1254
1256
  rendered_at_millis: number;
1255
- html: string | null;
1256
- text: string | null;
1257
1257
  is_transactional: boolean;
1258
1258
  is_high_priority: boolean;
1259
1259
  notification_category_id: string | null;
@@ -1265,6 +1265,8 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1265
1265
  id: string;
1266
1266
  subject: string;
1267
1267
  created_at_millis: number;
1268
+ html: string | null;
1269
+ text: string | null;
1268
1270
  updated_at_millis: number;
1269
1271
  tsx_source: string;
1270
1272
  theme_id: string | null;
@@ -1301,8 +1303,6 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1301
1303
  has_delivered: boolean;
1302
1304
  started_rendering_at_millis: number;
1303
1305
  rendered_at_millis: number;
1304
- html: string | null;
1305
- text: string | null;
1306
1306
  is_transactional: boolean;
1307
1307
  is_high_priority: boolean;
1308
1308
  notification_category_id: string | null;
@@ -1315,6 +1315,8 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1315
1315
  id: string;
1316
1316
  subject: string;
1317
1317
  created_at_millis: number;
1318
+ html: string | null;
1319
+ text: string | null;
1318
1320
  updated_at_millis: number;
1319
1321
  tsx_source: string;
1320
1322
  theme_id: string | null;
@@ -1351,8 +1353,6 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1351
1353
  has_delivered: boolean;
1352
1354
  started_rendering_at_millis: number;
1353
1355
  rendered_at_millis: number;
1354
- html: string | null;
1355
- text: string | null;
1356
1356
  is_transactional: boolean;
1357
1357
  is_high_priority: boolean;
1358
1358
  notification_category_id: string | null;
@@ -1365,6 +1365,8 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1365
1365
  id: string;
1366
1366
  subject: string;
1367
1367
  created_at_millis: number;
1368
+ html: string | null;
1369
+ text: string | null;
1368
1370
  updated_at_millis: number;
1369
1371
  tsx_source: string;
1370
1372
  theme_id: string | null;
@@ -1401,8 +1403,6 @@ declare const emailOutboxCrud: import("../../crud").CrudSchemaFromOptions<{
1401
1403
  has_delivered: boolean;
1402
1404
  started_rendering_at_millis: number;
1403
1405
  rendered_at_millis: number;
1404
- html: string | null;
1405
- text: string | null;
1406
1406
  is_transactional: boolean;
1407
1407
  is_high_priority: boolean;
1408
1408
  notification_category_id: string | null;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { a as KnownErrors, n as KnownError } from "./known-errors-Bm4a61wL.js";
2
2
  import { n as HexclaveClientInterface } from "./client-interface-DvkciaL0.js";
3
3
  import { t as HexclaveServerInterface } from "./server-interface-Ra_vIHP4.js";
4
- import { l as HexclaveAdminInterface } from "./admin-interface-B9TRKVnU.js";
4
+ import { l as HexclaveAdminInterface } from "./admin-interface-DaxVUjl4.js";
5
5
  export { HexclaveAdminInterface, HexclaveClientInterface, HexclaveServerInterface, KnownError, KnownErrors };
@@ -1,3 +1,3 @@
1
1
  import { n as PlanUsageResponse } from "../plan-usage-BaDxcLZ1.js";
2
- import { a as AdminDeploymentRunJson, c as ChatContent, d as InternalApiKeyCreateCrudResponse, i as AdminDeploymentEnvVarOptions, l as HexclaveAdminInterface, n as AdminDeploymentDomainJson, o as AdminDeploymentServiceBuildOptions, r as AdminDeploymentEnvVarJson, s as AdminDeploymentServiceJson, t as AdminAuthApplicationOptions, u as InternalApiKeyCreateCrudRequest } from "../admin-interface-B9TRKVnU.js";
2
+ import { a as AdminDeploymentRunJson, c as ChatContent, d as InternalApiKeyCreateCrudResponse, i as AdminDeploymentEnvVarOptions, l as HexclaveAdminInterface, n as AdminDeploymentDomainJson, o as AdminDeploymentServiceBuildOptions, r as AdminDeploymentEnvVarJson, s as AdminDeploymentServiceJson, t as AdminAuthApplicationOptions, u as InternalApiKeyCreateCrudRequest } from "../admin-interface-DaxVUjl4.js";
3
3
  export { AdminAuthApplicationOptions, AdminDeploymentDomainJson, AdminDeploymentEnvVarJson, AdminDeploymentEnvVarOptions, AdminDeploymentRunJson, AdminDeploymentServiceBuildOptions, AdminDeploymentServiceJson, ChatContent, HexclaveAdminInterface, InternalApiKeyCreateCrudRequest, InternalApiKeyCreateCrudResponse, type PlanUsageResponse };
@@ -1,2 +1,2 @@
1
- import { i as emailOutboxUpdateSchema, n as emailOutboxCrud, r as emailOutboxReadSchema, t as EmailOutboxCrud } from "../../email-outbox-CYmVerum.js";
1
+ import { i as emailOutboxUpdateSchema, n as emailOutboxCrud, r as emailOutboxReadSchema, t as EmailOutboxCrud } from "../../email-outbox-B1wmVPRG.js";
2
2
  export { EmailOutboxCrud, emailOutboxCrud, emailOutboxReadSchema, emailOutboxUpdateSchema };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hexclave/shared",
3
- "version": "1.0.63",
3
+ "version": "1.0.64",
4
4
  "repository": "https://github.com/hexclave/hexclave",
5
5
  "files": [
6
6
  "README.md",
@@ -51,13 +51,25 @@ export const deploymentsSkillSection = deindent`
51
51
 
52
52
  Note also that the config file usually sits inside \`rootDirectory\`, which means it is uploaded with your source and compiled by the remote build like any other file. If the deployed app doesn't depend on the Hexclave SDK, add \`hexclave.config.ts\` to \`.vercelignore\`: the CLI reads the config from disk before packaging, so the build itself never needs it, and excluding it keeps an SDK import in the config from breaking a build that is otherwise unrelated to Hexclave.
53
53
 
54
- ## Domains
54
+ ## Agent workflow (do this — do not drive the dashboard UI)
55
+
56
+ AI agents must deploy and manage Deployments through the CLI and \`hexclave.config.ts\`, not by clicking around \`app.hexclave.com\` in a browser. The dashboard is a human fallback only.
55
57
 
56
- Every Vercel service gets a Vercel domain autoprovisioned. If you want to attach a custom domain, there are two ways to do so.
58
+ Preferred sequence:
57
59
 
58
- **Option 1 the dashboard.** Visit \`https://app.hexclave.com/projects/<project-id>/deployments\`, click the service of choice, go to the Domains tab, add your domain, and then create the returned DNS records at your DNS provider.
60
+ 1. **Read this skill** (\`https://skill.hexclave.com/deployments\` or the Deployments addendum you already have) and ensure \`deployments-alpha\` is enabled in config as above.
61
+ 2. **Authenticate for cloud deploys** (pick the first that works):
62
+ - If \`HEXCLAVE_SECRET_SERVER_KEY\` (or \`STACK_SECRET_SERVER_KEY\`) **and** \`HEXCLAVE_PROJECT_ID\` (or \`STACK_PROJECT_ID\`) are already in the environment, use them. No login step.
63
+ - Else if \`npx @hexclave/cli@latest whoami\` succeeds, you already have a CLI login session — proceed.
64
+ - Else ask the user to run \`npx @hexclave/cli@latest login\` (or run it for them). That command opens a **one-time browser login page for the human**. Do **not** use the browser yourself to open the Deployments dashboard, click Deploy, or configure the service in the UI. After login returns successfully, continue immediately with the CLI.
65
+ 3. **Write/update \`hexclave.config.ts\`**, then deploy with \`npx @hexclave/cli@latest deploy <service> ...\` (see below). Pass every \`type: "secret"\` env via \`--secret\`.
66
+ 4. **Poll status/logs with \`hexclave exec\`** (snippets below). Do not tell the user to "watch the dashboard" as the primary path.
59
67
 
60
- **Option 2 the CLI.** Here is an example of adding \`app.example.com\` to the service \`api\` and receiving the DNS records that then need to be set with your DNS provider:
68
+ \`deploy\` auth: \`HEXCLAVE_SECRET_SERVER_KEY\` if set, otherwise the \`hexclave login\` session. \`exec --cloud-project-id\` needs the login session (not the secret server key alone).
69
+
70
+ ## Domains
71
+
72
+ Every Vercel service gets a Vercel domain autoprovisioned. Prefer the CLI to attach a custom domain:
61
73
 
62
74
  \`\`\`sh title="Terminal"
63
75
  npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\
@@ -66,6 +78,8 @@ export const deploymentsSkillSection = deindent`
66
78
  return p.getDeploymentServiceDomain('api', 'app.example.com');"
67
79
  \`\`\`
68
80
 
81
+ Humans can also add domains in the dashboard at \`https://app.hexclave.com/projects/<project-id>/deployments\` (service → Domains). Agents should not do that in a browser.
82
+
69
83
  ## Deploying
70
84
 
71
85
  Before deploying, run the service's \`installCommand\` and \`buildCommand\` locally and confirm they succeed. The remote build runs the same commands, but \`deploy\` exits before the build finishes, so a broken build does not fail the command — it surfaces only when you check the run afterwards.
@@ -76,7 +90,7 @@ export const deploymentsSkillSection = deindent`
76
90
  npx @hexclave/cli@latest deploy web --secret db_connection="$DATABASE_URL"
77
91
  \`\`\`
78
92
 
79
- The CLI packages the service's root directory (respecting \`.gitignore\` and \`.vercelignore\`, and always excluding \`node_modules\` and \`.git\`), uploads it, and starts a remote build. Without a config file, the configuration stored in Hexclave governs the deploy, with the root directory resolved against the current directory. It always deploys to production, never prompts, and exits as soon as the build is queued, printing the run id. Follow the build in the dashboard's Deployments tab.
93
+ The CLI packages the service's root directory (respecting \`.gitignore\` and \`.vercelignore\`, and always excluding \`node_modules\` and \`.git\`), uploads it, and starts a remote build. Without a config file, the configuration stored in Hexclave governs the deploy, with the root directory resolved against the current directory. It always deploys to production, never prompts, and exits as soon as the build is queued, printing the run id. Check that run with \`exec\` (next section), not by opening the dashboard.
80
94
 
81
95
  Every secret defined in the service's \`env\` must be passed via \`--secret\` on every deploy — a missing (or misspelled) one fails the deploy before anything is uploaded.
82
96
 
@@ -118,11 +132,13 @@ export const deploymentsSkillSection = deindent`
118
132
 
119
133
  ## Deleting a service
120
134
 
121
- If you want to delete a deployed service, you can do so through the dashboard, or through the CLI like so:
135
+ Prefer the CLI:
122
136
 
123
137
  \`\`\`sh title="Terminal"
124
138
  npx @hexclave/cli@latest exec --cloud-project-id <project-id> \\
125
139
  "const p = await hexclaveServerApp.getProject(); \\
126
140
  await p.deleteDeploymentService('api');"
127
141
  \`\`\`
142
+
143
+ Humans can also delete a service in the dashboard; agents should not.
128
144
  `;