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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) 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 +22 -11
  7. package/dist/build-Bh_S5BUv.js +2 -0
  8. package/dist/{build-DauirTcY.js → build-CEfFoIZZ.js} +1 -1
  9. package/dist/{ci-gPrwo6C0.js → ci-BKw14X2h.js} +14 -13
  10. package/dist/client.d.ts +3 -3
  11. package/dist/{contract-DB9QQhD9.d.ts → contract-CsUpTBe0.d.ts} +1 -1
  12. package/dist/{deploy-CqrtNJ1x.js → deploy-wGYjwXrx.js} +139 -88
  13. package/dist/email-DBTVhNB_.js +62 -0
  14. package/dist/{generate-BIifT6PK.js → generate-BEIYs17x.js} +70 -32
  15. package/dist/generate-Dox-OYt6.js +2 -0
  16. package/dist/headers-DkNr9MLJ.js +17 -0
  17. package/dist/index.d.ts +122 -10
  18. package/dist/index.js +142 -26
  19. package/dist/{init-Wu6XmyVc.js → init-6oGPM46R.js} +15 -17
  20. package/dist/{load-config-BknBkdRs.js → load-config-xEdTXs0y.js} +2 -2
  21. package/dist/log-context-zu8U9Sjm.js +73 -0
  22. package/dist/{login-iT9MRuaw.js → login-CUx3TmFQ.js} +1 -1
  23. package/dist/{logs-B-qZGXSK.js → logs-DSjuEN0Q.js} +20 -22
  24. package/dist/{manifest-C489nYUy.d.ts → manifest-C6_F4bL8.d.ts} +7 -0
  25. package/dist/{manifest-Bd04cWhu.js → manifest-CJSL9GuC.js} +22 -3
  26. package/dist/me-BW7Paary.js +32 -0
  27. package/dist/{project-C_rtpjp8.js → project-BRZGd6xq.js} +202 -20
  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-DcwMeIau.js → variables-DT5RyHdH.js} +14 -39
  40. package/dist/vite.d.ts +3 -60
  41. package/dist/vite.js +497 -27
  42. package/dist/workflow-engine-BOTzURKM.js +111 -0
  43. package/dist/{workspace-B6lenAS5.js → workspace-D0dnnlxL.js} +37 -39
  44. package/package.json +18 -5
  45. package/scaffold/.agents/skills/hitch-applets/SKILL.md +50 -18
  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 +12 -2
  49. package/scaffold/.agents/skills/hitch-applets/references/markdown.md +2 -0
  50. package/scaffold/.agents/skills/hitch-applets/references/performance.md +1 -1
  51. package/scaffold/.agents/skills/hitch-applets/references/records.md +27 -4
  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 +20 -20
  56. package/scaffold/.agents/skills/hitch-data/SKILL.md +3 -2
  57. package/scaffold/.agents/skills/hitch-data/references/attributes.md +7 -1
  58. package/scaffold/.agents/skills/hitch-data/references/limits.md +23 -23
  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 +1 -1
  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-DhNDp7ji.js +0 -2
  177. package/dist/generate-DSk8ihsC.js +0 -2
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-C489nYUy.js";
2
- import { n as pruneContract, t as NarrowContract } from "./contract-DB9QQhD9.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
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-Bd04cWhu.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-Bd04cWhu.js";
2
- import { c as resolveAuthForOrg, i as readWorkspaceConfig, l as resolveInstanceUrl } from "./workspace-B6lenAS5.js";
3
- import { n as runGenerate } from "./generate-BIifT6PK.js";
4
- import { n as loadAppletSourceDefinition } from "./load-config-BknBkdRs.js";
5
- import { a as writeAppletSupport, n as loadCliManifest, o as writeWorkspaceSupport, t as assertWorkspaceCli } from "./project-C_rtpjp8.js";
1
+ import { a as ORG_CODE_PATTERN, i as APPLET_CODE_PATTERN } from "./manifest-CJSL9GuC.js";
2
+ import { d as resolveAuthForOrg, f as resolveInstanceUrl, i as readWorkspaceConfig } from "./workspace-D0dnnlxL.js";
3
+ import { n as runGenerate } from "./generate-BEIYs17x.js";
4
+ import { a as writeAppletSupport, n as loadCliManifest, o as writeWorkspaceSupport, t as assertWorkspaceCli } from "./project-BRZGd6xq.js";
5
+ import { n as loadAppletSourceDefinition } from "./load-config-xEdTXs0y.js";
6
6
  import { access, cp, mkdir, readdir, writeFile } from "node:fs/promises";
