@hitch42/applet 0.1.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/LICENSE +21 -0
  2. package/dist/_internal/client.d.ts +7 -0
  3. package/dist/_internal/client.js +169 -0
  4. package/dist/_internal/server.d.ts +92 -0
  5. package/dist/_internal/server.js +181 -0
  6. package/dist/applet.d.ts +1 -0
  7. package/dist/applet.js +184 -0
  8. package/dist/batch-Qa4B4-Yp.d.ts +30 -0
  9. package/dist/build-BlmLiKro.js +90 -0
  10. package/dist/build-CcT-wNN9.js +2 -0
  11. package/dist/ci-0Q2mUh53.js +68 -0
  12. package/dist/client.d.ts +48 -0
  13. package/dist/client.js +38 -0
  14. package/dist/contract-QUvEGiRI.d.ts +23 -0
  15. package/dist/deploy-BbL3GObV.js +2579 -0
  16. package/dist/email-DBTVhNB_.js +62 -0
  17. package/dist/generate-XB-72Fzj.js +537 -0
  18. package/dist/generate-wIN3IYqL.js +2 -0
  19. package/dist/index.d.ts +185 -0
  20. package/dist/index.js +251 -0
  21. package/dist/init-DwsXRUk-.js +244 -0
  22. package/dist/lazy-client-x0DCI98S.js +64 -0
  23. package/dist/load-config-OKZU3UKn.js +27 -0
  24. package/dist/login-BBO74hPC.js +12 -0
  25. package/dist/logs-XvK6Zs5Y.js +183 -0
  26. package/dist/manifest-4ZAc6HUk.js +191 -0
  27. package/dist/manifest-I-9s8R36.d.ts +88 -0
  28. package/dist/me-BW7Paary.js +32 -0
  29. package/dist/project-B0qNXnFu.js +536 -0
  30. package/dist/prompt-ChS-grYO.js +29 -0
  31. package/dist/query-cache-CXmAyLv3.js +82 -0
  32. package/dist/react.d.ts +37 -0
  33. package/dist/react.js +515 -0
  34. package/dist/schedules-BkWZsbSs.js +42 -0
  35. package/dist/server.d.ts +46 -0
  36. package/dist/server.js +104 -0
  37. package/dist/telephony-protocol-D-nf3Gca.d.ts +76 -0
  38. package/dist/telephony.d.ts +77 -0
  39. package/dist/telephony.js +607 -0
  40. package/dist/upload-DKZzz5kW.d.ts +112 -0
  41. package/dist/upload-DRbVhuDm.js +114 -0
  42. package/dist/variables-0tjnAeut.js +108 -0
  43. package/dist/vite.d.ts +63 -0
  44. package/dist/vite.js +816 -0
  45. package/dist/workflow-CTo2kZF1.js +51 -0
  46. package/dist/workflow-DurM6Fwx.d.ts +28 -0
  47. package/dist/workflow-engine-MogejNfF.js +117 -0
  48. package/dist/workspace-DruAZPmV.js +390 -0
  49. package/package.json +112 -0
  50. package/scaffold/.agents/skills/hitch-applets/SKILL.md +163 -0
  51. package/scaffold/.agents/skills/hitch-applets/references/client.md +73 -0
  52. package/scaffold/.agents/skills/hitch-applets/references/email-tracking.md +49 -0
  53. package/scaffold/.agents/skills/hitch-applets/references/files.md +109 -0
  54. package/scaffold/.agents/skills/hitch-applets/references/manifest.md +198 -0
  55. package/scaffold/.agents/skills/hitch-applets/references/markdown.md +37 -0
  56. package/scaffold/.agents/skills/hitch-applets/references/performance.md +74 -0
  57. package/scaffold/.agents/skills/hitch-applets/references/records.md +176 -0
  58. package/scaffold/.agents/skills/hitch-applets/references/schedules.md +91 -0
  59. package/scaffold/.agents/skills/hitch-applets/references/server.md +95 -0
  60. package/scaffold/.agents/skills/hitch-applets/references/workflows.md +81 -0
  61. package/scaffold/.agents/skills/hitch-cli/SKILL.md +129 -0
  62. package/scaffold/.agents/skills/hitch-data/SKILL.md +52 -0
  63. package/scaffold/.agents/skills/hitch-data/references/attributes.md +127 -0
  64. package/scaffold/.agents/skills/hitch-data/references/limits.md +64 -0
  65. package/scaffold/.agents/skills/hitch-theory/SKILL.md +151 -0
  66. package/scaffold/.agents/skills/react-best-practices/SKILL.md +127 -0
  67. package/scaffold/.agents/skills/react-best-practices/rules/advanced-effect-event-deps.md +50 -0
  68. package/scaffold/.agents/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  69. package/scaffold/.agents/skills/react-best-practices/rules/advanced-init-once.md +42 -0
  70. package/scaffold/.agents/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
  71. package/scaffold/.agents/skills/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  72. package/scaffold/.agents/skills/react-best-practices/rules/async-defer-await.md +82 -0
  73. package/scaffold/.agents/skills/react-best-practices/rules/async-dependencies.md +48 -0
  74. package/scaffold/.agents/skills/react-best-practices/rules/async-parallel.md +24 -0
  75. package/scaffold/.agents/skills/react-best-practices/rules/bundle-analyzable-paths.md +42 -0
  76. package/scaffold/.agents/skills/react-best-practices/rules/bundle-barrel-imports.md +39 -0
  77. package/scaffold/.agents/skills/react-best-practices/rules/bundle-conditional.md +35 -0
  78. package/scaffold/.agents/skills/react-best-practices/rules/bundle-defer-third-party.md +46 -0
  79. package/scaffold/.agents/skills/react-best-practices/rules/bundle-dynamic-imports.md +38 -0
  80. package/scaffold/.agents/skills/react-best-practices/rules/bundle-preload.md +40 -0
  81. package/scaffold/.agents/skills/react-best-practices/rules/client-event-listeners.md +78 -0
  82. package/scaffold/.agents/skills/react-best-practices/rules/client-localstorage-schema.md +74 -0
  83. package/scaffold/.agents/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  84. package/scaffold/.agents/skills/react-best-practices/rules/js-batch-dom-css.md +110 -0
  85. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-function-results.md +58 -0
  86. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  87. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-storage.md +56 -0
  88. package/scaffold/.agents/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  89. package/scaffold/.agents/skills/react-best-practices/rules/js-early-exit.md +50 -0
  90. package/scaffold/.agents/skills/react-best-practices/rules/js-flatmap-filter.md +51 -0
  91. package/scaffold/.agents/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  92. package/scaffold/.agents/skills/react-best-practices/rules/js-index-maps.md +37 -0
  93. package/scaffold/.agents/skills/react-best-practices/rules/js-length-check-first.md +50 -0
  94. package/scaffold/.agents/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  95. package/scaffold/.agents/skills/react-best-practices/rules/js-request-idle-callback.md +104 -0
  96. package/scaffold/.agents/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  97. package/scaffold/.agents/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  98. package/scaffold/.agents/skills/react-best-practices/rules/rendering-activity.md +26 -0
  99. package/scaffold/.agents/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +38 -0
  100. package/scaffold/.agents/skills/react-best-practices/rules/rendering-conditional-render.md +32 -0
  101. package/scaffold/.agents/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  102. package/scaffold/.agents/skills/react-best-practices/rules/rendering-hoist-jsx.md +36 -0
  103. package/scaffold/.agents/skills/react-best-practices/rules/rendering-resource-hints.md +81 -0
  104. package/scaffold/.agents/skills/react-best-practices/rules/rendering-script-defer-async.md +36 -0
  105. package/scaffold/.agents/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  106. package/scaffold/.agents/skills/react-best-practices/rules/rendering-usetransition-loading.md +43 -0
  107. package/scaffold/.agents/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  108. package/scaffold/.agents/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  109. package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  110. package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  111. package/scaffold/.agents/skills/react-best-practices/rules/rerender-functional-setstate.md +77 -0
  112. package/scaffold/.agents/skills/react-best-practices/rules/rerender-lazy-state-init.md +56 -0
  113. package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo-with-default-value.md +36 -0
  114. package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo.md +44 -0
  115. package/scaffold/.agents/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  116. package/scaffold/.agents/skills/react-best-practices/rules/rerender-no-inline-components.md +75 -0
  117. package/scaffold/.agents/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  118. package/scaffold/.agents/skills/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  119. package/scaffold/.agents/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  120. package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  121. package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  122. package/scaffold/.agents/skills/tanstack-query/SKILL.md +136 -0
  123. package/scaffold/.agents/skills/tanstack-query/references/compositions/automatic-invalidation-after-mutations.md +124 -0
  124. package/scaffold/.agents/skills/tanstack-query/references/compositions/broadcast-realtime-and-multi-tab-synchronization.md +150 -0
  125. package/scaffold/.agents/skills/tanstack-query/references/compositions/compose-query-with-tanstack-router-and-start.md +248 -0
  126. package/scaffold/.agents/skills/tanstack-query/references/compositions/enforce-query-best-practices-with-eslint.md +167 -0
  127. package/scaffold/.agents/skills/tanstack-query/references/compositions/persist-offline-and-restore-caches.md +181 -0
  128. package/scaffold/.agents/skills/tanstack-query/references/compositions/query-data-and-forms.md +156 -0
  129. package/scaffold/.agents/skills/tanstack-query/references/core/build-query-abstractions.md +130 -0
  130. package/scaffold/.agents/skills/tanstack-query/references/core/cancel-queries-and-consume-abort-signals.md +176 -0
  131. package/scaffold/.agents/skills/tanstack-query/references/core/concurrent-optimistic-updates.md +135 -0
  132. package/scaffold/.agents/skills/tanstack-query/references/core/coordinate-query-execution.md +188 -0
  133. package/scaffold/.agents/skills/tanstack-query/references/core/design-query-keys-and-options.md +182 -0
  134. package/scaffold/.agents/skills/tanstack-query/references/core/fetch-and-observe-queries.md +193 -0
  135. package/scaffold/.agents/skills/tanstack-query/references/core/implement-optimistic-updates-and-cache-writes.md +168 -0
  136. package/scaffold/.agents/skills/tanstack-query/references/core/paginate-and-build-infinite-queries.md +188 -0
  137. package/scaffold/.agents/skills/tanstack-query/references/core/seed-placeholder-select-and-transform-data.md +188 -0
  138. package/scaffold/.agents/skills/tanstack-query/references/core/selectors-and-derived-state.md +145 -0
  139. package/scaffold/.agents/skills/tanstack-query/references/core/tune-defaults-freshness-retries-and-refetching.md +172 -0
  140. package/scaffold/.agents/skills/tanstack-query/references/core/understand-query-internals-and-observers.md +104 -0
  141. package/scaffold/.agents/skills/tanstack-query/references/core/write-mutations-and-invalidate-related-queries.md +183 -0
  142. package/scaffold/.agents/skills/tanstack-query/references/framework/debug-with-devtools.md +169 -0
  143. package/scaffold/.agents/skills/tanstack-query/references/framework/handle-status-and-errors.md +119 -0
  144. package/scaffold/.agents/skills/tanstack-query/references/framework/shape-data-and-render-efficiently.md +184 -0
  145. package/scaffold/.agents/skills/tanstack-query/references/framework/use-framework-adapter-reactivity.md +185 -0
  146. package/scaffold/.agents/skills/tanstack-query/references/framework/use-suspense-and-error-boundaries.md +208 -0
  147. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/migrate-major-versions-and-codemods.md +169 -0
  148. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/prefetch-and-remove-request-waterfalls.md +228 -0
  149. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/setup-query-client-and-providers.md +161 -0
  150. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/ssr-hydration-and-streaming.md +209 -0
  151. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/test-query-code.md +160 -0
  152. package/scaffold/.agents/skills/tanstack-router/SKILL.md +134 -0
  153. package/scaffold/.agents/skills/tanstack-router/references/compositions/router-query.md +412 -0
  154. package/scaffold/.agents/skills/tanstack-router/references/react-router.md +495 -0
  155. package/scaffold/.agents/skills/tanstack-router/references/router-core/auth-and-guards.md +495 -0
  156. package/scaffold/.agents/skills/tanstack-router/references/router-core/code-splitting.md +318 -0
  157. package/scaffold/.agents/skills/tanstack-router/references/router-core/data-loading.md +490 -0
  158. package/scaffold/.agents/skills/tanstack-router/references/router-core/index.md +158 -0
  159. package/scaffold/.agents/skills/tanstack-router/references/router-core/navigation.md +433 -0
  160. package/scaffold/.agents/skills/tanstack-router/references/router-core/not-found-and-errors.md +436 -0
  161. package/scaffold/.agents/skills/tanstack-router/references/router-core/path-params.md +383 -0
  162. package/scaffold/.agents/skills/tanstack-router/references/router-core/search-params.md +343 -0
  163. package/scaffold/.agents/skills/tanstack-router/references/router-core/ssr.md +462 -0
  164. package/scaffold/.agents/skills/tanstack-router/references/router-core/type-safety.md +493 -0
  165. package/scaffold/.agents/skills/tanstack-router/references/router-plugin.md +250 -0
  166. package/scaffold/.agents/skills/tanstack-router/references/virtual-file-routes.md +215 -0
  167. package/scaffold/.agents/skills/web-design-guidelines/SKILL.md +184 -0
  168. package/scaffold/.github/workflows/hitch.yml +15 -0
  169. package/scaffold/AGENTS.md +38 -0
  170. package/scaffold/applet/components.json +25 -0
  171. package/scaffold/applet/src/client/components/ui/alert.tsx +73 -0
  172. package/scaffold/applet/src/client/components/ui/avatar.tsx +100 -0
  173. package/scaffold/applet/src/client/components/ui/badge.tsx +55 -0
  174. package/scaffold/applet/src/client/components/ui/button.tsx +90 -0
  175. package/scaffold/applet/src/client/components/ui/card.tsx +85 -0
  176. package/scaffold/applet/src/client/components/ui/checkbox.tsx +35 -0
  177. package/scaffold/applet/src/client/components/ui/dialog.tsx +164 -0
  178. package/scaffold/applet/src/client/components/ui/dropdown-menu.tsx +235 -0
  179. package/scaffold/applet/src/client/components/ui/input-group.tsx +144 -0
  180. package/scaffold/applet/src/client/components/ui/input.tsx +22 -0
  181. package/scaffold/applet/src/client/components/ui/label.tsx +29 -0
  182. package/scaffold/applet/src/client/components/ui/popover.tsx +74 -0
  183. package/scaffold/applet/src/client/components/ui/select.tsx +243 -0
  184. package/scaffold/applet/src/client/components/ui/separator.tsx +25 -0
  185. package/scaffold/applet/src/client/components/ui/sheet.tsx +177 -0
  186. package/scaffold/applet/src/client/components/ui/skeleton.tsx +13 -0
  187. package/scaffold/applet/src/client/components/ui/spinner.tsx +17 -0
  188. package/scaffold/applet/src/client/components/ui/switch.tsx +41 -0
  189. package/scaffold/applet/src/client/components/ui/table.tsx +114 -0
  190. package/scaffold/applet/src/client/components/ui/tabs.tsx +78 -0
  191. package/scaffold/applet/src/client/components/ui/textarea.tsx +23 -0
  192. package/scaffold/applet/src/client/lib/utils.ts +1 -0
  193. package/scaffold/applet/src/client/styles/globals.css +136 -0
