@hitch42/applet 0.1.0-beta.2 → 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.
- package/dist/_internal/server.d.ts +14 -1
- package/dist/_internal/server.js +23 -74
- package/dist/applet.js +53 -29
- package/dist/build-BfbTbt_r.js +2 -0
- package/dist/{build-BRkmrUcj.js → build-CAb26kMY.js} +30 -14
- package/dist/ci-5qWl7lT3.js +68 -0
- package/dist/client.d.ts +3 -3
- package/dist/{contract-DMrpbaLJ.d.ts → contract-rP_eV9PK.d.ts} +1 -1
- package/dist/{deploy-DKB-Tef7.js → deploy-D_OFJ6-Q.js} +193 -30
- package/dist/email-DBTVhNB_.js +62 -0
- package/dist/generate-BgepN4-b.js +2 -0
- package/dist/{generate-BFmIzHaR.js → generate-CBPnHoqX.js} +40 -18
- package/dist/index.d.ts +122 -11
- package/dist/index.js +141 -26
- package/dist/{init-CQRsnd3i.js → init-tfzwuYnk.js} +12 -8
- package/dist/load-config-BYSxDVAl.js +27 -0
- package/dist/login-C7RKmmTe.js +12 -0
- package/dist/{logs-m00pzr_O.js → logs-DgjgAxj2.js} +3 -3
- package/dist/{manifest-DyoJ1MIL.js → manifest-Bp87Uz0a.js} +6 -0
- package/dist/{manifest-BQCAxATS.d.ts → manifest-DD_SGkS6.d.ts} +5 -0
- package/dist/me-BW7Paary.js +32 -0
- package/dist/{project-CEmDnlKa.js → project-D6XHllmC.js} +32 -20
- package/dist/prompt-ChS-grYO.js +29 -0
- package/dist/react.d.ts +1 -1
- package/dist/react.js +40 -42
- package/dist/schedules-dhU1yyFr.js +42 -0
- package/dist/server.d.ts +3 -3
- package/dist/telephony-protocol-D-nf3Gca.d.ts +76 -0
- package/dist/telephony.d.ts +77 -0
- package/dist/telephony.js +607 -0
- package/dist/{upload-YbRKEqR6.d.ts → upload-DKZzz5kW.d.ts} +6 -6
- package/dist/{variables-CP7Ce3Np.js → variables-Bwnr7oxf.js} +3 -28
- package/dist/vite.d.ts +1 -1
- package/dist/vite.js +464 -30
- package/dist/workflow-engine-MogejNfF.js +117 -0
- package/dist/{auth-DaVK0k5R.js → workspace-XVtM12ZC.js} +44 -4
- package/package.json +7 -1
- package/scaffold/.agents/skills/hitch-applets/SKILL.md +34 -15
- package/scaffold/.agents/skills/hitch-applets/references/email-tracking.md +49 -0
- package/scaffold/.agents/skills/hitch-applets/references/files.md +3 -3
- package/scaffold/.agents/skills/hitch-applets/references/manifest.md +21 -2
- package/scaffold/.agents/skills/hitch-applets/references/performance.md +74 -0
- package/scaffold/.agents/skills/hitch-applets/references/records.md +30 -8
- package/scaffold/.agents/skills/hitch-applets/references/schedules.md +7 -2
- package/scaffold/.agents/skills/hitch-applets/references/server.md +0 -3
- package/scaffold/.agents/skills/hitch-applets/references/workflows.md +11 -3
- package/scaffold/.agents/skills/hitch-cli/SKILL.md +129 -0
- package/scaffold/.agents/skills/hitch-data/SKILL.md +51 -0
- package/scaffold/.agents/skills/hitch-data/references/attributes.md +121 -0
- package/scaffold/.agents/skills/hitch-data/references/limits.md +64 -0
- package/scaffold/.agents/skills/hitch-theory/SKILL.md +150 -0
- package/scaffold/.github/workflows/hitch.yml +15 -0
- package/dist/build-CMluoV6q.js +0 -2
- package/dist/generate-CefnB-bp.js +0 -2
- package/dist/load-config-BnxocLAQ.js +0 -56
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
|
|
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/
|
|
82
|
-
const
|
|
83
|
+
//#region src/hitch/telephony.ts
|
|
84
|
+
const hitchPhoneNumberSchema = z.object({
|
|
83
85
|
id: z.uuid(),
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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-
|
|
2
|
-
import {
|
|
3
|
-
import { n as runGenerate } from "./generate-
|
|
4
|
-
import { n as loadAppletSourceDefinition
|
|
5
|
-
import { a as
|
|
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
|
|
27
|
-
if (
|
|
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-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
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 {
|
|
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
|
|
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
|
|
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
|
-
|
|
138
|
+
${SKILLS.map((skill) => `/.agents/skills/${skill}/`).join("\n")}
|
|
132
139
|
/.node-version
|
|
133
140
|
/AGENTS.md
|
|
134
141
|
/CLAUDE.md
|
|
@@ -169,16 +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
|
|
179
|
+
const deployWorkflowTarget = resolve(root, ".github/workflows/hitch.yml");
|
|
173
180
|
const agents = await readFile(new URL("../scaffold/AGENTS.md", import.meta.url), "utf8");
|
|
174
|
-
await Promise.all([mkdir(resolve(root, ".agents/skills"), { recursive: true }), rm(skillTarget, {
|
|
175
|
-
force: true,
|
|
176
|
-
recursive: true
|
|
177
|
-
})]);
|
|
178
181
|
await Promise.all([
|
|
179
|
-
|
|
182
|
+
mkdir(resolve(root, ".agents/skills"), { recursive: true }),
|
|
183
|
+
config.githubWorkflow === false ? void 0 : mkdir(resolve(root, ".github/workflows"), { recursive: true }),
|
|
184
|
+
...SKILLS.map((skill) => rm(resolve(root, ".agents/skills", skill), {
|
|
185
|
+
force: true,
|
|
186
|
+
recursive: true
|
|
187
|
+
}))
|
|
188
|
+
]);
|
|
189
|
+
await Promise.all([
|
|
190
|
+
...SKILLS.map((skill) => cp(new URL(`../scaffold/.agents/skills/${skill}`, import.meta.url), resolve(root, ".agents/skills", skill), { recursive: true })),
|
|
180
191
|
writeFile(resolve(root, "package.json"), `${JSON.stringify(workspacePackage(config.org), null, 2)}\n`),
|
|
181
192
|
writeFile(resolve(root, "pnpm-workspace.yaml"), workspaceFile(resolvedCli)),
|
|
193
|
+
config.githubWorkflow === false || existsSync(deployWorkflowTarget) ? void 0 : cp(new URL("../scaffold/.github/workflows/hitch.yml", import.meta.url), deployWorkflowTarget),
|
|
182
194
|
writeFile(resolve(root, ".node-version"), "24\n"),
|
|
183
195
|
writeGitignore(root),
|
|
184
196
|
writeFile(resolve(root, "AGENTS.md"), agents)
|
|
@@ -330,17 +342,17 @@ export default defineConfig({
|
|
|
330
342
|
hasClient ? writeFile(resolve(root, "components.json"), await readFile(new URL("../scaffold/applet/components.json", import.meta.url), "utf8")) : void 0
|
|
331
343
|
]);
|
|
332
344
|
}
|
|
333
|
-
async function
|
|
334
|
-
const
|
|
335
|
-
const workspaceRoot = dirname(dirname(resolve(appletRoot)));
|
|
345
|
+
async function prepareAppletProjects(workspaceRoot, appletRoots) {
|
|
346
|
+
const definitions = await Promise.all(appletRoots.map((root) => loadAppletSourceDefinition(root)));
|
|
336
347
|
const workspace = readWorkspaceConfig(workspaceRoot);
|
|
337
|
-
if (workspace === void 0) throw new Error(`No Hitch workspace found
|
|
348
|
+
if (workspace === void 0) throw new Error(`No Hitch workspace found at ${workspaceRoot}.`);
|
|
338
349
|
const cli = await loadCliManifest({ allowDevelopment: true });
|
|
339
|
-
await Promise.all([cli === void 0 ? void 0 : writeWorkspaceSupport(workspaceRoot, workspace, cli), writeAppletSupport(
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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;
|
|
344
356
|
}
|
|
345
357
|
//#endregion
|
|
346
|
-
export {
|
|
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