@hitch42/applet 0.1.1-beta.8 → 0.1.1-beta.9

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 (167) 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.d.ts +1 -1
  5. package/dist/_internal/server.js +112 -57
  6. package/dist/applet.js +12 -12
  7. package/dist/build-Bh_S5BUv.js +2 -0
  8. package/dist/{build-DANx9Hgg.js → build-CEfFoIZZ.js} +1 -1
  9. package/dist/{ci-5qWl7lT3.js → ci-BKw14X2h.js} +14 -13
  10. package/dist/client.d.ts +3 -3
  11. package/dist/{contract-rP_eV9PK.d.ts → contract-CsUpTBe0.d.ts} +1 -1
  12. package/dist/{deploy-MQWLG2EA.js → deploy-wGYjwXrx.js} +139 -88
  13. package/dist/{generate-BxYHdoAQ.js → generate-BEIYs17x.js} +65 -28
  14. package/dist/generate-Dox-OYt6.js +2 -0
  15. package/dist/headers-DkNr9MLJ.js +17 -0
  16. package/dist/index.d.ts +23 -22
  17. package/dist/index.js +2 -1
  18. package/dist/{init-jDEgYIXg.js → init-6oGPM46R.js} +15 -17
  19. package/dist/{load-config-BYSxDVAl.js → load-config-xEdTXs0y.js} +2 -2
  20. package/dist/log-context-zu8U9Sjm.js +73 -0
  21. package/dist/{login-C7RKmmTe.js → login-CUx3TmFQ.js} +1 -1
  22. package/dist/{logs-DgjgAxj2.js → logs-DSjuEN0Q.js} +20 -22
  23. package/dist/{manifest-DD_SGkS6.d.ts → manifest-C6_F4bL8.d.ts} +5 -1
  24. package/dist/{manifest-Bp87Uz0a.js → manifest-CJSL9GuC.js} +20 -4
  25. package/dist/{project-CbYPtpPq.js → project-BRZGd6xq.js} +199 -18
  26. package/dist/query-cache-CXmAyLv3.js +82 -0
  27. package/dist/react.d.ts +3 -2
  28. package/dist/react.js +98 -80
  29. package/dist/{schedules-dhU1yyFr.js → schedules-C8_Svr4h.js} +1 -1
  30. package/dist/server.d.ts +9 -4
  31. package/dist/server.js +29 -8
  32. package/dist/{telephony-protocol-DRgiYjqQ.d.ts → telephony-protocol-D-nf3Gca.d.ts} +15 -13
  33. package/dist/telephony.d.ts +24 -4
  34. package/dist/telephony.js +135 -16
  35. package/dist/{upload-YbRKEqR6.d.ts → upload-DKZzz5kW.d.ts} +6 -6
  36. package/dist/{variables-Bwnr7oxf.js → variables-DT5RyHdH.js} +13 -13
  37. package/dist/vite.d.ts +3 -60
  38. package/dist/vite.js +50 -15
  39. package/dist/{workflow-engine-MogejNfF.js → workflow-engine-BOTzURKM.js} +1 -7
  40. package/dist/{workspace-XVtM12ZC.js → workspace-D0dnnlxL.js} +33 -38
  41. package/package.json +13 -5
  42. package/scaffold/.agents/skills/hitch-applets/SKILL.md +30 -4
  43. package/scaffold/.agents/skills/hitch-applets/references/manifest.md +8 -0
  44. package/scaffold/.agents/skills/hitch-applets/references/markdown.md +2 -0
  45. package/scaffold/.agents/skills/hitch-applets/references/records.md +23 -1
  46. package/scaffold/.agents/skills/hitch-data/SKILL.md +2 -1
  47. package/scaffold/.agents/skills/hitch-data/references/attributes.md +7 -1
  48. package/scaffold/.agents/skills/hitch-data/references/limits.md +13 -13
  49. package/scaffold/.agents/skills/hitch-theory/SKILL.md +3 -2
  50. package/scaffold/.agents/skills/react-best-practices/SKILL.md +127 -0
  51. package/scaffold/.agents/skills/react-best-practices/rules/advanced-effect-event-deps.md +50 -0
  52. package/scaffold/.agents/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  53. package/scaffold/.agents/skills/react-best-practices/rules/advanced-init-once.md +42 -0
  54. package/scaffold/.agents/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
  55. package/scaffold/.agents/skills/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  56. package/scaffold/.agents/skills/react-best-practices/rules/async-defer-await.md +82 -0
  57. package/scaffold/.agents/skills/react-best-practices/rules/async-dependencies.md +48 -0
  58. package/scaffold/.agents/skills/react-best-practices/rules/async-parallel.md +24 -0
  59. package/scaffold/.agents/skills/react-best-practices/rules/bundle-analyzable-paths.md +42 -0
  60. package/scaffold/.agents/skills/react-best-practices/rules/bundle-barrel-imports.md +39 -0
  61. package/scaffold/.agents/skills/react-best-practices/rules/bundle-conditional.md +35 -0
  62. package/scaffold/.agents/skills/react-best-practices/rules/bundle-defer-third-party.md +46 -0
  63. package/scaffold/.agents/skills/react-best-practices/rules/bundle-dynamic-imports.md +38 -0
  64. package/scaffold/.agents/skills/react-best-practices/rules/bundle-preload.md +40 -0
  65. package/scaffold/.agents/skills/react-best-practices/rules/client-event-listeners.md +78 -0
  66. package/scaffold/.agents/skills/react-best-practices/rules/client-localstorage-schema.md +74 -0
  67. package/scaffold/.agents/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  68. package/scaffold/.agents/skills/react-best-practices/rules/js-batch-dom-css.md +110 -0
  69. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-function-results.md +58 -0
  70. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  71. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-storage.md +56 -0
  72. package/scaffold/.agents/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  73. package/scaffold/.agents/skills/react-best-practices/rules/js-early-exit.md +50 -0
  74. package/scaffold/.agents/skills/react-best-practices/rules/js-flatmap-filter.md +51 -0
  75. package/scaffold/.agents/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  76. package/scaffold/.agents/skills/react-best-practices/rules/js-index-maps.md +37 -0
  77. package/scaffold/.agents/skills/react-best-practices/rules/js-length-check-first.md +50 -0
  78. package/scaffold/.agents/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  79. package/scaffold/.agents/skills/react-best-practices/rules/js-request-idle-callback.md +104 -0
  80. package/scaffold/.agents/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  81. package/scaffold/.agents/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  82. package/scaffold/.agents/skills/react-best-practices/rules/rendering-activity.md +26 -0
  83. package/scaffold/.agents/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +38 -0
  84. package/scaffold/.agents/skills/react-best-practices/rules/rendering-conditional-render.md +32 -0
  85. package/scaffold/.agents/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  86. package/scaffold/.agents/skills/react-best-practices/rules/rendering-hoist-jsx.md +36 -0
  87. package/scaffold/.agents/skills/react-best-practices/rules/rendering-resource-hints.md +81 -0
  88. package/scaffold/.agents/skills/react-best-practices/rules/rendering-script-defer-async.md +36 -0
  89. package/scaffold/.agents/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  90. package/scaffold/.agents/skills/react-best-practices/rules/rendering-usetransition-loading.md +43 -0
  91. package/scaffold/.agents/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  92. package/scaffold/.agents/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  93. package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  94. package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  95. package/scaffold/.agents/skills/react-best-practices/rules/rerender-functional-setstate.md +77 -0
  96. package/scaffold/.agents/skills/react-best-practices/rules/rerender-lazy-state-init.md +56 -0
  97. package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo-with-default-value.md +36 -0
  98. package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo.md +44 -0
  99. package/scaffold/.agents/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  100. package/scaffold/.agents/skills/react-best-practices/rules/rerender-no-inline-components.md +75 -0
  101. package/scaffold/.agents/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  102. package/scaffold/.agents/skills/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  103. package/scaffold/.agents/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  104. package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  105. package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  106. package/scaffold/.agents/skills/tanstack-query/SKILL.md +136 -0
  107. package/scaffold/.agents/skills/tanstack-query/references/compositions/automatic-invalidation-after-mutations.md +124 -0
  108. package/scaffold/.agents/skills/tanstack-query/references/compositions/broadcast-realtime-and-multi-tab-synchronization.md +150 -0
  109. package/scaffold/.agents/skills/tanstack-query/references/compositions/compose-query-with-tanstack-router-and-start.md +248 -0
  110. package/scaffold/.agents/skills/tanstack-query/references/compositions/enforce-query-best-practices-with-eslint.md +167 -0
  111. package/scaffold/.agents/skills/tanstack-query/references/compositions/persist-offline-and-restore-caches.md +181 -0
  112. package/scaffold/.agents/skills/tanstack-query/references/compositions/query-data-and-forms.md +156 -0
  113. package/scaffold/.agents/skills/tanstack-query/references/core/build-query-abstractions.md +130 -0
  114. package/scaffold/.agents/skills/tanstack-query/references/core/cancel-queries-and-consume-abort-signals.md +176 -0
  115. package/scaffold/.agents/skills/tanstack-query/references/core/concurrent-optimistic-updates.md +135 -0
  116. package/scaffold/.agents/skills/tanstack-query/references/core/coordinate-query-execution.md +188 -0
  117. package/scaffold/.agents/skills/tanstack-query/references/core/design-query-keys-and-options.md +182 -0
  118. package/scaffold/.agents/skills/tanstack-query/references/core/fetch-and-observe-queries.md +193 -0
  119. package/scaffold/.agents/skills/tanstack-query/references/core/implement-optimistic-updates-and-cache-writes.md +168 -0
  120. package/scaffold/.agents/skills/tanstack-query/references/core/paginate-and-build-infinite-queries.md +188 -0
  121. package/scaffold/.agents/skills/tanstack-query/references/core/seed-placeholder-select-and-transform-data.md +188 -0
  122. package/scaffold/.agents/skills/tanstack-query/references/core/selectors-and-derived-state.md +145 -0
  123. package/scaffold/.agents/skills/tanstack-query/references/core/tune-defaults-freshness-retries-and-refetching.md +172 -0
  124. package/scaffold/.agents/skills/tanstack-query/references/core/understand-query-internals-and-observers.md +104 -0
  125. package/scaffold/.agents/skills/tanstack-query/references/core/write-mutations-and-invalidate-related-queries.md +183 -0
  126. package/scaffold/.agents/skills/tanstack-query/references/framework/debug-with-devtools.md +169 -0
  127. package/scaffold/.agents/skills/tanstack-query/references/framework/handle-status-and-errors.md +119 -0
  128. package/scaffold/.agents/skills/tanstack-query/references/framework/shape-data-and-render-efficiently.md +184 -0
  129. package/scaffold/.agents/skills/tanstack-query/references/framework/use-framework-adapter-reactivity.md +185 -0
  130. package/scaffold/.agents/skills/tanstack-query/references/framework/use-suspense-and-error-boundaries.md +208 -0
  131. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/migrate-major-versions-and-codemods.md +169 -0
  132. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/prefetch-and-remove-request-waterfalls.md +228 -0
  133. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/setup-query-client-and-providers.md +161 -0
  134. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/ssr-hydration-and-streaming.md +209 -0
  135. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/test-query-code.md +160 -0
  136. package/scaffold/.agents/skills/tanstack-router/SKILL.md +134 -0
  137. package/scaffold/.agents/skills/tanstack-router/references/compositions/router-query.md +412 -0
  138. package/scaffold/.agents/skills/tanstack-router/references/react-router.md +495 -0
  139. package/scaffold/.agents/skills/tanstack-router/references/router-core/auth-and-guards.md +495 -0
  140. package/scaffold/.agents/skills/tanstack-router/references/router-core/code-splitting.md +318 -0
  141. package/scaffold/.agents/skills/tanstack-router/references/router-core/data-loading.md +490 -0
  142. package/scaffold/.agents/skills/tanstack-router/references/router-core/index.md +158 -0
  143. package/scaffold/.agents/skills/tanstack-router/references/router-core/navigation.md +433 -0
  144. package/scaffold/.agents/skills/tanstack-router/references/router-core/not-found-and-errors.md +436 -0
  145. package/scaffold/.agents/skills/tanstack-router/references/router-core/path-params.md +383 -0
  146. package/scaffold/.agents/skills/tanstack-router/references/router-core/search-params.md +343 -0
  147. package/scaffold/.agents/skills/tanstack-router/references/router-core/ssr.md +462 -0
  148. package/scaffold/.agents/skills/tanstack-router/references/router-core/type-safety.md +493 -0
  149. package/scaffold/.agents/skills/tanstack-router/references/router-plugin.md +250 -0
  150. package/scaffold/.agents/skills/tanstack-router/references/virtual-file-routes.md +215 -0
  151. package/scaffold/.agents/skills/web-design-guidelines/SKILL.md +184 -0
  152. package/scaffold/.github/workflows/hitch.yml +1 -1
  153. package/scaffold/AGENTS.md +2 -2
  154. package/scaffold/applet/src/client/components/ui/alert.tsx +1 -1
  155. package/scaffold/applet/src/client/components/ui/button.tsx +1 -1
  156. package/scaffold/applet/src/client/components/ui/checkbox.tsx +1 -1
  157. package/scaffold/applet/src/client/components/ui/dialog.tsx +2 -2
  158. package/scaffold/applet/src/client/components/ui/dropdown-menu.tsx +2 -2
  159. package/scaffold/applet/src/client/components/ui/input-group.tsx +2 -2
  160. package/scaffold/applet/src/client/components/ui/select.tsx +2 -2
  161. package/scaffold/applet/src/client/components/ui/sheet.tsx +2 -2
  162. package/scaffold/applet/src/client/components/ui/spinner.tsx +2 -1
  163. package/scaffold/applet/src/client/components/ui/tabs.tsx +1 -1
  164. package/scaffold/applet/src/client/lib/utils.ts +1 -6
  165. package/scaffold/applet/src/client/styles/globals.css +2 -0
  166. package/dist/build-CFCKKMn7.js +0 -2
  167. package/dist/generate-CQ07Hdpo.js +0 -2
