@hitch42/applet 0.1.0-beta.9 → 0.1.1-beta.10

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 (164) hide show
  1. package/dist/_internal/client.js +120 -11
  2. package/dist/_internal/log-context.d.ts +34 -0
  3. package/dist/_internal/log-context.js +2 -0
  4. package/dist/_internal/server.js +112 -57
  5. package/dist/applet.js +12 -12
  6. package/dist/build-Bh_S5BUv.js +2 -0
  7. package/dist/{build-CAb26kMY.js → build-CEfFoIZZ.js} +1 -1
  8. package/dist/{ci-5qWl7lT3.js → ci-BKw14X2h.js} +14 -13
  9. package/dist/client.d.ts +2 -2
  10. package/dist/{contract-rP_eV9PK.d.ts → contract-CsUpTBe0.d.ts} +1 -1
  11. package/dist/{deploy-D_OFJ6-Q.js → deploy-wGYjwXrx.js} +139 -88
  12. package/dist/{generate-CBPnHoqX.js → generate-BEIYs17x.js} +54 -22
  13. package/dist/generate-Dox-OYt6.js +2 -0
  14. package/dist/headers-DkNr9MLJ.js +17 -0
  15. package/dist/index.d.ts +3 -2
  16. package/dist/index.js +2 -1
  17. package/dist/{init-tfzwuYnk.js → init-6oGPM46R.js} +10 -15
  18. package/dist/{load-config-BYSxDVAl.js → load-config-xEdTXs0y.js} +2 -2
  19. package/dist/log-context-zu8U9Sjm.js +73 -0
  20. package/dist/{login-C7RKmmTe.js → login-CUx3TmFQ.js} +1 -1
  21. package/dist/{logs-DgjgAxj2.js → logs-DSjuEN0Q.js} +20 -22
  22. package/dist/{manifest-DD_SGkS6.d.ts → manifest-C6_F4bL8.d.ts} +5 -1
  23. package/dist/{manifest-Bp87Uz0a.js → manifest-CJSL9GuC.js} +20 -4
  24. package/dist/{project-D6XHllmC.js → project-BRZGd6xq.js} +197 -16
  25. package/dist/query-cache-CXmAyLv3.js +82 -0
  26. package/dist/react.d.ts +2 -1
  27. package/dist/react.js +59 -39
  28. package/dist/{schedules-dhU1yyFr.js → schedules-C8_Svr4h.js} +1 -1
  29. package/dist/server.d.ts +8 -3
  30. package/dist/server.js +29 -8
  31. package/dist/telephony.d.ts +24 -4
  32. package/dist/telephony.js +135 -16
  33. package/dist/{variables-Bwnr7oxf.js → variables-DT5RyHdH.js} +13 -13
  34. package/dist/vite.d.ts +3 -60
  35. package/dist/vite.js +50 -15
  36. package/dist/{workflow-engine-MogejNfF.js → workflow-engine-BOTzURKM.js} +1 -7
  37. package/dist/{workspace-XVtM12ZC.js → workspace-D0dnnlxL.js} +33 -38
  38. package/package.json +13 -6
  39. package/scaffold/.agents/skills/hitch-applets/SKILL.md +29 -3
  40. package/scaffold/.agents/skills/hitch-applets/references/manifest.md +8 -0
  41. package/scaffold/.agents/skills/hitch-applets/references/markdown.md +2 -0
  42. package/scaffold/.agents/skills/hitch-applets/references/records.md +2 -0
  43. package/scaffold/.agents/skills/hitch-data/SKILL.md +2 -1
  44. package/scaffold/.agents/skills/hitch-data/references/attributes.md +7 -1
  45. package/scaffold/.agents/skills/hitch-data/references/limits.md +13 -13
  46. package/scaffold/.agents/skills/hitch-theory/SKILL.md +3 -2
  47. package/scaffold/.agents/skills/react-best-practices/SKILL.md +127 -0
  48. package/scaffold/.agents/skills/react-best-practices/rules/advanced-effect-event-deps.md +50 -0
  49. package/scaffold/.agents/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  50. package/scaffold/.agents/skills/react-best-practices/rules/advanced-init-once.md +42 -0
  51. package/scaffold/.agents/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
  52. package/scaffold/.agents/skills/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  53. package/scaffold/.agents/skills/react-best-practices/rules/async-defer-await.md +82 -0
  54. package/scaffold/.agents/skills/react-best-practices/rules/async-dependencies.md +48 -0
  55. package/scaffold/.agents/skills/react-best-practices/rules/async-parallel.md +24 -0
  56. package/scaffold/.agents/skills/react-best-practices/rules/bundle-analyzable-paths.md +42 -0
  57. package/scaffold/.agents/skills/react-best-practices/rules/bundle-barrel-imports.md +39 -0
  58. package/scaffold/.agents/skills/react-best-practices/rules/bundle-conditional.md +35 -0
  59. package/scaffold/.agents/skills/react-best-practices/rules/bundle-defer-third-party.md +46 -0
  60. package/scaffold/.agents/skills/react-best-practices/rules/bundle-dynamic-imports.md +38 -0
  61. package/scaffold/.agents/skills/react-best-practices/rules/bundle-preload.md +40 -0
  62. package/scaffold/.agents/skills/react-best-practices/rules/client-event-listeners.md +78 -0
  63. package/scaffold/.agents/skills/react-best-practices/rules/client-localstorage-schema.md +74 -0
  64. package/scaffold/.agents/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  65. package/scaffold/.agents/skills/react-best-practices/rules/js-batch-dom-css.md +110 -0
  66. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-function-results.md +58 -0
  67. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  68. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-storage.md +56 -0
  69. package/scaffold/.agents/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  70. package/scaffold/.agents/skills/react-best-practices/rules/js-early-exit.md +50 -0
  71. package/scaffold/.agents/skills/react-best-practices/rules/js-flatmap-filter.md +51 -0
  72. package/scaffold/.agents/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  73. package/scaffold/.agents/skills/react-best-practices/rules/js-index-maps.md +37 -0
  74. package/scaffold/.agents/skills/react-best-practices/rules/js-length-check-first.md +50 -0
  75. package/scaffold/.agents/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  76. package/scaffold/.agents/skills/react-best-practices/rules/js-request-idle-callback.md +104 -0
  77. package/scaffold/.agents/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  78. package/scaffold/.agents/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  79. package/scaffold/.agents/skills/react-best-practices/rules/rendering-activity.md +26 -0
  80. package/scaffold/.agents/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +38 -0
  81. package/scaffold/.agents/skills/react-best-practices/rules/rendering-conditional-render.md +32 -0
  82. package/scaffold/.agents/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  83. package/scaffold/.agents/skills/react-best-practices/rules/rendering-hoist-jsx.md +36 -0
  84. package/scaffold/.agents/skills/react-best-practices/rules/rendering-resource-hints.md +81 -0
  85. package/scaffold/.agents/skills/react-best-practices/rules/rendering-script-defer-async.md +36 -0
  86. package/scaffold/.agents/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  87. package/scaffold/.agents/skills/react-best-practices/rules/rendering-usetransition-loading.md +43 -0
  88. package/scaffold/.agents/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  89. package/scaffold/.agents/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  90. package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  91. package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  92. package/scaffold/.agents/skills/react-best-practices/rules/rerender-functional-setstate.md +77 -0
  93. package/scaffold/.agents/skills/react-best-practices/rules/rerender-lazy-state-init.md +56 -0
  94. package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo-with-default-value.md +36 -0
  95. package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo.md +44 -0
  96. package/scaffold/.agents/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  97. package/scaffold/.agents/skills/react-best-practices/rules/rerender-no-inline-components.md +75 -0
  98. package/scaffold/.agents/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  99. package/scaffold/.agents/skills/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  100. package/scaffold/.agents/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  101. package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  102. package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  103. package/scaffold/.agents/skills/tanstack-query/SKILL.md +136 -0
  104. package/scaffold/.agents/skills/tanstack-query/references/compositions/automatic-invalidation-after-mutations.md +124 -0
  105. package/scaffold/.agents/skills/tanstack-query/references/compositions/broadcast-realtime-and-multi-tab-synchronization.md +150 -0
  106. package/scaffold/.agents/skills/tanstack-query/references/compositions/compose-query-with-tanstack-router-and-start.md +248 -0
  107. package/scaffold/.agents/skills/tanstack-query/references/compositions/enforce-query-best-practices-with-eslint.md +167 -0
  108. package/scaffold/.agents/skills/tanstack-query/references/compositions/persist-offline-and-restore-caches.md +181 -0
  109. package/scaffold/.agents/skills/tanstack-query/references/compositions/query-data-and-forms.md +156 -0
  110. package/scaffold/.agents/skills/tanstack-query/references/core/build-query-abstractions.md +130 -0
  111. package/scaffold/.agents/skills/tanstack-query/references/core/cancel-queries-and-consume-abort-signals.md +176 -0
  112. package/scaffold/.agents/skills/tanstack-query/references/core/concurrent-optimistic-updates.md +135 -0
  113. package/scaffold/.agents/skills/tanstack-query/references/core/coordinate-query-execution.md +188 -0
  114. package/scaffold/.agents/skills/tanstack-query/references/core/design-query-keys-and-options.md +182 -0
  115. package/scaffold/.agents/skills/tanstack-query/references/core/fetch-and-observe-queries.md +193 -0
  116. package/scaffold/.agents/skills/tanstack-query/references/core/implement-optimistic-updates-and-cache-writes.md +168 -0
  117. package/scaffold/.agents/skills/tanstack-query/references/core/paginate-and-build-infinite-queries.md +188 -0
  118. package/scaffold/.agents/skills/tanstack-query/references/core/seed-placeholder-select-and-transform-data.md +188 -0
  119. package/scaffold/.agents/skills/tanstack-query/references/core/selectors-and-derived-state.md +145 -0
  120. package/scaffold/.agents/skills/tanstack-query/references/core/tune-defaults-freshness-retries-and-refetching.md +172 -0
  121. package/scaffold/.agents/skills/tanstack-query/references/core/understand-query-internals-and-observers.md +104 -0
  122. package/scaffold/.agents/skills/tanstack-query/references/core/write-mutations-and-invalidate-related-queries.md +183 -0
  123. package/scaffold/.agents/skills/tanstack-query/references/framework/debug-with-devtools.md +169 -0
  124. package/scaffold/.agents/skills/tanstack-query/references/framework/handle-status-and-errors.md +119 -0
  125. package/scaffold/.agents/skills/tanstack-query/references/framework/shape-data-and-render-efficiently.md +184 -0
  126. package/scaffold/.agents/skills/tanstack-query/references/framework/use-framework-adapter-reactivity.md +185 -0
  127. package/scaffold/.agents/skills/tanstack-query/references/framework/use-suspense-and-error-boundaries.md +208 -0
  128. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/migrate-major-versions-and-codemods.md +169 -0
  129. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/prefetch-and-remove-request-waterfalls.md +228 -0
  130. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/setup-query-client-and-providers.md +161 -0
  131. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/ssr-hydration-and-streaming.md +209 -0
  132. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/test-query-code.md +160 -0
  133. package/scaffold/.agents/skills/tanstack-router/SKILL.md +134 -0
  134. package/scaffold/.agents/skills/tanstack-router/references/compositions/router-query.md +412 -0
  135. package/scaffold/.agents/skills/tanstack-router/references/react-router.md +495 -0
  136. package/scaffold/.agents/skills/tanstack-router/references/router-core/auth-and-guards.md +495 -0
  137. package/scaffold/.agents/skills/tanstack-router/references/router-core/code-splitting.md +318 -0
  138. package/scaffold/.agents/skills/tanstack-router/references/router-core/data-loading.md +490 -0
  139. package/scaffold/.agents/skills/tanstack-router/references/router-core/index.md +158 -0
  140. package/scaffold/.agents/skills/tanstack-router/references/router-core/navigation.md +433 -0
  141. package/scaffold/.agents/skills/tanstack-router/references/router-core/not-found-and-errors.md +436 -0
  142. package/scaffold/.agents/skills/tanstack-router/references/router-core/path-params.md +383 -0
  143. package/scaffold/.agents/skills/tanstack-router/references/router-core/search-params.md +343 -0
  144. package/scaffold/.agents/skills/tanstack-router/references/router-core/ssr.md +462 -0
  145. package/scaffold/.agents/skills/tanstack-router/references/router-core/type-safety.md +493 -0
  146. package/scaffold/.agents/skills/tanstack-router/references/router-plugin.md +250 -0
  147. package/scaffold/.agents/skills/tanstack-router/references/virtual-file-routes.md +215 -0
  148. package/scaffold/.agents/skills/web-design-guidelines/SKILL.md +184 -0
  149. package/scaffold/.github/workflows/hitch.yml +1 -1
  150. package/scaffold/AGENTS.md +2 -2
  151. package/scaffold/applet/src/client/components/ui/alert.tsx +1 -1
  152. package/scaffold/applet/src/client/components/ui/button.tsx +1 -1
  153. package/scaffold/applet/src/client/components/ui/checkbox.tsx +1 -1
  154. package/scaffold/applet/src/client/components/ui/dialog.tsx +2 -2
  155. package/scaffold/applet/src/client/components/ui/dropdown-menu.tsx +2 -2
  156. package/scaffold/applet/src/client/components/ui/input-group.tsx +2 -2
  157. package/scaffold/applet/src/client/components/ui/select.tsx +2 -2
  158. package/scaffold/applet/src/client/components/ui/sheet.tsx +2 -2
  159. package/scaffold/applet/src/client/components/ui/spinner.tsx +2 -1
  160. package/scaffold/applet/src/client/components/ui/tabs.tsx +1 -1
  161. package/scaffold/applet/src/client/lib/utils.ts +1 -6
  162. package/scaffold/applet/src/client/styles/globals.css +2 -0
  163. package/dist/build-BfbTbt_r.js +0 -2
  164. package/dist/generate-BgepN4-b.js +0 -2
