@hitch42/applet 0.1.1-beta.8 → 0.1.1-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +1 -1
- package/dist/_internal/server.js +112 -57
- package/dist/applet.js +12 -12
- package/dist/build-Bh_S5BUv.js +2 -0
- package/dist/{build-DANx9Hgg.js → build-CEfFoIZZ.js} +1 -1
- package/dist/{ci-5qWl7lT3.js → ci-BKw14X2h.js} +14 -13
- package/dist/client.d.ts +3 -3
- package/dist/{contract-rP_eV9PK.d.ts → contract-CsUpTBe0.d.ts} +1 -1
- package/dist/{deploy-MQWLG2EA.js → deploy-wGYjwXrx.js} +139 -88
- package/dist/{generate-BxYHdoAQ.js → generate-BEIYs17x.js} +65 -28
- package/dist/generate-Dox-OYt6.js +2 -0
- package/dist/headers-DkNr9MLJ.js +17 -0
- package/dist/index.d.ts +23 -22
- package/dist/index.js +2 -1
- package/dist/{init-jDEgYIXg.js → init-6oGPM46R.js} +15 -17
- package/dist/{load-config-BYSxDVAl.js → load-config-xEdTXs0y.js} +2 -2
- package/dist/log-context-zu8U9Sjm.js +73 -0
- package/dist/{login-C7RKmmTe.js → login-CUx3TmFQ.js} +1 -1
- package/dist/{logs-DgjgAxj2.js → logs-DSjuEN0Q.js} +20 -22
- package/dist/{manifest-DD_SGkS6.d.ts → manifest-C6_F4bL8.d.ts} +5 -1
- package/dist/{manifest-Bp87Uz0a.js → manifest-CJSL9GuC.js} +20 -4
- package/dist/{project-CbYPtpPq.js → project-BRZGd6xq.js} +199 -18
- package/dist/query-cache-CXmAyLv3.js +82 -0
- package/dist/react.d.ts +3 -2
- package/dist/react.js +98 -80
- package/dist/{schedules-dhU1yyFr.js → schedules-C8_Svr4h.js} +1 -1
- package/dist/server.d.ts +9 -4
- package/dist/server.js +29 -8
- package/dist/{telephony-protocol-DRgiYjqQ.d.ts → telephony-protocol-D-nf3Gca.d.ts} +15 -13
- package/dist/telephony.d.ts +24 -4
- package/dist/telephony.js +135 -16
- package/dist/{upload-YbRKEqR6.d.ts → upload-DKZzz5kW.d.ts} +6 -6
- package/dist/{variables-Bwnr7oxf.js → variables-DT5RyHdH.js} +13 -13
- package/dist/vite.d.ts +3 -60
- package/dist/vite.js +50 -15
- package/dist/{workflow-engine-MogejNfF.js → workflow-engine-BOTzURKM.js} +1 -7
- package/dist/{workspace-XVtM12ZC.js → workspace-D0dnnlxL.js} +33 -38
- package/package.json +13 -5
- package/scaffold/.agents/skills/hitch-applets/SKILL.md +30 -4
- package/scaffold/.agents/skills/hitch-applets/references/manifest.md +8 -0
- package/scaffold/.agents/skills/hitch-applets/references/markdown.md +2 -0
- package/scaffold/.agents/skills/hitch-applets/references/records.md +23 -1
- package/scaffold/.agents/skills/hitch-data/SKILL.md +2 -1
- package/scaffold/.agents/skills/hitch-data/references/attributes.md +7 -1
- package/scaffold/.agents/skills/hitch-data/references/limits.md +13 -13
- package/scaffold/.agents/skills/hitch-theory/SKILL.md +3 -2
- 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 +1 -1
- 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-CFCKKMn7.js +0 -2
- package/dist/generate-CQ07Hdpo.js +0 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { a as ORG_CODE_PATTERN, i as APPLET_CODE_PATTERN } from "./manifest-
|
|
2
|
-
import { d as
|
|
3
|
-
import { n as runGenerate } from "./generate-
|
|
4
|
-
import { n as
|
|
5
|
-
import {
|
|
1
|
+
import { a as ORG_CODE_PATTERN, i as APPLET_CODE_PATTERN } from "./manifest-CJSL9GuC.js";
|
|
2
|
+
import { d as resolveAuthForOrg, f as resolveInstanceUrl, i as readWorkspaceConfig } from "./workspace-D0dnnlxL.js";
|
|
3
|
+
import { n as runGenerate } from "./generate-BEIYs17x.js";
|
|
4
|
+
import { a as writeAppletSupport, n as loadCliManifest, o as writeWorkspaceSupport, t as assertWorkspaceCli } from "./project-BRZGd6xq.js";
|
|
5
|
+
import { n as loadAppletSourceDefinition } from "./load-config-xEdTXs0y.js";
|
|
6
6
|
import { access, cp, mkdir, readdir, writeFile } from "node:fs/promises";
|
|
7
7
|
import { relative, resolve } from "node:path";
|
|
8
8
|
import { spawn } from "node:child_process";
|
|
@@ -23,8 +23,11 @@ async function assertTargetIsAvailable(paths, targetType) {
|
|
|
23
23
|
if (existingPath !== void 0) throw new Error(`Refusing to initialize ${targetType}: ${existingPath} already exists.`);
|
|
24
24
|
}
|
|
25
25
|
async function assertDirectoryIsEmpty(path) {
|
|
26
|
-
const
|
|
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";
|
|
@@ -92,22 +95,17 @@ async function runGit(cwd, args) {
|
|
|
92
95
|
});
|
|
93
96
|
});
|
|
94
97
|
}
|
|
95
|
-
async function generateAppletFiles(target, org,
|
|
98
|
+
async function generateAppletFiles(target, org, installResult) {
|
|
96
99
|
if (installResult === "failed") return false;
|
|
97
100
|
const previousCwd = process.cwd();
|
|
98
101
|
try {
|
|
99
|
-
const instanceUrl = await resolveInstanceUrl(
|
|
100
|
-
if (await resolveAuthForOrg(instanceUrl, org
|
|
102
|
+
const instanceUrl = await resolveInstanceUrl();
|
|
103
|
+
if (await resolveAuthForOrg(instanceUrl, org) === void 0) {
|
|
101
104
|
console.log("Not logged in. Run applet generate to pull the organization's generated files; it will prompt a login.");
|
|
102
105
|
return false;
|
|
103
106
|
}
|
|
104
107
|
process.chdir(target);
|
|
105
|
-
await runGenerate(
|
|
106
|
-
fetch: options.fetch,
|
|
107
|
-
login: options.login,
|
|
108
|
-
stdinIsTTY: options.stdinIsTTY,
|
|
109
|
-
store: options.store
|
|
110
|
-
});
|
|
108
|
+
await runGenerate();
|
|
111
109
|
return true;
|
|
112
110
|
} catch (error) {
|
|
113
111
|
console.warn(`Generation skipped: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -228,7 +226,7 @@ export default { router };
|
|
|
228
226
|
]);
|
|
229
227
|
await Promise.all([writeAppletSupport(appletTarget, definition), cli === void 0 ? void 0 : writeWorkspaceSupport(workspaceRoot, config, cli)]);
|
|
230
228
|
const installResult = await installDependencies(workspaceRoot, options.install ?? true);
|
|
231
|
-
const generateSucceeded = await generateAppletFiles(appletTarget, config.org,
|
|
229
|
+
const generateSucceeded = await generateAppletFiles(appletTarget, config.org, installResult);
|
|
232
230
|
const relativeTarget = relative(workspaceRoot, appletTarget);
|
|
233
231
|
const nextSteps = [
|
|
234
232
|
...installResult === "succeeded" ? [`cd ${JSON.stringify(relativeTarget)}`] : ["pnpm install", `cd ${JSON.stringify(relativeTarget)}`],
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { r as appletSourceDefinitionSchema } from "./manifest-
|
|
2
|
-
import { t as resolveWorkspaceOrg } from "./workspace-
|
|
1
|
+
import { r as appletSourceDefinitionSchema } from "./manifest-CJSL9GuC.js";
|
|
2
|
+
import { t as resolveWorkspaceOrg } from "./workspace-D0dnnlxL.js";
|
|
3
3
|
import { existsSync } from "node:fs";
|
|
4
4
|
import { resolve } from "node:path";
|
|
5
5
|
import { loadConfigFromFile } from "vite";
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { channel } from "node:diagnostics_channel";
|
|
2
|
+
//#region src/server/log-context.ts
|
|
3
|
+
const REQUEST_CONTEXT_CHANNEL = "hitch.request.context";
|
|
4
|
+
const APP_CONTEXT_CHANNEL = "hitch.request.app";
|
|
5
|
+
const isUuid = (value) => typeof value === "string" && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);
|
|
6
|
+
function requestIdFrom(headers) {
|
|
7
|
+
const requestId = headers.get("x-request-id");
|
|
8
|
+
return isUuid(requestId) ? requestId : crypto.randomUUID();
|
|
9
|
+
}
|
|
10
|
+
function publishNote(requestId, fields, channelName = REQUEST_CONTEXT_CHANNEL) {
|
|
11
|
+
const note = Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== void 0));
|
|
12
|
+
if (Object.keys(note).length === 0) return;
|
|
13
|
+
const serialized = JSON.stringify({
|
|
14
|
+
requestId,
|
|
15
|
+
...note
|
|
16
|
+
});
|
|
17
|
+
channel(channelName).publish(serialized.length > 16384 ? {
|
|
18
|
+
requestId,
|
|
19
|
+
noteDropped: true,
|
|
20
|
+
noteBytes: serialized.length,
|
|
21
|
+
noteKeys: Object.keys(note)
|
|
22
|
+
} : {
|
|
23
|
+
requestId,
|
|
24
|
+
...note
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function errorNote(error) {
|
|
28
|
+
return { error: error instanceof Error ? {
|
|
29
|
+
name: error.name,
|
|
30
|
+
message: error.message,
|
|
31
|
+
stack: error.stack?.slice(0, 8192),
|
|
32
|
+
...error.cause instanceof Error && { cause: {
|
|
33
|
+
name: error.cause.name,
|
|
34
|
+
message: error.cause.message
|
|
35
|
+
} }
|
|
36
|
+
} : {
|
|
37
|
+
name: "Error",
|
|
38
|
+
message: String(error)
|
|
39
|
+
} };
|
|
40
|
+
}
|
|
41
|
+
function cloudflareRequestFields(request) {
|
|
42
|
+
const cf = Reflect.get(request, "cf");
|
|
43
|
+
const field = (key) => typeof cf === "object" && cf !== null && key in cf ? Reflect.get(cf, key) : void 0;
|
|
44
|
+
const colo = field("colo");
|
|
45
|
+
const country = field("country");
|
|
46
|
+
const asn = field("asn");
|
|
47
|
+
return {
|
|
48
|
+
cfRay: request.headers.get("cf-ray") ?? void 0,
|
|
49
|
+
traceparent: request.headers.get("traceparent") ?? void 0,
|
|
50
|
+
colo: typeof colo === "string" ? colo : void 0,
|
|
51
|
+
country: typeof country === "string" ? country : void 0,
|
|
52
|
+
asn: typeof asn === "number" ? asn : void 0
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function createNoteLog(initial) {
|
|
56
|
+
const context = { ...initial };
|
|
57
|
+
const log = {
|
|
58
|
+
set(fields) {
|
|
59
|
+
Object.assign(context, fields);
|
|
60
|
+
publishNote(initial.requestId, fields);
|
|
61
|
+
},
|
|
62
|
+
error(error) {
|
|
63
|
+
log.set(errorNote(error));
|
|
64
|
+
},
|
|
65
|
+
getContext() {
|
|
66
|
+
return { ...context };
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
publishNote(initial.requestId, initial);
|
|
70
|
+
return log;
|
|
71
|
+
}
|
|
72
|
+
//#endregion
|
|
73
|
+
export { errorNote as a, requestIdFrom as c, createNoteLog as i, REQUEST_CONTEXT_CHANNEL as n, isUuid as o, cloudflareRequestFields as r, publishNote as s, APP_CONTEXT_CHANNEL as t };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as loginWithDevice,
|
|
1
|
+
import { a as loginWithDevice, f as resolveInstanceUrl, o as AuthenticationError, r as findWorkspaceConfig } from "./workspace-D0dnnlxL.js";
|
|
2
2
|
//#region src/login.ts
|
|
3
3
|
async function runLogin(options) {
|
|
4
4
|
if (process.env.HITCH_API_KEY !== void 0) throw new AuthenticationError("HITCH_API_KEY is set — unset it to manage stored logins.");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { i as APPLET_CODE_PATTERN } from "./manifest-
|
|
2
|
-
import { i as readWorkspaceConfig, n as fetchWithOrgAuth, t as resolveWorkspaceOrg } from "./workspace-
|
|
3
|
-
import { t as loadAppletConfig } from "./load-config-
|
|
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);
|
|
@@ -35,7 +35,9 @@ interface AppletManifest {
|
|
|
35
35
|
/** This code needs the schema as of this changeset. */
|
|
36
36
|
requiresChangeset?: string;
|
|
37
37
|
telephony?: {
|
|
38
|
-
|
|
38
|
+
read?: boolean;
|
|
39
|
+
send?: boolean;
|
|
40
|
+
events?: readonly "message.received"[];
|
|
39
41
|
};
|
|
40
42
|
schedules?: readonly {
|
|
41
43
|
code: string;
|
|
@@ -53,6 +55,8 @@ interface AppletManifest {
|
|
|
53
55
|
canDelete: boolean;
|
|
54
56
|
readOnly: readonly string[];
|
|
55
57
|
readWrite: readonly string[];
|
|
58
|
+
optional?: boolean;
|
|
59
|
+
optionalAttributes?: readonly string[];
|
|
56
60
|
}[];
|
|
57
61
|
}
|
|
58
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({
|
|
@@ -64,7 +73,11 @@ const appletManifestShape = {
|
|
|
64
73
|
name: nameSchema,
|
|
65
74
|
code: codeSchema,
|
|
66
75
|
requiresChangeset: z.uuid().optional(),
|
|
67
|
-
telephony: z.strictObject({
|
|
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(),
|
|
68
81
|
schedules: appletManifestSchedulesSchema.optional(),
|
|
69
82
|
variables: appletManifestVariablesSchema.optional(),
|
|
70
83
|
objects: appletManifestObjectsSchema
|
|
@@ -104,6 +117,7 @@ const appletDefinitionSchema = z.strictObject({
|
|
|
104
117
|
}).superRefine(checkDuplicateCodes);
|
|
105
118
|
const packageVersionsSchema = z.record(z.string().min(1), z.string().min(1)).readonly();
|
|
106
119
|
const RESERVED_APPLET_PACKAGES = /* @__PURE__ */ new Set([
|
|
120
|
+
"@fontsource-variable/geist-mono",
|
|
107
121
|
"@fontsource-variable/inter",
|
|
108
122
|
"@hitch42/applet",
|
|
109
123
|
"@orpc/contract",
|
|
@@ -123,14 +137,16 @@ const RESERVED_APPLET_PACKAGES = /* @__PURE__ */ new Set([
|
|
|
123
137
|
"@types/react",
|
|
124
138
|
"@types/react-dom",
|
|
125
139
|
"class-variance-authority",
|
|
126
|
-
"
|
|
140
|
+
"cn",
|
|
127
141
|
"lucide-react",
|
|
142
|
+
"oxfmt",
|
|
143
|
+
"oxlint",
|
|
144
|
+
"oxlint-tsgolint",
|
|
128
145
|
"react",
|
|
129
146
|
"react-aria-components",
|
|
130
147
|
"react-dom",
|
|
131
148
|
"shadcn",
|
|
132
149
|
"streamdown",
|
|
133
|
-
"tailwind-merge",
|
|
134
150
|
"tailwindcss",
|
|
135
151
|
"tw-animate-css",
|
|
136
152
|
"typescript",
|