@hitch42/applet 0.1.0-beta.3 → 0.1.0-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 (55) hide show
  1. package/dist/_internal/server.d.ts +14 -1
  2. package/dist/_internal/server.js +23 -74
  3. package/dist/applet.js +53 -29
  4. package/dist/build-BfbTbt_r.js +2 -0
  5. package/dist/{build-Ch3pALLA.js → build-CAb26kMY.js} +30 -14
  6. package/dist/ci-5qWl7lT3.js +68 -0
  7. package/dist/client.d.ts +3 -3
  8. package/dist/{contract-DMrpbaLJ.d.ts → contract-rP_eV9PK.d.ts} +1 -1
  9. package/dist/{deploy-DP2Bg6nt.js → deploy-D_OFJ6-Q.js} +193 -30
  10. package/dist/email-DBTVhNB_.js +62 -0
  11. package/dist/generate-BgepN4-b.js +2 -0
  12. package/dist/{generate-BuszZ9-U.js → generate-CBPnHoqX.js} +40 -30
  13. package/dist/index.d.ts +122 -11
  14. package/dist/index.js +141 -26
  15. package/dist/{init-BjWWDqqX.js → init-tfzwuYnk.js} +12 -8
  16. package/dist/load-config-BYSxDVAl.js +27 -0
  17. package/dist/login-C7RKmmTe.js +12 -0
  18. package/dist/{logs-m00pzr_O.js → logs-DgjgAxj2.js} +3 -3
  19. package/dist/{manifest-DyoJ1MIL.js → manifest-Bp87Uz0a.js} +6 -0
  20. package/dist/{manifest-BQCAxATS.d.ts → manifest-DD_SGkS6.d.ts} +5 -0
  21. package/dist/me-BW7Paary.js +32 -0
  22. package/dist/{project-MN3mFxeE.js → project-D6XHllmC.js} +26 -20
  23. package/dist/prompt-ChS-grYO.js +29 -0
  24. package/dist/react.d.ts +1 -1
  25. package/dist/react.js +40 -42
  26. package/dist/schedules-dhU1yyFr.js +42 -0
  27. package/dist/server.d.ts +3 -3
  28. package/dist/telephony-protocol-D-nf3Gca.d.ts +76 -0
  29. package/dist/telephony.d.ts +77 -0
  30. package/dist/telephony.js +607 -0
  31. package/dist/{upload-YbRKEqR6.d.ts → upload-DKZzz5kW.d.ts} +6 -6
  32. package/dist/{variables-CP7Ce3Np.js → variables-Bwnr7oxf.js} +3 -28
  33. package/dist/vite.d.ts +1 -1
  34. package/dist/vite.js +458 -27
  35. package/dist/workflow-engine-MogejNfF.js +117 -0
  36. package/dist/{auth-DaVK0k5R.js → workspace-XVtM12ZC.js} +44 -4
  37. package/package.json +6 -1
  38. package/scaffold/.agents/skills/hitch-applets/SKILL.md +34 -15
  39. package/scaffold/.agents/skills/hitch-applets/references/email-tracking.md +49 -0
  40. package/scaffold/.agents/skills/hitch-applets/references/files.md +3 -3
  41. package/scaffold/.agents/skills/hitch-applets/references/manifest.md +21 -2
  42. package/scaffold/.agents/skills/hitch-applets/references/performance.md +74 -0
  43. package/scaffold/.agents/skills/hitch-applets/references/records.md +30 -8
  44. package/scaffold/.agents/skills/hitch-applets/references/schedules.md +7 -2
  45. package/scaffold/.agents/skills/hitch-applets/references/server.md +0 -3
  46. package/scaffold/.agents/skills/hitch-applets/references/workflows.md +11 -3
  47. package/scaffold/.agents/skills/hitch-cli/SKILL.md +129 -0
  48. package/scaffold/.agents/skills/hitch-data/SKILL.md +51 -0
  49. package/scaffold/.agents/skills/hitch-data/references/attributes.md +121 -0
  50. package/scaffold/.agents/skills/hitch-data/references/limits.md +64 -0
  51. package/scaffold/.agents/skills/hitch-theory/SKILL.md +150 -0
  52. package/scaffold/.github/workflows/hitch.yml +1 -7
  53. package/dist/build-BqoQ-uNz.js +0 -2
  54. package/dist/generate-CRVA0Ll5.js +0 -2
  55. package/dist/load-config-BnxocLAQ.js +0 -56
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-DD_SGkS6.js";
2
+ import { n as pruneContract, t as NarrowContract } from "./contract-rP_eV9PK.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,121 @@ 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
+ 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
42
153
  //#region src/hitch/teams.d.ts