@@ -1,11 +1,12 @@
1
- import { i as readWorkspaceConfig, n as fetchWithOrgAuth } from "./workspace-XVtM12ZC.js";
2
- import { a as loadGitHubActionsSources, n as githubActionsContext, r as hitchResponseError, t as fetchWithGitHubActions } from "./ci-5qWl7lT3.js";
3
- import { n as buildPreparedApplet, r as prepareWorkspaceBuild, t as buildApplet } from "./build-CAb26kMY.js";
1
+ import { i as readWorkspaceConfig, n as fetchWithOrgAuth } from "./workspace-D0dnnlxL.js";
2
+ import { a as loadGitHubActionsSources, n as githubActionsContext, r as hitchResponseError, t as fetchWithGitHubActions } from "./ci-BKw14X2h.js";
3
+ import { n as buildPreparedApplet, r as prepareWorkspaceBuild, t as buildApplet } from "./build-CEfFoIZZ.js";
4
4
  import { createRequire } from "node:module";
5
+ import { createHash } from "node:crypto";
5
6
  import { existsSync } from "node:fs";
6
- import { readFile, readdir } from "node:fs/promises";
7
- import { relative, resolve, sep } from "node:path";
8
- import { execFile } from "node:child_process";
7
+ import { lstat, readFile, readdir, readlink } from "node:fs/promises";
8
+ import { dirname, relative, resolve, sep } from "node:path";
9
+ import { execFile, spawn } from "node:child_process";
9
10
  import { promisify } from "node:util";
