deepspace 0.33.1 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +5 -1
  3. package/dist/{chunk-PZDVKSLI.js → chunk-ESEI3MMY.js} +2 -2
  4. package/dist/{chunk-PZDVKSLI.js.map → chunk-ESEI3MMY.js.map} +1 -1
  5. package/dist/chunk-ESYXTIV2.js +1957 -0
  6. package/dist/chunk-ESYXTIV2.js.map +1 -0
  7. package/dist/cli.js +151 -53
  8. package/dist/cli.js.map +1 -1
  9. package/dist/documentation-client-core.js +1 -1
  10. package/dist/documentation-default-renderer.cjs +1 -1
  11. package/dist/documentation-react.js +1 -1
  12. package/dist/documentation-runtime.js +10 -10
  13. package/dist/documentation-server-core.js +1 -1
  14. package/dist/documentation.js +47 -22
  15. package/dist/documentation.js.map +1 -1
  16. package/dist/expo.d.ts +83 -0
  17. package/dist/expo.js +242 -0
  18. package/dist/expo.js.map +1 -0
  19. package/dist/index.d.ts +110 -23
  20. package/dist/index.js +134 -53
  21. package/dist/index.js.map +1 -1
  22. package/dist/server.d.ts +205 -37
  23. package/dist/server.js +290 -97
  24. package/dist/server.js.map +1 -1
  25. package/dist/testing.js +45 -3
  26. package/dist/testing.js.map +1 -1
  27. package/dist/worker.d.ts +348 -48
  28. package/dist/worker.js +547 -110
  29. package/dist/worker.js.map +1 -1
  30. package/features/documents/feature.json +15 -0
  31. package/features/documents/src/DocumentsListPage.tsx +22 -8
  32. package/features/documents/src/InviteDialog.tsx +63 -42
  33. package/features/documents/src/__tests__/documents-find-invitee-action.test.ts +131 -0
  34. package/features/documents/src/__tests__/documents-invitee-lookup.test.ts +67 -0
  35. package/features/documents/src/documents-find-invitee-action.ts +56 -0
  36. package/features/documents/src/documents-invitee-lookup.ts +38 -0
  37. package/features/documents/src/documents-ui.css +10 -0
  38. package/package.json +29 -9
package/dist/cli.js CHANGED
@@ -676,27 +676,62 @@ function findUnknownCommand(argv, rootCommands) {
676
676
  return null;
677
677
  }
678
678
 
679
+ // src/shared/planes.ts
680
+ var PLANES = {
681
+ production: {
682
+ auth: "https://auth.deep.space",
683
+ api: "https://api-worker.deep.space",
684
+ platform: "https://platform-worker.deep.space",
685
+ deploy: "https://deploy-worker.deep.space",
686
+ appDomain: "app.space",
687
+ platformDomain: "deep.space",
688
+ home: "https://deep.space",
689
+ dashboard: "https://dashboard.deep.space",
690
+ privacyPolicy: "https://deep.space/privacy"
691
+ },
692
+ // Services on deepspacesites.com, apps on spacestest.com: production's
693
+ // two-zone split, because a Worker cannot fetch one in its own zone.
694
+ staging: {
695
+ auth: "https://auth.deepspacesites.com",
696
+ api: "https://api.deepspacesites.com",
697
+ platform: "https://platform.deepspacesites.com",
698
+ deploy: "https://deploy.deepspacesites.com",
699
+ appDomain: "spacestest.com",
700
+ platformDomain: "deepspacesites.com",
701
+ home: "https://spacestest.com",
702
+ dashboard: "https://dashboard.deepspacesites.com",
703
+ privacyPolicy: "https://deep.space/privacy"
704
+ },
705
+ // Services on deepspacemedical.com, apps on deepspacemedical.app: two zones
706
+ // in the medical Cloudflare account. The plane has no dashboard.
707
+ medical: {
708
+ auth: "https://auth.deepspacemedical.com",
709
+ api: "https://api.deepspacemedical.com",
710
+ platform: "https://platform.deepspacemedical.com",
711
+ deploy: "https://deploy.deepspacemedical.com",
712
+ appDomain: "deepspacemedical.app",
713
+ platformDomain: "deepspacemedical.com",
714
+ home: "https://deepspacemedical.com",
715
+ dashboard: null,
716
+ privacyPolicy: "https://deepspacemedical.com/privacy"
717
+ }
718
+ };
719
+
679
720
  // src/cli/env.ts