7
7
  import { relative, resolve } from "node:path";
8
8
  import { spawn } from "node:child_process";
@@ -23,8 +23,11 @@ async function assertTargetIsAvailable(paths, targetType) {
23
23
  if (existingPath !== void 0) throw new Error(`Refusing to initialize ${targetType}: ${existingPath} already exists.`);
24
24
  }
25
25
  async function assertDirectoryIsEmpty(path) {
26
- const [entry] = await readdir(path);
27
- if (entry !== void 0) throw new Error(`Refusing to initialize a workspace: ${path} is not empty (${entry} exists).`);
26
+ const entries = await readdir(path);
27
+ if (entries.length > 0) {
28
+ const [entry] = entries;
29
+ throw new Error(`Refusing to initialize a workspace: ${path} is not empty (${entry} exists).`);
30
+ }
28
31
  }
29
32
  async function installDependencies(target, install) {
30
33
  if (!install) return "skipped";
@@ -92,22 +95,17 @@ async function runGit(cwd, args) {
92
95
  });
93
96
  });
94
97
  }
95
- async function generateAppletFiles(target, org, options, installResult) {
98
+ async function generateAppletFiles(target, org, installResult) {
96
99
  if (installResult === "failed") return false;
97
100
  const previousCwd = process.cwd();
98
101
  try {
99
- const instanceUrl = await resolveInstanceUrl(void 0, options.store);
100
- if (await resolveAuthForOrg(instanceUrl, org, options.store) === void 0) {
102
+ const instanceUrl = await resolveInstanceUrl();
103
+ if (await resolveAuthForOrg(instanceUrl, org) === void 0) {
101
104
  console.log("Not logged in. Run applet generate to pull the organization's generated files; it will prompt a login.");
102
105
  return false;
103
106
  }
104
107
  process.chdir(target);
105
- await runGenerate({
106
- fetch: options.fetch,
107
- login: options.login,
108
- stdinIsTTY: options.stdinIsTTY,
109
- store: options.store
110
- });
108
+ await runGenerate();
111
109
  return true;
112
110
  } catch (error) {
113
111
  console.warn(`Generation skipped: ${error instanceof Error ? error.message : String(error)}`);
@@ -228,7 +226,7 @@ export default { router };
228
226
  ]);
229
227
  await Promise.all([writeAppletSupport(appletTarget, definition), cli === void 0 ? void 0 : writeWorkspaceSupport(workspaceRoot, config, cli)]);
230
228
  const installResult = await installDependencies(workspaceRoot, options.install ?? true);
231
- const generateSucceeded = await generateAppletFiles(appletTarget, config.org, options, installResult);
229
+ const generateSucceeded = await generateAppletFiles(appletTarget, config.org, installResult);
232
230
  const relativeTarget = relative(workspaceRoot, appletTarget);
233
231
  const nextSteps = [
234
232
  ...installResult === "succeeded" ? [`cd ${JSON.stringify(relativeTarget)}`] : ["pnpm install", `cd ${JSON.stringify(relativeTarget)}`],
@@ -1,5 +1,5 @@
1
- import { r as appletSourceDefinitionSchema } from "./manifest-Bd04cWhu.js";
2
- import { t as resolveWorkspaceOrg } from "./workspace-B6lenAS5.js";
1
+ import { r as appletSourceDefinitionSchema } from "./manifest-CJSL9GuC.js";
2
+ import { t as resolveWorkspaceOrg } from "./workspace-D0dnnlxL.js";
3
3
  import { existsSync } from "node:fs";
4
4
  import { resolve } from "node:path";
5
5
  import { loadConfigFromFile } from "vite";
@@ -0,0 +1,73 @@
1
+ import { channel } from "node:diagnostics_channel";
2
+ //#region src/server/log-context.ts
3
+ const REQUEST_CONTEXT_CHANNEL = "hitch.request.context";
4
+ const APP_CONTEXT_CHANNEL = "hitch.request.app";
5
+ const isUuid = (value) => typeof value === "string" && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);
6
+ function requestIdFrom(headers) {
7
+ const requestId = headers.get("x-request-id");
8
+ return isUuid(requestId) ? requestId : crypto.randomUUID();
9
+ }
10
+ function publishNote(requestId, fields, channelName = REQUEST_CONTEXT_CHANNEL) {
11
+ const note = Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== void 0));
12
+ if (Object.keys(note).length === 0) return;
13
+ const serialized = JSON.stringify({
14
+ requestId,
15
+ ...note
16
+ });
17
+ channel(channelName).publish(serialized.length > 16384 ? {
18
+ requestId,
19
+ noteDropped: true,
20
+ noteBytes: serialized.length,
21
+ noteKeys: Object.keys(note)
22
+ } : {
23
+ requestId,
24
+ ...note
25
+ });
26
+ }
27
+ function errorNote(error) {
28
+ return { error: error instanceof Error ? {
29
+ name: error.name,
30
+ message: error.message,
31
+ stack: error.stack?.slice(0, 8192),
32
+ ...error.cause instanceof Error && { cause: {
33
+ name: error.cause.name,
34
+ message: error.cause.message
35
+ } }
36
+ } : {
37
+ name: "Error",
38
+ message: String(error)
39
+ } };
40
+ }
41
+ function cloudflareRequestFields(request) {
42
+ const cf = Reflect.get(request, "cf");
43
+ const field = (key) => typeof cf === "object" && cf !== null && key in cf ? Reflect.get(cf, key) : void 0;
44
+ const colo = field("colo");
45
+ const country = field("country");
46
+ const asn = field("asn");
47
+ return {
48
+ cfRay: request.headers.get("cf-ray") ?? void 0,
49
+ traceparent: request.headers.get("traceparent") ?? void 0,
50
+ colo: typeof colo === "string" ? colo : void 0,
51
+ country: typeof country === "string" ? country : void 0,
52
+ asn: typeof asn === "number" ? asn : void 0
53
+ };
54
+ }
55
+ function createNoteLog(initial) {
56
+ const context = { ...initial };
57
+ const log = {
58
+ set(fields) {
59
+ Object.assign(context, fields);
60
+ publishNote(initial.requestId, fields);
61
+ },
62
+ error(error) {
63
+ log.set(errorNote(error));
64
+ },
65
+ getContext() {
66
+ return { ...context };
67
+ }
68
+ };
69
+ publishNote(initial.requestId, initial);
70
+ return log;
71
+ }
72
+ //#endregion
73
+ export { errorNote as a, requestIdFrom as c, createNoteLog as i, REQUEST_CONTEXT_CHANNEL as n, isUuid as o, cloudflareRequestFields as r, publishNote as s, APP_CONTEXT_CHANNEL as t };
@@ -1,4 +1,4 @@
1
- import { a as loginWithDevice, l as resolveInstanceUrl, o as AuthenticationError, r as findWorkspaceConfig } from "./workspace-B6lenAS5.js";
1
+ import { a as loginWithDevice, f as resolveInstanceUrl, o as AuthenticationError, r as findWorkspaceConfig } from "./workspace-D0dnnlxL.js";
2
2
  //#region src/login.ts
