@hs-x/cli 0.2.7 → 0.3.6
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/LICENSE +202 -0
- package/README.md +25 -8
- package/dist/audit-interactive.d.ts +29 -0
- package/dist/audit-interactive.d.ts.map +1 -0
- package/dist/audit-interactive.js +156 -0
- package/dist/audit-interactive.js.map +1 -0
- package/dist/bin/hs-x.js.map +1 -1
- package/dist/checkpoint-interactive.d.ts +24 -0
- package/dist/checkpoint-interactive.d.ts.map +1 -0
- package/dist/checkpoint-interactive.js +65 -0
- package/dist/checkpoint-interactive.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +266 -39
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/kit.d.ts +1 -1
- package/dist/cli/kit.d.ts.map +1 -1
- package/dist/cli/kit.js +19 -3
- package/dist/cli/kit.js.map +1 -1
- package/dist/cloudflare-auth.d.ts +8 -0
- package/dist/cloudflare-auth.d.ts.map +1 -1
- package/dist/cloudflare-auth.js +12 -2
- package/dist/cloudflare-auth.js.map +1 -1
- package/dist/cloudflare-oauth-store.d.ts +9 -1
- package/dist/cloudflare-oauth-store.d.ts.map +1 -1
- package/dist/cloudflare-oauth-store.js +23 -4
- package/dist/cloudflare-oauth-store.js.map +1 -1
- package/dist/cloudflare-oauth.d.ts +1 -0
- package/dist/cloudflare-oauth.d.ts.map +1 -1
- package/dist/cloudflare-oauth.js +6 -2
- package/dist/cloudflare-oauth.js.map +1 -1
- package/dist/commands/account.d.ts +28 -13
- package/dist/commands/account.d.ts.map +1 -1
- package/dist/commands/account.js +219 -69
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/api.d.ts.map +1 -1
- package/dist/commands/api.js +7 -11
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +13 -7
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +239 -125
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/control-plane-read.d.ts +71 -10
- package/dist/commands/control-plane-read.d.ts.map +1 -1
- package/dist/commands/control-plane-read.js +1035 -58
- package/dist/commands/control-plane-read.js.map +1 -1
- package/dist/commands/deploy-promote.d.ts +25 -3
- package/dist/commands/deploy-promote.d.ts.map +1 -1
- package/dist/commands/deploy-promote.js +314 -38
- package/dist/commands/deploy-promote.js.map +1 -1
- package/dist/commands/deploy.d.ts +69 -4
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +1512 -276
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts +5 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +502 -107
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.d.ts +14 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +131 -20
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/flags.d.ts +108 -6
- package/dist/commands/flags.d.ts.map +1 -1
- package/dist/commands/flags.js +996 -75
- package/dist/commands/flags.js.map +1 -1
- package/dist/commands/help-command.d.ts +14 -0
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +144 -44
- package/dist/commands/help-command.js.map +1 -1
- package/dist/commands/history.js +14 -10
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/init.d.ts +4 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +98 -17
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/link.d.ts +2 -3
- package/dist/commands/link.d.ts.map +1 -1
- package/dist/commands/link.js +201 -101
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +22 -5
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/migrate.d.ts +37 -17
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +500 -73
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/rollback.d.ts +42 -2
- package/dist/commands/rollback.d.ts.map +1 -1
- package/dist/commands/rollback.js +422 -58
- package/dist/commands/rollback.js.map +1 -1
- package/dist/commands/secrets.d.ts +76 -3
- package/dist/commands/secrets.d.ts.map +1 -1
- package/dist/commands/secrets.js +328 -41
- package/dist/commands/secrets.js.map +1 -1
- package/dist/commands/status.d.ts +13 -2
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +154 -17
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/unlink.d.ts +2 -2
- package/dist/commands/unlink.d.ts.map +1 -1
- package/dist/commands/unlink.js +2 -2
- package/dist/commands/unlink.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +4 -3
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.d.ts +12 -3
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +70 -8
- package/dist/commands/validate.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/control-plane-fetch.d.ts.map +1 -1
- package/dist/control-plane-fetch.js +5 -4
- package/dist/control-plane-fetch.js.map +1 -1
- package/dist/deploy-revision-capture.d.ts +48 -0
- package/dist/deploy-revision-capture.d.ts.map +1 -0
- package/dist/deploy-revision-capture.js +125 -0
- package/dist/deploy-revision-capture.js.map +1 -0
- package/dist/dev/event-bus.d.ts +5 -2
- package/dist/dev/event-bus.d.ts.map +1 -1
- package/dist/dev/event-bus.js +4 -1
- package/dist/dev/event-bus.js.map +1 -1
- package/dist/dev/hubspot-logs-poller.d.ts +35 -0
- package/dist/dev/hubspot-logs-poller.d.ts.map +1 -0
- package/dist/dev/hubspot-logs-poller.js +94 -0
- package/dist/dev/hubspot-logs-poller.js.map +1 -0
- package/dist/dev/invoke.d.ts +9 -1
- package/dist/dev/invoke.d.ts.map +1 -1
- package/dist/dev/invoke.js +69 -20
- package/dist/dev/invoke.js.map +1 -1
- package/dist/dev/keyboard.d.ts +31 -0
- package/dist/dev/keyboard.d.ts.map +1 -0
- package/dist/dev/keyboard.js +143 -0
- package/dist/dev/keyboard.js.map +1 -0
- package/dist/dev/log-server.d.ts +7 -0
- package/dist/dev/log-server.d.ts.map +1 -1
- package/dist/dev/log-server.js +68 -31
- package/dist/dev/log-server.js.map +1 -1
- package/dist/dev/migrated-card.d.ts +17 -0
- package/dist/dev/migrated-card.d.ts.map +1 -0
- package/dist/dev/migrated-card.js +114 -0
- package/dist/dev/migrated-card.js.map +1 -0
- package/dist/dev/stream-filter.d.ts +40 -0
- package/dist/dev/stream-filter.d.ts.map +1 -0
- package/dist/dev/stream-filter.js +93 -0
- package/dist/dev/stream-filter.js.map +1 -0
- package/dist/dev/stream-renderer.d.ts +34 -0
- package/dist/dev/stream-renderer.d.ts.map +1 -1
- package/dist/dev/stream-renderer.js +222 -8
- package/dist/dev/stream-renderer.js.map +1 -1
- package/dist/errors-registry.d.ts.map +1 -1
- package/dist/errors-registry.js +280 -36
- package/dist/errors-registry.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/help.d.ts.map +1 -1
- package/dist/help.js +8 -0
- package/dist/help.js.map +1 -1
- package/dist/hubspot-app-logs.d.ts +76 -0
- package/dist/hubspot-app-logs.d.ts.map +1 -0
- package/dist/hubspot-app-logs.js +323 -0
- package/dist/hubspot-app-logs.js.map +1 -0
- package/dist/hubspot-auth.d.ts +8 -2
- package/dist/hubspot-auth.d.ts.map +1 -1
- package/dist/hubspot-auth.js +9 -9
- package/dist/hubspot-auth.js.map +1 -1
- package/dist/hubspot-developer-client.js +119 -11
- package/dist/hubspot-developer-client.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init/templates.d.ts +11 -1
- package/dist/init/templates.d.ts.map +1 -1
- package/dist/init/templates.js +228 -15
- package/dist/init/templates.js.map +1 -1
- package/dist/link-migration-journal.d.ts +131 -0
- package/dist/link-migration-journal.d.ts.map +1 -0
- package/dist/link-migration-journal.js +395 -0
- package/dist/link-migration-journal.js.map +1 -0
- package/dist/link-preflight.d.ts +78 -0
- package/dist/link-preflight.d.ts.map +1 -0
- package/dist/link-preflight.js +231 -0
- package/dist/link-preflight.js.map +1 -0
- package/dist/local-project-picker.d.ts +34 -0
- package/dist/local-project-picker.d.ts.map +1 -0
- package/dist/local-project-picker.js +121 -0
- package/dist/local-project-picker.js.map +1 -0
- package/dist/logs-interactive.d.ts +37 -0
- package/dist/logs-interactive.d.ts.map +1 -0
- package/dist/logs-interactive.js +110 -0
- package/dist/logs-interactive.js.map +1 -0
- package/dist/output-context.d.ts +13 -0
- package/dist/output-context.d.ts.map +1 -0
- package/dist/output-context.js +46 -0
- package/dist/output-context.js.map +1 -0
- package/dist/project-context.d.ts +55 -0
- package/dist/project-context.d.ts.map +1 -0
- package/dist/project-context.js +115 -0
- package/dist/project-context.js.map +1 -0
- package/dist/project-picker.d.ts +65 -0
- package/dist/project-picker.d.ts.map +1 -0
- package/dist/project-picker.js +227 -0
- package/dist/project-picker.js.map +1 -0
- package/dist/prompt.d.ts +8 -0
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +81 -13
- package/dist/prompt.js.map +1 -1
- package/dist/reporter/human.d.ts +10 -2
- package/dist/reporter/human.d.ts.map +1 -1
- package/dist/reporter/human.js +82 -14
- package/dist/reporter/human.js.map +1 -1
- package/dist/reporter/index.d.ts.map +1 -1
- package/dist/reporter/index.js +7 -5
- package/dist/reporter/index.js.map +1 -1
- package/dist/reporter/json.d.ts +2 -1
- package/dist/reporter/json.d.ts.map +1 -1
- package/dist/reporter/json.js +10 -7
- package/dist/reporter/json.js.map +1 -1
- package/dist/reporter/style.d.ts +19 -0
- package/dist/reporter/style.d.ts.map +1 -1
- package/dist/reporter/style.js +126 -6
- package/dist/reporter/style.js.map +1 -1
- package/dist/reporter/types.d.ts +34 -4
- package/dist/reporter/types.d.ts.map +1 -1
- package/dist/reporter/types.js.map +1 -1
- package/dist/services/account-store.d.ts +3 -1
- package/dist/services/account-store.d.ts.map +1 -1
- package/dist/services/account-store.js +2 -1
- package/dist/services/account-store.js.map +1 -1
- package/dist/services/app-paths.d.ts.map +1 -1
- package/dist/services/app-paths.js +3 -1
- package/dist/services/app-paths.js.map +1 -1
- package/dist/services/cloudflare-auth.d.ts +1 -1
- package/dist/services/cloudflare-auth.d.ts.map +1 -1
- package/dist/services/cloudflare-auth.js +2 -2
- package/dist/services/cloudflare-auth.js.map +1 -1
- package/dist/services/cloudflare-kv.d.ts.map +1 -1
- package/dist/services/cloudflare-kv.js.map +1 -1
- package/dist/services/command-history.d.ts.map +1 -1
- package/dist/services/command-history.js.map +1 -1
- package/dist/services/config.d.ts.map +1 -1
- package/dist/services/config.js +1 -1
- package/dist/services/config.js.map +1 -1
- package/dist/services/control-plane.d.ts.map +1 -1
- package/dist/services/control-plane.js +3 -3
- package/dist/services/control-plane.js.map +1 -1
- package/dist/services/env-loader.d.ts.map +1 -1
- package/dist/services/env-loader.js +1 -3
- package/dist/services/env-loader.js.map +1 -1
- package/dist/services/http.d.ts.map +1 -1
- package/dist/services/http.js.map +1 -1
- package/dist/services/hubspot-dev-client.d.ts.map +1 -1
- package/dist/services/hubspot-dev-client.js +30 -0
- package/dist/services/hubspot-dev-client.js.map +1 -1
- package/dist/services/live.d.ts +2 -2
- package/dist/services/live.d.ts.map +1 -1
- package/dist/services/live.js +1 -1
- package/dist/services/live.js.map +1 -1
- package/dist/services/machine-id.d.ts.map +1 -1
- package/dist/services/machine-id.js.map +1 -1
- package/dist/services/reporter.d.ts +8 -5
- package/dist/services/reporter.d.ts.map +1 -1
- package/dist/services/reporter.js +6 -4
- package/dist/services/reporter.js.map +1 -1
- package/dist/services/tenant-state.d.ts.map +1 -1
- package/dist/services/tenant-state.js.map +1 -1
- package/dist/state-store.d.ts +4 -0
- package/dist/state-store.d.ts.map +1 -1
- package/dist/state-store.js +15 -0
- package/dist/state-store.js.map +1 -1
- package/dist/status-drilldown.d.ts +24 -0
- package/dist/status-drilldown.d.ts.map +1 -0
- package/dist/status-drilldown.js +50 -0
- package/dist/status-drilldown.js.map +1 -0
- package/dist/tenant-state.d.ts.map +1 -1
- package/dist/tenant-state.js +3 -2
- package/dist/tenant-state.js.map +1 -1
- package/dist/token-key-custody.d.ts +91 -0
- package/dist/token-key-custody.d.ts.map +1 -0
- package/dist/token-key-custody.js +375 -0
- package/dist/token-key-custody.js.map +1 -0
- package/package.json +14 -15
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { Path } from '@effect/platform';
|
|
2
1
|
import * as Command from '@effect/cli/Command';
|
|
2
|
+
import { Path } from '@effect/platform';
|
|
3
3
|
import { validateProject } from '@hs-x/validator';
|
|
4
4
|
import { Effect, Option } from 'effect';
|
|
5
5
|
import { exitWith } from '../cli-error.js';
|
|
6
6
|
import { cwdOption, jsonOption, runHandler } from '../cli/kit.js';
|
|
7
|
+
import { LocalProjectPickerCancelled, resolveLocalProject } from '../local-project-picker.js';
|
|
8
|
+
import { isInteractive, promptSelect } from '../prompt.js';
|
|
7
9
|
import { Cwd } from '../services/cwd.js';
|
|
8
10
|
import { Reporter } from '../services/reporter.js';
|
|
9
11
|
// ─── Native @effect/cli command (Phase 4) ───────────────────────────────────
|
|
@@ -20,7 +22,30 @@ function validateBody(command, opts) {
|
|
|
20
22
|
const cwd = yield* Cwd;
|
|
21
23
|
const path = yield* Path.Path;
|
|
22
24
|
const reporter = yield* Reporter;
|
|
23
|
-
|
|
25
|
+
let root = Option.getOrElse(opts.cwd, () => cwd);
|
|
26
|
+
if (!opts.json && isInteractive()) {
|
|
27
|
+
const selected = yield* Effect.promise(async () => {
|
|
28
|
+
try {
|
|
29
|
+
return await resolveLocalProject({
|
|
30
|
+
root,
|
|
31
|
+
allowPrompt: true,
|
|
32
|
+
message: `Which local project should ${command} validate?`,
|
|
33
|
+
prompts: { select: promptSelect },
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (error instanceof LocalProjectPickerCancelled)
|
|
38
|
+
return 'cancelled';
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
if (selected === 'cancelled') {
|
|
43
|
+
yield* reporter.info('Cancelled.');
|
|
44
|
+
return yield* Effect.fail(exitWith(130));
|
|
45
|
+
}
|
|
46
|
+
if (selected)
|
|
47
|
+
root = selected.root;
|
|
48
|
+
}
|
|
24
49
|
const result = yield* Effect.promise(() => validateProject({ root }));
|
|
25
50
|
if (opts.json) {
|
|
26
51
|
// JSON-shape note: the legacy json output is a FLAT, pretty-printed
|
|
@@ -41,23 +66,60 @@ function validateBody(command, opts) {
|
|
|
41
66
|
yield* reporter.done('Validated', 0);
|
|
42
67
|
return;
|
|
43
68
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
69
|
+
const errors = result.diagnostics.filter((d) => d.severity === 'error').length;
|
|
70
|
+
const warnings = result.diagnostics.filter((d) => d.severity === 'warning').length;
|
|
71
|
+
const summary = [
|
|
72
|
+
...(errors > 0 ? [`${errors} error${errors === 1 ? '' : 's'}`] : []),
|
|
73
|
+
...(warnings > 0 ? [`${warnings} warning${warnings === 1 ? '' : 's'}`] : []),
|
|
74
|
+
].join(' · ');
|
|
75
|
+
if (errors > 0) {
|
|
76
|
+
yield* step.fail(summary);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
yield* step.warn(summary);
|
|
49
80
|
}
|
|
50
|
-
yield* reporter.
|
|
81
|
+
yield* reporter.rows(result.diagnostics.map(diagnosticRow));
|
|
82
|
+
if (result.ok) {
|
|
83
|
+
// Warnings only: same exit as `--json` mode (`result.ok ? 0 : 1`).
|
|
84
|
+
yield* reporter.done('Validated', 0, { warn: warnings, fail: errors });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
yield* reporter.done('Failed', 20, { warn: warnings, fail: errors });
|
|
51
88
|
// The reporter `done(…, 20)` above sets the rendered summary code; the
|
|
52
89
|
// process exit code stays 1 to match the legacy `result.ok ? 0 : 1`.
|
|
53
90
|
return yield* Effect.fail(exitWith(1));
|
|
54
91
|
});
|
|
55
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* One railed row per diagnostic: severity glyph (error→fail, warning→warn,
|
|
95
|
+
* anything else unglyphed), code as the cyan key, message at full brightness,
|
|
96
|
+
* `file:line` as the dim detail tail. Shared with `hs-x status`, whose
|
|
97
|
+
* validation section renders the same diagnostics.
|
|
98
|
+
*/
|
|
99
|
+
export function diagnosticRow(diagnostic) {
|
|
100
|
+
return {
|
|
101
|
+
key: diagnostic.code,
|
|
102
|
+
value: diagnostic.message,
|
|
103
|
+
...(diagnostic.severity === 'error'
|
|
104
|
+
? { status: 'fail' }
|
|
105
|
+
: diagnostic.severity === 'warning'
|
|
106
|
+
? { status: 'warn' }
|
|
107
|
+
: {}),
|
|
108
|
+
...(diagnostic.file
|
|
109
|
+
? {
|
|
110
|
+
detail: `${diagnostic.file}${diagnostic.line !== undefined ? `:${diagnostic.line}` : ''}`,
|
|
111
|
+
}
|
|
112
|
+
: {}),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
56
115
|
export function checkHelpText(command) {
|
|
57
116
|
return `hs-x ${command}
|
|
58
117
|
|
|
59
118
|
Validate project source and report diagnostics.
|
|
60
119
|
|
|
120
|
+
Interactive terminals discover local hsx.config.ts projects beneath a parent
|
|
121
|
+
workspace. Scripts select the project root explicitly with --cwd.
|
|
122
|
+
|
|
61
123
|
Flags:
|
|
62
124
|
--cwd <path> Project directory (defaults to current working directory)
|
|
63
125
|
--json Emit JSON result
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
package/dist/constants.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// `^${CLI_VERSION}` @hs-x/* dependency ranges. MUST equal package.json's
|
|
3
3
|
// version (version-sync.test.ts enforces it): @hs-x/cli@0.1.3 shipped
|
|
4
4
|
// reporting 0.1.0, which read as a stale install.
|
|
5
|
-
export const CLI_VERSION = '0.
|
|
5
|
+
export const CLI_VERSION = '0.3.6';
|
|
6
6
|
/** Brand orange (#ff5e1f) as ANSI 24-bit foreground SGR parameters. */
|
|
7
7
|
export const BRAND_ORANGE_SGR = '38;2;255;94;31';
|
|
8
8
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-plane-fetch.d.ts","sourceRoot":"","sources":["../src/control-plane-fetch.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,SAAkB,IAAI,2BAA2B;IACjD,QAAQ,CAAC,IAAI,EAAE,qBAAqB,GAAG,uBAAuB,CAAC;gBACnD,IAAI,EAAE,qBAAqB,GAAG,uBAAuB,EAAE,OAAO,EAAE,MAAM;CAInF;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"control-plane-fetch.d.ts","sourceRoot":"","sources":["../src/control-plane-fetch.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,SAAkB,IAAI,2BAA2B;IACjD,QAAQ,CAAC,IAAI,EAAE,qBAAqB,GAAG,uBAAuB,CAAC;gBACnD,IAAI,EAAE,qBAAqB,GAAG,uBAAuB,EAAE,OAAO,EAAE,MAAM;CAInF;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqCxF;AASD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAMjC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { activeSession, defaultStorePath, loadStore, } from './account-store.js';
|
|
2
1
|
import { HttpClientRequest } from '@hs-x/types';
|
|
2
|
+
import { activeSession, defaultStorePath, loadStore, } from './account-store.js';
|
|
3
3
|
import { executeCliHttp } from './effect-http.js';
|
|
4
4
|
export class ControlPlaneAuthError extends Error {
|
|
5
5
|
name = 'ControlPlaneAuthError';
|
|
@@ -17,12 +17,13 @@ export class ControlPlaneAuthError extends Error {
|
|
|
17
17
|
* so the caller can branch on status.
|
|
18
18
|
*/
|
|
19
19
|
export async function controlPlaneFetch(input) {
|
|
20
|
-
const
|
|
20
|
+
const storePath = input.storePath ?? defaultStorePath();
|
|
21
|
+
const session = await loadUserSession(storePath);
|
|
21
22
|
if (!session) {
|
|
22
|
-
throw new ControlPlaneAuthError('HSX_E_NOT_LOGGED_IN',
|
|
23
|
+
throw new ControlPlaneAuthError('HSX_E_NOT_LOGGED_IN', `No local HS-X session in ${storePath}. Run \`hs-x login\` in this CLI environment first.`);
|
|
23
24
|
}
|
|
24
25
|
if (sessionExpired(session)) {
|
|
25
|
-
throw new ControlPlaneAuthError('HSX_E_SESSION_EXPIRED',
|
|
26
|
+
throw new ControlPlaneAuthError('HSX_E_SESSION_EXPIRED', `The HS-X session in ${storePath} has expired. Run \`hs-x login\` in this CLI environment again.`);
|
|
26
27
|
}
|
|
27
28
|
const fetchImpl = input.fetchImpl ?? fetch;
|
|
28
29
|
const url = new URL(input.path, input.controlPlaneUrl);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-plane-fetch.js","sourceRoot":"","sources":["../src/control-plane-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"control-plane-fetch.js","sourceRoot":"","sources":["../src/control-plane-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deploy-time revision capture (ADR-021 R03).
|
|
3
|
+
*
|
|
4
|
+
* After a Worker deploy, HS-X reads back Cloudflare's *confirmed* active
|
|
5
|
+
* deployment through the R01 adapter, takes the version id VERBATIM (never
|
|
6
|
+
* fabricated), fingerprints the deployed bindings via the shared
|
|
7
|
+
* `computeBindingFingerprint`, and returns a {@link DeployRevision} to attach to
|
|
8
|
+
* the deploy record. Capture is a pure READ: re-running it after a
|
|
9
|
+
* CF-success / CP-failure re-reads the same active deployment and yields the
|
|
10
|
+
* same version id, so a retry converges with zero duplicate deployments.
|
|
11
|
+
*
|
|
12
|
+
* A malformed/absent version id fails `DeployRevision` decode and surfaces as a
|
|
13
|
+
* thrown error; the deploy flow treats capture as best-effort and records the
|
|
14
|
+
* deploy WITHOUT a revision rather than fabricating one or failing the deploy.
|
|
15
|
+
*/
|
|
16
|
+
import type { DeployBindingConfig, DeployRevision } from '@hs-x/types';
|
|
17
|
+
import { type CloudflareWorkerVersionsClient } from '@hs-x/types/rollback';
|
|
18
|
+
/**
|
|
19
|
+
* Reduce a Cloudflare version `resources` block to the deterministic
|
|
20
|
+
* {@link DeployBindingConfig} the fingerprint is derived from. Opaque and
|
|
21
|
+
* best-effort: unknown shapes yield an empty binding list rather than throwing,
|
|
22
|
+
* because a stable-but-empty fingerprint is still a valid drift baseline.
|
|
23
|
+
*/
|
|
24
|
+
export declare function bindingConfigFromVersionResources(resources: unknown): DeployBindingConfig;
|
|
25
|
+
export interface CaptureDeployRevisionInput {
|
|
26
|
+
/** Cloudflare account id — used verbatim as the Worker identity's first half. */
|
|
27
|
+
readonly cloudflareAccountId: string;
|
|
28
|
+
/** Worker script name — authoritative, never renamed (T03). Second half of the Worker identity. */
|
|
29
|
+
readonly scriptName: string;
|
|
30
|
+
readonly apiToken: string;
|
|
31
|
+
/** ISO-8601 capture time; defaults to now. */
|
|
32
|
+
readonly capturedAt?: string;
|
|
33
|
+
/** Injection seam for tests / alternate transports. */
|
|
34
|
+
readonly createClient?: (input: {
|
|
35
|
+
readonly accountId: string;
|
|
36
|
+
readonly scriptName: string;
|
|
37
|
+
readonly apiToken: string;
|
|
38
|
+
}) => CloudflareWorkerVersionsClient;
|
|
39
|
+
readonly fetchImpl?: typeof fetch;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Read back Cloudflare's confirmed active deployment and build the verifiable
|
|
43
|
+
* {@link DeployRevision} for it. Throws if there is no active deployment/version
|
|
44
|
+
* or the id fails `DeployRevision` decode — the caller records without a
|
|
45
|
+
* revision in that case. Never fabricates an id.
|
|
46
|
+
*/
|
|
47
|
+
export declare function captureDeployRevision(input: CaptureDeployRevisionInput): Promise<DeployRevision>;
|
|
48
|
+
//# sourceMappingURL=deploy-revision-capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-revision-capture.d.ts","sourceRoot":"","sources":["../src/deploy-revision-capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACL,KAAK,8BAA8B,EAEpC,MAAM,sBAAsB,CAAC;AAmC9B;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,OAAO,GAAG,mBAAmB,CA6BzF;AAED,MAAM,WAAW,0BAA0B;IACzC,iFAAiF;IACjF,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,mGAAmG;IACnG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC3B,KAAK,8BAA8B,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACnC;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,cAAc,CAAC,CAyCzB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deploy-time revision capture (ADR-021 R03).
|
|
3
|
+
*
|
|
4
|
+
* After a Worker deploy, HS-X reads back Cloudflare's *confirmed* active
|
|
5
|
+
* deployment through the R01 adapter, takes the version id VERBATIM (never
|
|
6
|
+
* fabricated), fingerprints the deployed bindings via the shared
|
|
7
|
+
* `computeBindingFingerprint`, and returns a {@link DeployRevision} to attach to
|
|
8
|
+
* the deploy record. Capture is a pure READ: re-running it after a
|
|
9
|
+
* CF-success / CP-failure re-reads the same active deployment and yields the
|
|
10
|
+
* same version id, so a retry converges with zero duplicate deployments.
|
|
11
|
+
*
|
|
12
|
+
* A malformed/absent version id fails `DeployRevision` decode and surfaces as a
|
|
13
|
+
* thrown error; the deploy flow treats capture as best-effort and records the
|
|
14
|
+
* deploy WITHOUT a revision rather than fabricating one or failing the deploy.
|
|
15
|
+
*/
|
|
16
|
+
import { Schema, computeBindingFingerprint, schemas } from '@hs-x/types';
|
|
17
|
+
import { createWorkerVersionsClient, } from '@hs-x/types/rollback';
|
|
18
|
+
/**
|
|
19
|
+
* Binding fields, in priority order, that carry the stable identity of the
|
|
20
|
+
* resource a binding points at. The first present one becomes the binding's
|
|
21
|
+
* fingerprint `target`. Value-only bindings (see {@link VALUE_ONLY_BINDINGS})
|
|
22
|
+
* never contribute a target so no secret/plaintext *value* is fingerprinted.
|
|
23
|
+
*/
|
|
24
|
+
const TARGET_IDENTITY_FIELDS = [
|
|
25
|
+
'namespace_id',
|
|
26
|
+
'database_id',
|
|
27
|
+
'id',
|
|
28
|
+
'bucket_name',
|
|
29
|
+
'queue_name',
|
|
30
|
+
'class_name',
|
|
31
|
+
'service',
|
|
32
|
+
'certificate_id',
|
|
33
|
+
'dataset',
|
|
34
|
+
'index_name',
|
|
35
|
+
'pipeline',
|
|
36
|
+
'store_id',
|
|
37
|
+
'project',
|
|
38
|
+
];
|
|
39
|
+
/** Binding kinds whose identity is their (secret/plaintext) value — excluded from the fingerprint target. */
|
|
40
|
+
const VALUE_ONLY_BINDINGS = new Set(['plain_text', 'secret_text', 'json', 'secret_key']);
|
|
41
|
+
function asRecord(value) {
|
|
42
|
+
return typeof value === 'object' && value !== null ? value : {};
|
|
43
|
+
}
|
|
44
|
+
function asString(value) {
|
|
45
|
+
return typeof value === 'string' ? value : undefined;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Reduce a Cloudflare version `resources` block to the deterministic
|
|
49
|
+
* {@link DeployBindingConfig} the fingerprint is derived from. Opaque and
|
|
50
|
+
* best-effort: unknown shapes yield an empty binding list rather than throwing,
|
|
51
|
+
* because a stable-but-empty fingerprint is still a valid drift baseline.
|
|
52
|
+
*/
|
|
53
|
+
export function bindingConfigFromVersionResources(resources) {
|
|
54
|
+
const record = asRecord(resources);
|
|
55
|
+
const runtime = asRecord(record.script_runtime);
|
|
56
|
+
const rawBindings = Array.isArray(record.bindings) ? record.bindings : [];
|
|
57
|
+
const bindings = rawBindings.flatMap((raw) => {
|
|
58
|
+
const binding = asRecord(raw);
|
|
59
|
+
const type = asString(binding.type);
|
|
60
|
+
const name = asString(binding.name);
|
|
61
|
+
if (!type || !name)
|
|
62
|
+
return [];
|
|
63
|
+
const target = VALUE_ONLY_BINDINGS.has(type)
|
|
64
|
+
? undefined
|
|
65
|
+
: (() => {
|
|
66
|
+
for (const field of TARGET_IDENTITY_FIELDS) {
|
|
67
|
+
const value = asString(binding[field]);
|
|
68
|
+
if (value)
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
})();
|
|
73
|
+
return [{ type, name, ...(target !== undefined ? { target } : {}) }];
|
|
74
|
+
});
|
|
75
|
+
const compatibilityFlags = Array.isArray(runtime.compatibility_flags)
|
|
76
|
+
? runtime.compatibility_flags.filter((flag) => typeof flag === 'string')
|
|
77
|
+
: undefined;
|
|
78
|
+
const compatibilityDate = asString(runtime.compatibility_date);
|
|
79
|
+
return {
|
|
80
|
+
...(compatibilityDate !== undefined ? { compatibilityDate } : {}),
|
|
81
|
+
...(compatibilityFlags !== undefined ? { compatibilityFlags } : {}),
|
|
82
|
+
bindings,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Read back Cloudflare's confirmed active deployment and build the verifiable
|
|
87
|
+
* {@link DeployRevision} for it. Throws if there is no active deployment/version
|
|
88
|
+
* or the id fails `DeployRevision` decode — the caller records without a
|
|
89
|
+
* revision in that case. Never fabricates an id.
|
|
90
|
+
*/
|
|
91
|
+
export async function captureDeployRevision(input) {
|
|
92
|
+
const client = input.createClient
|
|
93
|
+
? input.createClient({
|
|
94
|
+
accountId: input.cloudflareAccountId,
|
|
95
|
+
scriptName: input.scriptName,
|
|
96
|
+
apiToken: input.apiToken,
|
|
97
|
+
})
|
|
98
|
+
: createWorkerVersionsClient({
|
|
99
|
+
accountId: input.cloudflareAccountId,
|
|
100
|
+
scriptName: input.scriptName,
|
|
101
|
+
apiToken: input.apiToken,
|
|
102
|
+
...(input.fetchImpl ? { fetchImpl: input.fetchImpl } : {}),
|
|
103
|
+
});
|
|
104
|
+
const active = await client.getActiveDeployment();
|
|
105
|
+
const versionId = active?.versions.find((split) => split.percentage > 0)?.versionId ??
|
|
106
|
+
active?.versions[0]?.versionId;
|
|
107
|
+
if (!active || !versionId) {
|
|
108
|
+
throw new Error(`Cloudflare reported no active deployment for Worker "${input.scriptName}"; nothing to capture.`);
|
|
109
|
+
}
|
|
110
|
+
// Read the full version for its bindings/runtime (fingerprint input) and the
|
|
111
|
+
// sequential version number. The version id itself is already authoritative
|
|
112
|
+
// from the active deployment split.
|
|
113
|
+
const detail = await client.getVersion(versionId);
|
|
114
|
+
const bindingFingerprint = computeBindingFingerprint(bindingConfigFromVersionResources(detail.resources));
|
|
115
|
+
return Schema.decodeUnknownSync(schemas.DeployRevision)({
|
|
116
|
+
schemaVersion: 1,
|
|
117
|
+
cloudflareAccountId: input.cloudflareAccountId,
|
|
118
|
+
scriptName: input.scriptName,
|
|
119
|
+
versionId,
|
|
120
|
+
...(typeof detail.number === 'number' ? { versionNumber: detail.number } : {}),
|
|
121
|
+
bindingFingerprint,
|
|
122
|
+
capturedAt: input.capturedAt ?? new Date().toISOString(),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=deploy-revision-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-revision-capture.js","sourceRoot":"","sources":["../src/deploy-revision-capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAEL,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,sBAAsB,GAAG;IAC7B,cAAc;IACd,aAAa;IACb,IAAI;IACJ,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,gBAAgB;IAChB,SAAS;IACT,YAAY;IACZ,UAAU;IACV,UAAU;IACV,SAAS;CACD,CAAC;AAEX,6GAA6G;AAC7G,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAEzF,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/F,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAAC,SAAkB;IAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1C,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,CAAC,GAAG,EAAE;gBACJ,KAAK,MAAM,KAAK,IAAI,sBAAsB,EAAE,CAAC;oBAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;oBACvC,IAAI,KAAK;wBAAE,OAAO,KAAK,CAAC;gBAC1B,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IACH,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACnE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;QACxF,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/D,OAAO;QACL,GAAG,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,QAAQ;KACT,CAAC;AACJ,CAAC;AAmBD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAiC;IAEjC,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY;QAC/B,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;YACjB,SAAS,EAAE,KAAK,CAAC,mBAAmB;YACpC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC;QACJ,CAAC,CAAC,0BAA0B,CAAC;YACzB,SAAS,EAAE,KAAK,CAAC,mBAAmB;YACpC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3D,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAClD,MAAM,SAAS,GACb,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,SAAS;QACjE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;IACjC,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,wDAAwD,KAAK,CAAC,UAAU,wBAAwB,CACjG,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,4EAA4E;IAC5E,oCAAoC;IACpC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,kBAAkB,GAAG,yBAAyB,CAClD,iCAAiC,CAAC,MAAM,CAAC,SAAS,CAAC,CACpD,CAAC;IAEF,OAAO,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACtD,aAAa,EAAE,CAAC;QAChB,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,SAAS;QACT,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,kBAAkB;QAClB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACzD,CAAC,CAAC;AACL,CAAC"}
|
package/dist/dev/event-bus.d.ts
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* In-process event bus for `hs-x dev` unified output.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Four lanes:
|
|
5
5
|
* - frontend: logs from card iframe (via @hs-x/sdk-ui `logger` → /__hsx/log)
|
|
6
6
|
* - backend: stdout/stderr from local handler process (e.g. wrangler dev) — lane wired later
|
|
7
7
|
* - request: inbound proxied request summaries from local dev-proxy receiver — lane wired later
|
|
8
|
+
* - hubspot: HubSpot's own app-log entries (card/extension renders, proxy
|
|
9
|
+
* executions) polled from the app-logs API — failures that happen before
|
|
10
|
+
* a request ever reaches our Worker only show up here
|
|
8
11
|
*
|
|
9
12
|
* Subscribers (the reporter renderer) interleave events by arrival order.
|
|
10
13
|
*/
|
|
11
|
-
export type DevLane = 'frontend' | 'backend' | 'request';
|
|
14
|
+
export type DevLane = 'frontend' | 'backend' | 'request' | 'hubspot';
|
|
12
15
|
export type DevLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
13
16
|
export interface DevEvent {
|
|
14
17
|
readonly lane: DevLane;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/dev/event-bus.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/dev/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AACrE,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAAC;CACnD;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAmB/C"}
|
package/dist/dev/event-bus.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* In-process event bus for `hs-x dev` unified output.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Four lanes:
|
|
5
5
|
* - frontend: logs from card iframe (via @hs-x/sdk-ui `logger` → /__hsx/log)
|
|
6
6
|
* - backend: stdout/stderr from local handler process (e.g. wrangler dev) — lane wired later
|
|
7
7
|
* - request: inbound proxied request summaries from local dev-proxy receiver — lane wired later
|
|
8
|
+
* - hubspot: HubSpot's own app-log entries (card/extension renders, proxy
|
|
9
|
+
* executions) polled from the app-logs API — failures that happen before
|
|
10
|
+
* a request ever reaches our Worker only show up here
|
|
8
11
|
*
|
|
9
12
|
* Subscribers (the reporter renderer) interleave events by arrival order.
|
|
10
13
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/dev/event-bus.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/dev/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAqBH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC9C,OAAO;QACL,IAAI,CAAC,KAAK;YACR,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC;gBAAC,MAAM,CAAC;oBACP,oFAAoF;gBACtF,CAAC;YACH,CAAC;QACH,CAAC;QACD,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HubSpot app-logs → dev-stream bridge.
|
|
3
|
+
*
|
|
4
|
+
* The dev sidecar only sees what reaches our Worker (or the card iframe's
|
|
5
|
+
* logger). A card that fails inside HubSpot — render error, proxy failure,
|
|
6
|
+
* frontend logger output swallowed by the prod path — is invisible to it,
|
|
7
|
+
* which is exactly the "nothing shows up" dead end. This poller pulls the
|
|
8
|
+
* HubSpot-side system types on an interval and emits them as `hubspot`-lane
|
|
9
|
+
* events, so the dev stream is the same one-timeline surface as `hs-x logs`.
|
|
10
|
+
*/
|
|
11
|
+
import type { SystemType } from '@hs-x/hubspot-cli';
|
|
12
|
+
import { type HubSpotLogsPayload, type HubSpotLogsSource } from '../hubspot-app-logs.js';
|
|
13
|
+
import type { DevEventBus } from './event-bus.js';
|
|
14
|
+
export interface HubSpotLogsPollerOptions {
|
|
15
|
+
readonly bus: DevEventBus;
|
|
16
|
+
readonly source: HubSpotLogsSource;
|
|
17
|
+
readonly intervalMs?: number;
|
|
18
|
+
/** Emit only entries at/after this time (default: poller start). */
|
|
19
|
+
readonly sessionStartMs?: number;
|
|
20
|
+
readonly systemTypes?: readonly SystemType[];
|
|
21
|
+
/** Injectable fetch for tests; defaults to the real app-logs read. */
|
|
22
|
+
readonly fetchPayload?: (input: {
|
|
23
|
+
readonly source: HubSpotLogsSource;
|
|
24
|
+
readonly sinceMinutes: number;
|
|
25
|
+
readonly limit: number;
|
|
26
|
+
readonly systemTypes: readonly SystemType[];
|
|
27
|
+
}) => Promise<HubSpotLogsPayload>;
|
|
28
|
+
}
|
|
29
|
+
export interface HubSpotLogsPoller {
|
|
30
|
+
/** One poll cycle — exposed for tests and for an eager first tick. */
|
|
31
|
+
poll(): Promise<void>;
|
|
32
|
+
stop(): void;
|
|
33
|
+
}
|
|
34
|
+
export declare function startHubSpotLogsPoller(options: HubSpotLogsPollerOptions): HubSpotLogsPoller;
|
|
35
|
+
//# sourceMappingURL=hubspot-logs-poller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hubspot-logs-poller.d.ts","sourceRoot":"","sources":["../../src/dev/hubspot-logs-poller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAelD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7C,sEAAsE;IACtE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAC9B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;QACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;KAC7C,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,IAAI,IAAI,CAAC;CACd;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAiF3F"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { fetchHubSpotLogsPayload, } from '../hubspot-app-logs.js';
|
|
2
|
+
/** The types where HubSpot sees things our Worker never does. */
|
|
3
|
+
const DEV_POLL_SYSTEM_TYPES = [
|
|
4
|
+
'CRM_EXTENSIBILITY_CARD',
|
|
5
|
+
'EXTENSION_RENDER',
|
|
6
|
+
'EXTENSION_LOG',
|
|
7
|
+
'PROXY_EXECUTION',
|
|
8
|
+
];
|
|
9
|
+
const DEFAULT_POLL_INTERVAL_MS = 30_000;
|
|
10
|
+
/** Query window per poll; overlap is deduplicated by log id. */
|
|
11
|
+
const LOOKBACK_MINUTES = 5;
|
|
12
|
+
const POLL_LIMIT = 50;
|
|
13
|
+
export function startHubSpotLogsPoller(options) {
|
|
14
|
+
const fetchPayload = options.fetchPayload ?? fetchHubSpotLogsPayload;
|
|
15
|
+
const systemTypes = options.systemTypes ?? DEV_POLL_SYSTEM_TYPES;
|
|
16
|
+
const sessionStartMs = options.sessionStartMs ?? Date.now();
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
let stopped = false;
|
|
19
|
+
let warnedError;
|
|
20
|
+
const poll = async () => {
|
|
21
|
+
if (stopped)
|
|
22
|
+
return;
|
|
23
|
+
let payload;
|
|
24
|
+
try {
|
|
25
|
+
payload = await fetchPayload({
|
|
26
|
+
source: options.source,
|
|
27
|
+
sinceMinutes: LOOKBACK_MINUTES,
|
|
28
|
+
limit: POLL_LIMIT,
|
|
29
|
+
systemTypes,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch (cause) {
|
|
33
|
+
payload = { rows: [], error: cause instanceof Error ? cause.message : String(cause) };
|
|
34
|
+
}
|
|
35
|
+
if (stopped)
|
|
36
|
+
return;
|
|
37
|
+
if (payload.error) {
|
|
38
|
+
// Surface a broken HubSpot leg once (not every 30s), then stay quiet
|
|
39
|
+
// until the error message changes.
|
|
40
|
+
if (payload.error !== warnedError) {
|
|
41
|
+
warnedError = payload.error;
|
|
42
|
+
options.bus.emit({
|
|
43
|
+
lane: 'hubspot',
|
|
44
|
+
level: 'warn',
|
|
45
|
+
ts: Date.now(),
|
|
46
|
+
msg: `HubSpot app logs unavailable: ${payload.error}`,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
warnedError = undefined;
|
|
52
|
+
const fresh = payload.rows
|
|
53
|
+
.filter((row) => {
|
|
54
|
+
const id = typeof row.invocationId === 'string' ? row.invocationId : undefined;
|
|
55
|
+
if (!id || seen.has(id))
|
|
56
|
+
return false;
|
|
57
|
+
seen.add(id);
|
|
58
|
+
const ts = typeof row.timestamp === 'string' ? Date.parse(row.timestamp) : Number.NaN;
|
|
59
|
+
return Number.isFinite(ts) && ts >= sessionStartMs;
|
|
60
|
+
})
|
|
61
|
+
.sort((a, b) => String(a.timestamp).localeCompare(String(b.timestamp)));
|
|
62
|
+
for (const row of fresh) {
|
|
63
|
+
const errorType = typeof row.errorType === 'string' ? row.errorType : undefined;
|
|
64
|
+
const source = typeof row.source === 'string' ? row.source : 'app-log';
|
|
65
|
+
const target = typeof row.target === 'string' ? row.target : undefined;
|
|
66
|
+
const durationMs = typeof row.durationMs === 'number' ? row.durationMs : undefined;
|
|
67
|
+
const invocationId = typeof row.invocationId === 'string' ? row.invocationId : undefined;
|
|
68
|
+
options.bus.emit({
|
|
69
|
+
lane: 'hubspot',
|
|
70
|
+
level: errorType ? 'error' : 'info',
|
|
71
|
+
ts: Date.parse(String(row.timestamp)),
|
|
72
|
+
msg: `${target ?? source}${errorType ? ` — ${errorType}` : ''}`,
|
|
73
|
+
source,
|
|
74
|
+
fields: {
|
|
75
|
+
...(durationMs !== undefined ? { durationMs } : {}),
|
|
76
|
+
...(invocationId ? { invocationId } : {}),
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const timer = setInterval(() => {
|
|
82
|
+
void poll();
|
|
83
|
+
}, options.intervalMs ?? DEFAULT_POLL_INTERVAL_MS);
|
|
84
|
+
// Do not keep the dev process alive on our account.
|
|
85
|
+
timer.unref?.();
|
|
86
|
+
return {
|
|
87
|
+
poll,
|
|
88
|
+
stop() {
|
|
89
|
+
stopped = true;
|
|
90
|
+
clearInterval(timer);
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=hubspot-logs-poller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hubspot-logs-poller.js","sourceRoot":"","sources":["../../src/dev/hubspot-logs-poller.ts"],"names":[],"mappings":"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"}
|
package/dist/dev/invoke.d.ts
CHANGED
|
@@ -53,7 +53,15 @@ export declare function describeInvocationError(error: unknown): string;
|
|
|
53
53
|
* invocation; a missing file just means an empty env.
|
|
54
54
|
*/
|
|
55
55
|
export declare function loadDevVars(root: string): Promise<Record<string, string>>;
|
|
56
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* Import the project's worker modules and read their manifests.
|
|
58
|
+
*
|
|
59
|
+
* Two layouts exist: the legacy `src/workers/*.ts` layout (each module
|
|
60
|
+
* default-exports a defineWorker), and the defineApp layout (hsx.config.ts
|
|
61
|
+
* holds the defineApp config; the defineWorker default export lives in
|
|
62
|
+
* src/index.ts or any other module under src/). When src/workers/ yields
|
|
63
|
+
* nothing, fall back to scanning src/ the way the `hs-x dev` server does.
|
|
64
|
+
*/
|
|
57
65
|
export declare function loadProjectWorkers(root: string): Promise<readonly LoadedWorker[]>;
|
|
58
66
|
/** Invoke one capability through the production runtime router, in process. */
|
|
59
67
|
export declare function invokeCapabilityLocally(request: DevInvokeRequest): Promise<DevInvokeOutcome>;
|
package/dist/dev/invoke.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/dev/invoke.ts"],"names":[],"mappings":"AAgBA,UAAU,YAAY;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;QACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;KAC1D,CAAC,CAAC;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC7C;AAED,qBAAa,cAAe,SAAQ,KAAK;IAErC,QAAQ,CAAC,IAAI,EACT,sBAAsB,GACtB,8BAA8B,GAC9B,8BAA8B;IAElC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;gBALb,IAAI,EACT,sBAAsB,GACtB,8BAA8B,GAC9B,8BAA8B,EAClC,OAAO,EAAE,MAAM,EACN,IAAI,CAAC,EAAE,MAAM,YAAA;CAIzB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CA6B9D;AAMD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAa/E;
|
|
1
|
+
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/dev/invoke.ts"],"names":[],"mappings":"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"}
|