43
154
  type HitchTeam = {
44
155
  id: string;
@@ -61,14 +172,14 @@ type TeamsOutput = {
61
172
  type TeamMembersOutput = {
62
173
  data: HitchTeamMember[];
63
174
  };
64
- declare const teamSchema: z.ZodType<HitchTeam>;
65
- declare const teamMemberSchema: z.ZodType<HitchTeamMember>;
175
+ declare const teamSchema: z.ZodType<HitchTeam, HitchTeam>;
176
+ declare const teamMemberSchema: z.ZodType<HitchTeamMember, HitchTeamMember>;
66
177
  type TeamsContract = {
67
- list: ContractProcedure<z.ZodType<void>, z.ZodType<TeamsOutput>, Record<never, never>, Meta>;
178
+ list: ContractProcedure<z.ZodType<void, void>, z.ZodType<TeamsOutput, TeamsOutput>, Record<never, never>, Meta>;
68
179
  members: {
69
- list: ContractProcedure<z.ZodType<TeamIdInput>, z.ZodType<TeamMembersOutput>, Record<never, never>, Meta>;
180
+ list: ContractProcedure<z.ZodType<TeamIdInput, TeamIdInput>, z.ZodType<TeamMembersOutput, TeamMembersOutput>, Record<never, never>, Meta>;
70
181
  };
71
182
  };
72
183
  declare const teamsContract: TeamsContract;
73
184
  //#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 };
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 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-Bp87Uz0a.js";
3
5
  import { oc } from "@orpc/contract";
4
6
  import { z } from "zod";
5
7
  //#region src/hitch/contract.ts
@@ -78,34 +80,147 @@ 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
+ 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()
87
164
  });
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())
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()
95
186
  });
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()
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()
104
192
  });
105
- const meContract = { get: oc.route({
106
- method: "GET",
107
- path: "/v1/me"
108
- }).input(z.void()).output(meSchema) };
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
+ };
109
224
  //#endregion
110
225
  //#region src/hitch/teams.ts
111
226
  const teamSchema = z.object({
@@ -133,4 +248,4 @@ const teamsContract = {
133
248
  }).input(teamIdInputSchema).output(teamMembersOutputSchema) }
134
249
  };
135
250
  //#endregion