3
3
  async function runLogin(options) {
4
4
  if (process.env.HITCH_API_KEY !== void 0) throw new AuthenticationError("HITCH_API_KEY is set — unset it to manage stored logins.");
@@ -1,6 +1,6 @@
1
- import { i as APPLET_CODE_PATTERN } from "./manifest-Bd04cWhu.js";
2
- import { i as readWorkspaceConfig, n as fetchWithOrgAuth, t as resolveWorkspaceOrg } from "./workspace-B6lenAS5.js";
3
- import { t as loadAppletConfig } from "./load-config-BknBkdRs.js";
1
+ import { i as APPLET_CODE_PATTERN } from "./manifest-CJSL9GuC.js";
2
+ import { i as readWorkspaceConfig, n as fetchWithOrgAuth, t as resolveWorkspaceOrg } from "./workspace-D0dnnlxL.js";
3
+ import { t as loadAppletConfig } from "./load-config-xEdTXs0y.js";
4
4
  import { z } from "zod";
5
5
  //#region src/logs.ts
6
6
  const LOG_LEVELS = [
@@ -19,6 +19,16 @@ const logSchema = z.object({
19
19
  timestamp: z.number(),
20
20
  level: z.string(),
21
21
  message: z.string(),
22
+ context: z.record(z.string(), z.unknown()).optional(),
23
+ error: z.object({
24
+ name: z.string(),
25
+ message: z.string(),
26
+ stack: z.string().optional(),
27
+ cause: z.object({
28
+ name: z.string(),
29
+ message: z.string()
30
+ }).optional()
31
+ }).optional(),
22
32
  releaseId: z.string(),
23
33
  type: z.string().optional(),
24
34
  runId: z.string().optional(),
@@ -93,20 +103,6 @@ async function readErrorDetails(response) {
93
103
  }
94
104
  return "";
95
105
  }
96
- function waitForPoll(signal) {
97
- if (signal?.aborted === true) return Promise.resolve(false);
98
- return new Promise((resolve) => {
99
- const timeout = setTimeout(() => {
100
- signal?.removeEventListener("abort", onAbort);
101
- resolve(true);
102
- }, POLL_INTERVAL_MS);
103
- const onAbort = () => {
104
- clearTimeout(timeout);
105
- resolve(false);
106
- };
107
- signal?.addEventListener("abort", onAbort, { once: true });
108
- });
109
- }
110
106
  function printLog(log) {
111
107
  const details = log.type === "invocation" ? [
112
108
  log.statusCode === void 0 ? void 0 : `status=${log.statusCode}`,
@@ -114,7 +110,9 @@ function printLog(log) {
114
110
  log.wallTimeMs === void 0 ? void 0 : `wall=${log.wallTimeMs}ms`,
115
111
  log.cpuTimeMs === void 0 ? void 0 : `cpu=${log.cpuTimeMs}ms`
116
112
  ].filter((value) => value !== void 0) : [];
117
- console.log(`${new Date(log.timestamp).toISOString()} ${log.level.toUpperCase().padEnd(5)} ${log.type === "workflow" ? `[${log.workflow} ${log.runId?.slice(0, 8)}#${log.invocation}] ` : ""}${log.message}${details.length === 0 ? "" : ` [${details.join(" ")}]`}`);
113
+ console.log(`${new Date(log.timestamp).toISOString()} ${log.level.toUpperCase().padEnd(5)} ${log.type === "workflow" ? `[${log.workflow} ${log.runId?.slice(0, 8)}#${log.invocation}] ` : ""}${log.message}${details.length === 0 ? "" : ` [${details.join(" ")}]`}${log.context === void 0 ? "" : ` ${JSON.stringify(log.context)}`}`);
114
+ if (log.error) console.log(log.error.stack ?? `${log.error.name}: ${log.error.message}`);
115
+ if (log.error?.cause) console.log(`Caused by ${log.error.cause.name}: ${log.error.cause.message}`);
118
116
  }
119
117
  async function runLogs(options) {
120
118
  const [{ code, org }, since, limit, level, userFilter, search] = await Promise.all([
@@ -127,13 +125,12 @@ async function runLogs(options) {
127
125
  ]);
128
126
  const runFilter = options.run === void 0 ? void 0 : { runId: { $eq: options.run } };
129
127
  const filter = runFilter === void 0 ? userFilter : userFilter === void 0 ? runFilter : { $and: [runFilter, userFilter] };
130
- const fetcher = options.fetch ?? globalThis.fetch;
131
128
  const startedAt = Date.now();
132
129
  const requestLogs = async (from, to) => {
133
- const response = await fetchWithOrgAuth(org, options, (instanceUrl, accessToken) => {
130
+ const response = await fetchWithOrgAuth(org, (instanceUrl, accessToken) => {
134
131
  const url = new URL(`/api/v1/applets/${encodeURIComponent(code)}/logs/query`, `${instanceUrl}/`);
135
132
  const levelFilter = level === void 0 ? void 0 : { level: { $in: LOG_LEVELS.slice(LOG_LEVELS.indexOf(level)) } };
136
- return fetcher(url, {
133
+ return fetch(url, {
137
134
  method: "POST",
138
135
  headers: {
139
136
  Authorization: `Bearer ${accessToken}`,
@@ -172,7 +169,8 @@ async function runLogs(options) {
172
169
  return;
173
170
  }
174
171
  let lastTimestamp = initialLogs.at(-1)?.timestamp ?? startedAt;
175
- while (await waitForPoll(options.signal)) {
172
+ for (;;) {
173
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
176
174
  const to = Date.now();
177
175
  const logs = await requestLogs(Math.max(startedAt - since, lastTimestamp - LIVE_OVERLAP_MS), to);
178
176
  printNewLogs(logs);
@@ -34,6 +34,11 @@ interface AppletManifest {
34
34
  code: string;
35
35
  /** This code needs the schema as of this changeset. */
36
36
  requiresChangeset?: string;
37
+ telephony?: {
38
+ read?: boolean;
39
+ send?: boolean;
40
+ events?: readonly "message.received"[];
41
+ };
37
42
  schedules?: readonly {
38
43
  code: string;
39
44
  name: string;
@@ -50,6 +55,8 @@ interface AppletManifest {
50
55
  canDelete: boolean;
51
56
  readOnly: readonly string[];
52
57
  readWrite: readonly string[];
58
+ optional?: boolean;
59
+ optionalAttributes?: readonly string[];
53
60
  }[];
54
61
  }
55
62
  type AppletDefinition = Omit<AppletManifest, "org">;