@hitch42/applet 0.1.1-beta.1 → 0.1.1-beta.11

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 (178) 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 +14 -1
  5. package/dist/_internal/server.js +122 -118
  6. package/dist/applet.js +53 -29
  7. package/dist/build-Bh_S5BUv.js +2 -0
  8. package/dist/{build-Rk3xDZV7.js → build-CEfFoIZZ.js} +30 -14
  9. package/dist/ci-BKw14X2h.js +69 -0
  10. package/dist/client.d.ts +3 -3
  11. package/dist/{contract-DMrpbaLJ.d.ts → contract-CsUpTBe0.d.ts} +1 -1
  12. package/dist/{deploy-D3BGDqgC.js → deploy-wGYjwXrx.js} +249 -35
  13. package/dist/email-DBTVhNB_.js +62 -0
  14. package/dist/{generate-CH0VQmUi.js → generate-BEIYs17x.js} +79 -25
  15. package/dist/generate-Dox-OYt6.js +2 -0
  16. package/dist/headers-DkNr9MLJ.js +17 -0
  17. package/dist/index.d.ts +123 -11
  18. package/dist/index.js +142 -26
  19. package/dist/{init-BS1Y-eNL.js → init-6oGPM46R.js} +17 -18
  20. package/dist/load-config-xEdTXs0y.js +27 -0
  21. package/dist/log-context-zu8U9Sjm.js +73 -0
  22. package/dist/login-CUx3TmFQ.js +12 -0
  23. package/dist/{logs-m00pzr_O.js → logs-DSjuEN0Q.js} +20 -22
  24. package/dist/{manifest-BQCAxATS.d.ts → manifest-C6_F4bL8.d.ts} +9 -0
  25. package/dist/{manifest-DyoJ1MIL.js → manifest-CJSL9GuC.js} +25 -3
  26. package/dist/me-BW7Paary.js +32 -0
  27. package/dist/{project-CxN-Dtc7.js → project-BRZGd6xq.js} +227 -34
  28. package/dist/prompt-ChS-grYO.js +29 -0
  29. package/dist/query-cache-CXmAyLv3.js +82 -0
  30. package/dist/react.d.ts +3 -2
  31. package/dist/react.js +98 -80
  32. package/dist/schedules-C8_Svr4h.js +42 -0
  33. package/dist/server.d.ts +9 -4
  34. package/dist/server.js +29 -8
  35. package/dist/telephony-protocol-D-nf3Gca.d.ts +76 -0
  36. package/dist/telephony.d.ts +97 -0
  37. package/dist/telephony.js +726 -0
  38. package/dist/{upload-YbRKEqR6.d.ts → upload-DKZzz5kW.d.ts} +6 -6
  39. package/dist/{variables-CP7Ce3Np.js → variables-DT5RyHdH.js} +14 -39
  40. package/dist/vite.d.ts +3 -60
  41. package/dist/vite.js +503 -34
  42. package/dist/workflow-engine-BOTzURKM.js +111 -0
  43. package/dist/{auth-DaVK0k5R.js → workspace-D0dnnlxL.js} +75 -40
  44. package/package.json +19 -6
  45. package/scaffold/.agents/skills/hitch-applets/SKILL.md +60 -15
  46. package/scaffold/.agents/skills/hitch-applets/references/email-tracking.md +49 -0
  47. package/scaffold/.agents/skills/hitch-applets/references/files.md +3 -3
  48. package/scaffold/.agents/skills/hitch-applets/references/manifest.md +29 -2
  49. package/scaffold/.agents/skills/hitch-applets/references/markdown.md +2 -0
  50. package/scaffold/.agents/skills/hitch-applets/references/performance.md +74 -0
  51. package/scaffold/.agents/skills/hitch-applets/references/records.md +32 -8
  52. package/scaffold/.agents/skills/hitch-applets/references/schedules.md +7 -2
  53. package/scaffold/.agents/skills/hitch-applets/references/server.md +0 -3
  54. package/scaffold/.agents/skills/hitch-applets/references/workflows.md +11 -3
  55. package/scaffold/.agents/skills/hitch-cli/SKILL.md +129 -0
  56. package/scaffold/.agents/skills/hitch-data/SKILL.md +52 -0
  57. package/scaffold/.agents/skills/hitch-data/references/attributes.md +127 -0
  58. package/scaffold/.agents/skills/hitch-data/references/limits.md +64 -0
  59. package/scaffold/.agents/skills/hitch-theory/SKILL.md +151 -0
  60. package/scaffold/.agents/skills/react-best-practices/SKILL.md +127 -0
  61. package/scaffold/.agents/skills/react-best-practices/rules/advanced-effect-event-deps.md +50 -0
  62. package/scaffold/.agents/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  63. package/scaffold/.agents/skills/react-best-practices/rules/advanced-init-once.md +42 -0
  64. package/scaffold/.agents/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
  65. package/scaffold/.agents/skills/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  66. package/scaffold/.agents/skills/react-best-practices/rules/async-defer-await.md +82 -0
  67. package/scaffold/.agents/skills/react-best-practices/rules/async-dependencies.md +48 -0
  68. package/scaffold/.agents/skills/react-best-practices/rules/async-parallel.md +24 -0
  69. package/scaffold/.agents/skills/react-best-practices/rules/bundle-analyzable-paths.md +42 -0
  70. package/scaffold/.agents/skills/react-best-practices/rules/bundle-barrel-imports.md +39 -0
  71. package/scaffold/.agents/skills/react-best-practices/rules/bundle-conditional.md +35 -0
  72. package/scaffold/.agents/skills/react-best-practices/rules/bundle-defer-third-party.md +46 -0
  73. package/scaffold/.agents/skills/react-best-practices/rules/bundle-dynamic-imports.md +38 -0
  74. package/scaffold/.agents/skills/react-best-practices/rules/bundle-preload.md +40 -0
  75. package/scaffold/.agents/skills/react-best-practices/rules/client-event-listeners.md +78 -0
  76. package/scaffold/.agents/skills/react-best-practices/rules/client-localstorage-schema.md +74 -0
  77. package/scaffold/.agents/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  78. package/scaffold/.agents/skills/react-best-practices/rules/js-batch-dom-css.md +110 -0
  79. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-function-results.md +58 -0
  80. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  81. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-storage.md +56 -0
  82. package/scaffold/.agents/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  83. package/scaffold/.agents/skills/react-best-practices/rules/js-early-exit.md +50 -0
  84. package/scaffold/.agents/skills/react-best-practices/rules/js-flatmap-filter.md +51 -0
  85. package/scaffold/.agents/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  86. package/scaffold/.agents/skills/react-best-practices/rules/js-index-maps.md +37 -0
  87. package/scaffold/.agents/skills/react-best-practices/rules/js-length-check-first.md +50 -0
  88. package/scaffold/.agents/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  89. package/scaffold/.agents/skills/react-best-practices/rules/js-request-idle-callback.md +104 -0
  90. package/scaffold/.agents/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  91. package/scaffold/.agents/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  92. package/scaffold/.agents/skills/react-best-practices/rules/rendering-activity.md +26 -0
  93. package/scaffold/.agents/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +38 -0
  94. package/scaffold/.agents/skills/react-best-practices/rules/rendering-conditional-render.md +32 -0
  95. package/scaffold/.agents/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  96. package/scaffold/.agents/skills/react-best-practices/rules/rendering-hoist-jsx.md +36 -0
  97. package/scaffold/.agents/skills/react-best-practices/rules/rendering-resource-hints.md +81 -0
  98. package/scaffold/.agents/skills/react-best-practices/rules/rendering-script-defer-async.md +36 -0
  99. package/scaffold/.agents/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  100. package/scaffold/.agents/skills/react-best-practices/rules/rendering-usetransition-loading.md +43 -0
  101. package/scaffold/.agents/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  102. package/scaffold/.agents/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  103. package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  104. package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  105. package/scaffold/.agents/skills/react-best-practices/rules/rerender-functional-setstate.md +77 -0
  106. package/scaffold/.agents/skills/react-best-practices/rules/rerender-lazy-state-init.md +56 -0
  107. package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo-with-default-value.md +36 -0
  108. package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo.md +44 -0
  109. package/scaffold/.agents/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  110. package/scaffold/.agents/skills/react-best-practices/rules/rerender-no-inline-components.md +75 -0
  111. package/scaffold/.agents/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  112. package/scaffold/.agents/skills/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  113. package/scaffold/.agents/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  114. package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  115. package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  116. package/scaffold/.agents/skills/tanstack-query/SKILL.md +136 -0
  117. package/scaffold/.agents/skills/tanstack-query/references/compositions/automatic-invalidation-after-mutations.md +124 -0
  118. package/scaffold/.agents/skills/tanstack-query/references/compositions/broadcast-realtime-and-multi-tab-synchronization.md +150 -0
  119. package/scaffold/.agents/skills/tanstack-query/references/compositions/compose-query-with-tanstack-router-and-start.md +248 -0
  120. package/scaffold/.agents/skills/tanstack-query/references/compositions/enforce-query-best-practices-with-eslint.md +167 -0
  121. package/scaffold/.agents/skills/tanstack-query/references/compositions/persist-offline-and-restore-caches.md +181 -0
  122. package/scaffold/.agents/skills/tanstack-query/references/compositions/query-data-and-forms.md +156 -0
  123. package/scaffold/.agents/skills/tanstack-query/references/core/build-query-abstractions.md +130 -0
  124. package/scaffold/.agents/skills/tanstack-query/references/core/cancel-queries-and-consume-abort-signals.md +176 -0
  125. package/scaffold/.agents/skills/tanstack-query/references/core/concurrent-optimistic-updates.md +135 -0
  126. package/scaffold/.agents/skills/tanstack-query/references/core/coordinate-query-execution.md +188 -0
  127. package/scaffold/.agents/skills/tanstack-query/references/core/design-query-keys-and-options.md +182 -0
  128. package/scaffold/.agents/skills/tanstack-query/references/core/fetch-and-observe-queries.md +193 -0
  129. package/scaffold/.agents/skills/tanstack-query/references/core/implement-optimistic-updates-and-cache-writes.md +168 -0
  130. package/scaffold/.agents/skills/tanstack-query/references/core/paginate-and-build-infinite-queries.md +188 -0
  131. package/scaffold/.agents/skills/tanstack-query/references/core/seed-placeholder-select-and-transform-data.md +188 -0
  132. package/scaffold/.agents/skills/tanstack-query/references/core/selectors-and-derived-state.md +145 -0
  133. package/scaffold/.agents/skills/tanstack-query/references/core/tune-defaults-freshness-retries-and-refetching.md +172 -0
  134. package/scaffold/.agents/skills/tanstack-query/references/core/understand-query-internals-and-observers.md +104 -0
  135. package/scaffold/.agents/skills/tanstack-query/references/core/write-mutations-and-invalidate-related-queries.md +183 -0
  136. package/scaffold/.agents/skills/tanstack-query/references/framework/debug-with-devtools.md +169 -0
  137. package/scaffold/.agents/skills/tanstack-query/references/framework/handle-status-and-errors.md +119 -0
  138. package/scaffold/.agents/skills/tanstack-query/references/framework/shape-data-and-render-efficiently.md +184 -0
  139. package/scaffold/.agents/skills/tanstack-query/references/framework/use-framework-adapter-reactivity.md +185 -0
  140. package/scaffold/.agents/skills/tanstack-query/references/framework/use-suspense-and-error-boundaries.md +208 -0
  141. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/migrate-major-versions-and-codemods.md +169 -0
  142. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/prefetch-and-remove-request-waterfalls.md +228 -0
  143. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/setup-query-client-and-providers.md +161 -0
  144. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/ssr-hydration-and-streaming.md +209 -0
  145. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/test-query-code.md +160 -0
  146. package/scaffold/.agents/skills/tanstack-router/SKILL.md +134 -0
  147. package/scaffold/.agents/skills/tanstack-router/references/compositions/router-query.md +412 -0
  148. package/scaffold/.agents/skills/tanstack-router/references/react-router.md +495 -0
  149. package/scaffold/.agents/skills/tanstack-router/references/router-core/auth-and-guards.md +495 -0
  150. package/scaffold/.agents/skills/tanstack-router/references/router-core/code-splitting.md +318 -0
  151. package/scaffold/.agents/skills/tanstack-router/references/router-core/data-loading.md +490 -0
  152. package/scaffold/.agents/skills/tanstack-router/references/router-core/index.md +158 -0
  153. package/scaffold/.agents/skills/tanstack-router/references/router-core/navigation.md +433 -0
  154. package/scaffold/.agents/skills/tanstack-router/references/router-core/not-found-and-errors.md +436 -0
  155. package/scaffold/.agents/skills/tanstack-router/references/router-core/path-params.md +383 -0
  156. package/scaffold/.agents/skills/tanstack-router/references/router-core/search-params.md +343 -0
  157. package/scaffold/.agents/skills/tanstack-router/references/router-core/ssr.md +462 -0
  158. package/scaffold/.agents/skills/tanstack-router/references/router-core/type-safety.md +493 -0
  159. package/scaffold/.agents/skills/tanstack-router/references/router-plugin.md +250 -0
  160. package/scaffold/.agents/skills/tanstack-router/references/virtual-file-routes.md +215 -0
  161. package/scaffold/.agents/skills/web-design-guidelines/SKILL.md +184 -0
  162. package/scaffold/.github/workflows/hitch.yml +15 -0
  163. package/scaffold/AGENTS.md +2 -2
  164. package/scaffold/applet/src/client/components/ui/alert.tsx +1 -1
  165. package/scaffold/applet/src/client/components/ui/button.tsx +1 -1
  166. package/scaffold/applet/src/client/components/ui/checkbox.tsx +1 -1
  167. package/scaffold/applet/src/client/components/ui/dialog.tsx +2 -2
  168. package/scaffold/applet/src/client/components/ui/dropdown-menu.tsx +2 -2
  169. package/scaffold/applet/src/client/components/ui/input-group.tsx +2 -2
  170. package/scaffold/applet/src/client/components/ui/select.tsx +2 -2
  171. package/scaffold/applet/src/client/components/ui/sheet.tsx +2 -2
  172. package/scaffold/applet/src/client/components/ui/spinner.tsx +2 -1
  173. package/scaffold/applet/src/client/components/ui/tabs.tsx +1 -1
  174. package/scaffold/applet/src/client/lib/utils.ts +1 -6
  175. package/scaffold/applet/src/client/styles/globals.css +2 -0
  176. package/dist/build-CEku1lyb.js +0 -2
  177. package/dist/generate-6Nbt7uii.js +0 -2
  178. package/dist/load-config-BnxocLAQ.js +0 -56