680
721
  function resolveDeepSpaceEnvironment(value) {
681
722
  if (value === void 0 || value === "production") return "production";
682
723
  if (value === "staging") return "staging";
724
+ if (value === "medical") return "medical";
683
725
  return "invalid";
684
726
  }
685
727
  var DEEPSPACE_ENV = resolveDeepSpaceEnvironment(process.env.DEEPSPACE_ENV);
686
- var PROD_URLS = {
687
- auth: "https://auth.deep.space",
688
- api: "https://api-worker.deep.space",
689
- platform: "https://platform-worker.deep.space",
690
- deploy: "https://deploy-worker.deep.space"
691
- };
692
- var STAGING_URLS = {
693
- // Services live on deepspacesites.com, apps on spacestest.com. This mirrors
694
- // prod's two-zone split because a Worker cannot fetch one in its own zone.
695
- auth: "https://auth.deepspacesites.com",
696
- api: "https://api.deepspacesites.com",
697
- platform: "https://platform.deepspacesites.com",
698
- deploy: "https://deploy.deepspacesites.com"
728
+ var serviceUrls = (plane) => {
729
+ const { auth: auth2, api: api4, platform, deploy } = PLANES[plane];
730
+ return { auth: auth2, api: api4, platform, deploy };
699
731
  };
732
+ var PROD_URLS = serviceUrls("production");
733
+ var STAGING_URLS = serviceUrls("staging");
734
+ var MEDICAL_URLS = serviceUrls("medical");
700
735
  var INVALID_URLS = {
701
736
  auth: "http://127.0.0.1:9",
702
737
  api: "http://127.0.0.1:9",
@@ -704,19 +739,21 @@ var INVALID_URLS = {
704
739
  deploy: "http://127.0.0.1:9"
705
740
  };
706
741
  function appDomainForEnv(env) {
707
- return env === "production" ? "app.space" : env === "staging" ? "spacestest.com" : null;
742
+ return env === "invalid" ? null : PLANES[env].appDomain;
708
743
  }
709
744
  function platformDomainForEnv(env) {
710
- return env === "production" ? "deep.space" : env === "staging" ? "deepspacesites.com" : null;
745
+ return env === "invalid" ? null : PLANES[env].platformDomain;
711
746
  }
712
- var PLATFORM_URLS = DEEPSPACE_ENV === "production" ? PROD_URLS : DEEPSPACE_ENV === "staging" ? STAGING_URLS : INVALID_URLS;
747
+ var PLATFORM_URLS = DEEPSPACE_ENV === "production" ? PROD_URLS : DEEPSPACE_ENV === "staging" ? STAGING_URLS : DEEPSPACE_ENV === "medical" ? MEDICAL_URLS : INVALID_URLS;
713
748
  var PLANE_URLS = {
714
749
  production: PROD_URLS,
715
- staging: STAGING_URLS
750
+ staging: STAGING_URLS,
751
+ medical: MEDICAL_URLS
716
752
  };
717
753
  var PLANE_AUTH_URLS = {
718
754
  production: PLANE_URLS.production.auth,
719
- staging: PLANE_URLS.staging.auth
755
+ staging: PLANE_URLS.staging.auth,
756
+ medical: PLANE_URLS.medical.auth
720
757
  };
721
758
  function effectivePlatformUrls(env = process.env) {
722
759
  return {
@@ -732,7 +769,7 @@ var {
732
769
  platform: PLATFORM_URL,
733
770
  deploy: DEPLOY_URL
734
771
  } = effectivePlatformUrls();
735
- var DASHBOARD_URL = DEEPSPACE_ENV === "production" ? "https://dashboard.deep.space" : DEEPSPACE_ENV === "staging" ? "https://dashboard.deepspacesites.com" : "http://127.0.0.1:9";
772
+ var DASHBOARD_URL = DEEPSPACE_ENV === "invalid" ? "http://127.0.0.1:9" : PLANES[DEEPSPACE_ENV].dashboard;
736
773
 
737
774
  // src/cli/auth.ts
738
775
  import { readFileSync as readFileSync2, existsSync, mkdirSync } from "fs";
@@ -1014,7 +1051,7 @@ var login_default = defineDeepspaceCommand({
1014
1051
  const who = await doEmailLogin(email, password);
1015
1052
  if (!json) {
1016
1053
  console.log(`Logged in as ${who.email} (${who.userId})`);
1017
- console.log(`Dashboard: ${DASHBOARD_URL}`);
1054
+ if (DASHBOARD_URL) console.log(`Dashboard: ${DASHBOARD_URL}`);
1018
1055
  }
1019
1056
  return { data: { email: who.email, userId: who.userId } };
1020
1057
  }
@@ -1057,13 +1094,15 @@ var login_default = defineDeepspaceCommand({
1057
1094
  if (!json) {
1058
1095
  s.stop("Authenticated");
1059
1096
  p4.log.success(`Logged in as ${result.name ?? result.email}`);
1060
- p4.note(
1061
- `Manage your account, deployed apps, billing, and subscription
1097
+ if (DASHBOARD_URL) {
1098
+ p4.note(
1099
+ `Manage your account, deployed apps, billing, and subscription
1062
1100
  plans on the web dashboard:
1063
1101
 
1064
1102
  ${DASHBOARD_URL}`,
1065
- "Dashboard"
1066
- );
1103
+ "Dashboard"
1104
+ );
1105
+ }
1067
1106
  p4.outro("Done");
1068
1107
  }
1069
1108
  return { data: { email: result.email, userId } };
@@ -1686,9 +1725,8 @@ import { existsSync as existsSync6 } from "fs";
1686
1725
  import { tmpdir } from "os";
1687
1726
  import { isAbsolute as isAbsolute2, relative, resolve as resolve3 } from "path";
1688
1727
  function spaceRemoteName(environment = DEEPSPACE_ENV) {
1689
- if (environment === "staging") return "space-staging";
1690
1728
  if (environment === "production") return "space";
1691
- return "space-invalid";
1729
+ return `space-${environment}`;
1692
1730
  }
1693
1731
  var SPACE_REMOTE = spaceRemoteName();
1694
1732
  function spaceTrackingRef(branch, remote = SPACE_REMOTE) {
@@ -1724,7 +1762,7 @@ function entryIsTransient(cwd) {
1724
1762
  return rel === "" || !rel.startsWith("..") && !isAbsolute2(rel);
1725
1763
  }
1726
1764
  function helperEntryUsable(command) {
1727
- const match = /^!(?:DEEPSPACE_ENV=(production|staging) )?'([^']*)' '([^']*)' git-credential$/.exec(command);
1765
+ const match = /^!(?:DEEPSPACE_ENV=(production|staging|medical) )?'([^']*)' '([^']*)' git-credential$/.exec(command);
1728
1766
  const expectedEnvironment = DEEPSPACE_ENV === "production" ? void 0 : DEEPSPACE_ENV;
1729
1767
  if (!match || match[1] !== expectedEnvironment) return false;
1730
1768
  return existsSync6(match[2]) && existsSync6(match[3]);
@@ -1732,7 +1770,7 @@ function helperEntryUsable(command) {
1732
1770
  function credentialHelperCommand(environment = DEEPSPACE_ENV) {
1733
1771
  const entry = process.argv[1];
1734
1772
  if (!entry) throw new Error("CLI entry path is unavailable");
1735
- const environmentPrefix = environment === "staging" ? "DEEPSPACE_ENV=staging " : "";
1773
+ const environmentPrefix = environment === "staging" || environment === "medical" ? `DEEPSPACE_ENV=${environment} ` : "";
1736
1774
  return `!${environmentPrefix}${shQuote(process.execPath)} ${shQuote(entry)} git-credential`;
1737
1775
  }
1738
1776
  function installCredentialHelper(cwd, url) {
@@ -4482,10 +4520,9 @@ import { existsSync as existsSync15, mkdirSync as mkdirSync7, readFileSync as re
4482
4520
  import { homedir as homedir2 } from "os";
4483
4521
  import { join as join13 } from "path";
4484
4522
  var TEST_ACCOUNTS_PATH = join13(homedir2(), ".deepspace", "test-accounts.json");
4485
- var PRODUCTION_AUTH_ORIGIN = "https://auth.deep.space";
4486
- var STAGING_AUTH_ORIGIN = "https://auth.deepspacesites.com";
4487
4523
  function currentTestAccountScope(env = process.env) {
4488
- const selected = env.DEEPSPACE_AUTH_URL ?? (env.DEEPSPACE_ENV === "staging" ? STAGING_AUTH_ORIGIN : PRODUCTION_AUTH_ORIGIN);
4524
+ const plane = env.DEEPSPACE_ENV;
4525
+ const selected = env.DEEPSPACE_AUTH_URL ?? (plane === "staging" || plane === "medical" ? PLANES[plane].auth : PLANES.production.auth);
4489
4526
  return normalizeTestAccountScope(selected);
4490
4527
  }
4491
4528
  function normalizeTestAccountScope(value) {
@@ -5753,6 +5790,7 @@ var ACTION_TOOLS_DELETE_WHERE_MIGRATION_ID = "2026-08-action-tools-delete-where"
5753
5790
  var BUILD_INJECTED_APP_ID_MIGRATION_ID = "2026-08-build-injected-app-id";
5754
5791
  var ACTION_ROUTES_BEARER_GUARD_MIGRATION_ID = "2026-08-action-routes-bearer-guard";
5755
5792
  var FILES_SESSION_COOKIE_READS_MIGRATION_ID = "2026-09-files-session-cookie-reads";
5793
+ var AI_SDK_7_MIGRATION_ID = "2026-09-ai-sdk-7";
5756
5794
  function validateAppMigrationIds(value) {
5757
5795
  if (!Array.isArray(value)) {
5758
5796
  return { valid: false, reason: "app migrations must be a JSON string array" };
@@ -5816,6 +5854,12 @@ var APP_MIGRATION_GUIDANCE = [
5816
5854
  description: "Let private file URLs render in <img>/<audio>/<video> for the signed-in user",
5817
5855
  files: ["the app-owned HTTP route file that proxies /api/files/*"],
5818
5856
  guidance: "In the /api/files/* proxy only, replace `const auth = await resolveAuth(c.req.raw, c.env)` with `const auth = (await resolveAuth(c.req.raw, c.env)) ?? (await resolveSessionReadAuth(c.req.raw, c.env))`, importing resolveSessionReadAuth from 'deepspace/worker'. It identifies same-origin GET/HEAD by the app-origin session cookie and returns null for everything else. Do not add it to resolveAuth, which also gates writes. In the same route, skip the JSON URL rewrite for HEAD: change `if (contentType.includes('application/json'))` to `if (contentType.includes('application/json') && c.req.method !== 'HEAD')`, because a HEAD answer carries the content-type but no body and parsing it would turn every failed media probe into a 500."
5857
+ },
5858
+ {
5859
+ id: AI_SDK_7_MIGRATION_ID,
5860
+ description: "Move the app's own AI code to AI SDK 7",
5861
+ files: ["src/ai/chat-routes.ts", 'every other file importing from "ai"'],
5862
+ guidance: "Run `npx @ai-sdk/codemod v7 src` and review its diff: it renames `system` to `instructions` in ANY object, including non-AI-SDK request bodies, so revert those. Then by hand: in the chat route's `onEnd` (formerly `onFinish`), persist `responseMessages` \u2014 `response.messages` now holds only the final step, which drops earlier tool calls \u2014 and since `onEnd` no longer runs after an abort, also persist in `onAbort({ steps })` from the completed steps' `response.messages`. Replace `result.toUIMessageStreamResponse(options)` with `createUIMessageStreamResponse({ headers, stream: toUIMessageStream({ stream: result.stream, ...options }) })` imported from 'ai'. A tool's `execute` options now include `context`. `role: 'system'` messages inside `messages` are rejected unless the call sets `allowSystemInMessages: true`."
5819
5863
  }
5820
5864
  ];
5821
5865
  var APP_MIGRATION_DEFINITIONS = APP_MIGRATION_GUIDANCE.map(({ id, description }) => ({
@@ -5867,14 +5911,18 @@ async function buildDeployBundle(options) {
5867
5911
  let preparedWranglerConfig;
5868
5912
  try {
5869
5913
  preparedWranglerConfig = prepareWranglerEnvConfig(appDir, envName);
5870
- const appDomain = DEEPSPACE_ENV === "staging" ? "spacestest.com" : "app.space";
5914
+ const appDomain = appDomainForEnv(DEEPSPACE_ENV) ?? "app.space";
5871
5915
  execSync2("npx vite build", {
5872
5916
  cwd: appDir,
5873
5917
  stdio: "pipe",
5874
5918
  env: {
5875
5919
  ...wranglerViteEnv(process.env, preparedWranglerConfig),
5876
5920
  // The Vite plugin's one documentation compile stamps release URLs.
5877
- DEEPSPACE_DOCUMENTATION_BASE_URL: `https://${appName}.${appDomain}/docs`
5921
+ DEEPSPACE_DOCUMENTATION_BASE_URL: `https://${appName}.${appDomain}/docs`,
5922
+ // The scaffold's build-time prerender (prerender.ts) builds canonical
5923
+ // URLs and the sitemap on this, so a staging deploy resolves to
5924
+ // spacestest.com instead of the wrangler name on app.space.
5925
+ DEEPSPACE_SITE_ORIGIN: `https://${appName}.${appDomain}`
5878
5926
  }
5879
5927
  });
5880
5928
  } catch (error) {
@@ -8256,7 +8304,7 @@ var whoami_default = defineDeepspaceCommand({
8256
8304
  if (payload.exp) {
8257
8305
  console.log(`Expires: ${new Date(payload.exp * 1e3).toISOString()} (renews on use)`);
8258
8306
  }
8259
- console.log(`Dashboard: ${DASHBOARD_URL}`);
8307
+ if (DASHBOARD_URL) console.log(`Dashboard: ${DASHBOARD_URL}`);
8260
8308
  if (isTestAccount) {
8261
8309
  console.log("");
8262
8310
  console.log("Note: this is a test account, not a real OAuth developer.");
@@ -8733,8 +8781,10 @@ function renderSummary(summary) {
8733
8781
  );
8734
8782
  }
8735
8783
  }
8736
- lines.push("");
8737
- lines.push(`Dashboard: ${DASHBOARD_URL}`);
8784
+ if (DASHBOARD_URL) {
8785
+ lines.push("");
8786
+ lines.push(`Dashboard: ${DASHBOARD_URL}`);
8787
+ }
8738
8788
  return lines.join("\n");
8739
8789
  }
8740
8790
  var usage_default = defineDeepspaceCommand({
@@ -10993,9 +11043,19 @@ function formatCurrency(value, currency) {
10993
11043
  return `${value} ${currency}`;
10994
11044
  }
10995
11045
  function priceLabel(billing) {
10996
- if (billing.baseCost === null) return "metered at the provider's actual cost";
10997
- const figure = `${formatCurrency(billing.baseCost, billing.currency)} ${billingUnit(billing.model)}`;
10998
- return billing.variesWithInput ? `base ${figure} (some inputs cost less or more)` : figure;
11046
+ if (billing.baseCost === null) {
11047
+ const price2 = "metered at the provider's actual cost plus platform markup";
11048
+ return billing.freeTierPriceDiffers ? `${price2}; free-tier pricing differs` : price2;
11049
+ }
11050
+ const tokenScale = billing.model === "per_token" ? 1e6 : 1;
11051
+ const unit = billing.model === "per_token" ? "per 1M tokens" : billingUnit(billing.model);
11052
+ const paidCost = (billing.paidBaseCost ?? billing.baseCost) * tokenScale;
11053
+ const figure = `${formatCurrency(paidCost, billing.currency)} ${unit}`;
11054
+ const price = billing.variesWithInput ? `base ${figure} (some inputs cost less or more)` : figure;
11055
+ if (!billing.freeTierPriceDiffers) return price;
11056
+ const freeFigure = `${formatCurrency(billing.baseCost * tokenScale, billing.currency)} ${unit}`;
11057
+ const freePrice = billing.variesWithInput ? `base ${freeFigure} (some inputs cost less or more)` : freeFigure;
11058
+ return `paid tier: ${price}; free tier: ${freePrice}`;
10999
11059
  }
11000
11060
  function billingUnit(model) {
11001
11061
  if (model === "per_token") return "per token";
@@ -11561,14 +11621,31 @@ async function requestJson(url, init, token, timeout) {
11561
11621
  clearTimeout(timer);
11562
11622
  }
11563
11623
  }
11624
+ var MAX_DETAIL_TEXT = 2e3;
11625
+ var DETAIL_PROSE_KEYS = /* @__PURE__ */ new Set(["error", "detail", "guidance", "message"]);
11626
+ function describeDetail(detail) {
11627
+ const parts = [];
11628
+ for (const [key, value] of Object.entries(detail)) {
11629
+ if (value === void 0 || value === null || value === "") continue;
11630
+ const prose = typeof value === "string" && DETAIL_PROSE_KEYS.has(key);
11631
+ parts.push(prose ? value : `${key}: ${JSON.stringify(value)}`);
11632
+ }
11633
+ const text2 = parts.join(" ");
11634
+ return text2.length > MAX_DETAIL_TEXT ? `${text2.slice(0, MAX_DETAIL_TEXT)}\u2026` : text2;
11635
+ }
11564
11636
  function httpRefusal(response, tokens) {
11565
11637
  const server = isRecord(response.body) ? response.body : void 0;
11566
11638
  const code = safeServerCode(server?.code);
11567
- const message = typeof server?.error === "string" ? redact(server.error, tokens).slice(0, 500) : "";
11639
+ const baseMessage = typeof server?.error === "string" ? redact(server.error, tokens).slice(0, 500) : "";
11640
+ const redactedDetail = isRecord(server?.detail) ? redactValue(server.detail, tokens) : void 0;
11641
+ const detail = isRecord(redactedDetail) ? { extra: { detail: redactedDetail } } : {};
11642
+ const detailText = isRecord(redactedDetail) ? describeDetail(redactedDetail) : "";
11643
+ const message = detailText ? `${baseMessage} ${detailText}`.trim() : baseMessage;
11568
11644
  if (response.status === 403) {
11569
11645
  return new Refusal(
11570
11646
  message || "You are not allowed to use this app agent.",
11571
- code ?? "agent_forbidden"
11647
+ code ?? "agent_forbidden",
11648
+ detail
11572
11649
  );
11573
11650
  }
11574
11651
  if (response.status === 404 && !server) {
@@ -11579,7 +11656,8 @@ function httpRefusal(response, tokens) {
11579
11656
  }
11580
11657
  return new Refusal(
11581
11658
  message || `App agent request failed (${response.status}).`,
11582
- code ?? (response.status === 404 ? "agent_endpoint_not_found" : "agent_request_failed")
11659
+ code ?? (response.status === 404 ? "agent_endpoint_not_found" : "agent_request_failed"),
11660
+ detail
11583
11661
  );
11584
11662
  }
11585
11663
  async function callAgent(target2, path, init, timeout) {
@@ -11899,7 +11977,7 @@ Context: deepspace ${payload.cliVersion} \xB7 ${payload.nodeVersion} \xB7 ${payl
11899
11977
  } else {
11900
11978
  console.log(`Submitted feedback ${result.report.id} (${result.report.type}).`);
11901
11979
  }
11902
- console.log(`Track triage status at ${DASHBOARD_URL}.`);
11980
+ if (DASHBOARD_URL) console.log(`Track triage status at ${DASHBOARD_URL}.`);
11903
11981
  }
11904
11982
  return { data: { report: result.report } };
11905
11983
  }
@@ -16045,7 +16123,7 @@ import { join as join28, resolve as resolve22 } from "path";
16045
16123
  // package.json
16046
16124
  var package_default = {
16047
16125
  name: "deepspace",
16048
- version: "0.33.1",
16126
+ version: "0.35.0",
16049
16127
  engines: {
16050
16128
  node: ">=22.15.0 <23 || >=24 <25 || >=26 <27"
16051
16129
  },
@@ -16086,6 +16164,10 @@ var package_default = {
16086
16164
  types: "./dist/build.d.ts",
16087
16165
  import: "./dist/build.js"
16088
16166
  },
16167
+ "./expo": {
16168
+ types: "./dist/expo.d.ts",
16169
+ import: "./dist/expo.js"
16170
+ },
16089
16171
  "./documentation": {
16090
16172
  types: "./dist/documentation.d.ts",
16091
16173
  import: "./dist/documentation.js"
@@ -16102,26 +16184,26 @@ var package_default = {
16102
16184
  ],
16103
16185
  scripts: {
16104
16186
  build: "node ../../scripts/clean-artifacts.mjs dist --tsbuildinfo && tsup",
16105
- "type-check": "tsc --noEmit",
16187
+ "type-check": "tsc --noEmit && tsc --noEmit -p tsconfig.expo.json",
16106
16188
  test: "vitest run",
16107
16189
  "test:documentation-browser": "playwright test --config src/documentation/runtime/__browser__/playwright.config.ts",
16108
16190
  clean: "node ../../scripts/clean-artifacts.mjs dist --tsbuildinfo",
16109
16191
  prepublishOnly: "pnpm build"
16110
16192
  },
16111
16193
  dependencies: {
16112
- "@ai-sdk/anthropic": "2.0.91",
16113
- "@ai-sdk/openai": "2.0.116",
16114
- "@ai-sdk/openai-compatible": "1.0.46",
16194
+ "@ai-sdk/anthropic": "4.0.58",
16195
+ "@ai-sdk/openai": "4.0.71",
16196
+ "@ai-sdk/openai-compatible": "3.0.53",
16115
16197
  "@clack/prompts": "^1.2.0",
16116
16198
  "@mdx-js/mdx": "^3.1.1",
16117
16199
  acorn: "^8.16.0",
16118
- ai: "5.0.222",
16200
+ ai: "7.0.107",
16119
16201
  "better-auth": "1.6.23",
16120
16202
  citty: "^0.2.0",
16121
16203
  "cross-spawn": "^7.0.6",
16122
16204
  esbuild: "^0.27.0",
16123
16205
  "highlight.js": "^11.11.1",
16124
- hono: "^4.12.34",
16206
+ hono: "^4.13.7",
16125
16207
  jose: "^6.1.0",
16126
16208
  marked: "^18.0.7",
16127
16209
  "mdast-util-gfm": "^3.1.0",
@@ -16130,7 +16212,7 @@ var package_default = {
16130
16212
  "remark-frontmatter": "^5.0.0",
16131
16213
  "remark-gfm": "^4.0.1",
16132
16214
  "sanitize-html": "^2.17.7",
16133
- "smol-toml": "^1.6.1",
16215
+ "smol-toml": "^1.7.1",
16134
16216
  yaml: "^2.9.0",
16135
16217
  yjs: "^13.6.0",
16136
16218
  zod: "^4.3.6"
@@ -16141,7 +16223,11 @@ var package_default = {
16141
16223
  "lucide-react": ">=0.400.0",
16142
16224
  react: "^18.0.0 || ^19.0.0",
16143
16225
  "react-dom": "^18.0.0 || ^19.0.0",
16144
- "tailwind-merge": ">=2.0.0"
16226
+ "tailwind-merge": ">=2.0.0",
16227
+ "expo-crypto": "~57.0.0",
16228
+ "expo-linking": "~57.0.0",
16229
+ "expo-secure-store": "~57.0.0",
16230
+ "expo-web-browser": "~57.0.0"
16145
16231
  },
16146
16232
  peerDependenciesMeta: {
16147
16233
  "@playwright/test": {
@@ -16161,6 +16247,18 @@ var package_default = {
16161
16247
  },
16162
16248
  "lucide-react": {
16163
16249
  optional: true
16250
+ },
16251
+ "expo-crypto": {
16252
+ optional: true
16253
+ },
16254
+ "expo-linking": {
16255
+ optional: true
16256
+ },
16257
+ "expo-secure-store": {
16258
+ optional: true
16259
+ },
16260
+ "expo-web-browser": {
16261
+ optional: true
16164
16262
  }
16165
16263
  },
16166
16264
  devDependencies: {
@@ -16554,7 +16652,7 @@ function assertKnownOptions(argv) {
16554
16652
  var rawArgs = process.argv.slice(2);
16555
16653
  var wantsHelp = rawArgs.some((arg) => arg === "--help" || arg === "-h");
16556
16654
  if (DEEPSPACE_ENV === "invalid") {
16557
- const error = `Invalid DEEPSPACE_ENV=${JSON.stringify(process.env.DEEPSPACE_ENV)}. Use \`staging\`, \`production\`, or unset it; refusing to default to production.`;
16655
+ const error = `Invalid DEEPSPACE_ENV=${JSON.stringify(process.env.DEEPSPACE_ENV)}. Use \`production\`, \`staging\`, \`medical\`, or unset it; refusing to default to production.`;
16558
16656
  if (rawArgs.includes("--json") && !wantsHelp) {
16559
16657
  console.log(JSON.stringify({ ok: false, code: "invalid_environment", error }));
16560
16658
  } else {