@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
@@ -1,6 +1,7 @@
1
- import { i as resolveInstanceUrl, n as organizationInstanceUrl, t as fetchWithOrgAuth } from "./auth-DaVK0k5R.js";
2
- import { t as loadAppletConfig } from "./load-config-BnxocLAQ.js";
3
- import { r as prepareAppletProject } from "./project-CxN-Dtc7.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";
4
5
  import { createRequire } from "node:module";
5
6
  import { existsSync } from "node:fs";
6
7
  import { access, mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
@@ -54,7 +55,7 @@ export default createWorkerEntry(server, { code: ${JSON.stringify(appletCode)} }
54
55
  }
55
56
  //#endregion
56
57
  //#region src/typegen/operations.ts
57
- const RECORD_ROUTE = /^\/v1\/([^/]+)(?:\/(\{id\}|query|update|aggregate))?$/;
58
+ const RECORD_ROUTE = /^\/v1\/([^/]+)(?:\/(\{id\}(?:\/history)?|query|update|aggregate))?$/;
58
59
  const COMPONENT_REF_PREFIX$1 = "#/components/schemas/";
59
60
  const BATCH_PATH = "/v1/batch";
60
61
  const BATCH_ITEM_PATH = "paths./v1/batch.post.requestBody.content.application/json.schema.properties.requests.items";
@@ -63,6 +64,7 @@ const VERBS = {
63
64
  "get:": "list",
64
65
  "post:": "create",
65
66
  "get:{id}": "get",
67
+ "get:{id}/history": "history",
66
68
  "patch:{id}": "update",
67
69
  "delete:{id}": "delete",
68
70
  "post:query": "query",
@@ -73,6 +75,7 @@ const COMPONENT_RESPONSE_STATUS = {
73
75
  list: "200",
74
76
  create: "201",
75
77
  get: "200",
78
+ history: "200",
76
79
  update: "200",
77
80
  query: "200"
78
81
  };
@@ -148,10 +151,13 @@ function prepareBatchOperation(operation, manifest) {
148
151
  if (manifest === void 0) return true;
149
152
  const object = manifest.objects.find(({ code }) => code === objectCode);
150
153
  if (object === void 0) return false;
151
- if (verb === "create") return object.canCreate;
152
- if (verb === "delete") return object.canDelete;
153
- if (verb === "update" || verb === "updateWhere") return object.readWrite.length > 0;
154
- return true;
154
+ switch (verb) {
155
+ case "create": return object.canCreate;
156
+ case "delete": return object.canDelete;
157
+ case "update":
158
+ case "updateWhere": return object.readWrite.length > 0;
159
+ default: return true;
160
+ }
155
161
  });
156
162
  if (entries.length === 0) return void 0;
157
163
  items.oneOf = entries;
@@ -165,7 +171,7 @@ function prepareRecordSpec(spec, manifest) {
165
171
  const prepared = structuredClone(spec);
166
172
  prepared.paths = Object.fromEntries(Object.entries(prepared.paths).flatMap(([path, pathItem]) => {
167
173
  if (path === BATCH_PATH) {
168
- if (!isObject$2(pathItem) || pathItem.post === void 0) return [];
174
+ if (!isObject$2(pathItem)) return [];
169
175
  const operation = prepareBatchOperation(pathItem.post, manifest);
170
176
  return operation === void 0 ? [] : [[path, { post: operation }]];
171
177
  }
@@ -193,6 +199,37 @@ function prepareRecordSpec(spec, manifest) {
193
199
  });
194
200
  return operations.length > 0 ? [[path, Object.fromEntries(operations)]] : [];
195
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
+ });
196
233
  return prepared;
197
234
  }
198
235
  function describeValue$1(value, expectedRef = false) {
@@ -273,7 +310,7 @@ ${Object.entries(catalog).map(([objectCode, attributeCodes]) => ` ${JSON.string
273
310
  };`;
274
311
  return `// Generated by @hitch42/applet — do not edit.
275
312
  import type manifest from "./manifest.gen.ts";
276
- ${options.hasServer ? "import type server from \"../src/server/main.ts\";\nimport type * as serverModule from \"../src/server/main.ts\";\n" : ""}${options.hasClient ? "import type { Route as indexRoute } from \"../src/client/routes/index.tsx\";\n" : ""}${options.hasServer ? "import type { AnyRouter } from \"@orpc/server\";\n" : ""}${options.hasClient ? "import type { AnyRoute } from \"@tanstack/react-router\";\n" : ""}${options.hasServer ? "import type { WorkflowDefinition } from \"@hitch42/applet/server\";\n" : ""}
313
+ ${options.hasServer ? "import type server from \"../src/server/main.ts\";\nimport type * as serverModule from \"../src/server/main.ts\";\n" : ""}${options.hasClient ? "import type { Route as indexRoute } from \"../src/client/routes/index.tsx\";\n" : ""}${options.hasServer ? "import type { AnyRouter } from \"@orpc/server\";\n" : ""}${options.hasClient ? "import type { AnyRoute } from \"@tanstack/react-router\";\n" : ""}${options.hasServer ? "import type { WorkflowDefinition } from \"@hitch42/applet/server\";\nimport type { TelephonyMessageReceivedEvent } from \"@hitch42/applet\";\n" : ""}
277
314
  ${catalogType}
278
315
 
279
316
  type Expect<T extends true> = T;
@@ -286,6 +323,7 @@ type _SrcServerMainMustDefaultExportRouterAndValidWorkflows = Expect<
286
323
  typeof server extends {
287
324
  router: AnyRouter;
288
325
  workflows?: Record<string, WorkflowDefinition<any, any>>;
326
+ telephony?: { onMessageReceived?: (event: TelephonyMessageReceivedEvent) => void | Promise<void> };
289
327
  }
290
328
  ? true
291
329
  : false
@@ -351,19 +389,33 @@ async function responseJson(response) {
351
389
  throw new Error("Failed to parse the organization's OpenAPI spec.", { cause: error });
352
390
  }
353
391
  }
354
- async function loadAuthenticatedSpec(orgCode, options) {
355
- const fetcher = options.fetch ?? globalThis.fetch;
356
- const response = await fetchWithOrgAuth(orgCode, options, (instanceUrl, accessToken) => fetcher(`${instanceUrl}/api/v1/openapi.json${options.changesetId === void 0 ? "" : `?changeset_id=${encodeURIComponent(options.changesetId)}`}`, { 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}` } }));
357
396
  if (!response.ok) throw new Error(`Failed to load the organization's OpenAPI spec (${response.status}).`);