@@ -0,0 +1,185 @@
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-I-9s8R36.js";
2
+ import { n as pruneContract, t as NarrowContract } from "./contract-QUvEGiRI.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";
5
+ import { ContractProcedure, Meta } from "@orpc/contract";
6
+ import { z } from "zod";
7
+ //#region ../shared/auth/src/workspace.d.mts
8
+ interface HitchConfig {
9
+ sdk: string;
10
+ org: string;
11
+ githubWorkflow?: boolean;
12
+ }
13
+ //#endregion
14
+ //#region src/hitch/me.d.ts
15
+ type HitchPerson = {
16
+ id: string;
17
+ firstName: string;
18
+ lastName: string;
19
+ email: string;
20
+ };
21
+ type HitchMembership = {
22
+ orgId: string;
23
+ code: string;
24
+ name: string;
25
+ iconFileId: string | null;
26
+ role: "member" | "owner";
27
+ capabilities: string[];
28
+ };
29
+ type HitchMe = {
30
+ person: HitchPerson;
31
+ memberships: HitchMembership[];
32
+ organization: {
33
+ id: string;
34
+ code: string;
35
+ } | null;
36
+ multiOrg: boolean;
37
+ };
38
+ declare const meSchema: z.ZodType<HitchMe, HitchMe>;
39
+ type MeContract = {
40
+ get: ContractProcedure<z.ZodType<void, void>, z.ZodType<HitchMe, HitchMe>, Record<never, never>, Meta>;
41
+ };
42
+ declare const meContract: MeContract;
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
+ canRead: boolean;
51
+ canSend: boolean;
52
+ canCall: boolean;
53
+ voiceEnabled: boolean;
54
+ };
55
+ type HitchCall = {
56
+ id: string;
57
+ numberId: string;
58
+ direction: "inbound" | "outbound";
59
+ status: "starting" | "ringing" | "active" | "ended" | "missed" | "failed";
60
+ from: string;
61
+ to: string;
62
+ userId: string | null;
63
+ answeredAt: string | null;
64
+ endedAt: string | null;
65
+ durationSeconds: number | null;
66
+ voicemailSeconds: number | null;
67
+ hangupCause: string | null;
68
+ record: boolean;
69
+ hasRecording: boolean;
70
+ transcriptStatus: "pending" | "done" | "failed" | null;
71
+ transcript: {
72
+ segments: {
73
+ side: "member" | "customer";
74
+ speaker: number;
75
+ start: number;
76
+ end: number;
77
+ text: string;
78
+ }[];
79
+ } | null;
80
+ createdAt: string;
81
+ };
82
+ type ListHitchCallsInput = ListHitchMessagesInput & {
83
+ status?: HitchCall["status"];
84
+ };
85
+ type HitchMessage = {
86
+ id: string;
87
+ numberId: string;
88
+ direction: "inbound" | "outbound";
89
+ status: "pending" | "unknown" | "accepted" | "sent" | "delivered" | "unconfirmed" | "failed" | "received";
90
+ from: string;
91
+ to: string;
92
+ body: string | null;
93
+ redacted: boolean;
94
+ userId: string | null;
95
+ appletId: string | null;
96
+ requestId: string | null;
97
+ errorCode: string | null;
98
+ errorDetail: string | null;
99
+ statusAt: string | null;
100
+ createdAt: string;
101
+ };
102
+ type ListHitchMessagesInput = {
103
+ numberId?: string;
104
+ userId?: string;
105
+ direction?: "inbound" | "outbound";
106
+ since?: string;
107
+ until?: string;
108
+ cursor?: string;
109
+ limit?: number;
110
+ };
111
+ type SendHitchMessageInput = {
112
+ numberId: string;
113
+ to: string;
114
+ body: string;
115
+ requestId?: string;
116
+ };
117
+ type MessageIdInput = {
118
+ id: string;
119
+ };
120
+ type NumbersOutput = {
121
+ data: HitchPhoneNumber[];
122
+ };
123
+ type MessagesOutput = {
124
+ data: HitchMessage[];
125
+ nextCursor: string | null;
126
+ };
127
+ type CallsOutput = {
128
+ data: HitchCall[];
129
+ nextCursor: string | null;
130
+ };
131
+ declare const hitchPhoneNumberSchema: z.ZodType<HitchPhoneNumber, HitchPhoneNumber>;
132
+ declare const hitchMessageSchema: z.ZodType<HitchMessage, HitchMessage>;
133
+ declare const listHitchNumbersOutputSchema: z.ZodType<NumbersOutput, NumbersOutput>;
134
+ declare const listHitchMessagesOutputSchema: z.ZodType<MessagesOutput, MessagesOutput>;
135
+ declare const listHitchMessagesInputSchema: z.ZodType<ListHitchMessagesInput, ListHitchMessagesInput>;
136
+ declare const sendHitchMessageInputSchema: z.ZodType<SendHitchMessageInput, SendHitchMessageInput>;
137
+ type TelephonyContract = {
138
+ calls: {
139
+ get: ContractProcedure<z.ZodType<MessageIdInput, MessageIdInput>, z.ZodType<HitchCall, HitchCall>, Record<never, never>, Meta>;
140
+ list: ContractProcedure<z.ZodType<ListHitchCallsInput, ListHitchCallsInput>, z.ZodType<CallsOutput, CallsOutput>, Record<never, never>, Meta>;
141
+ };
142
+ numbers: {
143
+ list: ContractProcedure<z.ZodType<void, void>, z.ZodType<NumbersOutput, NumbersOutput>, Record<never, never>, Meta>;
144
+ };
145
+ messages: {
146
+ get: ContractProcedure<z.ZodType<MessageIdInput, MessageIdInput>, z.ZodType<HitchMessage, HitchMessage>, Record<never, never>, Meta>;
147
+ list: ContractProcedure<z.ZodType<ListHitchMessagesInput, ListHitchMessagesInput>, z.ZodType<MessagesOutput, MessagesOutput>, Record<never, never>, Meta>;
148
+ send: ContractProcedure<z.ZodType<SendHitchMessageInput, SendHitchMessageInput>, z.ZodType<HitchMessage, HitchMessage>, Record<never, never>, Meta>;
149
+ };
150
+ };
151
+ declare const telephonyContract: TelephonyContract;
152
+ //#endregion
153
+ //#region src/hitch/teams.d.ts
154
+ type HitchTeam = {
155
+ id: string;
156
+ name: string;
157
+ };
158
+ type HitchTeamMember = {
159
+ userId: string;
160
+ firstName: string;
161
+ lastName: string;
162
+ email: string;
163
+ };
164
+ type TeamIdInput = {
165
+ params: {
166
+ id: string;
167
+ };
168
+ };
169
+ type TeamsOutput = {
170
+ data: HitchTeam[];
171
+ };
172
+ type TeamMembersOutput = {
173
+ data: HitchTeamMember[];
174
+ };
175
+ declare const teamSchema: z.ZodType<HitchTeam, HitchTeam>;
176
+ declare const teamMemberSchema: z.ZodType<HitchTeamMember, HitchTeamMember>;
177
+ type TeamsContract = {
178
+ list: ContractProcedure<z.ZodType<void, void>, z.ZodType<TeamsOutput, TeamsOutput>, Record<never, never>, Meta>;
179
+ members: {
180
+ list: ContractProcedure<z.ZodType<TeamIdInput, TeamIdInput>, z.ZodType<TeamMembersOutput, TeamMembersOutput>, Record<never, never>, Meta>;
181
+ };
182
+ };
183
+ declare const teamsContract: TeamsContract;
184
+ //#endregion
185
+ 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 ADDED
@@ -0,0 +1,251 @@
1
+ import { i as registerHitchContract, t as uploadFile } from "./upload-DRbVhuDm.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-4ZAc6HUk.js";
5
+ import { oc } from "@orpc/contract";
6
+ import { z } from "zod";
7
+ //#region src/hitch/contract.ts
8
+ function isObject(value) {
9
+ return value !== null && typeof value === "object" && !Array.isArray(value);
10
+ }
11
+ function pruneContract(contract, manifest) {
12
+ if (!isObject(contract) || !isObject(contract.records)) throw new Error("Hitch contract must contain a \"records\" router.");
13
+ const contractRecords = contract.records;
14
+ const records = Object.fromEntries(manifest.objects.map((manifestObject) => {
15
+ const procedures = contractRecords[manifestObject.code];
16
+ if (!isObject(procedures)) throw new Error(`Hitch contract object "${manifestObject.code}" is missing.`);
17
+ const pruned = { ...procedures };
18
+ if (!manifestObject.canCreate) delete pruned.create;
19
+ if (!manifestObject.canDelete) delete pruned.delete;
20
+ if (manifestObject.readWrite.length === 0) {
21
+ delete pruned.update;
22
+ delete pruned.updateWhere;
23
+ }
24
+ return [manifestObject.code, pruned];
25
+ }));
26
+ return Object.assign({}, contract, { records });
27
+ }
28
+ //#endregion
29
+ //#region src/hitch/files.ts
30
+ const fileFields = {
31
+ id: z.string(),
32
+ organizationId: z.string(),
33
+ key: z.string(),
34
+ filename: z.string(),
35
+ contentType: z.string(),
36
+ uploadedBy: z.string().nullable(),
37
+ createdAt: z.string(),
38
+ updatedAt: z.string()
39
+ };
40
+ const fileSchema = z.object({
41
+ ...fileFields,
42
+ sizeBytes: z.number(),
43
+ arrivedAt: z.string()
44
+ });
45
+ const pendingFileSchema = z.object({
46
+ ...fileFields,
47
+ sizeBytes: z.null(),
48
+ arrivedAt: z.null()
49
+ });
50
+ const createFileInputSchema = z.object({ body: z.object({
51
+ filename: z.string().trim().min(1),
52
+ contentType: z.string().trim().min(1)
53
+ }) });
54
+ const createFileOutputSchema = z.object({
55
+ data: pendingFileSchema,
56
+ uploadUrl: z.string()
57
+ });
58
+ const fileIdInputSchema = z.object({ params: z.object({ id: z.uuid() }) });
59
+ const getFileOutputSchema = z.object({
60
+ data: fileSchema,
61
+ downloadUrl: z.string()
62
+ });
63
+ const filesContract = {
64
+ create: oc.route({
65
+ method: "POST",
66
+ path: "/v1/files",
67
+ successStatus: 201,
68
+ inputStructure: "detailed"
69
+ }).input(createFileInputSchema).output(createFileOutputSchema),
70
+ confirm: oc.route({
71
+ method: "POST",
72
+ path: "/v1/files/{id}/confirm",
73
+ successStatus: 200,
74
+ inputStructure: "detailed"
75
+ }).input(fileIdInputSchema).output(getFileOutputSchema),
76
+ get: oc.route({
77
+ method: "GET",
78
+ path: "/v1/files/{id}",
79
+ inputStructure: "detailed"
80
+ }).input(fileIdInputSchema).output(getFileOutputSchema)
81
+ };
82
+ //#endregion
83
+ //#region src/hitch/telephony.ts
84
+ const hitchPhoneNumberSchema = z.object({
85
+ id: z.uuid(),
86
+ e164: z.string(),
87
+ label: z.string(),
88
+ enabled: z.boolean(),
89
+ canRead: z.boolean(),
90
+ canSend: z.boolean(),
91
+ canCall: z.boolean(),
92
+ voiceEnabled: z.boolean()
93
+ });
94
+ const hitchCallSchema = z.object({
95
+ id: z.uuid(),
96
+ numberId: z.uuid(),
97
+ direction: z.enum(["inbound", "outbound"]),
98
+ status: z.enum([
99
+ "starting",
100
+ "ringing",
101
+ "active",
102
+ "ended",
103
+ "missed",
104
+ "failed"
105
+ ]),
106
+ from: z.string(),
107
+ to: z.string(),
108
+ userId: z.uuid().nullable(),
109
+ answeredAt: z.string().nullable(),
110
+ endedAt: z.string().nullable(),
111
+ durationSeconds: z.number().nullable(),
112
+ voicemailSeconds: z.number().nullable(),
113
+ hangupCause: z.string().nullable(),
114
+ record: z.boolean(),
115
+ hasRecording: z.boolean(),
116
+ transcriptStatus: z.enum([
117
+ "pending",
118
+ "done",
119
+ "failed"
120
+ ]).nullable(),
121
+ transcript: z.object({ segments: z.array(z.object({
122
+ side: z.enum(["member", "customer"]),
123
+ speaker: z.number(),
124
+ start: z.number(),
125
+ end: z.number(),
126
+ text: z.string()
127
+ })) }).nullable(),
128
+ createdAt: z.string()
129
+ });
130
+ const hitchMessageSchema = z.object({
131
+ id: z.uuid(),
132
+ numberId: z.uuid(),
133
+ direction: z.enum(["inbound", "outbound"]),
134
+ status: z.enum([
135
+ "pending",
136
+ "unknown",
137
+ "accepted",
138
+ "sent",
139
+ "delivered",
140
+ "unconfirmed",
141
+ "failed",
142
+ "received"
143
+ ]),
144
+ from: z.string(),
145
+ to: z.string(),
146
+ body: z.string().nullable(),
147
+ redacted: z.boolean(),
148
+ userId: z.uuid().nullable(),
149
+ appletId: z.uuid().nullable(),
150
+ requestId: z.string().nullable(),
151
+ errorCode: z.string().nullable(),
152
+ errorDetail: z.string().nullable(),
153
+ statusAt: z.string().nullable(),
154
+ createdAt: z.string()
155
+ });
156
+ const listHitchNumbersOutputSchema = z.object({ data: z.array(hitchPhoneNumberSchema) });
157
+ const listHitchMessagesOutputSchema = z.object({
158
+ data: z.array(hitchMessageSchema),
159
+ nextCursor: z.string().nullable()
160
+ });
161
+ const listHitchCallsOutputSchema = z.object({
162
+ data: z.array(hitchCallSchema),
163
+ nextCursor: z.string().nullable()
164
+ });
165
+ const idInputSchema = z.object({ id: z.uuid() });
166
+ const listInputFields = {
167
+ numberId: z.uuid().optional(),
168
+ userId: z.uuid().optional(),
169
+ direction: z.enum(["inbound", "outbound"]).optional(),
170
+ since: z.iso.datetime().optional(),
171
+ until: z.iso.datetime().optional(),
172
+ cursor: z.string().optional(),
173
+ limit: z.number().int().min(1).max(200).optional()
174
+ };
175
+ const listHitchMessagesInputSchema = z.object(listInputFields);
176
+ const listHitchCallsInputSchema = z.object({
177
+ ...listInputFields,
178
+ status: z.enum([
179
+ "starting",
180
+ "ringing",
181
+ "active",
182
+ "ended",
183
+ "missed",
184
+ "failed"
185
+ ]).optional()
186
+ });
187
+ const sendHitchMessageInputSchema = z.object({
188
+ numberId: z.uuid(),
189
+ to: z.string(),
190
+ body: z.string().min(1).max(1600),
191
+ requestId: z.string().min(1).max(200).optional()
192
+ });
193
+ const telephonyContract = {
194
+ calls: {
195
+ get: oc.route({
196
+ method: "GET",
197
+ path: "/v1/telephony/calls/{id}"
198
+ }).input(idInputSchema).output(hitchCallSchema),
199
+ list: oc.route({
200
+ method: "GET",
201
+ path: "/v1/telephony/calls"
202
+ }).input(listHitchCallsInputSchema).output(listHitchCallsOutputSchema)
203
+ },
204
+ numbers: { list: oc.route({
205
+ method: "GET",
206
+ path: "/v1/telephony/numbers"
207
+ }).input(z.void()).output(listHitchNumbersOutputSchema) },
208
+ messages: {
209
+ get: oc.route({
210
+ method: "GET",
211
+ path: "/v1/telephony/messages/{id}"
212
+ }).input(idInputSchema).output(hitchMessageSchema),
213
+ list: oc.route({
214
+ method: "GET",
215
+ path: "/v1/telephony/messages"
216
+ }).input(listHitchMessagesInputSchema).output(listHitchMessagesOutputSchema),
217
+ send: oc.route({
218
+ method: "POST",
219
+ path: "/v1/telephony/messages",
220
+ successStatus: 201
221
+ }).input(sendHitchMessageInputSchema).output(hitchMessageSchema)
222
+ }
223
+ };
224
+ //#endregion
225
+ //#region src/hitch/teams.ts
226
+ const teamSchema = z.object({
227
+ id: z.uuid(),
228
+ name: z.string()
229
+ });
230
+ const teamMemberSchema = z.object({
231
+ userId: z.uuid(),
232
+ firstName: z.string(),
233
+ lastName: z.string(),
234
+ email: z.email()
235
+ });
236
+ const teamsOutputSchema = z.object({ data: z.array(teamSchema) });
237
+ const teamIdInputSchema = z.object({ params: z.object({ id: z.uuid() }) });
238
+ const teamMembersOutputSchema = z.object({ data: z.array(teamMemberSchema) });
239
+ const teamsContract = {
240
+ list: oc.route({
241
+ method: "GET",
242
+ path: "/v1/teams"
243
+ }).input(z.void()).output(teamsOutputSchema),
244
+ members: { list: oc.route({
245
+ method: "GET",
246
+ path: "/v1/teams/{id}/members",
247
+ inputStructure: "detailed"
248
+ }).input(teamIdInputSchema).output(teamMembersOutputSchema) }
249
+ };
250
+ //#endregion
251
+ 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 };
@@ -0,0 +1,244 @@
1
+ import { a as ORG_CODE_PATTERN, i as APPLET_CODE_PATTERN } from "./manifest-4ZAc6HUk.js";
2
+ import { d as resolveAuthForOrg, f as resolveInstanceUrl, i as readWorkspaceConfig } from "./workspace-DruAZPmV.js";
3
+ import { n as runGenerate } from "./generate-XB-72Fzj.js";
4
+ import { a as writeAppletSupport, n as loadCliManifest, o as writeWorkspaceSupport, t as assertWorkspaceCli } from "./project-B0qNXnFu.js";
5
+ import { n as loadAppletSourceDefinition } from "./load-config-OKZU3UKn.js";
6
+ import { access, cp, mkdir, readdir, writeFile } from "node:fs/promises";
7
+ import { relative, resolve } from "node:path";
8
+ import { spawn } from "node:child_process";
9
+ //#region src/init.ts
10
+ function isMissingFile(error) {
11
+ return error instanceof Error && "code" in error && error.code === "ENOENT";
12
+ }
13
+ async function assertTargetIsAvailable(paths, targetType) {
14
+ const existingPath = (await Promise.all(paths.map(async (path) => {
15
+ try {
16
+ await access(path);
17
+ return path;
18
+ } catch (error) {
19
+ if (isMissingFile(error)) return void 0;
20
+ throw error;
21
+ }
22
+ }))).find((path) => path !== void 0);
23
+ if (existingPath !== void 0) throw new Error(`Refusing to initialize ${targetType}: ${existingPath} already exists.`);
24
+ }
25
+ async function assertDirectoryIsEmpty(path) {
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
+ }
31
+ }
32
+ async function installDependencies(target, install) {
33
+ if (!install) return "skipped";
34
+ console.log("Installing dependencies with pnpm install...");
35
+ return new Promise((resolveInstall, rejectInstall) => {
36
+ let finished = false;
37
+ const child = spawn("pnpm", ["install"], {
38
+ cwd: target,
39
+ stdio: "inherit",
40
+ shell: process.platform === "win32"
41
+ });
42
+ child.once("error", (error) => {
43
+ finished = true;
44
+ if (isMissingFile(error)) {
45
+ console.error("pnpm was not found. Install pnpm, then run pnpm install.");
46
+ resolveInstall("failed");
47
+ return;
48
+ }
49
+ rejectInstall(error);
50
+ });
51
+ child.once("close", (code) => {
52
+ if (finished) return;
53
+ finished = true;
54
+ if (code === 0) {
55
+ resolveInstall("succeeded");
56
+ return;
57
+ }
58
+ console.error(`pnpm install failed${code === null ? "." : ` with exit code ${code}.`}`);
59
+ resolveInstall("failed");
60
+ });
61
+ });
62
+ }
63
+ async function runGit(cwd, args) {
64
+ const env = Object.fromEntries(Object.entries(process.env).filter(([key]) => ![
65
+ "GIT_COMMON_DIR",
66
+ "GIT_DIR",
67
+ "GIT_INDEX_FILE",
68
+ "GIT_WORK_TREE"
69
+ ].includes(key)));
70
+ return new Promise((resolveGit, rejectGit) => {
71
+ let finished = false;
72
+ const child = spawn("git", args, {
73
+ cwd,
74
+ env,
75
+ stdio: [
76
+ "ignore",
77
+ "ignore",
78
+ "inherit"
79
+ ]
80
+ });
81
+ child.once("error", (error) => {
82
+ finished = true;
83
+ if (isMissingFile(error)) {
84
+ console.error("git was not found; skipping repository setup.");
85
+ resolveGit(false);
86
+ return;
87
+ }
88
+ rejectGit(error);
89
+ });
90
+ child.once("close", (code) => {
91
+ if (finished) return;
92
+ finished = true;
93
+ if (code !== 0) console.error(`git ${args[0]} failed${code === null ? "." : ` with exit code ${code}.`}`);
94
+ resolveGit(code === 0);
95
+ });
96
+ });
97
+ }
98
+ async function generateAppletFiles(target, org, options, installResult) {
99
+ if (installResult === "failed") return false;
100
+ const previousCwd = process.cwd();
101
+ try {
102
+ const instanceUrl = await resolveInstanceUrl(void 0, options.store);
103
+ if (await resolveAuthForOrg(instanceUrl, org, options.store) === void 0) {
104
+ console.log("Not logged in. Run applet generate to pull the organization's generated files; it will prompt a login.");
105
+ return false;
106
+ }
107
+ process.chdir(target);
108
+ await runGenerate({
109
+ fetch: options.fetch,
110
+ login: options.login,
111
+ stdinIsTTY: options.stdinIsTTY,
112
+ store: options.store
113
+ });
114
+ return true;
115
+ } catch (error) {
116
+ console.warn(`Generation skipped: ${error instanceof Error ? error.message : String(error)}`);
117
+ console.warn("Run applet generate in the applet directory after you resolve this problem.");
118
+ return false;
119
+ } finally {
120
+ process.chdir(previousCwd);
121
+ }
122
+ }
123
+ async function runInit(org, options = {}) {
124
+ if (!ORG_CODE_PATTERN.test(org)) throw new Error(`Invalid organization code "${org}".`);
125
+ const target = process.cwd();
126
+ await assertDirectoryIsEmpty(target);
127
+ const cli = await loadCliManifest();
128
+ if (cli === void 0) throw new Error("The CLI package manifest is not published.");
129
+ const config = {
130
+ sdk: `${cli.name}@${cli.version}`,
131
+ org
132
+ };
133
+ await writeFile(resolve(target, "hitch.config.ts"), `import type { HitchConfig } from "@hitch42/applet";
134
+
135
+ // After a clone, run: pnpm dlx ${config.sdk} bootstrap
136
+ export default {
137
+ sdk: ${JSON.stringify(config.sdk)},
138
+ org: ${JSON.stringify(config.org)},
139
+ } satisfies HitchConfig;
140
+ `);
141
+ await writeWorkspaceSupport(target, config, cli);
142
+ const initialized = (options.git ?? true) && await runGit(target, [
143
+ "init",
144
+ "-b",
145
+ "main"
146
+ ]);
147
+ const installResult = await installDependencies(target, options.install ?? true);
148
+ if (initialized) {
149
+ if ((options.commit ?? true) && await runGit(target, ["add", "-A"]) && await runGit(target, [
150
+ "commit",
151
+ "-m",
152
+ `applet init ${org}`
153
+ ])) console.log("Created a git repository with an initial commit.");
154
+ else console.log("Created a git repository.");
155
+ }
156
+ const nextSteps = [...installResult === "succeeded" ? [] : ["pnpm install"], "pnpm exec applet new <code>"];
157
+ console.log(`Workspace created in ${target}.\n\nNext steps:\n${nextSteps.map((step) => ` ${step}`).join("\n")}`);
158
+ }
159
+ async function runBootstrap(options = {}) {
160
+ const target = process.cwd();
161
+ const config = readWorkspaceConfig(target);
162
+ if (config === void 0) throw new Error(`Not a Hitch workspace root: ${target}. Run applet bootstrap from the directory that contains hitch.config.ts.`);
163
+ const cli = await loadCliManifest();
164
+ if (cli === void 0) throw new Error("The CLI package manifest is not published.");
165
+ assertWorkspaceCli(config, cli);
166
+ const applets = await readdir(resolve(target, "applets"), { withFileTypes: true }).catch((error) => {
167
+ if (isMissingFile(error)) return [];
168
+ throw error;
169
+ });
170
+ const definitions = await Promise.all(applets.filter((entry) => entry.isDirectory()).map(async ({ name }) => {
171
+ const root = resolve(target, "applets", name);
172
+ return {
173
+ definition: await loadAppletSourceDefinition(root),
174
+ root
175
+ };
176
+ }));
177
+ await Promise.all([writeWorkspaceSupport(target, config, cli), ...definitions.map(({ definition, root }) => writeAppletSupport(root, definition))]);
178
+ const installResult = await installDependencies(target, options.install ?? true);
179
+ console.log(`Workspace files generated in ${target}.${installResult === "failed" ? "\n\nNext step:\n pnpm install" : ""}`);
180
+ }
181
+ async function runNew(options) {
182
+ if (!APPLET_CODE_PATTERN.test(options.code)) throw new Error(`Invalid applet code "${options.code}".`);
183
+ if (options.clientOnly === true && options.serverOnly === true) throw new Error("Use only one of --client-only or --server-only.");
184
+ const workspaceRoot = process.cwd();
185
+ const name = options.code.replaceAll("_", " ").replace(/^./, (character) => character.toUpperCase());
186
+ const config = readWorkspaceConfig(workspaceRoot);
187
+ if (config === void 0) throw new Error(`Not a Hitch workspace root: ${workspaceRoot}. Run applet new from the directory that contains hitch.config.ts.`);
188
+ const cli = await loadCliManifest({ allowDevelopment: true });
189
+ if (cli !== void 0) assertWorkspaceCli(config, cli);
190
+ const appletTarget = resolve(workspaceRoot, "applets", options.code);
191
+ await assertTargetIsAvailable([resolve(appletTarget, "applet.manifest.ts"), resolve(appletTarget, "src")], "an applet");
192
+ const hasClient = options.serverOnly !== true;
193
+ const hasServer = options.clientOnly !== true;
194
+ if (hasClient) await cp(new URL("../scaffold/applet", import.meta.url), appletTarget, { recursive: true });
195
+ await Promise.all([hasClient ? mkdir(resolve(appletTarget, "src/client/routes"), { recursive: true }) : void 0, hasServer ? mkdir(resolve(appletTarget, "src/server"), { recursive: true }) : void 0]);
196
+ const definition = {
197
+ name,
198
+ code: options.code,
199
+ objects: [],
200
+ dependencies: {},
201
+ devDependencies: {}
202
+ };
203
+ await Promise.all([
204
+ writeFile(resolve(appletTarget, "applet.manifest.ts"), `import type { AppletSourceDefinition } from "@hitch42/applet";
205
+
206
+ export default {
207
+ name: "${name}",
208
+ code: "${options.code}",
209
+ objects: [],
210
+ dependencies: {},
211
+ devDependencies: {},
212
+ } as const satisfies AppletSourceDefinition;
213
+ `),
214
+ hasClient ? writeFile(resolve(appletTarget, "src/client/routes/index.tsx"), `import { createFileRoute } from "@tanstack/react-router";
215
+
216
+ import "@/client/styles/globals.css";
217
+
218
+ export const Route = createFileRoute("/${options.code}/")({
219
+ component: () => <p>Hello from ${options.code}</p>,
220
+ });
221
+ `) : void 0,
222
+ hasServer ? writeFile(resolve(appletTarget, "src/server/main.ts"), `import { os, type } from "@orpc/server";
223
+
224
+ // Delete this file if you do not require an API.
225
+ const router = {
226
+ hello: os.input(type<{ name: string }>()).handler(({ input }) => \`Hello, \${input.name}!\`),
227
+ };
228
+
229
+ export default { router };
230
+ `) : void 0
231
+ ]);
232
+ await Promise.all([writeAppletSupport(appletTarget, definition), cli === void 0 ? void 0 : writeWorkspaceSupport(workspaceRoot, config, cli)]);
233
+ const installResult = await installDependencies(workspaceRoot, options.install ?? true);
234
+ const generateSucceeded = await generateAppletFiles(appletTarget, config.org, options, installResult);
235
+ const relativeTarget = relative(workspaceRoot, appletTarget);
236
+ const nextSteps = [
237
+ ...installResult === "succeeded" ? [`cd ${JSON.stringify(relativeTarget)}`] : ["pnpm install", `cd ${JSON.stringify(relativeTarget)}`],
238
+ ...generateSucceeded ? [] : ["pnpm exec applet generate"],
239
+ "pnpm exec vite"
240
+ ];
241
+ console.log(`Applet created in ${relativeTarget}.\n\nNext steps:\n${nextSteps.map((step) => ` ${step}`).join("\n")}`);
242
+ }
243
+ //#endregion
244
+ export { runBootstrap, runInit, runNew };