@@ -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-BxYHdoAQ.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-CbYPtpPq.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";
@@ -23,8 +23,11 @@ async function assertTargetIsAvailable(paths, targetType) {
23
23
  if (existingPath !== void 0) throw new Error(`Refusing to initialize ${targetType}: ${existingPath} already exists.`);
24
24
  }
25
25
  async function assertDirectoryIsEmpty(path) {
26
- const [entry] = await readdir(path);
27
- if (entry !== void 0) throw new Error(`Refusing to initialize a workspace: ${path} is not empty (${entry} exists).`);
26
+ const entries = await readdir(path);
27
+ if (entries.length > 0) {
28
+ const [entry] = entries;
29
+ throw new Error(`Refusing to initialize a workspace: ${path} is not empty (${entry} exists).`);
30
+ }
28
31
  }
29
32
  async function installDependencies(target, install) {
30
33
  if (!install) return "skipped";
@@ -92,22 +95,17 @@ async function runGit(cwd, args) {
92
95
  });
93
96
  });
94
97
  }
95
- async function generateAppletFiles(target, org, options, installResult) {
98
+ async function generateAppletFiles(target, org, installResult) {
96
99
  if (installResult === "failed") return false;
97
100
  const previousCwd = process.cwd();
98
101
  try {
99
- const instanceUrl = await resolveInstanceUrl(void 0, options.store);
100
- if (await resolveAuthForOrg(instanceUrl, org, options.store) === void 0) {
102
+ const instanceUrl = await resolveInstanceUrl();
103
+ if (await resolveAuthForOrg(instanceUrl, org) === void 0) {
101
104
  console.log("Not logged in. Run applet generate to pull the organization's generated files; it will prompt a login.");
102
105
  return false;
103
106
  }
104
107
  process.chdir(target);
105
- await runGenerate({
106
- fetch: options.fetch,
107
- login: options.login,
108
- stdinIsTTY: options.stdinIsTTY,
109
- store: options.store
110
- });
108
+ await runGenerate();
111
109
  return true;
112
110
  } catch (error) {
113
111
  console.warn(`Generation skipped: ${error instanceof Error ? error.message : String(error)}`);
@@ -228,7 +226,7 @@ export default { router };
228
226
  ]);
229
227
  await Promise.all([writeAppletSupport(appletTarget, definition), cli === void 0 ? void 0 : writeWorkspaceSupport(workspaceRoot, config, cli)]);
230
228
  const installResult = await installDependencies(workspaceRoot, options.install ?? true);
231
- const generateSucceeded = await generateAppletFiles(appletTarget, config.org, options, installResult);
229
+ const generateSucceeded = await generateAppletFiles(appletTarget, config.org, installResult);
232
230
  const relativeTarget = relative(workspaceRoot, appletTarget);
233
231
  const nextSteps = [
234
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.");
@@ -1,6 +1,6 @@
1
- import { i as APPLET_CODE_PATTERN } from "./manifest-Bp87Uz0a.js";
2
- import { i as readWorkspaceConfig, n as fetchWithOrgAuth, t as resolveWorkspaceOrg } from "./workspace-XVtM12ZC.js";
3
- import { t as loadAppletConfig } from "./load-config-BYSxDVAl.js";
1
+ import { i as APPLET_CODE_PATTERN } from "./manifest-CJSL9GuC.js";
2
+ import { i as readWorkspaceConfig, n as fetchWithOrgAuth, t as resolveWorkspaceOrg } from "./workspace-D0dnnlxL.js";
3
+ import { t as loadAppletConfig } from "./load-config-xEdTXs0y.js";
4
4
  import { z } from "zod";
5
5
  //#region src/logs.ts
6
6
  const LOG_LEVELS = [
@@ -19,6 +19,16 @@ const logSchema = z.object({
19
19
  timestamp: z.number(),
20
20
  level: z.string(),
21
21
  message: z.string(),
22
+ context: z.record(z.string(), z.unknown()).optional(),
23
+ error: z.object({
24
+ name: z.string(),
25
+ message: z.string(),
26
+ stack: z.string().optional(),
27
+ cause: z.object({
28
+ name: z.string(),
29
+ message: z.string()
30
+ }).optional()
31
+ }).optional(),
22
32
  releaseId: z.string(),
23
33
  type: z.string().optional(),
24
34
  runId: z.string().optional(),
@@ -93,20 +103,6 @@ async function readErrorDetails(response) {
93
103
  }
94
104
  return "";
95
105
  }
96
- function waitForPoll(signal) {
97
- if (signal?.aborted === true) return Promise.resolve(false);
98
- return new Promise((resolve) => {
99
- const timeout = setTimeout(() => {
100
- signal?.removeEventListener("abort", onAbort);
101
- resolve(true);
102
- }, POLL_INTERVAL_MS);
103
- const onAbort = () => {
104
- clearTimeout(timeout);
105
- resolve(false);
106
- };
107
- signal?.addEventListener("abort", onAbort, { once: true });
108
- });
109
- }
110
106
  function printLog(log) {
111
107
  const details = log.type === "invocation" ? [
112
108
  log.statusCode === void 0 ? void 0 : `status=${log.statusCode}`,
@@ -114,7 +110,9 @@ function printLog(log) {
114
110
  log.wallTimeMs === void 0 ? void 0 : `wall=${log.wallTimeMs}ms`,
115
111
  log.cpuTimeMs === void 0 ? void 0 : `cpu=${log.cpuTimeMs}ms`
116
112
  ].filter((value) => value !== void 0) : [];
117
- console.log(`${new Date(log.timestamp).toISOString()} ${log.level.toUpperCase().padEnd(5)} ${log.type === "workflow" ? `[${log.workflow} ${log.runId?.slice(0, 8)}#${log.invocation}] ` : ""}${log.message}${details.length === 0 ? "" : ` [${details.join(" ")}]`}`);
113
+ console.log(`${new Date(log.timestamp).toISOString()} ${log.level.toUpperCase().padEnd(5)} ${log.type === "workflow" ? `[${log.workflow} ${log.runId?.slice(0, 8)}#${log.invocation}] ` : ""}${log.message}${details.length === 0 ? "" : ` [${details.join(" ")}]`}${log.context === void 0 ? "" : ` ${JSON.stringify(log.context)}`}`);
114
+ if (log.error) console.log(log.error.stack ?? `${log.error.name}: ${log.error.message}`);
115
+ if (log.error?.cause) console.log(`Caused by ${log.error.cause.name}: ${log.error.cause.message}`);
118
116
  }
119
117
  async function runLogs(options) {
120
118
  const [{ code, org }, since, limit, level, userFilter, search] = await Promise.all([
@@ -127,13 +125,12 @@ async function runLogs(options) {
127
125
  ]);
128
126
  const runFilter = options.run === void 0 ? void 0 : { runId: { $eq: options.run } };
129
127
  const filter = runFilter === void 0 ? userFilter : userFilter === void 0 ? runFilter : { $and: [runFilter, userFilter] };
130
- const fetcher = options.fetch ?? globalThis.fetch;
131
128
  const startedAt = Date.now();
132
129
  const requestLogs = async (from, to) => {
133
- const response = await fetchWithOrgAuth(org, options, (instanceUrl, accessToken) => {
130
+ const response = await fetchWithOrgAuth(org, (instanceUrl, accessToken) => {
134
131
  const url = new URL(`/api/v1/applets/${encodeURIComponent(code)}/logs/query`, `${instanceUrl}/`);
135
132
  const levelFilter = level === void 0 ? void 0 : { level: { $in: LOG_LEVELS.slice(LOG_LEVELS.indexOf(level)) } };
136
- return fetcher(url, {
133
+ return fetch(url, {
137
134
  method: "POST",
138
135
  headers: {
139
136
  Authorization: `Bearer ${accessToken}`,
@@ -172,7 +169,8 @@ async function runLogs(options) {
172
169
  return;
173
170
  }
174
171
  let lastTimestamp = initialLogs.at(-1)?.timestamp ?? startedAt;
175
- while (await waitForPoll(options.signal)) {
172
+ for (;;) {
173
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
176
174
  const to = Date.now();
177
175
  const logs = await requestLogs(Math.max(startedAt - since, lastTimestamp - LIVE_OVERLAP_MS), to);
178
176
  printNewLogs(logs);
@@ -35,7 +35,9 @@ interface AppletManifest {
35
35
  /** This code needs the schema as of this changeset. */
36
36
  requiresChangeset?: string;
37
37
  telephony?: {
38
- events: readonly "message.received"[];
38
+ read?: boolean;
39
+ send?: boolean;
40
+ events?: readonly "message.received"[];
39
41
  };
40
42
  schedules?: readonly {
41
43
  code: string;
@@ -53,6 +55,8 @@ interface AppletManifest {
53
55
  canDelete: boolean;
54
56
  readOnly: readonly string[];
55
57
  readWrite: readonly string[];
58
+ optional?: boolean;
59
+ optionalAttributes?: readonly string[];
56
60
  }[];
57
61
  }
58
62
  type AppletDefinition = Omit<AppletManifest, "org">;
@@ -31,13 +31,22 @@ const appletManifestObjectSchema = z.strictObject({
31
31
  canCreate: z.boolean(),
32
32
  canDelete: z.boolean(),
33
33
  readOnly: attributeCodesSchema,
34
- readWrite: attributeCodesSchema
34
+ readWrite: attributeCodesSchema,
35
+ optional: z.boolean().optional(),
36
+ optionalAttributes: attributeCodesSchema.optional()
35
37
  }).superRefine((object, context) => {
36
38
  const overlap = object.readOnly.find((code) => object.readWrite.includes(code));
37
39
  if (overlap !== void 0) context.addIssue({
38
40
  code: "custom",
39
41
  message: `readOnly and readWrite both contain "${overlap}".`
40
42
  });
43
+ object.optionalAttributes?.forEach((code, index) => {
44
+ if (!object.readOnly.includes(code) && !object.readWrite.includes(code)) context.addIssue({
45
+ code: "custom",
46
+ message: `optionalAttributes contains undeclared attribute code "${code}".`,
47
+ path: ["optionalAttributes", index]
48
+ });
49
+ });
41
50
  });
42
51
  const appletManifestObjectsSchema = z.array(appletManifestObjectSchema).readonly();
43
52
  const appletManifestSchedulesSchema = z.array(z.strictObject({
@@ -64,7 +73,11 @@ const appletManifestShape = {
64
73
  name: nameSchema,
65
74
  code: codeSchema,
66
75
  requiresChangeset: z.uuid().optional(),
67
- telephony: z.strictObject({ events: z.array(z.literal("message.received")).min(1).refine((events) => new Set(events).size === events.length).readonly() }).optional(),
76
+ telephony: z.strictObject({
77
+ read: z.boolean().optional(),
78
+ send: z.boolean().optional(),
79
+ events: z.array(z.literal("message.received")).min(1).refine((events) => new Set(events).size === events.length).readonly().optional()
80
+ }).refine((telephony) => telephony.events === void 0 || telephony.read === true, "telephony.events needs telephony.read").optional(),
68
81
  schedules: appletManifestSchedulesSchema.optional(),
69
82
  variables: appletManifestVariablesSchema.optional(),
70
83
  objects: appletManifestObjectsSchema
@@ -104,6 +117,7 @@ const appletDefinitionSchema = z.strictObject({
104
117
  }).superRefine(checkDuplicateCodes);
105
118
  const packageVersionsSchema = z.record(z.string().min(1), z.string().min(1)).readonly();
106
119
  const RESERVED_APPLET_PACKAGES = /* @__PURE__ */ new Set([
120
+ "@fontsource-variable/geist-mono",
107
121
  "@fontsource-variable/inter",
108
122
  "@hitch42/applet",
109
123
  "@orpc/contract",
@@ -123,14 +137,16 @@ const RESERVED_APPLET_PACKAGES = /* @__PURE__ */ new Set([
123
137
  "@types/react",
124
138
  "@types/react-dom",
125
139
  "class-variance-authority",
126
- "clsx",
140
+ "cn",
127
141
  "lucide-react",
142
+ "oxfmt",
143
+ "oxlint",
144
+ "oxlint-tsgolint",
128
145
  "react",
129
146
  "react-aria-components",
130
147
  "react-dom",
131
148
  "shadcn",
132
149
  "streamdown",
133
- "tailwind-merge",
134
150
  "tailwindcss",
135
151
  "tw-animate-css",
136
152
  "typescript",