358
397
  return responseJson(response);
359
398
  }
360
- async function loadThemeStylesheet(orgCode, options) {
361
- const fetcher = options.fetch ?? globalThis.fetch;
362
- const instanceUrl = await resolveInstanceUrl(void 0, options.store);
363
- 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`);
364
402
  if (!response.ok) throw new Error(`Failed to load the organization's theme (${response.status}).`);
365
403
  return response.text();
366
404
  }
405
+ async function loadBuildInputs(manifest) {
406
+ const github = githubActionsContext();
407
+ if (github !== void 0) {
408
+ const inputs = await loadGitHubActionsBuildInputs(github, manifest.requiresChangeset);
409
+ return {
410
+ spec: inputs.openapi,
411
+ theme: inputs.theme
412
+ };
413
+ }
414
+ return {
415
+ spec: await loadAuthenticatedSpec(manifest),
416
+ theme: await loadThemeStylesheet(manifest.org)
417
+ };
418
+ }
367
419
  async function generateContract(spec, outDir) {
368
420
  await mkdir(outDir, { recursive: true });
369
421
  const paths = spec !== null && typeof spec === "object" && "paths" in spec ? spec.paths : void 0;
@@ -403,16 +455,16 @@ async function writeContractFiles(outDir, manifest, spec) {
403
455
  await writeManifestGen(outDir, manifest);
404
456
  await writeRegisterDeclaration(outDir, catalog);
405
457
  await writeFile(resolve(outDir, "index.ts"), `// Generated by applet generate — do not edit.
406
- import { filesContract as files, meContract as me, pruneContract, registerHitchContract, teamsContract as teams } from "@hitch42/applet";
458
+ import { emailContract, filesContract as files, meContract as me, pruneContract, registerHitchContract, teamsContract as teams, telephonyContract as telephony } from "@hitch42/applet";
407
459
  import manifest from "./manifest.gen.ts";
408
460
 
409
461
  ${Object.hasOwn(preparedSpec.paths, "/v1/batch") ? `import { contract as generated } from "./orpc.gen.ts";
410
462
 
411
463
  const { batch, ...records } = generated;
412
464
 
413
- export const contract = { records, batch, files, me, teams } as const;` : `import { contract as records } from "./orpc.gen.ts";
465
+ export const contract = { records, batch, email: emailContract(manifest.code), files, me, teams, telephony } as const;` : `import { contract as records } from "./orpc.gen.ts";
414
466
 
415
- export const contract = { records, files, me, teams } as const;`}
467
+ export const contract = { records, email: emailContract(manifest.code), files, me, teams, telephony } as const;`}
416
468
  registerHitchContract(pruneContract(contract, manifest));
417
469
 
418
470
  declare module "@hitch42/applet" {
@@ -424,16 +476,18 @@ declare module "@hitch42/applet" {
424
476
  export type * from "./zod.gen.ts";
425
477
  `);
426
478
  }
427
- async function syncContract(outDir, manifest, options = {}) {
428
- await writeContractFiles(outDir, manifest, await loadAuthenticatedSpec(manifest.org, 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));
429
484
  }
430
- async function runGenerate(options) {
485
+ async function runGenerate() {
431
486
  await prepareAppletProject();
432
487
  const root = process.cwd();
433
488
  const outDir = resolve("./.hitch");
434
489
  const manifest = await loadAppletConfig(process.cwd());
435
- const spec = await loadAuthenticatedSpec(manifest.org, options);
436
- const themeStylesheet = await loadThemeStylesheet(manifest.org, options);
490
+ const { spec, theme: themeStylesheet } = await loadBuildInputs(manifest);
437
491
  const stagedDir = await mkdtemp(resolve("./.hitch.tmp-"));
438
492
  const backupDir = `${stagedDir}.backup`;
439
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,12 +1,14 @@
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-BQCAxATS.js";
2
- import { n as pruneContract, t as NarrowContract } from "./contract-DMrpbaLJ.js";
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-YbRKEqR6.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
+ 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
+ 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";
4
5
  import { ContractProcedure, Meta } from "@orpc/contract";
5
6
  import { z } from "zod";
6
- //#region src/workspace.d.ts
7
+ //#region ../shared/auth/src/workspace.d.mts
7
8
  interface HitchConfig {
8
9
  sdk: string;
9
10
  org: string;
11
+ githubWorkflow?: boolean;
10
12
  }
11
13
  //#endregion
12
14
  //#region src/hitch/me.d.ts
@@ -33,12 +35,122 @@ type HitchMe = {
33
35
  } | null;
34
36
  multiOrg: boolean;
35
37
  };
36
- declare const meSchema: z.ZodType<HitchMe>;
38
+ declare const meSchema: z.ZodType<HitchMe, HitchMe>;
37
39
  type MeContract = {
38
- get: ContractProcedure<z.ZodType<void>, z.ZodType<HitchMe>, Record<never, never>, Meta>;
40
+ get: ContractProcedure<z.ZodType<void, void>, z.ZodType<HitchMe, HitchMe>, Record<never, never>, Meta>;
39
41
  };
40
42
  declare const meContract: MeContract;
41
43
  //#endregion
44
+ //#region src/hitch/telephony.d.ts
45
+ type HitchPhoneNumber = {
46
+ id: string;
47
+ e164: string;
48
+ label: string;
49
+ enabled: boolean;
50
+ assignedTo: string | null;
51
+ canRead: boolean;
52
+ canSend: boolean;
53
+ canCall: boolean;
54
+ voiceEnabled: boolean;
55
+ };
56
+ type HitchCall = {
57
+ id: string;
58
+ numberId: string;
59
+ direction: "inbound" | "outbound";
60
+ status: "starting" | "ringing" | "active" | "ended" | "missed" | "failed";
61
+ from: string;
62
+ to: string;
63
+ userId: string | null;
64
+ answeredAt: string | null;
65
+ endedAt: string | null;
66
+ durationSeconds: number | null;
67
+ voicemailSeconds: number | null;
68
+ hangupCause: string | null;
69
+ record: boolean;
70
+ hasRecording: boolean;
71
+ transcriptStatus: "pending" | "done" | "failed" | null;
72
+ transcript: {
73
+ segments: {
74
+ side: "member" | "customer";
75
+ speaker: number;
76
+ start: number;
77
+ end: number;
78
+ text: string;
79
+ }[];
80
+ } | null;
81
+ createdAt: string;
82
+ };
83
+ type ListHitchCallsInput = ListHitchMessagesInput & {
84
+ status?: HitchCall["status"];
85
+ };
86
+ type HitchMessage = {
87
+ id: string;
88
+ numberId: string;
89
+ direction: "inbound" | "outbound";
90
+ status: "pending" | "unknown" | "accepted" | "sent" | "delivered" | "unconfirmed" | "failed" | "received";
91
+ from: string;
92
+ to: string;
93
+ body: string | null;
94
+ redacted: boolean;
95
+ userId: string | null;
96
+ appletId: string | null;
97
+ requestId: string | null;
98
+ errorCode: string | null;
99
+ errorDetail: string | null;
100
+ statusAt: string | null;
101
+ createdAt: string;
102
+ };
103
+ type ListHitchMessagesInput = {
104
+ numberId?: string;
105
+ userId?: string;
106
+ direction?: "inbound" | "outbound";
107
+ since?: string;
108
+ until?: string;
109
+ cursor?: string;
110
+ limit?: number;
111
+ };
112
+ type SendHitchMessageInput = {
113
+ numberId: string;
114
+ to: string;
115
+ body: string;
116
+ requestId?: string;
117
+ };
118
+ type MessageIdInput = {
119
+ id: string;
120
+ };
121
+ type NumbersOutput = {
122
+ data: HitchPhoneNumber[];
123
+ };
124
+ type MessagesOutput = {
125
+ data: HitchMessage[];
126
+ nextCursor: string | null;
127
+ };
128
+ type CallsOutput = {
129
+ data: HitchCall[];
130
+ nextCursor: string | null;
131
+ };
132
+ declare const hitchPhoneNumberSchema: z.ZodType<HitchPhoneNumber, HitchPhoneNumber>;
133
+ declare const hitchMessageSchema: z.ZodType<HitchMessage, HitchMessage>;
134
+ declare const listHitchNumbersOutputSchema: z.ZodType<NumbersOutput, NumbersOutput>;
135
+ declare const listHitchMessagesOutputSchema: z.ZodType<MessagesOutput, MessagesOutput>;
136
+ declare const listHitchMessagesInputSchema: z.ZodType<ListHitchMessagesInput, ListHitchMessagesInput>;
137
+ declare const sendHitchMessageInputSchema: z.ZodType<SendHitchMessageInput, SendHitchMessageInput>;
138
+ type TelephonyContract = {
139
+ calls: {
140
+ get: ContractProcedure<z.ZodType<MessageIdInput, MessageIdInput>, z.ZodType<HitchCall, HitchCall>, Record<never, never>, Meta>;
141
+ list: ContractProcedure<z.ZodType<ListHitchCallsInput, ListHitchCallsInput>, z.ZodType<CallsOutput, CallsOutput>, Record<never, never>, Meta>;
142
+ };
143
+ numbers: {
144
+ list: ContractProcedure<z.ZodType<void, void>, z.ZodType<NumbersOutput, NumbersOutput>, Record<never, never>, Meta>;
145
+ };
146
+ messages: {
147
+ get: ContractProcedure<z.ZodType<MessageIdInput, MessageIdInput>, z.ZodType<HitchMessage, HitchMessage>, Record<never, never>, Meta>;
148
+ list: ContractProcedure<z.ZodType<ListHitchMessagesInput, ListHitchMessagesInput>, z.ZodType<MessagesOutput, MessagesOutput>, Record<never, never>, Meta>;
149
+ send: ContractProcedure<z.ZodType<SendHitchMessageInput, SendHitchMessageInput>, z.ZodType<HitchMessage, HitchMessage>, Record<never, never>, Meta>;
150
+ };
151
+ };
152
+ declare const telephonyContract: TelephonyContract;
153
+ //#endregion
42
154
  //#region src/hitch/teams.d.ts
43
155
  type HitchTeam = {
44
156
  id: string;
@@ -61,14 +173,14 @@ type TeamsOutput = {
61
173
  type TeamMembersOutput = {
62
174
  data: HitchTeamMember[];
63
175
  };
64
- declare const teamSchema: z.ZodType<HitchTeam>;
65
- declare const teamMemberSchema: z.ZodType<HitchTeamMember>;
176
+ declare const teamSchema: z.ZodType<HitchTeam, HitchTeam>;
177
+ declare const teamMemberSchema: z.ZodType<HitchTeamMember, HitchTeamMember>;
66
178
  type TeamsContract = {
67
- list: ContractProcedure<z.ZodType<void>, z.ZodType<TeamsOutput>, Record<never, never>, Meta>;
179
+ list: ContractProcedure<z.ZodType<void, void>, z.ZodType<TeamsOutput, TeamsOutput>, Record<never, never>, Meta>;
68
180
  members: {
69
- list: ContractProcedure<z.ZodType<TeamIdInput>, z.ZodType<TeamMembersOutput>, Record<never, never>, Meta>;
181
+ list: ContractProcedure<z.ZodType<TeamIdInput, TeamIdInput>, z.ZodType<TeamMembersOutput, TeamMembersOutput>, Record<never, never>, Meta>;
70
182
  };
71
183
  };
72
184
  declare const teamsContract: TeamsContract;
73
185
  //#endregion
74
- export { type AppletDefinition, type AppletManifest, type AppletManifestObject, type AppletPackages, type AppletSourceDefinition, type FilesClient, type FilesUpload, type HitchConfig, type HitchMe, type HitchRegister, type HitchTeam, type HitchTeamMember, type NarrowContract, type RegisteredAppletSourceDefinition, type RegisteredCatalog, type RegisteredContract, type RegisteredManifest, type RegisteredRouter, type RegisteredVariableKeys, type RegisteredVariables, type RegisteredWorkflows, type UploadFileOptions, type UploadProgress, type UploadedHitchFile, appletDefinitionSchema, appletManifestSchema, appletSourceDefinitionSchema, createFileOutputSchema, fileSchema, filesContract, getFileOutputSchema, meContract, meSchema, pruneContract, registerHitchContract, teamMemberSchema, teamSchema, teamsContract, uploadFile };
186
+ export { type AppletDefinition, type AppletManifest, type AppletManifestObject, type AppletPackages, type AppletSourceDefinition, type EmailTracker, type FilesClient, type FilesUpload, type HitchConfig, type HitchMe, type HitchMessage, type HitchPhoneNumber, type HitchRegister, type HitchTeam, type HitchTeamMember, type ListEmailTrackersOutput, type ListHitchMessagesInput, type NarrowContract, type RegisteredAppletSourceDefinition, type RegisteredCatalog, type RegisteredContract, type RegisteredManifest, type RegisteredRouter, type RegisteredVariableKeys, type RegisteredVariables, type RegisteredWorkflows, type SendHitchMessageInput, type TelephonyContract, type TelephonyMessageReceivedEvent, type UploadFileOptions, type UploadProgress, type UploadedHitchFile, appletDefinitionSchema, appletManifestSchema, appletSourceDefinitionSchema, createEmailPixelInputSchema, createEmailPixelOutputSchema, createFileOutputSchema, emailContract, emailTagKeySchema, emailTagsSchema, emailTrackerSchema, fileSchema, filesContract, getEmailTrackerInputSchema, getFileOutputSchema, hitchMessageSchema, hitchPhoneNumberSchema, listEmailTrackersInputSchema, listEmailTrackersOutputSchema, listHitchMessagesInputSchema, listHitchMessagesOutputSchema, listHitchNumbersOutputSchema, markEmailTrackerSentInputSchema, meContract, meSchema, pruneContract, registerHitchContract, sendHitchMessageInputSchema, teamMemberSchema, teamSchema, teamsContract, telephonyContract, uploadFile };
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  import { i as registerHitchContract, t as uploadFile } from "./upload-DRbVhuDm.js";
2
- import { n as appletManifestSchema, r as appletSourceDefinitionSchema, t as appletDefinitionSchema } from "./manifest-DyoJ1MIL.js";
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
+ import { n as meSchema, t as meContract } from "./me-BW7Paary.js";
4
+ import { n as appletManifestSchema, r as appletSourceDefinitionSchema, t as appletDefinitionSchema } from "./manifest-CJSL9GuC.js";
3
5
  import { oc } from "@orpc/contract";
4
6
  import { z } from "zod";
5
7
  //#region src/hitch/contract.ts
@@ -78,34 +80,148 @@ const filesContract = {
78
80
  }).input(fileIdInputSchema).output(getFileOutputSchema)
79
81
  };
80
82
  //#endregion
81
- //#region src/hitch/me.ts
82
- const personSchema = z.object({
83
+ //#region src/hitch/telephony.ts
84
+ const hitchPhoneNumberSchema = z.object({
83
85
  id: z.uuid(),
84
- firstName: z.string(),
85
- lastName: z.string(),
86
- email: z.email()
86
+ e164: z.string(),
87
+ label: z.string(),
88
+ enabled: z.boolean(),
89
+ assignedTo: z.uuid().nullable(),
90
+ canRead: z.boolean(),
91
+ canSend: z.boolean(),
92
+ canCall: z.boolean(),
93
+ voiceEnabled: z.boolean()
94
+ });
95
+ const hitchCallSchema = z.object({
96
+ id: z.uuid(),
97
+ numberId: z.uuid(),
98
+ direction: z.enum(["inbound", "outbound"]),
99
+ status: z.enum([
100
+ "starting",
101
+ "ringing",
102
+ "active",
103
+ "ended",
104
+ "missed",
105
+ "failed"
106
+ ]),
107
+ from: z.string(),
108
+ to: z.string(),
109
+ userId: z.uuid().nullable(),
110
+ answeredAt: z.string().nullable(),
111
+ endedAt: z.string().nullable(),
112
+ durationSeconds: z.number().nullable(),
113
+ voicemailSeconds: z.number().nullable(),
114
+ hangupCause: z.string().nullable(),
115
+ record: z.boolean(),
116
+ hasRecording: z.boolean(),
117
+ transcriptStatus: z.enum([
118
+ "pending",
119
+ "done",
120
+ "failed"
121
+ ]).nullable(),
122
+ transcript: z.object({ segments: z.array(z.object({
123
+ side: z.enum(["member", "customer"]),
124
+ speaker: z.number(),
125
+ start: z.number(),
126
+ end: z.number(),
127
+ text: z.string()
128
+ })) }).nullable(),
129
+ createdAt: z.string()
130
+ });
131
+ const hitchMessageSchema = z.object({
132
+ id: z.uuid(),
133
+ numberId: z.uuid(),
134
+ direction: z.enum(["inbound", "outbound"]),
135
+ status: z.enum([
136
+ "pending",
137
+ "unknown",
138
+ "accepted",
139
+ "sent",
140
+ "delivered",
141
+ "unconfirmed",
142
+ "failed",
143
+ "received"
144
+ ]),
145
+ from: z.string(),
146
+ to: z.string(),
147
+ body: z.string().nullable(),
148
+ redacted: z.boolean(),
149
+ userId: z.uuid().nullable(),
150
+ appletId: z.uuid().nullable(),
151
+ requestId: z.string().nullable(),
152
+ errorCode: z.string().nullable(),
153
+ errorDetail: z.string().nullable(),
154
+ statusAt: z.string().nullable(),
155
+ createdAt: z.string()
156
+ });
157
+ const listHitchNumbersOutputSchema = z.object({ data: z.array(hitchPhoneNumberSchema) });
158
+ const listHitchMessagesOutputSchema = z.object({
159
+ data: z.array(hitchMessageSchema),
160
+ nextCursor: z.string().nullable()
161
+ });
162
+ const listHitchCallsOutputSchema = z.object({
163
+ data: z.array(hitchCallSchema),
164
+ nextCursor: z.string().nullable()
87
165
  });
88
- const membershipSchema = z.object({
89
- orgId: z.uuid(),
90
- code: z.string(),
91
- name: z.string(),
92
- iconFileId: z.uuid().nullable(),
93
- role: z.enum(["member", "owner"]),
94
- capabilities: z.array(z.string())
166
+ const idInputSchema = z.object({ id: z.uuid() });
167
+ const listInputFields = {
168
+ numberId: z.uuid().optional(),
169
+ userId: z.uuid().optional(),
170
+ direction: z.enum(["inbound", "outbound"]).optional(),
171
+ since: z.iso.datetime().optional(),
172
+ until: z.iso.datetime().optional(),
173
+ cursor: z.string().optional(),
174
+ limit: z.number().int().min(1).max(200).optional()
175
+ };
176
+ const listHitchMessagesInputSchema = z.object(listInputFields);
177
+ const listHitchCallsInputSchema = z.object({
178
+ ...listInputFields,
179
+ status: z.enum([
180
+ "starting",
181
+ "ringing",
182
+ "active",
183
+ "ended",
184
+ "missed",
185
+ "failed"
186
+ ]).optional()
95
187
  });
96
- const meSchema = z.object({
97
- person: personSchema,
98
- memberships: z.array(membershipSchema),
99
- organization: z.object({
100
- id: z.uuid(),
101
- code: z.string()
102
- }).nullable(),
103
- multiOrg: z.boolean()
188
+ const sendHitchMessageInputSchema = z.object({
189
+ numberId: z.uuid(),
190
+ to: z.string(),
191
+ body: z.string().min(1).max(1600),
192
+ requestId: z.string().min(1).max(200).optional()
104
193
  });
105
- const meContract = { get: oc.route({
106
- method: "GET",
107
- path: "/v1/me"
108
- }).input(z.void()).output(meSchema) };
194
+ const telephonyContract = {
195
+ calls: {
196
+ get: oc.route({
197
+ method: "GET",
198
+ path: "/v1/telephony/calls/{id}"
199
+ }).input(idInputSchema).output(hitchCallSchema),
200
+ list: oc.route({
201
+ method: "GET",
202
+ path: "/v1/telephony/calls"
203
+ }).input(listHitchCallsInputSchema).output(listHitchCallsOutputSchema)
204
+ },
205
+ numbers: { list: oc.route({
206
+ method: "GET",
207
+ path: "/v1/telephony/numbers"
208
+ }).input(z.void()).output(listHitchNumbersOutputSchema) },
209
+ messages: {
210
+ get: oc.route({
211
+ method: "GET",
212
+ path: "/v1/telephony/messages/{id}"
213
+ }).input(idInputSchema).output(hitchMessageSchema),
214
+ list: oc.route({
215
+ method: "GET",
216
+ path: "/v1/telephony/messages"
217
+ }).input(listHitchMessagesInputSchema).output(listHitchMessagesOutputSchema),
218
+ send: oc.route({
219
+ method: "POST",
220
+ path: "/v1/telephony/messages",
221
+ successStatus: 201
222
+ }).input(sendHitchMessageInputSchema).output(hitchMessageSchema)
223
+ }
224
+ };
109
225
  //#endregion
110
226
  //#region src/hitch/teams.ts
111
227
  const teamSchema = z.object({
@@ -133,4 +249,4 @@ const teamsContract = {
133
249
  }).input(teamIdInputSchema).output(teamMembersOutputSchema) }
134
250
  };
135
251
  //#endregion
136
- export { appletDefinitionSchema, appletManifestSchema, appletSourceDefinitionSchema, createFileOutputSchema, fileSchema, filesContract, getFileOutputSchema, meContract, meSchema, pruneContract, registerHitchContract, teamMemberSchema, teamSchema, teamsContract, uploadFile };
252
+ export { appletDefinitionSchema, appletManifestSchema, appletSourceDefinitionSchema, createEmailPixelInputSchema, createEmailPixelOutputSchema, createFileOutputSchema, emailContract, emailTagKeySchema, emailTagsSchema, emailTrackerSchema, fileSchema, filesContract, getEmailTrackerInputSchema, getFileOutputSchema, hitchMessageSchema, hitchPhoneNumberSchema, listEmailTrackersInputSchema, listEmailTrackersOutputSchema, listHitchMessagesInputSchema, listHitchMessagesOutputSchema, listHitchNumbersOutputSchema, markEmailTrackerSentInputSchema, meContract, meSchema, pruneContract, registerHitchContract, sendHitchMessageInputSchema, teamMemberSchema, teamSchema, teamsContract, telephonyContract, uploadFile };
@@ -1,8 +1,8 @@
1
- import { a as ORG_CODE_PATTERN, i as APPLET_CODE_PATTERN } from "./manifest-DyoJ1MIL.js";
2
- import { i as resolveInstanceUrl, r as resolveAuthForOrg } from "./auth-DaVK0k5R.js";
3
- import { n as runGenerate } from "./generate-CH0VQmUi.js";
4
- import { n as loadAppletSourceDefinition, r as readWorkspaceConfig } from "./load-config-BnxocLAQ.js";
5
- import { a as writeWorkspaceSupport, i as writeAppletSupport, n as loadCliManifest, t as assertWorkspaceCli } from "./project-CxN-Dtc7.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";
@@ -33,7 +36,8 @@ async function installDependencies(target, install) {
33
36
  let finished = false;
34
37
  const child = spawn("pnpm", ["install"], {
35
38
  cwd: target,
36
- stdio: "inherit"
39
+ stdio: "inherit",
40
+ shell: process.platform === "win32"
37
41
  });
38
42
  child.once("error", (error) => {
39
43
  finished = true;
@@ -91,22 +95,17 @@ async function runGit(cwd, args) {
91
95
  });
92
96
  });
93
97
  }
94
- async function generateAppletFiles(target, org, options, installResult) {
98
+ async function generateAppletFiles(target, org, installResult) {
95
99
  if (installResult === "failed") return false;
96
100
  const previousCwd = process.cwd();
97
101
  try {
98
- const instanceUrl = await resolveInstanceUrl(void 0, options.store);
99
- if (await resolveAuthForOrg(instanceUrl, org, options.store) === void 0) {
102
+ const instanceUrl = await resolveInstanceUrl();
103
+ if (await resolveAuthForOrg(instanceUrl, org) === void 0) {
100
104
  console.log("Not logged in. Run applet generate to pull the organization's generated files; it will prompt a login.");
101
105
  return false;
102
106
  }
103
107
  process.chdir(target);
104
- await runGenerate({
105
- fetch: options.fetch,
106
- login: options.login,
107
- stdinIsTTY: options.stdinIsTTY,
108
- store: options.store
109
- });
108
+ await runGenerate();
110
109
  return true;
111
110
  } catch (error) {
112
111
  console.warn(`Generation skipped: ${error instanceof Error ? error.message : String(error)}`);
@@ -227,7 +226,7 @@ export default { router };
227
226
  ]);
228
227
  await Promise.all([writeAppletSupport(appletTarget, definition), cli === void 0 ? void 0 : writeWorkspaceSupport(workspaceRoot, config, cli)]);
229
228
  const installResult = await installDependencies(workspaceRoot, options.install ?? true);
230
- const generateSucceeded = await generateAppletFiles(appletTarget, config.org, options, installResult);
229
+ const generateSucceeded = await generateAppletFiles(appletTarget, config.org, installResult);
231
230
  const relativeTarget = relative(workspaceRoot, appletTarget);
232
231
  const nextSteps = [
233
232
  ...installResult === "succeeded" ? [`cd ${JSON.stringify(relativeTarget)}`] : ["pnpm install", `cd ${JSON.stringify(relativeTarget)}`],