@@ -0,0 +1,27 @@
1
+ import { r as appletSourceDefinitionSchema } from "./manifest-CJSL9GuC.js";
2
+ import { t as resolveWorkspaceOrg } from "./workspace-D0dnnlxL.js";
3
+ import { existsSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+ import { loadConfigFromFile } from "vite";
6
+ //#region src/typegen/load-config.ts
7
+ async function loadAppletSourceDefinition(root) {
8
+ const path = resolve(root, "applet.manifest.ts");
9
+ if (!existsSync(path)) throw new Error(`No applet manifest found at ${path}.`);
10
+ const loaded = await loadConfigFromFile({
11
+ command: "build",
12
+ mode: "production"
13
+ }, path, root);
14
+ if (loaded === null) throw new Error(`No applet manifest found at ${path}.`);
15
+ const parsed = appletSourceDefinitionSchema.safeParse(loaded.config);
16
+ if (!parsed.success) throw new Error(`Invalid applet manifest at ${loaded.path}: ${parsed.error.message}`);
17
+ return parsed.data;
18
+ }
19
+ async function loadAppletConfig(root) {
20
+ const { dependencies: _dependencies, devDependencies: _devDependencies, ...definition } = await loadAppletSourceDefinition(root);
21
+ return {
22
+ org: resolveWorkspaceOrg(root),
23
+ ...definition
24
+ };
25
+ }
26
+ //#endregion
27
+ export { loadAppletSourceDefinition as n, loadAppletConfig as t };
@@ -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 };
@@ -0,0 +1,12 @@
1
+ import { a as loginWithDevice, f as resolveInstanceUrl, o as AuthenticationError, r as findWorkspaceConfig } from "./workspace-D0dnnlxL.js";
2
+ //#region src/login.ts
3
+ async function runLogin(options) {
4
+ if (process.env.HITCH_API_KEY !== void 0) throw new AuthenticationError("HITCH_API_KEY is set — unset it to manage stored logins.");
5
+ const { me, membership } = await loginWithDevice(await resolveInstanceUrl(), {
6
+ expectedOrg: findWorkspaceConfig(process.cwd())?.org,
7
+ noBrowser: options.noBrowser
8
+ });
9
+ console.log(`Signed in as ${me.person.email} to ${membership.name}.`);
10
+ }
11
+ //#endregion
12
+ export { runLogin };
@@ -1,6 +1,6 @@
1
- import { i as APPLET_CODE_PATTERN } from "./manifest-DyoJ1MIL.js";
2
- import { t as fetchWithOrgAuth } from "./auth-DaVK0k5R.js";
3
- import { i as resolveWorkspaceOrg, r as readWorkspaceConfig, t as loadAppletConfig } from "./load-config-BnxocLAQ.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);
@@ -32,6 +32,13 @@ interface AppletManifest {
32
32
  org: string;
33
33
  name: string;
34
34
  code: string;
35
+ /** This code needs the schema as of this changeset. */
36
+ requiresChangeset?: string;
37
+ telephony?: {
38
+ read?: boolean;
39
+ send?: boolean;
40
+ events?: readonly "message.received"[];
41
+ };
35
42
  schedules?: readonly {
36
43
  code: string;
37
44
  name: string;
@@ -48,6 +55,8 @@ interface AppletManifest {
48
55
  canDelete: boolean;
49
56
  readOnly: readonly string[];
50
57
  readWrite: readonly string[];
58
+ optional?: boolean;
59
+ optionalAttributes?: readonly string[];
51
60
  }[];
52
61
  }
53
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({
@@ -63,6 +72,12 @@ const appletManifestShape = {
63
72
  org: z.string().regex(ORG_CODE_PATTERN, "must start with a lowercase letter, end with a letter or number, and contain only lowercase letters, numbers, and non-consecutive hyphens"),
64
73
  name: nameSchema,
65
74
  code: codeSchema,
75
+ requiresChangeset: z.uuid().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(),
66
81
  schedules: appletManifestSchedulesSchema.optional(),
67
82
  variables: appletManifestVariablesSchema.optional(),
68
83
  objects: appletManifestObjectsSchema
@@ -94,12 +109,15 @@ const appletManifestSchema = z.strictObject(appletManifestShape).superRefine(che
94
109
  const appletDefinitionSchema = z.strictObject({
95
110
  name: appletManifestShape.name,
96
111
  code: appletManifestShape.code,
112
+ requiresChangeset: appletManifestShape.requiresChangeset,
113
+ telephony: appletManifestShape.telephony,
97
114
  schedules: appletManifestShape.schedules,
98
115
  variables: appletManifestShape.variables,
99
116
  objects: appletManifestShape.objects
100
117
  }).superRefine(checkDuplicateCodes);
101
118
  const packageVersionsSchema = z.record(z.string().min(1), z.string().min(1)).readonly();
102
119
  const RESERVED_APPLET_PACKAGES = /* @__PURE__ */ new Set([
120
+ "@fontsource-variable/geist-mono",
103
121
  "@fontsource-variable/inter",
104
122
  "@hitch42/applet",
105
123
  "@orpc/contract",
@@ -119,14 +137,16 @@ const RESERVED_APPLET_PACKAGES = /* @__PURE__ */ new Set([
119
137
  "@types/react",
120
138
  "@types/react-dom",
121
139
  "class-variance-authority",
122
- "clsx",
140
+ "cn",
123
141
  "lucide-react",
142
+ "oxfmt",
143
+ "oxlint",
144
+ "oxlint-tsgolint",
124
145
  "react",
125
146
  "react-aria-components",
126
147
  "react-dom",
127
148
  "shadcn",
128
149
  "streamdown",
129
- "tailwind-merge",
130
150
  "tailwindcss",
131
151
  "tw-animate-css",
132
152
  "typescript",
@@ -161,6 +181,8 @@ const checkSourcePackages = (manifest, context) => {
161
181
  const appletSourceDefinitionSchema = z.strictObject({
162
182
  name: appletManifestShape.name,
163
183
  code: appletManifestShape.code,
184
+ requiresChangeset: appletManifestShape.requiresChangeset,
185
+ telephony: appletManifestShape.telephony,
164
186
  schedules: appletManifestShape.schedules,
165
187
  variables: appletManifestShape.variables,
166
188
  objects: appletManifestShape.objects,
@@ -0,0 +1,32 @@
1
+ import { oc } from "@orpc/contract";
2
+ import { z } from "zod";
3
+ //#region src/hitch/me.ts
4
+ const personSchema = z.object({
5
+ id: z.uuid(),
6
+ firstName: z.string(),
7
+ lastName: z.string(),
8
+ email: z.email()
9
+ });
10
+ const membershipSchema = z.object({
11
+ orgId: z.uuid(),
12
+ code: z.string(),
13
+ name: z.string(),
14
+ iconFileId: z.uuid().nullable(),
15
+ role: z.enum(["member", "owner"]),
16
+ capabilities: z.array(z.string())
17
+ });
18
+ const meSchema = z.object({
19
+ person: personSchema,
20
+ memberships: z.array(membershipSchema),
21
+ organization: z.object({
22
+ id: z.uuid(),
23
+ code: z.string()
24
+ }).nullable(),
25
+ multiOrg: z.boolean()
26
+ });
27
+ const meContract = { get: oc.route({
28
+ method: "GET",
29
+ path: "/v1/me"
30
+ }).input(z.void()).output(meSchema) };
31
+ //#endregion
32
+ export { meSchema as n, meContract as t };