136
- export { appletDefinitionSchema, appletManifestSchema, appletSourceDefinitionSchema, createFileOutputSchema, fileSchema, filesContract, getFileOutputSchema, meContract, meSchema, pruneContract, registerHitchContract, teamMemberSchema, teamSchema, teamsContract, uploadFile };
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 };
@@ -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-BuszZ9-U.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-MN3mFxeE.js";
1
+ import { a as ORG_CODE_PATTERN, i as APPLET_CODE_PATTERN } from "./manifest-Bp87Uz0a.js";
2
+ import { d as resolveInstanceUrl, i as readWorkspaceConfig, u as resolveAuthForOrg } from "./workspace-XVtM12ZC.js";
3
+ import { n as runGenerate } from "./generate-CBPnHoqX.js";
4
+ import { n as loadAppletSourceDefinition } from "./load-config-BYSxDVAl.js";
5
+ import { a as writeAppletSupport, n as loadCliManifest, o as writeWorkspaceSupport, t as assertWorkspaceCli } from "./project-D6XHllmC.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;
@@ -0,0 +1,27 @@
1
+ import { r as appletSourceDefinitionSchema } from "./manifest-Bp87Uz0a.js";
2
+ import { t as resolveWorkspaceOrg } from "./workspace-XVtM12ZC.js";
3
+ import { existsSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+ import { loadConfigFromFile } from "vite";
6
+ //#region src/typegen/load-config.ts
7
+ async function loadAppletSourceDefinition(root) {
8
+ const path = resolve(root, "applet.manifest.ts");
9
+ if (!existsSync(path)) throw new Error(`No applet manifest found at ${path}.`);
10
+ const loaded = await loadConfigFromFile({
11
+ command: "build",
12
+ mode: "production"
13
+ }, path, root);
14
+ if (loaded === null) throw new Error(`No applet manifest found at ${path}.`);
15
+ const parsed = appletSourceDefinitionSchema.safeParse(loaded.config);
16
+ if (!parsed.success) throw new Error(`Invalid applet manifest at ${loaded.path}: ${parsed.error.message}`);
17
+ return parsed.data;
18
+ }
19
+ async function loadAppletConfig(root) {
20
+ const { dependencies: _dependencies, devDependencies: _devDependencies, ...definition } = await loadAppletSourceDefinition(root);
21
+ return {
22
+ org: resolveWorkspaceOrg(root),
23
+ ...definition
24
+ };
25
+ }
26
+ //#endregion
27
+ export { loadAppletSourceDefinition as n, loadAppletConfig as t };
@@ -0,0 +1,12 @@
1
+ import { a as loginWithDevice, d as resolveInstanceUrl, o as AuthenticationError, r as findWorkspaceConfig } from "./workspace-XVtM12ZC.js";
2
+ //#region src/login.ts
3
+ async function runLogin(options) {
4
+ if (process.env.HITCH_API_KEY !== void 0) throw new AuthenticationError("HITCH_API_KEY is set — unset it to manage stored logins.");
5
+ const { me, membership } = await loginWithDevice(await resolveInstanceUrl(), {
6
+ expectedOrg: findWorkspaceConfig(process.cwd())?.org,
7
+ noBrowser: options.noBrowser
8
+ });
9
+ console.log(`Signed in as ${me.person.email} to ${membership.name}.`);
10
+ }
11
+ //#endregion
12
+ export { runLogin };
@@ -1,6 +1,6 @@
1
- import { i as APPLET_CODE_PATTERN } from "./manifest-DyoJ1MIL.js";
2
- import { t as fetchWithOrgAuth } from "./auth-DaVK0k5R.js";
3
- import { i as resolveWorkspaceOrg, r as readWorkspaceConfig, t as loadAppletConfig } from "./load-config-BnxocLAQ.js";
1
+ import { i as APPLET_CODE_PATTERN } from "./manifest-Bp87Uz0a.js";
2
+ import { i as readWorkspaceConfig, n as fetchWithOrgAuth, t as resolveWorkspaceOrg } from "./workspace-XVtM12ZC.js";
3
+ import { t as loadAppletConfig } from "./load-config-BYSxDVAl.js";
4
4
  import { z } from "zod";
5
5
  //#region src/logs.ts
6
6
  const LOG_LEVELS = [
@@ -63,6 +63,8 @@ const appletManifestShape = {
63
63
  org: z.string().regex(ORG_CODE_PATTERN, "must start with a lowercase letter, end with a letter or number, and contain only lowercase letters, numbers, and non-consecutive hyphens"),
64
64
  name: nameSchema,
65
65
  code: codeSchema,
66
+ requiresChangeset: z.uuid().optional(),
67
+ telephony: z.strictObject({ events: z.array(z.literal("message.received")).min(1).refine((events) => new Set(events).size === events.length).readonly() }).optional(),
66
68
  schedules: appletManifestSchedulesSchema.optional(),
67
69
  variables: appletManifestVariablesSchema.optional(),
68
70
  objects: appletManifestObjectsSchema
@@ -94,6 +96,8 @@ const appletManifestSchema = z.strictObject(appletManifestShape).superRefine(che
94
96
  const appletDefinitionSchema = z.strictObject({
95
97
  name: appletManifestShape.name,
96
98
  code: appletManifestShape.code,
99
+ requiresChangeset: appletManifestShape.requiresChangeset,
100
+ telephony: appletManifestShape.telephony,
97
101
  schedules: appletManifestShape.schedules,
98
102
  variables: appletManifestShape.variables,
99
103
  objects: appletManifestShape.objects
@@ -161,6 +165,8 @@ const checkSourcePackages = (manifest, context) => {
161
165
  const appletSourceDefinitionSchema = z.strictObject({
162
166
  name: appletManifestShape.name,
163
167
  code: appletManifestShape.code,
168
+ requiresChangeset: appletManifestShape.requiresChangeset,
169
+ telephony: appletManifestShape.telephony,
164
170
  schedules: appletManifestShape.schedules,
165
171
  variables: appletManifestShape.variables,
166
172
  objects: appletManifestShape.objects,
@@ -32,6 +32,11 @@ interface AppletManifest {
32
32
  org: string;
33
33
  name: string;
34
34
  code: string;
35
+ /** This code needs the schema as of this changeset. */
36
+ requiresChangeset?: string;
37
+ telephony?: {
38
+ events: readonly "message.received"[];
39
+ };
35
40
  schedules?: readonly {
36
41
  code: string;
37
42
  name: string;
@@ -0,0 +1,32 @@
1
+ import { oc } from "@orpc/contract";
2
+ import { z } from "zod";
3
+ //#region src/hitch/me.ts
4
+ const personSchema = z.object({
5
+ id: z.uuid(),
6
+ firstName: z.string(),
7
+ lastName: z.string(),
8
+ email: z.email()
9
+ });
10
+ const membershipSchema = z.object({
11
+ orgId: z.uuid(),
12
+ code: z.string(),
13
+ name: z.string(),
14
+ iconFileId: z.uuid().nullable(),
15
+ role: z.enum(["member", "owner"]),
16
+ capabilities: z.array(z.string())
17
+ });
18
+ const meSchema = z.object({
19
+ person: personSchema,
20
+ memberships: z.array(membershipSchema),
21
+ organization: z.object({
22
+ id: z.uuid(),
23
+ code: z.string()
24
+ }).nullable(),
25
+ multiOrg: z.boolean()
26
+ });
27
+ const meContract = { get: oc.route({
28
+ method: "GET",
29
+ path: "/v1/me"
30
+ }).input(z.void()).output(meSchema) };
31
+ //#endregion
32
+ export { meSchema as n, meContract as t };
@@ -1,4 +1,5 @@
1
- import { n as loadAppletSourceDefinition, r as readWorkspaceConfig } from "./load-config-BnxocLAQ.js";
1
+ import { i as readWorkspaceConfig } from "./workspace-XVtM12ZC.js";
2
+ import { n as loadAppletSourceDefinition } from "./load-config-BYSxDVAl.js";
2
3
  import { z } from "zod";
3
4
  import { existsSync } from "node:fs";
4
5
  import { cp, mkdir, readFile, rm, symlink, writeFile } from "node:fs/promises";
@@ -50,11 +51,11 @@ const cliManifestSchema = z.object({
50
51
  async function loadCliManifest(options) {
51
52
  const result = cliManifestSchema.safeParse(JSON.parse(await readFile(new URL("../package.json", import.meta.url), "utf8")));
52
53
  if (!result.success) {
53
- const issue = result.error.issues[0];
54
+ const issue = result.error.issues.at(0);
54
55
  if (issue === void 0) throw new Error("Invalid CLI package manifest.");
55
56
  throw new Error(`Invalid CLI package manifest field "${issue.path.join(".")}": ${issue.message}.`);
56
57
  }
57
- const catalogEntry = [...Object.entries(result.data.dependencies).map(([name, value]) => [`dependencies.${name}`, value]), ...Object.entries(result.data.peerDependencies).map(([name, value]) => [`peerDependencies.${name}`, value])].find(([, value]) => value?.startsWith("catalog:"));
58
+ const catalogEntry = [...Object.entries(result.data.dependencies).map(([name, value]) => [`dependencies.${name}`, value]), ...Object.entries(result.data.peerDependencies).map(([name, value]) => [`peerDependencies.${name}`, value])].find(([, value]) => value.startsWith("catalog:"));
58
59
  if (catalogEntry !== void 0) {
59
60
  if (options?.allowDevelopment === true) return void 0;
60
61
  throw new Error(`Invalid CLI package manifest field "${catalogEntry[0]}": "catalog:" identifies an unpublished development build. Run the published @hitch42/applet CLI instead.`);
@@ -127,8 +128,14 @@ minimumReleaseAgeExclude:
127
128
  }
128
129
  const GITIGNORE_START = "# BEGIN Hitch generated files";
129
130
  const GITIGNORE_END = "# END Hitch generated files";
131
+ const SKILLS = [
132
+ "hitch-applets",
133
+ "hitch-cli",
134
+ "hitch-data",
135
+ "hitch-theory"
136
+ ];
130
137
  const GITIGNORE = `${GITIGNORE_START}
131
- /.agents/skills/hitch-applets/
138
+ ${SKILLS.map((skill) => `/.agents/skills/${skill}/`).join("\n")}
132
139
  /.node-version
133
140
  /AGENTS.md
134
141
  /CLAUDE.md
@@ -169,22 +176,21 @@ async function writeWorkspaceSupport(root, config, cli) {
169
176
  const resolvedCli = cli ?? await loadCliManifest();
170
177
  if (resolvedCli === void 0) throw new Error("The CLI package manifest is not published.");
171
178
  assertWorkspaceCli(config, resolvedCli);
172
- const skillTarget = resolve(root, ".agents/skills/hitch-applets");
173
179
  const deployWorkflowTarget = resolve(root, ".github/workflows/hitch.yml");
174
180
  const agents = await readFile(new URL("../scaffold/AGENTS.md", import.meta.url), "utf8");
175
181
  await Promise.all([
176
182
  mkdir(resolve(root, ".agents/skills"), { recursive: true }),
177
- mkdir(resolve(root, ".github/workflows"), { recursive: true }),
178
- rm(skillTarget, {
183
+ config.githubWorkflow === false ? void 0 : mkdir(resolve(root, ".github/workflows"), { recursive: true }),
184
+ ...SKILLS.map((skill) => rm(resolve(root, ".agents/skills", skill), {
179
185
  force: true,
180
186
  recursive: true
181
- })
187
+ }))
182
188
  ]);
183
189
  await Promise.all([
184
- cp(new URL("../scaffold/.agents/skills/hitch-applets", import.meta.url), skillTarget, { recursive: true }),
190
+ ...SKILLS.map((skill) => cp(new URL(`../scaffold/.agents/skills/${skill}`, import.meta.url), resolve(root, ".agents/skills", skill), { recursive: true })),
185
191
  writeFile(resolve(root, "package.json"), `${JSON.stringify(workspacePackage(config.org), null, 2)}\n`),
186
192
  writeFile(resolve(root, "pnpm-workspace.yaml"), workspaceFile(resolvedCli)),
187
- existsSync(deployWorkflowTarget) ? void 0 : cp(new URL("../scaffold/.github/workflows/hitch.yml", import.meta.url), deployWorkflowTarget),
193
+ config.githubWorkflow === false || existsSync(deployWorkflowTarget) ? void 0 : cp(new URL("../scaffold/.github/workflows/hitch.yml", import.meta.url), deployWorkflowTarget),
188
194
  writeFile(resolve(root, ".node-version"), "24\n"),
189
195
  writeGitignore(root),
190
196
  writeFile(resolve(root, "AGENTS.md"), agents)
@@ -336,17 +342,17 @@ export default defineConfig({
336
342
  hasClient ? writeFile(resolve(root, "components.json"), await readFile(new URL("../scaffold/applet/components.json", import.meta.url), "utf8")) : void 0
337
343
  ]);
338
344
  }
339
- async function prepareAppletProject(appletRoot = process.cwd()) {
340
- const definition = await loadAppletSourceDefinition(appletRoot);
341
- const workspaceRoot = dirname(dirname(resolve(appletRoot)));
345
+ async function prepareAppletProjects(workspaceRoot, appletRoots) {
346
+ const definitions = await Promise.all(appletRoots.map((root) => loadAppletSourceDefinition(root)));
342
347
  const workspace = readWorkspaceConfig(workspaceRoot);
343
- if (workspace === void 0) throw new Error(`No Hitch workspace found for ${appletRoot}.`);
348
+ if (workspace === void 0) throw new Error(`No Hitch workspace found at ${workspaceRoot}.`);
344
349
  const cli = await loadCliManifest({ allowDevelopment: true });
345
- await Promise.all([cli === void 0 ? void 0 : writeWorkspaceSupport(workspaceRoot, workspace, cli), writeAppletSupport(appletRoot, definition)]);
346
- return {
347
- definition,
348
- workspaceRoot
349
- };
350
+ await Promise.all([cli === void 0 ? void 0 : writeWorkspaceSupport(workspaceRoot, workspace, cli), ...appletRoots.map((root, index) => writeAppletSupport(root, definitions[index]))]);
351
+ }
352
+ async function prepareAppletProject(appletRoot = process.cwd()) {
353
+ const workspaceRoot = dirname(dirname(resolve(appletRoot)));
354
+ await prepareAppletProjects(workspaceRoot, [appletRoot]);
355
+ return workspaceRoot;
350
356
  }
351
357
  //#endregion
352
- export { writeWorkspaceSupport as a, writeAppletSupport as i, loadCliManifest as n, prepareAppletProject as r, assertWorkspaceCli as t };
358
+ export { writeAppletSupport as a, prepareAppletProjects as i, loadCliManifest as n, writeWorkspaceSupport as o, prepareAppletProject as r, assertWorkspaceCli as t };
@@ -0,0 +1,29 @@
1
+ import { Writable } from "node:stream";
2
+ import { createInterface } from "node:readline";
3
+ //#region src/prompt.ts
4
+ function question(prompt, hidden = false) {
5
+ return new Promise((resolveAnswer, rejectAnswer) => {
6
+ let muted = false;
7
+ const output = hidden ? new Writable({ write(chunk, encoding, callback) {
8
+ if (!muted) process.stdout.write(chunk, encoding);
9
+ callback();
10
+ } }) : process.stdout;
11
+ const readline = createInterface({
12
+ input: process.stdin,
13
+ output,
14
+ terminal: true
15
+ });
16
+ readline.once("error", rejectAnswer);
17
+ if (hidden) {
18
+ process.stdout.write(prompt);
19
+ muted = true;
20
+ }
21
+ readline.question(hidden ? "" : prompt, (answer) => {
22
+ readline.close();
23
+ if (hidden) process.stdout.write("\n");
24
+ resolveAnswer(answer);
25
+ });
26
+ });
27
+ }
28
+ //#endregion
29
+ export { question as t };
package/dist/react.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as UploadedHitchFile } from "./upload-YbRKEqR6.js";
1
+ import { a as UploadedHitchFile } from "./upload-DKZzz5kW.js";
2
2
  import { ReactElement } from "react";
3
3
  import "@tiptap/core";
4
4
  //#region src/react/markdown.d.ts