@hitch42/applet 0.1.1-beta.1 → 0.1.1-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_internal/client.js +120 -11
- package/dist/_internal/log-context.d.ts +34 -0
- package/dist/_internal/log-context.js +2 -0
- package/dist/_internal/server.d.ts +14 -1
- package/dist/_internal/server.js +122 -118
- package/dist/applet.js +53 -29
- package/dist/build-Bh_S5BUv.js +2 -0
- package/dist/{build-Rk3xDZV7.js → build-CEfFoIZZ.js} +30 -14
- package/dist/ci-BKw14X2h.js +69 -0
- package/dist/client.d.ts +3 -3
- package/dist/{contract-DMrpbaLJ.d.ts → contract-CsUpTBe0.d.ts} +1 -1
- package/dist/{deploy-D3BGDqgC.js → deploy-wGYjwXrx.js} +249 -35
- package/dist/email-DBTVhNB_.js +62 -0
- package/dist/{generate-CH0VQmUi.js → generate-BEIYs17x.js} +79 -25
- package/dist/generate-Dox-OYt6.js +2 -0
- package/dist/headers-DkNr9MLJ.js +17 -0
- package/dist/index.d.ts +123 -11
- package/dist/index.js +142 -26
- package/dist/{init-BS1Y-eNL.js → init-6oGPM46R.js} +17 -18
- package/dist/load-config-xEdTXs0y.js +27 -0
- package/dist/log-context-zu8U9Sjm.js +73 -0
- package/dist/login-CUx3TmFQ.js +12 -0
- package/dist/{logs-m00pzr_O.js → logs-DSjuEN0Q.js} +20 -22
- package/dist/{manifest-BQCAxATS.d.ts → manifest-C6_F4bL8.d.ts} +9 -0
- package/dist/{manifest-DyoJ1MIL.js → manifest-CJSL9GuC.js} +25 -3
- package/dist/me-BW7Paary.js +32 -0
- package/dist/{project-CxN-Dtc7.js → project-BRZGd6xq.js} +227 -34
- package/dist/prompt-ChS-grYO.js +29 -0
- package/dist/query-cache-CXmAyLv3.js +82 -0
- package/dist/react.d.ts +3 -2
- package/dist/react.js +98 -80
- package/dist/schedules-C8_Svr4h.js +42 -0
- package/dist/server.d.ts +9 -4
- package/dist/server.js +29 -8
- package/dist/telephony-protocol-D-nf3Gca.d.ts +76 -0
- package/dist/telephony.d.ts +97 -0
- package/dist/telephony.js +726 -0
- package/dist/{upload-YbRKEqR6.d.ts → upload-DKZzz5kW.d.ts} +6 -6
- package/dist/{variables-CP7Ce3Np.js → variables-DT5RyHdH.js} +14 -39
- package/dist/vite.d.ts +3 -60
- package/dist/vite.js +503 -34
- package/dist/workflow-engine-BOTzURKM.js +111 -0
- package/dist/{auth-DaVK0k5R.js → workspace-D0dnnlxL.js} +75 -40
- package/package.json +19 -6
- package/scaffold/.agents/skills/hitch-applets/SKILL.md +60 -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 +29 -2
- package/scaffold/.agents/skills/hitch-applets/references/markdown.md +2 -0
- package/scaffold/.agents/skills/hitch-applets/references/performance.md +74 -0
- package/scaffold/.agents/skills/hitch-applets/references/records.md +32 -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 +52 -0
- package/scaffold/.agents/skills/hitch-data/references/attributes.md +127 -0
- package/scaffold/.agents/skills/hitch-data/references/limits.md +64 -0
- package/scaffold/.agents/skills/hitch-theory/SKILL.md +151 -0
- package/scaffold/.agents/skills/react-best-practices/SKILL.md +127 -0
- package/scaffold/.agents/skills/react-best-practices/rules/advanced-effect-event-deps.md +50 -0
- package/scaffold/.agents/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/scaffold/.agents/skills/react-best-practices/rules/advanced-init-once.md +42 -0
- package/scaffold/.agents/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/scaffold/.agents/skills/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/scaffold/.agents/skills/react-best-practices/rules/async-defer-await.md +82 -0
- package/scaffold/.agents/skills/react-best-practices/rules/async-dependencies.md +48 -0
- package/scaffold/.agents/skills/react-best-practices/rules/async-parallel.md +24 -0
- package/scaffold/.agents/skills/react-best-practices/rules/bundle-analyzable-paths.md +42 -0
- package/scaffold/.agents/skills/react-best-practices/rules/bundle-barrel-imports.md +39 -0
- package/scaffold/.agents/skills/react-best-practices/rules/bundle-conditional.md +35 -0
- package/scaffold/.agents/skills/react-best-practices/rules/bundle-defer-third-party.md +46 -0
- package/scaffold/.agents/skills/react-best-practices/rules/bundle-dynamic-imports.md +38 -0
- package/scaffold/.agents/skills/react-best-practices/rules/bundle-preload.md +40 -0
- package/scaffold/.agents/skills/react-best-practices/rules/client-event-listeners.md +78 -0
- package/scaffold/.agents/skills/react-best-practices/rules/client-localstorage-schema.md +74 -0
- package/scaffold/.agents/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-batch-dom-css.md +110 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-cache-function-results.md +58 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-cache-storage.md +56 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-flatmap-filter.md +51 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-length-check-first.md +50 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-request-idle-callback.md +104 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/scaffold/.agents/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +38 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-conditional-render.md +32 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-hoist-jsx.md +36 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-resource-hints.md +81 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-script-defer-async.md +36 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rendering-usetransition-loading.md +43 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-functional-setstate.md +77 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-lazy-state-init.md +56 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo-with-default-value.md +36 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-no-inline-components.md +75 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/scaffold/.agents/skills/tanstack-query/SKILL.md +136 -0
- package/scaffold/.agents/skills/tanstack-query/references/compositions/automatic-invalidation-after-mutations.md +124 -0
- package/scaffold/.agents/skills/tanstack-query/references/compositions/broadcast-realtime-and-multi-tab-synchronization.md +150 -0
- package/scaffold/.agents/skills/tanstack-query/references/compositions/compose-query-with-tanstack-router-and-start.md +248 -0
- package/scaffold/.agents/skills/tanstack-query/references/compositions/enforce-query-best-practices-with-eslint.md +167 -0
- package/scaffold/.agents/skills/tanstack-query/references/compositions/persist-offline-and-restore-caches.md +181 -0
- package/scaffold/.agents/skills/tanstack-query/references/compositions/query-data-and-forms.md +156 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/build-query-abstractions.md +130 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/cancel-queries-and-consume-abort-signals.md +176 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/concurrent-optimistic-updates.md +135 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/coordinate-query-execution.md +188 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/design-query-keys-and-options.md +182 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/fetch-and-observe-queries.md +193 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/implement-optimistic-updates-and-cache-writes.md +168 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/paginate-and-build-infinite-queries.md +188 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/seed-placeholder-select-and-transform-data.md +188 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/selectors-and-derived-state.md +145 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/tune-defaults-freshness-retries-and-refetching.md +172 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/understand-query-internals-and-observers.md +104 -0
- package/scaffold/.agents/skills/tanstack-query/references/core/write-mutations-and-invalidate-related-queries.md +183 -0
- package/scaffold/.agents/skills/tanstack-query/references/framework/debug-with-devtools.md +169 -0
- package/scaffold/.agents/skills/tanstack-query/references/framework/handle-status-and-errors.md +119 -0
- package/scaffold/.agents/skills/tanstack-query/references/framework/shape-data-and-render-efficiently.md +184 -0
- package/scaffold/.agents/skills/tanstack-query/references/framework/use-framework-adapter-reactivity.md +185 -0
- package/scaffold/.agents/skills/tanstack-query/references/framework/use-suspense-and-error-boundaries.md +208 -0
- package/scaffold/.agents/skills/tanstack-query/references/lifecycle/migrate-major-versions-and-codemods.md +169 -0
- package/scaffold/.agents/skills/tanstack-query/references/lifecycle/prefetch-and-remove-request-waterfalls.md +228 -0
- package/scaffold/.agents/skills/tanstack-query/references/lifecycle/setup-query-client-and-providers.md +161 -0
- package/scaffold/.agents/skills/tanstack-query/references/lifecycle/ssr-hydration-and-streaming.md +209 -0
- package/scaffold/.agents/skills/tanstack-query/references/lifecycle/test-query-code.md +160 -0
- package/scaffold/.agents/skills/tanstack-router/SKILL.md +134 -0
- package/scaffold/.agents/skills/tanstack-router/references/compositions/router-query.md +412 -0
- package/scaffold/.agents/skills/tanstack-router/references/react-router.md +495 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/auth-and-guards.md +495 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/code-splitting.md +318 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/data-loading.md +490 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/index.md +158 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/navigation.md +433 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/not-found-and-errors.md +436 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/path-params.md +383 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/search-params.md +343 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/ssr.md +462 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-core/type-safety.md +493 -0
- package/scaffold/.agents/skills/tanstack-router/references/router-plugin.md +250 -0
- package/scaffold/.agents/skills/tanstack-router/references/virtual-file-routes.md +215 -0
- package/scaffold/.agents/skills/web-design-guidelines/SKILL.md +184 -0
- package/scaffold/.github/workflows/hitch.yml +15 -0
- package/scaffold/AGENTS.md +2 -2
- package/scaffold/applet/src/client/components/ui/alert.tsx +1 -1
- package/scaffold/applet/src/client/components/ui/button.tsx +1 -1
- package/scaffold/applet/src/client/components/ui/checkbox.tsx +1 -1
- package/scaffold/applet/src/client/components/ui/dialog.tsx +2 -2
- package/scaffold/applet/src/client/components/ui/dropdown-menu.tsx +2 -2
- package/scaffold/applet/src/client/components/ui/input-group.tsx +2 -2
- package/scaffold/applet/src/client/components/ui/select.tsx +2 -2
- package/scaffold/applet/src/client/components/ui/sheet.tsx +2 -2
- package/scaffold/applet/src/client/components/ui/spinner.tsx +2 -1
- package/scaffold/applet/src/client/components/ui/tabs.tsx +1 -1
- package/scaffold/applet/src/client/lib/utils.ts +1 -6
- package/scaffold/applet/src/client/styles/globals.css +2 -0
- package/dist/build-CEku1lyb.js +0 -2
- package/dist/generate-6Nbt7uii.js +0 -2
- package/dist/load-config-BnxocLAQ.js +0 -56
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { r as appletSourceDefinitionSchema } from "./manifest-CJSL9GuC.js";
|
|
2
|
+
import { t as resolveWorkspaceOrg } from "./workspace-D0dnnlxL.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,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 };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { a as loginWithDevice, f as resolveInstanceUrl, o as AuthenticationError, r as findWorkspaceConfig } from "./workspace-D0dnnlxL.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-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,
|
|
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
|
|
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
|
-
|
|
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);
|
|
@@ -32,6 +32,13 @@ 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
|
+
read?: boolean;
|
|
39
|
+
send?: boolean;
|
|
40
|
+
events?: readonly "message.received"[];
|
|
41
|
+
};
|
|
35
42
|
schedules?: readonly {
|
|
36
43
|
code: string;
|
|
37
44
|
name: string;
|
|
@@ -48,6 +55,8 @@ interface AppletManifest {
|
|
|
48
55
|
canDelete: boolean;
|
|
49
56
|
readOnly: readonly string[];
|
|
50
57
|
readWrite: readonly string[];
|
|
58
|
+
optional?: boolean;
|
|
59
|
+
optionalAttributes?: readonly string[];
|
|
51
60
|
}[];
|
|
52
61
|
}
|
|
53
62
|
type AppletDefinition = Omit<AppletManifest, "org">;
|
|
@@ -31,13 +31,22 @@ const appletManifestObjectSchema = z.strictObject({
|
|
|
31
31
|
canCreate: z.boolean(),
|
|
32
32
|
canDelete: z.boolean(),
|
|
33
33
|
readOnly: attributeCodesSchema,
|
|
34
|
-
readWrite: attributeCodesSchema
|
|
34
|
+
readWrite: attributeCodesSchema,
|
|
35
|
+
optional: z.boolean().optional(),
|
|
36
|
+
optionalAttributes: attributeCodesSchema.optional()
|
|
35
37
|
}).superRefine((object, context) => {
|
|
36
38
|
const overlap = object.readOnly.find((code) => object.readWrite.includes(code));
|
|
37
39
|
if (overlap !== void 0) context.addIssue({
|
|
38
40
|
code: "custom",
|
|
39
41
|
message: `readOnly and readWrite both contain "${overlap}".`
|
|
40
42
|
});
|
|
43
|
+
object.optionalAttributes?.forEach((code, index) => {
|
|
44
|
+
if (!object.readOnly.includes(code) && !object.readWrite.includes(code)) context.addIssue({
|
|
45
|
+
code: "custom",
|
|
46
|
+
message: `optionalAttributes contains undeclared attribute code "${code}".`,
|
|
47
|
+
path: ["optionalAttributes", index]
|
|
48
|
+
});
|
|
49
|
+
});
|
|
41
50
|
});
|
|
42
51
|
const appletManifestObjectsSchema = z.array(appletManifestObjectSchema).readonly();
|
|
43
52
|
const appletManifestSchedulesSchema = z.array(z.strictObject({
|
|
@@ -63,6 +72,12 @@ const appletManifestShape = {
|
|
|
63
72
|
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
73
|
name: nameSchema,
|
|
65
74
|
code: codeSchema,
|
|
75
|
+
requiresChangeset: z.uuid().optional(),
|
|
76
|
+
telephony: z.strictObject({
|
|
77
|
+
read: z.boolean().optional(),
|
|
78
|
+
send: z.boolean().optional(),
|
|
79
|
+
events: z.array(z.literal("message.received")).min(1).refine((events) => new Set(events).size === events.length).readonly().optional()
|
|
80
|
+
}).refine((telephony) => telephony.events === void 0 || telephony.read === true, "telephony.events needs telephony.read").optional(),
|
|
66
81
|
schedules: appletManifestSchedulesSchema.optional(),
|
|
67
82
|
variables: appletManifestVariablesSchema.optional(),
|
|
68
83
|
objects: appletManifestObjectsSchema
|
|
@@ -94,12 +109,15 @@ const appletManifestSchema = z.strictObject(appletManifestShape).superRefine(che
|
|
|
94
109
|
const appletDefinitionSchema = z.strictObject({
|
|
95
110
|
name: appletManifestShape.name,
|
|
96
111
|
code: appletManifestShape.code,
|
|
112
|
+
requiresChangeset: appletManifestShape.requiresChangeset,
|
|
113
|
+
telephony: appletManifestShape.telephony,
|
|
97
114
|
schedules: appletManifestShape.schedules,
|
|
98
115
|
variables: appletManifestShape.variables,
|
|
99
116
|
objects: appletManifestShape.objects
|
|
100
117
|
}).superRefine(checkDuplicateCodes);
|
|
101
118
|
const packageVersionsSchema = z.record(z.string().min(1), z.string().min(1)).readonly();
|
|
102
119
|
const RESERVED_APPLET_PACKAGES = /* @__PURE__ */ new Set([
|
|
120
|
+
"@fontsource-variable/geist-mono",
|
|
103
121
|
"@fontsource-variable/inter",
|
|
104
122
|
"@hitch42/applet",
|
|
105
123
|
"@orpc/contract",
|
|
@@ -119,14 +137,16 @@ const RESERVED_APPLET_PACKAGES = /* @__PURE__ */ new Set([
|
|
|
119
137
|
"@types/react",
|
|
120
138
|
"@types/react-dom",
|
|
121
139
|
"class-variance-authority",
|
|
122
|
-
"
|
|
140
|
+
"cn",
|
|
123
141
|
"lucide-react",
|
|
142
|
+
"oxfmt",
|
|
143
|
+
"oxlint",
|
|
144
|
+
"oxlint-tsgolint",
|
|
124
145
|
"react",
|
|
125
146
|
"react-aria-components",
|
|
126
147
|
"react-dom",
|
|
127
148
|
"shadcn",
|
|
128
149
|
"streamdown",
|
|
129
|
-
"tailwind-merge",
|
|
130
150
|
"tailwindcss",
|
|
131
151
|
"tw-animate-css",
|
|
132
152
|
"typescript",
|
|
@@ -161,6 +181,8 @@ const checkSourcePackages = (manifest, context) => {
|
|
|
161
181
|
const appletSourceDefinitionSchema = z.strictObject({
|
|
162
182
|
name: appletManifestShape.name,
|
|
163
183
|
code: appletManifestShape.code,
|
|
184
|
+
requiresChangeset: appletManifestShape.requiresChangeset,
|
|
185
|
+
telephony: appletManifestShape.telephony,
|
|
164
186
|
schedules: appletManifestShape.schedules,
|
|
165
187
|
variables: appletManifestShape.variables,
|
|
166
188
|
objects: appletManifestShape.objects,
|
|
@@ -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 };
|