10
11
  import { createGzip } from "node:zlib";
11
12
  //#region \0rolldown/runtime.js
@@ -2307,11 +2308,112 @@ var require_pack = /* @__PURE__ */ __commonJSMin(((exports, module) => {
2307
2308
  }
2308
2309
  }));
2309
2310
  //#endregion
2310
- //#region src/deploy.ts
2311
+ //#region src/source-hash.ts
2311
2312
  var import_tar_stream = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports) => {
2312
2313
  exports.extract = require_extract();
2313
2314
  exports.pack = require_pack();
2314
2315
  })))(), 1);
2316
+ const execFileAsync$1 = promisify(execFile);
2317
+ function gitEnvironment() {
2318
+ return Object.fromEntries(Object.entries(process.env).filter(([key]) => !key.startsWith("GIT_")));
2319
+ }
2320
+ var SourceHashUnavailableError = class extends Error {
2321
+ constructor() {
2322
+ super("Git is unavailable or the applet is outside a git repository.");
2323
+ }
2324
+ };
2325
+ function isMissingPath(error) {
2326
+ return error instanceof Error && "code" in error && (error.code === "ENOENT" || error.code === "ENOTDIR");
2327
+ }
2328
+ async function hashFiles(topLevel, paths, env) {
2329
+ if (paths.length === 0) return [];
2330
+ return new Promise((resolveHashes, reject) => {
2331
+ const child = spawn("git", ["hash-object", "--stdin-paths"], {
2332
+ cwd: topLevel,
2333
+ env
2334
+ });
2335
+ const stdout = [];
2336
+ const stderr = [];
2337
+ child.stdout.on("data", (chunk) => stdout.push(chunk));
2338
+ child.stderr.on("data", (chunk) => stderr.push(chunk));
2339
+ child.stdin.on("error", reject);
2340
+ child.on("error", reject);
2341
+ child.on("close", (code) => {
2342
+ if (code !== 0) {
2343
+ reject(/* @__PURE__ */ new Error(`git hash-object failed (${code}): ${Buffer.concat(stderr).toString("utf8").trim()}`));
2344
+ return;
2345
+ }
2346
+ const hashes = Buffer.concat(stdout).toString("utf8").trimEnd().split("\n");
2347
+ if (hashes.length !== paths.length || hashes.some((hash) => !/^[0-9a-f]{40,64}$/.test(hash))) {
2348
+ reject(/* @__PURE__ */ new Error("git hash-object returned an unexpected number of hashes."));
2349
+ return;
2350
+ }
2351
+ resolveHashes(hashes);
2352
+ });
2353
+ child.stdin.end(paths.map((path) => `"${path.split("").map((character) => character < " " || character === "" || character === "\"" || character === "\\" ? `\\${character.charCodeAt(0).toString(8).padStart(3, "0")}` : character).join("")}"\n`).join(""));
2354
+ });
2355
+ }
2356
+ async function sourceHashes(appletRoots) {
2357
+ if (appletRoots.length === 0) return /* @__PURE__ */ new Map();
2358
+ const env = gitEnvironment();
2359
+ const workspaceRoot = dirname(dirname(appletRoots[0]));
2360
+ let topLevel;
2361
+ try {
2362
+ const { stdout } = await execFileAsync$1("git", ["rev-parse", "--show-toplevel"], {
2363
+ cwd: workspaceRoot,
2364
+ env
2365
+ });
2366
+ topLevel = stdout.trim();
2367
+ } catch (error) {
2368
+ if (isMissingPath(error) || error instanceof Error && error.message.includes("not a git repository")) throw new SourceHashUnavailableError();
2369
+ throw error;
2370
+ }
2371
+ const { stdout } = await execFileAsync$1("git", [
2372
+ "ls-files",
2373
+ "-z",
2374
+ "--cached",
2375
+ "--others",
2376
+ "--exclude-standard"
2377
+ ], {
2378
+ cwd: topLevel,
2379
+ env,
2380
+ maxBuffer: 67108864
2381
+ });
2382
+ const paths = [...new Set(stdout.split("\0").filter(Boolean))];
2383
+ const present = (await Promise.all(paths.map(async (path) => {
2384
+ const absolutePath = resolve(topLevel, path);
2385
+ try {
2386
+ const stat = await lstat(absolutePath);
2387
+ if (stat.isFile()) return {
2388
+ path,
2389
+ kind: "file"
2390
+ };
2391
+ if (stat.isSymbolicLink()) return {
2392
+ path,
2393
+ kind: "link",
2394
+ contentId: await readlink(absolutePath)
2395
+ };
2396
+ return;
2397
+ } catch (error) {
2398
+ if (isMissingPath(error)) return void 0;
2399
+ throw error;
2400
+ }
2401
+ }))).filter((entry) => entry !== void 0);
2402
+ const regularPaths = present.filter((entry) => entry.kind === "file").map((entry) => entry.path);
2403
+ const hashes = await hashFiles(topLevel, regularPaths, env);
2404
+ const contentIds = /* @__PURE__ */ new Map();
2405
+ present.filter((entry) => entry.kind === "link").forEach((entry) => contentIds.set(entry.path, entry.contentId));
2406
+ regularPaths.forEach((path, index) => contentIds.set(path, hashes[index]));
2407
+ const appletsDirectory = relative(topLevel, resolve(workspaceRoot, "applets")).split(sep).join("/");
2408
+ return new Map(appletRoots.map((appletRoot) => {
2409
+ const appletDirectory = relative(topLevel, appletRoot).split(sep).join("/");
2410
+ const digest = createHash("sha256");
2411
+ [...contentIds.entries()].filter(([path]) => path !== appletsDirectory && !path.startsWith(`${appletsDirectory}/`) || path.startsWith(`${appletDirectory}/`)).sort(([left], [right]) => Buffer.compare(Buffer.from(left), Buffer.from(right))).forEach(([path, contentId]) => digest.update(`${path}\0${contentId}\n`));
2412
+ return [appletRoot, digest.digest("hex")];
2413
+ }));
2414
+ }
2415
+ //#endregion
2416
+ //#region src/deploy.ts
2315
2417
  const execFileAsync = promisify(execFile);
