@growthub/cli 0.14.9 → 0.14.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/add-ons/[providerId]/callback/route.js +35 -0
  2. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/add-ons/[providerId]/failure/route.js +35 -0
  3. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/add-ons/[providerId]/schedule/route.js +423 -0
  4. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/add-ons/providers/[providerId]/connect/route.js +78 -0
  5. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/add-ons/providers/[providerId]/credentials/route.js +276 -0
  6. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/add-ons/providers/[providerId]/products/[productId]/resources/route.js +173 -0
  7. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/add-ons/providers/[providerId]/products/sync/route.js +347 -0
  8. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/add-ons/providers/[providerId]/sync/route.js +293 -0
  9. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/add-ons/upstash/provider/connect/route.js +7 -0
  10. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/add-ons/upstash/provider/sync/route.js +7 -0
  11. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/add-ons/upstash/sync/route.js +197 -0
  12. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/apps/route.js +1 -1
  13. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/patch/preflight/route.js +38 -0
  14. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/sandbox-run/route.js +3 -20
  15. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/test-api-record/route.js +3 -20
  16. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/workflow/publish/route.js +407 -290
  17. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/workflows/[providerId]/route.js +209 -0
  18. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/components/WorkspaceAddOnsMarketplace.jsx +806 -0
  19. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/ApiRegistryActionCard.jsx +141 -0
  20. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/CeoCockpit.jsx +15 -3
  21. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/HelperSidecar.jsx +42 -5
  22. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/OrchestrationGraphCanvas.jsx +5 -1
  23. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/OrchestrationNodeConfigPanel.jsx +86 -20
  24. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/ScheduleCockpit.jsx +363 -0
  25. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/helper-commands.js +8 -0
  26. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/globals.css +322 -1
  27. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/page.jsx +2 -2
  28. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/add-ons/add-ons-client.jsx +197 -0
  29. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/add-ons/page.jsx +23 -0
  30. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/settings-shell.jsx +1 -0
  31. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workflows/WorkflowSurface.jsx +734 -61
  32. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-rail.jsx +15 -10
  33. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/env-status.js +2 -7
  34. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/orchestration-graph-runner.js +29 -19
  35. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/sandbox-serverless-flow.js +8 -4
  36. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/schedule-cockpit-console.js +287 -0
  37. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/scheduler-orchestration.js +449 -0
  38. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/server-secrets.js +77 -0
  39. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/serverless-readiness.js +583 -0
  40. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-add-on-callback.js +63 -0
  41. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-add-on-scheduler.js +519 -0
  42. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-add-ons.js +957 -0
  43. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-app-readiness.js +212 -0
  44. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-config.js +607 -63
  45. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-contract-compliance.js +168 -0
  46. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-data-model.js +21 -0
  47. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-operator-auth.js +32 -0
  48. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-patch-impact.js +133 -0
  49. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-provenance-lineage.js +214 -0
  50. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-stale-surfaces.js +217 -0
  51. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-workflow-impact.js +170 -0
  52. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/public/integrations/upstash/provider.png +0 -0
  53. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/public/integrations/upstash/qstash.png +0 -0
  54. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/public/integrations/upstash/redis.png +0 -0
  55. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/public/integrations/upstash/search.png +0 -0
  56. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/public/integrations/upstash/vector.png +0 -0
  57. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/scripts/scheduler-ingress-smoke.mjs +26 -0
  58. package/assets/worker-kits/growthub-custom-workspace-starter-v1/kit.json +6 -0
  59. package/assets/worker-kits/growthub-custom-workspace-starter-v1/skills/governed-workspace-mutation/SKILL.md +3 -1
  60. package/dist/index.js +3024 -4191
  61. package/package.json +1 -1
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Growthub Workspace App-Readiness V1 — ship-readiness deriver.
3
+ *
4
+ * Composes the signals the workspace already records into ONE app-scoped
5
+ * eligibility verdict: `{ ready, blocking[], nextAction }`. Eligibility, not a
6
+ * flag — readiness is computed from the live state every call, never stored.
7
+ *
8
+ * Signal sources, all already present in the read-only metadata graph the
9
+ * Workspace Map builds:
10
+ * - integration.status — an unconnected integration blocks its dependents
11
+ * - sandbox.authStatus — an unauthenticated sandbox cannot run
12
+ * - pipelineHealth.status / latestOk — an untested or failing pipeline blocks
13
+ * - workflow.lifecycleStatus — a draft-only workflow is a soft (non-blocking)
14
+ * signal that proof is still pending
15
+ *
16
+ * Callers that hold richer signals (env-status, deploy check shape, swarm
17
+ * eligibility) may pass them via `options.extraBlockers` / `options.extraSignals`
18
+ * — they are merged in without changing the shape. Pure: no fetch, no fs, no
19
+ * writes, no secrets. Deterministic ordering so receipts/diffs stay clean.
20
+ */
21
+
22
+ const APP_READINESS_KIND = "growthub-workspace-app-readiness-v1";
23
+ const APP_READINESS_VERSION = 1;
24
+
25
+ // Severity rank → lower sorts first (most urgent blocker becomes nextAction).
26
+ const SEVERITY = { blocker: 0, warning: 1 };
27
+
28
+ function safeString(value) {
29
+ if (value == null) return "";
30
+ return typeof value === "string" ? value : String(value);
31
+ }
32
+
33
+ function isConnected(status) {
34
+ const s = safeString(status).toLowerCase();
35
+ return s === "connected" || s === "ok" || s === "active" || s === "ready";
36
+ }
37
+
38
+ // Three-state auth: "authed" | "unauthed" | "unknown". Empty is UNKNOWN, never
39
+ // silently "authed" — unknown auth must not pass as ready (review finding D).
40
+ function authState(status) {
41
+ const s = safeString(status).toLowerCase();
42
+ if (["authed", "authenticated", "ok", "connected", "ready"].includes(s)) return "authed";
43
+ if (!s) return "unknown";
44
+ return "unauthed";
45
+ }
46
+
47
+ // A local / no-auth sandbox legitimately has no credential — an intentional
48
+ // exception, not a silent default.
49
+ function isNoAuthSandbox(summary) {
50
+ const locality = safeString(summary.runLocality).toLowerCase();
51
+ const adapter = safeString(summary.adapter).toLowerCase();
52
+ const provider = safeString(summary.authProvider).toLowerCase();
53
+ return locality === "local" || adapter.includes("local") || provider === "none" || provider === "local";
54
+ }
55
+
56
+ /**
57
+ * @param {object} graph a `buildWorkspaceMetadataGraph` envelope
58
+ * @param {object} [options]
59
+ * @param {string} [options.appId] restrict to nodes scoped to this app (when
60
+ * node summaries carry `appId`/`appScope`); omit for workspace scope.
61
+ * @param {Array<{severity?:string,code:string,message:string,nextAction?:string}>} [options.extraBlockers]
62
+ * @param {object} [options.extraSignals] merged verbatim into `signals`.
63
+ * @returns {object} `{ kind, version, appId, ready, score, blocking[], warnings[], signals, nextAction, summary }`
64
+ */
65
+ function deriveAppReadiness(graph, options = {}) {
66
+ const appId = safeString(options.appId).trim() || null;
67
+
68
+ const empty = (warning) => ({
69
+ kind: APP_READINESS_KIND,
70
+ version: APP_READINESS_VERSION,
71
+ appId,
72
+ ready: false,
73
+ score: 0,
74
+ blocking: [],
75
+ warnings: warning ? [warning] : [],
76
+ signals: {},
77
+ nextAction: null,
78
+ summary: "No readiness computed."
79
+ });
80
+
81
+ if (!graph || typeof graph !== "object" || !Array.isArray(graph.nodes)) {
82
+ return empty("graph missing or malformed");
83
+ }
84
+
85
+ const inScope = (node) => {
86
+ if (!appId) return true;
87
+ const scope = node.summary && (node.summary.appId || node.summary.appScope);
88
+ return safeString(scope) === appId;
89
+ };
90
+
91
+ const nodes = graph.nodes.filter(inScope);
92
+ const issues = [];
93
+ const counts = { integrations: 0, sandboxes: 0, pipelines: 0, workflows: 0 };
94
+
95
+ for (const node of nodes) {
96
+ const s = node.summary || {};
97
+ if (node.type === "integration") {
98
+ counts.integrations += 1;
99
+ if (!isConnected(s.status)) {
100
+ issues.push({
101
+ severity: "blocker",
102
+ code: "integration_not_connected",
103
+ subject: node.label || node.id,
104
+ message: `Integration "${node.label || node.id}" is ${safeString(s.status) || "not connected"}.`,
105
+ nextAction: `Connect integration "${node.label || node.id}" (test-source / auth), then re-check readiness.`
106
+ });
107
+ }
108
+ } else if (node.type === "sandbox") {
109
+ counts.sandboxes += 1;
110
+ const state = authState(s.authStatus);
111
+ const subject = node.label || node.id;
112
+ if (state === "authed" || isNoAuthSandbox(s)) {
113
+ // authed, or a deliberate local/no-auth sandbox — ready.
114
+ } else if (state === "unknown") {
115
+ issues.push({
116
+ severity: "warning",
117
+ code: "sandbox_auth_unknown",
118
+ subject,
119
+ message: `Sandbox "${subject}" has no auth status — cannot confirm it can run, and it is not marked local/no-auth.`,
120
+ nextAction: `Authenticate sandbox "${subject}", or mark it local/no-auth (runLocality: local) if it needs no credential.`
121
+ });
122
+ } else {
123
+ issues.push({
124
+ severity: "blocker",
125
+ code: "sandbox_unauthenticated",
126
+ subject,
127
+ message: `Sandbox "${subject}" auth status is ${safeString(s.authStatus)}.`,
128
+ nextAction: `Authenticate sandbox "${subject}" before running.`
129
+ });
130
+ }
131
+ } else if (node.type === "pipelineHealth") {
132
+ counts.pipelines += 1;
133
+ const status = safeString(s.status).toLowerCase();
134
+ if (status === "untested" || s.latestOk === false) {
135
+ issues.push({
136
+ severity: status === "untested" ? "warning" : "blocker",
137
+ code: status === "untested" ? "pipeline_untested" : "pipeline_failing",
138
+ subject: node.label || node.id,
139
+ message: `Pipeline "${node.label || node.id}" is ${status || "failing"}.`,
140
+ nextAction: status === "untested"
141
+ ? `Run "${node.label || node.id}" once to prove it (POST /api/workspace/sandbox-run).`
142
+ : `Investigate the last failing run of "${node.label || node.id}".`
143
+ });
144
+ }
145
+ } else if (node.type === "workflow") {
146
+ counts.workflows += 1;
147
+ if (safeString(s.lifecycleStatus).toLowerCase() === "draft") {
148
+ issues.push({
149
+ severity: "warning",
150
+ code: "workflow_draft_only",
151
+ subject: node.label || node.id,
152
+ message: `Workflow "${node.label || node.id}" is draft-only — durable proof pending.`,
153
+ nextAction: `Prove "${node.label || node.id}" with a sandbox run, then publish.`
154
+ });
155
+ }
156
+ }
157
+ }
158
+
159
+ for (const extra of Array.isArray(options.extraBlockers) ? options.extraBlockers : []) {
160
+ if (!extra || !extra.code) continue;
161
+ issues.push({
162
+ severity: extra.severity === "warning" ? "warning" : "blocker",
163
+ code: safeString(extra.code),
164
+ subject: safeString(extra.subject) || safeString(extra.code),
165
+ message: safeString(extra.message) || safeString(extra.code),
166
+ nextAction: extra.nextAction ? safeString(extra.nextAction) : null
167
+ });
168
+ }
169
+
170
+ issues.sort((a, b) =>
171
+ (SEVERITY[a.severity] ?? 9) - (SEVERITY[b.severity] ?? 9) ||
172
+ a.code.localeCompare(b.code) ||
173
+ a.subject.localeCompare(b.subject)
174
+ );
175
+
176
+ const blocking = issues.filter((i) => i.severity === "blocker");
177
+ const warnings = issues.filter((i) => i.severity === "warning");
178
+ const ready = blocking.length === 0;
179
+
180
+ // Score: 100 when ready and clean; each blocker −25, each warning −5, floored at 0.
181
+ const score = Math.max(0, 100 - blocking.length * 25 - warnings.length * 5);
182
+ const nextAction = (blocking[0]?.nextAction)
183
+ || (warnings[0]?.nextAction)
184
+ || (ready ? "Ready — promote/deploy through the governed lane." : null);
185
+
186
+ return {
187
+ kind: APP_READINESS_KIND,
188
+ version: APP_READINESS_VERSION,
189
+ appId,
190
+ ready,
191
+ score,
192
+ blocking,
193
+ warnings,
194
+ signals: { ...counts, ...(options.extraSignals && typeof options.extraSignals === "object" ? options.extraSignals : {}) },
195
+ nextAction,
196
+ summary: summarizeReadiness(appId, ready, blocking, warnings, score)
197
+ };
198
+ }
199
+
200
+ function summarizeReadiness(appId, ready, blocking, warnings, score) {
201
+ const scope = appId ? `App "${appId}"` : "Workspace";
202
+ if (ready && !warnings.length) return `${scope} is ready to ship (score ${score}).`;
203
+ if (ready) return `${scope} is ready (score ${score}) with ${warnings.length} warning(s).`;
204
+ return `${scope} is blocked (score ${score}): ${blocking.length} blocker(s), ${warnings.length} warning(s).`;
205
+ }
206
+
207
+ export {
208
+ APP_READINESS_KIND,
209
+ APP_READINESS_VERSION,
210
+ deriveAppReadiness,
211
+ summarizeReadiness
212
+ };