2316
2418
  var WorkspaceDeployError = class extends Error {
2317
2419
  constructor(failedApplets) {
@@ -2363,9 +2465,6 @@ async function createBundle(distDir) {
2363
2465
  body.set(bundle);
2364
2466
  return body;
2365
2467
  }
2366
- function gitEnvironment() {
2367
- return Object.fromEntries(Object.entries(process.env).filter(([key]) => !key.startsWith("GIT_")));
2368
- }
2369
2468
  async function readGitInfo(appletRoot) {
2370
2469
  const env = gitEnvironment();
2371
2470
  try {
@@ -2399,13 +2498,14 @@ function releaseForm(manifest, bundle) {
2399
2498
  body.set("bundle", new File([bundle], "bundle.tar.gz", { type: "application/gzip" }));
2400
2499
  return body;
2401
2500
  }
2402
- async function deployWithOrgAuth(appletRoot, distDir, manifest, options) {
2403
- const fetcher = options.fetch ?? globalThis.fetch;
2501
+ async function deployWithOrgAuth(appletRoot, distDir, manifest, sourceHash) {
2502
+ const fetcher = globalThis.fetch;
2404
2503
  const [bundle, git] = await Promise.all([createBundle(distDir), readGitInfo(appletRoot)]);
2405
- return fetchWithOrgAuth(manifest.org, options, (instanceUrl, accessToken) => {
2504
+ return fetchWithOrgAuth(manifest.org, (instanceUrl, accessToken) => {
2406
2505
  const body = releaseForm(manifest, bundle);
2407
2506
  body.set("gitDirty", String(git.gitDirty));
2408
2507
  if (git.gitSha !== void 0) body.set("gitSha", git.gitSha);
2508
+ if (sourceHash !== void 0) body.set("sourceHash", sourceHash);
2409
2509
  return fetcher(`${instanceUrl}/api/v1/applets/${manifest.code}/releases`, {
2410
2510
  method: "POST",
2411
2511
  headers: { Authorization: `Bearer ${accessToken}` },
@@ -2413,12 +2513,13 @@ async function deployWithOrgAuth(appletRoot, distDir, manifest, options) {
2413
2513
  });
2414
2514
  });
2415
2515
  }
2416
- async function deployWithGitHubActions(context, appletRoot, distDir, manifest, options) {
2417
- const fetcher = options.fetch ?? globalThis.fetch;
2516
+ async function deployWithGitHubActions(context, appletRoot, distDir, manifest, sourceHash) {
2517
+ const fetcher = globalThis.fetch;
2418
2518
  const [bundle, sourceDirectory] = await Promise.all([createBundle(distDir), repositoryDirectory(appletRoot)]);
2419
- return fetchWithGitHubActions(context, options, (instanceUrl, accessToken) => {
2519
+ return fetchWithGitHubActions(context, (instanceUrl, accessToken) => {
2420
2520
  const body = releaseForm(manifest, bundle);
2421
2521
  body.set("source_directory", sourceDirectory);
2522
+ if (sourceHash !== void 0) body.set("source_hash", sourceHash);
2422
2523
  return fetcher(`${instanceUrl}/api/ci/v1/applets/${manifest.code}/releases`, {
2423
2524
  method: "POST",
2424
2525
  headers: { Authorization: `Bearer ${accessToken}` },
@@ -2426,12 +2527,13 @@ async function deployWithGitHubActions(context, appletRoot, distDir, manifest, o
2426
2527
  });
2427
2528
  });
2428
2529
  }
2429
- async function deployApplet(appletRoot, options, logPrefix = "") {
2430
- const github = githubActionsContext(options.store?.env ?? process.env);
2530
+ async function deployApplet(appletRoot, options, logPrefix = "", sourceHash) {
2531
+ const github = githubActionsContext();
2532
+ sourceHash ??= (await computeSourceHash([appletRoot], github !== void 0)).get(appletRoot);
2431
2533
  if (options.dist === void 0) await buildApplet(appletRoot);
2432
2534
  const distDir = resolve(appletRoot, options.dist ?? ".hitch/dist");
2433
2535
  const manifest = await readManifest(distDir);
2434
- const response = github === void 0 ? await deployWithOrgAuth(appletRoot, distDir, manifest, options) : await deployWithGitHubActions(github, appletRoot, distDir, manifest, options);
2536
+ const response = github === void 0 ? await deployWithOrgAuth(appletRoot, distDir, manifest, sourceHash) : await deployWithGitHubActions(github, appletRoot, distDir, manifest, sourceHash);
2435
2537
  if (!response.ok) throw await hitchResponseError(response, "Deploy failed");
2436
2538
  const result = await response.json();
2437
2539
  console.log(`${logPrefix}Deployed release ${result.data.id} (${result.promoted ? "promoted" : "not promoted"}).`);
@@ -2452,95 +2554,44 @@ async function workspaceAppletRoots(workspaceRoot) {
2452
2554
  if (roots.length === 0) throw new Error(`No applets were found under ${appletsDir}.`);
2453
2555
  return roots;
2454
2556
  }
2455
- async function gitChanged(topLevel, base, pathspecs, env) {
2557
+ async function computeSourceHash(appletRoots, required) {
2456
2558
  try {
2457
- await execFileAsync("git", [
2458
- "diff",
2459
- "--quiet",
2460
- base,
2461
- "HEAD",
2462
- "--",
2463
- ...pathspecs
2464
- ], {
2465
- cwd: topLevel,
2466
- env
2467
- });
2468
- return false;
2559
+ return await sourceHashes(appletRoots);
2469
2560
  } catch (error) {
2470
- if (error instanceof Error && "code" in error && error.code === 1) return true;
2561
+ if (!required && error instanceof SourceHashUnavailableError) return /* @__PURE__ */ new Map();
2471
2562
  throw error;
2472
2563
  }
2473
2564
  }
2474
- async function hasCommit(topLevel, sha, env) {
2475
- const git = (args) => execFileAsync("git", args, {
2476
- cwd: topLevel,
2477
- env
2478
- });
2479
- return git([
2480
- "cat-file",
2481
- "-e",
2482
- `${sha}^{commit}`
2483
- ]).catch(() => git([
2484
- "fetch",
2485
- "--depth=1",
2486
- "origin",
2487
- sha
2488
- ])).then(() => true, () => false);
2489
- }
2490
- async function ciDeployDecisions(github, workspaceRoot, appletRoots, options) {
2491
- const env = gitEnvironment();
2492
- const [sources, { stdout: topLevelOutput }, directories] = await Promise.all([
2493
- loadGitHubActionsSources(github, options),
2494
- execFileAsync("git", ["rev-parse", "--show-toplevel"], {
2495
- cwd: workspaceRoot,
2496
- env
2497
- }),
2498
- Promise.all(appletRoots.map((appletRoot) => repositoryDirectory(appletRoot)))
2499
- ]);
2500
- const topLevel = topLevelOutput.trim();
2501
- const appletsDirectory = relative(topLevel, resolve(workspaceRoot, "applets")).split(sep).join("/");
2502
- const baseByDirectory = new Map(sources.map((source) => [source.sourceDirectory, source.gitSha]));
2503
- const bases = new Set(directories.flatMap((directory) => baseByDirectory.get(directory) ?? []));
2504
- const sharedChanges = /* @__PURE__ */ new Map();
2505
- for (const base of bases) sharedChanges.set(base, await hasCommit(topLevel, base, env) ? await gitChanged(topLevel, base, [`:(exclude)${appletsDirectory}`], env) : void 0);
2506
- const decisions = await Promise.all(appletRoots.map(async (appletRoot, index) => {
2507
- const directory = directories[index];
2508
- const base = baseByDirectory.get(directory) ?? null;
2509
- if (base === null) return [appletRoot, {
2510
- deploy: true,
2511
- reason: "no CI release to compare"
2512
- }];
2513
- const short = base.slice(0, 7);
2514
- const sharedChanged = sharedChanges.get(base);
2515
- if (sharedChanged === void 0) return [appletRoot, {
2516
- deploy: true,
2517
- reason: `commit ${short} is not in the repository`
2518
- }];
2519
- if (await gitChanged(topLevel, base, [directory], env)) return [appletRoot, {
2565
+ async function ciDeployDecisions(github, appletRoots, hashes) {
2566
+ const [sources, directories] = await Promise.all([loadGitHubActionsSources(github), Promise.all(appletRoots.map((appletRoot) => repositoryDirectory(appletRoot)))]);
2567
+ const hashByDirectory = new Map(sources.map((source) => [source.sourceDirectory, source.sourceHash]));
2568
+ return new Map(appletRoots.map((appletRoot, index) => {
2569
+ const sourceHash = hashByDirectory.get(directories[index]);
2570
+ if (sourceHash === null || sourceHash === void 0) return [appletRoot, {
2520
2571
  deploy: true,
2521
- reason: `${directory} changed since ${short}`
2572
+ reason: "no release with a source hash to compare"
2522
2573
  }];
2523
- if (sharedChanged) return [appletRoot, {
2574
+ if (sourceHash !== hashes.get(appletRoot)) return [appletRoot, {
2524
2575
  deploy: true,
2525
- reason: `files outside ${appletsDirectory} changed since ${short}`
2576
+ reason: "files changed since the current release"
2526
2577
  }];
2527
2578
  return [appletRoot, {
2528
2579
  deploy: false,
2529
- reason: `no changes since ${short}`
2580
+ reason: "no changes since the current release"
2530
2581
  }];
2531
2582
  }));
2532
- return new Map(decisions);
2533
2583
  }
2534
2584
  async function runDeploy(options) {
2535
2585
  const root = process.cwd();
2536
- const github = githubActionsContext(options.store?.env ?? process.env);
2586
+ const github = githubActionsContext();
2537
2587
  if (existsSync(resolve(root, "applet.manifest.ts"))) {
2538
2588
  await deployApplet(root, options);
2539
2589
  return;
2540
2590
  }
2541
2591
  if (readWorkspaceConfig(root) === void 0) throw new Error("Run applet deploy in an applet folder or in the workspace root.");
2542
2592
  const appletRoots = await workspaceAppletRoots(root);
2543
- const decisions = github === void 0 ? void 0 : await ciDeployDecisions(github, root, appletRoots, options);
2593
+ const hashes = await computeSourceHash(appletRoots, github !== void 0);
2594
+ const decisions = github === void 0 ? void 0 : await ciDeployDecisions(github, appletRoots, hashes);
2544
2595
  const selectedRoots = appletRoots.filter((appletRoot) => {
2545
2596
  const name = relative(root, appletRoot);
2546
2597
  const decision = decisions?.get(appletRoot);
@@ -2554,14 +2605,14 @@ async function runDeploy(options) {
2554
2605
  });
2555
2606
  if (selectedRoots.length === 0) return;
2556
2607
  if (options.dist === void 0) await prepareWorkspaceBuild(root, appletRoots);
2557
- const interactive = github === void 0 && (options.stdinIsTTY ?? process.stdin.isTTY === true);
2608
+ const interactive = github === void 0 && process.stdin.isTTY === true;
2558
2609
  const deploy = async (appletRoot) => {
2559
2610
  const logPrefix = `[${relative(root, appletRoot)}] `;
2560
2611
  if (options.dist === void 0) await buildPreparedApplet(appletRoot, ".hitch/dist", interactive ? "" : logPrefix);
2561
2612
  await deployApplet(appletRoot, {
2562
2613
  ...options,
2563
2614
  dist: options.dist ?? ".hitch/dist"
2564
- }, logPrefix);
2615
+ }, logPrefix, hashes.get(appletRoot));
2565
2616
  };
2566
2617
  if (interactive) {
2567
2618
  for (const appletRoot of selectedRoots) await deploy(appletRoot);
@@ -1,7 +1,7 @@
1
- import { c as organizationInstanceUrl, d as resolveInstanceUrl, n as fetchWithOrgAuth } from "./workspace-XVtM12ZC.js";
2
- import { i as loadGitHubActionsBuildInputs, n as githubActionsContext } from "./ci-5qWl7lT3.js";
3
- import { t as loadAppletConfig } from "./load-config-BYSxDVAl.js";
4
- import { r as prepareAppletProject } from "./project-D6XHllmC.js";
1
+ import { f as resolveInstanceUrl, l as organizationInstanceUrl, n as fetchWithOrgAuth } from "./workspace-D0dnnlxL.js";
2
+ import { i as loadGitHubActionsBuildInputs, n as githubActionsContext } from "./ci-BKw14X2h.js";
3
+ import { r as prepareAppletProject } from "./project-BRZGd6xq.js";
4
+ import { t as loadAppletConfig } from "./load-config-xEdTXs0y.js";
5
5
  import { createRequire } from "node:module";
6
6
  import { existsSync } from "node:fs";
7
7
  import { access, mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
@@ -199,6 +199,37 @@ function prepareRecordSpec(spec, manifest) {
199
199
  });
200
200
  return operations.length > 0 ? [[path, Object.fromEntries(operations)]] : [];
201
201
  }));
202
+ manifest?.objects.forEach(({ code, optionalAttributes }) => {
203
+ if (optionalAttributes === void 0 || optionalAttributes.length === 0) return;
204
+ const responsePath = `/v1/${code}/{id}`;
205
+ const response = prepared.paths[responsePath]?.get?.responses;
206
+ const schema = isObject$2(response) && isObject$2(response["200"]) ? response["200"].content : void 0;
207
+ const mediaType = isObject$2(schema) && isObject$2(schema["application/json"]) ? schema["application/json"] : void 0;
208
+ const ref = isObject$2(mediaType) && isObject$2(mediaType.schema) ? mediaType.schema.$ref : void 0;
209
+ const recordPath = `paths.${responsePath}.get.responses.200.content.application/json.schema`;
210
+ if (typeof ref !== "string" || !ref.startsWith(COMPONENT_REF_PREFIX$1)) throw new Error(`object "${code}": ${recordPath} expected a component schema $ref, found ${describeValue$1(mediaType)}`);
211
+ const componentName = ref.slice(21);
212
+ const components = isObject$2(prepared.components) ? prepared.components : void 0;
213
+ const record = (isObject$2(components?.schemas) ? components.schemas : void 0)?.[componentName];
214
+ const componentPath = `components.schemas.${componentName}`;
215
+ if (!isObject$2(record) || !isObject$2(record.properties)) throw new Error(`object "${code}": ${componentPath}.properties expected an object, found ${describeValue$1(isObject$2(record) ? record.properties : record)}`);
216
+ const properties = record.properties;
217
+ optionalAttributes.forEach((attributeCode) => {
218
+ const property = properties[attributeCode];
219
+ const propertyPath = `${componentPath}.properties.${attributeCode}`;
220
+ if (!isObject$2(property)) throw new Error(`object "${code}": ${propertyPath} expected an object, found ${describeValue$1(property)}`);
221
+ const types = Array.isArray(property.type) ? property.type : [property.type];
222
+ properties[attributeCode] = property.type !== void 0 ? {
223
+ ...property,
224
+ type: types.includes("null") ? types : [...types, "null"],
225
+ ...Array.isArray(property.enum) && !property.enum.includes(null) ? { enum: [...property.enum, null] } : {}
226
+ } : Array.isArray(property.oneOf) ? {
227
+ ...property,
228
+ oneOf: [...property.oneOf, { type: "null" }]
229
+ } : Array.isArray(property.anyOf) && property.anyOf.some((item) => isObject$2(item) && item.type === "null") ? property : { anyOf: [property, { type: "null" }] };
230
+ });
231
+ if (Array.isArray(record.required)) record.required = record.required.filter((name) => !optionalAttributes.includes(name));
232
+ });
202
233
  return prepared;
203
234
  }
204
235
  function describeValue$1(value, expectedRef = false) {
@@ -358,33 +389,31 @@ async function responseJson(response) {
358
389
  throw new Error("Failed to parse the organization's OpenAPI spec.", { cause: error });
359
390
  }
360
391
  }
361
- async function loadAuthenticatedSpec(manifest, options) {
362
- const github = githubActionsContext(options.store?.env ?? process.env);
363
- if (github !== void 0) return (await loadGitHubActionsBuildInputs(github, options, manifest.requiresChangeset)).openapi;
364
- const fetcher = options.fetch ?? globalThis.fetch;
365
- const response = await fetchWithOrgAuth(manifest.org, options, (instanceUrl, accessToken) => fetcher(`${instanceUrl}/api/v1/openapi.json${manifest.requiresChangeset === void 0 ? "" : `?changeset_id=${encodeURIComponent(manifest.requiresChangeset)}`}`, { headers: { Authorization: `Bearer ${accessToken}` } }));
392
+ async function loadAuthenticatedSpec(manifest) {
393
+ const github = githubActionsContext();
394
+ if (github !== void 0) return (await loadGitHubActionsBuildInputs(github, manifest.requiresChangeset)).openapi;
395
+ const response = await fetchWithOrgAuth(manifest.org, (instanceUrl, accessToken) => globalThis.fetch(`${instanceUrl}/api/v1/openapi.json${manifest.requiresChangeset === void 0 ? "" : `?changeset_id=${encodeURIComponent(manifest.requiresChangeset)}`}`, { headers: { Authorization: `Bearer ${accessToken}` } }));
366
396
  if (!response.ok) throw new Error(`Failed to load the organization's OpenAPI spec (${response.status}).`);
367
397
  return responseJson(response);
368
398
  }
369
- async function loadThemeStylesheet(orgCode, options) {
370
- const fetcher = options.fetch ?? globalThis.fetch;
371
- const instanceUrl = await resolveInstanceUrl(void 0, options.store);
372
- const response = await fetcher(`${organizationInstanceUrl(instanceUrl, orgCode)}/theme.css`);
399
+ async function loadThemeStylesheet(orgCode) {
400
+ const instanceUrl = await resolveInstanceUrl();
401
+ const response = await globalThis.fetch(`${organizationInstanceUrl(instanceUrl, orgCode)}/theme.css`);
373
402
  if (!response.ok) throw new Error(`Failed to load the organization's theme (${response.status}).`);
374
403
  return response.text();
375
404
  }
376
- async function loadBuildInputs(manifest, options) {
377
- const github = githubActionsContext(options.store?.env ?? process.env);
405
+ async function loadBuildInputs(manifest) {
406
+ const github = githubActionsContext();
378
407
  if (github !== void 0) {
379
- const inputs = await loadGitHubActionsBuildInputs(github, options, manifest.requiresChangeset);
408
+ const inputs = await loadGitHubActionsBuildInputs(github, manifest.requiresChangeset);
380
409
  return {
381
410
  spec: inputs.openapi,
382
411
  theme: inputs.theme
383
412
  };
384
413
  }
385
414
  return {
386
- spec: await loadAuthenticatedSpec(manifest, options),
387
- theme: await loadThemeStylesheet(manifest.org, options)
415
+ spec: await loadAuthenticatedSpec(manifest),
416
+ theme: await loadThemeStylesheet(manifest.org)
388
417
  };
389
418
  }
390
419
  async function generateContract(spec, outDir) {
@@ -447,15 +476,18 @@ declare module "@hitch42/applet" {
447
476
  export type * from "./zod.gen.ts";
448
477
  `);
449
478
  }
450
- async function syncContract(outDir, manifest, options = {}) {
451
- await writeContractFiles(outDir, manifest, await loadAuthenticatedSpec(manifest, options));
479
+ async function syncContract(outDir, manifest) {
480
+ await writeContractFiles(outDir, manifest, manifest.objects.length === 0 ? {
481
+ paths: {},
482
+ components: { schemas: {} }
483
+ } : await loadAuthenticatedSpec(manifest));
452
484
  }
453
- async function runGenerate(options) {
485
+ async function runGenerate() {
454
486
  await prepareAppletProject();
455
487
  const root = process.cwd();
456
488
  const outDir = resolve("./.hitch");
457
489
  const manifest = await loadAppletConfig(process.cwd());
458
- const { spec, theme: themeStylesheet } = await loadBuildInputs(manifest, options);
490
+ const { spec, theme: themeStylesheet } = await loadBuildInputs(manifest);
459
491
  const stagedDir = await mkdtemp(resolve("./.hitch.tmp-"));
460
492
  const backupDir = `${stagedDir}.backup`;
461
493
  let staged = true;
@@ -0,0 +1,2 @@
1
+ import { n as runGenerate } from "./generate-BEIYs17x.js";
2
+ export { runGenerate };
@@ -0,0 +1,17 @@
1
+ //#region src/headers.ts
2
+ const HITCH_USER_HEADER = "x-hitch-user";
3
+ const HITCH_SESSION_HEADER = "x-hitch-session";
4
+ const HITCH_APPLET_HEADER = "x-hitch-applet";
5
+ const HITCH_APPLET_CODE_HEADER = "x-hitch-applet-code";
6
+ const HITCH_APPLET_TOKEN_HEADER = "x-hitch-applet-token";
7
+ const HITCH_SCHEDULE_RUN_HEADER = "x-hitch-schedule-run";
8
+ const HITCH_SCHEDULE_HEADER = "x-hitch-schedule";
9
+ const HITCH_ORG_CODE_HEADER = "x-hitch-org-code";
10
+ const HITCH_ORGANIZATION_HEADER = "x-hitch-organization";
11
+ const HITCH_RELEASE_HEADER = "x-hitch-release";
12
+ const HITCH_REQUEST_HOST_HEADER = "x-hitch-request-host";
13
+ const HITCH_WORKFLOW_RUN_HEADER = "x-hitch-workflow-run";
14
+ const HITCH_WORKFLOW_HEADER = "x-hitch-workflow";
15
+ const HITCH_WORKFLOW_INVOCATION_HEADER = "x-hitch-workflow-invocation";
16
+ //#endregion
17
+ export { HITCH_ORG_CODE_HEADER as a, HITCH_SCHEDULE_HEADER as c, HITCH_USER_HEADER as d, HITCH_WORKFLOW_HEADER as f, HITCH_ORGANIZATION_HEADER as i, HITCH_SCHEDULE_RUN_HEADER as l, HITCH_WORKFLOW_RUN_HEADER as m, HITCH_APPLET_HEADER as n, HITCH_RELEASE_HEADER as o, HITCH_WORKFLOW_INVOCATION_HEADER as p, HITCH_APPLET_TOKEN_HEADER as r, HITCH_REQUEST_HOST_HEADER as s, HITCH_APPLET_CODE_HEADER as t, HITCH_SESSION_HEADER as u };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { _ as RegisteredWorkflows, a as AppletSourceDefinition, c as appletManifestSchema, d as RegisteredCatalog, f as RegisteredContract, g as RegisteredVariables, h as RegisteredVariableKeys, i as AppletPackages, l as appletSourceDefinitionSchema, m as RegisteredRouter, n as AppletManifest, o as RegisteredAppletSourceDefinition, p as RegisteredManifest, r as AppletManifestObject, s as appletDefinitionSchema, t as AppletDefinition, u as HitchRegister, v as registerHitchContract } from "./manifest-DD_SGkS6.js";
2
- import { n as pruneContract, t as NarrowContract } from "./contract-rP_eV9PK.js";
1
+ import { _ as RegisteredWorkflows, a as AppletSourceDefinition, c as appletManifestSchema, d as RegisteredCatalog, f as RegisteredContract, g as RegisteredVariables, h as RegisteredVariableKeys, i as AppletPackages, l as appletSourceDefinitionSchema, m as RegisteredRouter, n as AppletManifest, o as RegisteredAppletSourceDefinition, p as RegisteredManifest, r as AppletManifestObject, s as appletDefinitionSchema, t as AppletDefinition, u as HitchRegister, v as registerHitchContract } from "./manifest-C6_F4bL8.js";
2
+ import { n as pruneContract, t as NarrowContract } from "./contract-CsUpTBe0.js";
3
3
  import { a as UploadedHitchFile, c as createFileOutputSchema, d as getFileOutputSchema, i as UploadProgress, l as fileSchema, n as FilesUpload, r as UploadFileOptions, s as uploadFile, t as FilesClient, u as filesContract } from "./upload-DKZzz5kW.js";
4
4
  import { a as createEmailPixelOutputSchema, c as emailTagsSchema, d as listEmailTrackersInputSchema, f as listEmailTrackersOutputSchema, i as createEmailPixelInputSchema, l as emailTrackerSchema, m as markEmailTrackerSentInputSchema, n as EmailTracker, o as emailContract, r as ListEmailTrackersOutput, s as emailTagKeySchema, t as TelephonyMessageReceivedEvent, u as getEmailTrackerInputSchema } from "./telephony-protocol-D-nf3Gca.js";
5
5
  import { ContractProcedure, Meta } from "@orpc/contract";
@@ -47,6 +47,7 @@ type HitchPhoneNumber = {
47
47
  e164: string;
48
48
  label: string;
49
49
  enabled: boolean;
50
+ assignedTo: string | null;
50
51
  canRead: boolean;
51
52
  canSend: boolean;
52
53
  canCall: boolean;
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { i as registerHitchContract, t as uploadFile } from "./upload-DRbVhuDm.js";
2
2
  import { a as emailTagsSchema, c as listEmailTrackersInputSchema, d as markEmailTrackerSentInputSchema, i as emailTagKeySchema, l as listEmailTrackersOutputSchema, n as createEmailPixelOutputSchema, o as emailTrackerSchema, r as emailContract, s as getEmailTrackerInputSchema, t as createEmailPixelInputSchema } from "./email-DBTVhNB_.js";
3
3
  import { n as meSchema, t as meContract } from "./me-BW7Paary.js";
4
- import { n as appletManifestSchema, r as appletSourceDefinitionSchema, t as appletDefinitionSchema } from "./manifest-Bp87Uz0a.js";
4
+ import { n as appletManifestSchema, r as appletSourceDefinitionSchema, t as appletDefinitionSchema } from "./manifest-CJSL9GuC.js";
5
5
  import { oc } from "@orpc/contract";
6
6
  import { z } from "zod";
7
7
  //#region src/hitch/contract.ts
@@ -86,6 +86,7 @@ const hitchPhoneNumberSchema = z.object({
86
86
  e164: z.string(),
87
87
  label: z.string(),
88
88
  enabled: z.boolean(),
89
+ assignedTo: z.uuid().nullable(),
89
90
  canRead: z.boolean(),
90
91
  canSend: z.boolean(),
91
92
  canCall: z.boolean(),
@@ -1,8 +1,8 @@
1
- import { a as ORG_CODE_PATTERN, i as APPLET_CODE_PATTERN } from "./manifest-Bp87Uz0a.js";
2
- import { d as resolveInstanceUrl, i as readWorkspaceConfig, u as resolveAuthForOrg } from "./workspace-XVtM12ZC.js";
3
- import { n as runGenerate } from "./generate-CBPnHoqX.js";
4
- import { n as loadAppletSourceDefinition } from "./load-config-BYSxDVAl.js";
5
- import { a as writeAppletSupport, n as loadCliManifest, o as writeWorkspaceSupport, t as assertWorkspaceCli } from "./project-D6XHllmC.js";
1
+ import { a as ORG_CODE_PATTERN, i as APPLET_CODE_PATTERN } from "./manifest-CJSL9GuC.js";
2
+ import { d as resolveAuthForOrg, f as resolveInstanceUrl, i as readWorkspaceConfig } from "./workspace-D0dnnlxL.js";
3
+ import { n as runGenerate } from "./generate-BEIYs17x.js";
4
+ import { a as writeAppletSupport, n as loadCliManifest, o as writeWorkspaceSupport, t as assertWorkspaceCli } from "./project-BRZGd6xq.js";
5
+ import { n as loadAppletSourceDefinition } from "./load-config-xEdTXs0y.js";
6
6
  import { access, cp, mkdir, readdir, writeFile } from "node:fs/promises";
7
7
  import { relative, resolve } from "node:path";
8
8
  import { spawn } from "node:child_process";
@@ -95,22 +95,17 @@ async function runGit(cwd, args) {
95
95
  });
96
96
  });
97
97
  }
98
- async function generateAppletFiles(target, org, options, installResult) {
98
+ async function generateAppletFiles(target, org, installResult) {
99
99
  if (installResult === "failed") return false;
100
100
  const previousCwd = process.cwd();
101
101
  try {
102
- const instanceUrl = await resolveInstanceUrl(void 0, options.store);
103
- if (await resolveAuthForOrg(instanceUrl, org, options.store) === void 0) {
102
+ const instanceUrl = await resolveInstanceUrl();
103
+ if (await resolveAuthForOrg(instanceUrl, org) === void 0) {
104
104
  console.log("Not logged in. Run applet generate to pull the organization's generated files; it will prompt a login.");
105
105
  return false;
106
106
  }
107
107
  process.chdir(target);
108
- await runGenerate({
109
- fetch: options.fetch,
110
- login: options.login,
111
- stdinIsTTY: options.stdinIsTTY,
112
- store: options.store
113
- });
108
+ await runGenerate();
114
109
  return true;
115
110
  } catch (error) {
116
111
  console.warn(`Generation skipped: ${error instanceof Error ? error.message : String(error)}`);
@@ -231,7 +226,7 @@ export default { router };
231
226
  ]);
232
227
  await Promise.all([writeAppletSupport(appletTarget, definition), cli === void 0 ? void 0 : writeWorkspaceSupport(workspaceRoot, config, cli)]);
233
228
  const installResult = await installDependencies(workspaceRoot, options.install ?? true);
234
- const generateSucceeded = await generateAppletFiles(appletTarget, config.org, options, installResult);
229
+ const generateSucceeded = await generateAppletFiles(appletTarget, config.org, installResult);
235
230
  const relativeTarget = relative(workspaceRoot, appletTarget);
236
231
  const nextSteps = [
237
232
  ...installResult === "succeeded" ? [`cd ${JSON.stringify(relativeTarget)}`] : ["pnpm install", `cd ${JSON.stringify(relativeTarget)}`],
@@ -1,5 +1,5 @@
1
- import { r as appletSourceDefinitionSchema } from "./manifest-Bp87Uz0a.js";
2
- import { t as resolveWorkspaceOrg } from "./workspace-XVtM12ZC.js";
1
+ import { r as appletSourceDefinitionSchema } from "./manifest-CJSL9GuC.js";
2
+ import { t as resolveWorkspaceOrg } from "./workspace-D0dnnlxL.js";
3
3
  import { existsSync } from "node:fs";
4
4
  import { resolve } from "node:path";
5
5
  import { loadConfigFromFile } from "vite";
@@ -0,0 +1,73 @@
1
+ import { channel } from "node:diagnostics_channel";
2
+ //#region src/server/log-context.ts
3
+ const REQUEST_CONTEXT_CHANNEL = "hitch.request.context";
4
+ const APP_CONTEXT_CHANNEL = "hitch.request.app";
5
+ const isUuid = (value) => typeof value === "string" && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);
6
+ function requestIdFrom(headers) {
7
+ const requestId = headers.get("x-request-id");
8
+ return isUuid(requestId) ? requestId : crypto.randomUUID();
9
+ }
10
+ function publishNote(requestId, fields, channelName = REQUEST_CONTEXT_CHANNEL) {
11
+ const note = Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== void 0));
12
+ if (Object.keys(note).length === 0) return;
13
+ const serialized = JSON.stringify({
14
+ requestId,
15
+ ...note
16
+ });
17
+ channel(channelName).publish(serialized.length > 16384 ? {
18
+ requestId,
19
+ noteDropped: true,
20
+ noteBytes: serialized.length,
21
+ noteKeys: Object.keys(note)
22
+ } : {
23
+ requestId,
24
+ ...note
25
+ });
26
+ }
27
+ function errorNote(error) {
28
+ return { error: error instanceof Error ? {
29
+ name: error.name,
30
+ message: error.message,
31
+ stack: error.stack?.slice(0, 8192),
32
+ ...error.cause instanceof Error && { cause: {
33
+ name: error.cause.name,
34
+ message: error.cause.message
35
+ } }
36
+ } : {
37
+ name: "Error",
38
+ message: String(error)
39
+ } };
40
+ }
41
+ function cloudflareRequestFields(request) {
42
+ const cf = Reflect.get(request, "cf");
43
+ const field = (key) => typeof cf === "object" && cf !== null && key in cf ? Reflect.get(cf, key) : void 0;
44
+ const colo = field("colo");
45
+ const country = field("country");
46
+ const asn = field("asn");
47
+ return {
48
+ cfRay: request.headers.get("cf-ray") ?? void 0,
49
+ traceparent: request.headers.get("traceparent") ?? void 0,
50
+ colo: typeof colo === "string" ? colo : void 0,
51
+ country: typeof country === "string" ? country : void 0,
52
+ asn: typeof asn === "number" ? asn : void 0
53
+ };
54
+ }
55
+ function createNoteLog(initial) {
56
+ const context = { ...initial };
57
+ const log = {
58
+ set(fields) {
59
+ Object.assign(context, fields);
60
+ publishNote(initial.requestId, fields);
61
+ },
62
+ error(error) {
63
+ log.set(errorNote(error));
64
+ },
65
+ getContext() {
66
+ return { ...context };
67
+ }
68
+ };
69
+ publishNote(initial.requestId, initial);
70
+ return log;
71
+ }
72
+ //#endregion
73
+ export { errorNote as a, requestIdFrom as c, createNoteLog as i, REQUEST_CONTEXT_CHANNEL as n, isUuid as o, cloudflareRequestFields as r, publishNote as s, APP_CONTEXT_CHANNEL as t };
@@ -1,4 +1,4 @@
1
- import { a as loginWithDevice, d as resolveInstanceUrl, o as AuthenticationError, r as findWorkspaceConfig } from "./workspace-XVtM12ZC.js";
1
+ import { a as loginWithDevice, f as resolveInstanceUrl, o as AuthenticationError, r as findWorkspaceConfig } from "./workspace-D0dnnlxL.js";
2
2
  //#region src/login.ts
3
3
  async function runLogin(options) {
4
4
  if (process.env.HITCH_API_KEY !== void 0) throw new AuthenticationError("HITCH_API_KEY is set — unset it to manage stored logins.");