@growthub/cli 0.13.5 → 0.13.7
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/assets/worker-kits/growthub-custom-workspace-starter-v1/QUICKSTART.md +19 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/.env.example +8 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/README.md +4 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/integrations/nango/action/execute/route.js +60 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/integrations/nango/actions/route.js +50 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/integrations/nango/connect-session/route.js +68 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/integrations/nango/connection-status/route.js +56 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/integrations/nango/proxy/route.js +67 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/integrations/nango/status/route.js +50 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/metadata-graph/route.js +1 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/components/WorkspaceActivationPanel.jsx +172 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/DataModelShell.jsx +161 -50
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/NangoConnectionPanel.jsx +531 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/globals.css +274 -18
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/integrations/nango/page.jsx +167 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/integrations/page.jsx +1 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workflows/WorkflowSurface.jsx +62 -7
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-builder.jsx +554 -48
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-rail.jsx +24 -14
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/env.js +7 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/nango/index.js +38 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/nango/nango-adapter.js +552 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/nango/nango-config-loader.js +202 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/nango/nango-schema.js +303 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/resolver-loader.js +49 -10
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/source-resolver-registry.js +1 -1
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/nango.js +49 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/template-registry.js +4 -2
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/orchestration-graph.js +2 -2
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-activation.js +534 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-data-model.js +3 -1
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-metadata-store.js +82 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-schema.js +102 -3
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/package.json +1 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/bundles/growthub-custom-workspace-starter-v1.json +1 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/kit.json +5 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/templates/seeded-configs/project-management.config.json +276 -0
- package/dist/index.js +127 -44
- package/package.json +1 -1
|
@@ -51,6 +51,7 @@ import { AgentSwarmPanel } from "../data-model/components/AgentSwarmPanel.jsx";
|
|
|
51
51
|
import { RunSetupPanel } from "./RunSetupPanel.jsx";
|
|
52
52
|
import { describeRunInputMetadataItems, discoverRunInputSchema } from "@/lib/orchestration-run-inputs";
|
|
53
53
|
import { selectWorkflowNodeInputSchema } from "@/lib/workspace-metadata-selectors";
|
|
54
|
+
import { deriveProvenance, hasConnectionId } from "@/lib/workspace-activation";
|
|
54
55
|
|
|
55
56
|
// Workspace Metadata Graph V1 — read-only dependency metadata for workflow
|
|
56
57
|
// sidecars. The runtime path (sandbox-run, publish, draft/live) is
|
|
@@ -62,7 +63,7 @@ const WORKFLOW_METADATA_SELECTORS = Object.freeze({
|
|
|
62
63
|
});
|
|
63
64
|
|
|
64
65
|
function resolveRegistryRowForSandbox(workspaceConfig, sandboxRow) {
|
|
65
|
-
const graph = parseOrchestrationGraph(sandboxRow?.orchestrationGraph);
|
|
66
|
+
const graph = parseOrchestrationGraph(sandboxRow?.orchestrationConfig || sandboxRow?.orchestrationGraph);
|
|
66
67
|
const apiNode = graph?.nodes?.find((n) => n?.type === "api-registry-call");
|
|
67
68
|
const registryId = String(
|
|
68
69
|
apiNode?.config?.registryId || apiNode?.config?.integrationId || sandboxRow?.schedulerRegistryId || ""
|
|
@@ -291,6 +292,10 @@ function isPassingRun(payload) {
|
|
|
291
292
|
return payload?.ok === true && Number(payload?.exitCode ?? payload?.response?.exitCode) === 0;
|
|
292
293
|
}
|
|
293
294
|
|
|
295
|
+
function graphHasNodes(graph) {
|
|
296
|
+
return Array.isArray(graph?.nodes) && graph.nodes.length > 0;
|
|
297
|
+
}
|
|
298
|
+
|
|
294
299
|
function WorkflowAddStepPanel({ target, onSelect }) {
|
|
295
300
|
return (
|
|
296
301
|
<div className="dm-workflow-add-panel">
|
|
@@ -323,7 +328,7 @@ export default function WorkflowSurface() {
|
|
|
323
328
|
const searchParams = useSearchParams();
|
|
324
329
|
const objectId = String(searchParams.get("object") || "").trim();
|
|
325
330
|
const rowId = String(searchParams.get("row") || "").trim();
|
|
326
|
-
const fieldName = String(searchParams.get("field") || "
|
|
331
|
+
const fieldName = String(searchParams.get("field") || "orchestrationConfig").trim();
|
|
327
332
|
const runId = String(searchParams.get("run") || "").trim();
|
|
328
333
|
|
|
329
334
|
const [workspaceConfig, setWorkspaceConfig] = useState(null);
|
|
@@ -369,24 +374,58 @@ export default function WorkflowSurface() {
|
|
|
369
374
|
);
|
|
370
375
|
|
|
371
376
|
const sandboxRow = resolved.row;
|
|
372
|
-
const
|
|
377
|
+
const hasGraphValue = (value) => Boolean(parseOrchestrationGraph(value));
|
|
378
|
+
const effectiveFieldName = hasGraphValue(sandboxRow?.[fieldName])
|
|
373
379
|
? fieldName
|
|
374
|
-
: sandboxRow?.orchestrationConfig
|
|
380
|
+
: hasGraphValue(sandboxRow?.orchestrationConfig)
|
|
375
381
|
? "orchestrationConfig"
|
|
376
|
-
:
|
|
382
|
+
: hasGraphValue(sandboxRow?.orchestrationGraph)
|
|
383
|
+
? "orchestrationGraph"
|
|
384
|
+
: (fieldName || "orchestrationConfig");
|
|
377
385
|
const draftFieldName = effectiveFieldName === "orchestrationConfig" ? "orchestrationDraftConfig" : "orchestrationDraftGraph";
|
|
378
386
|
const registryRow = useMemo(
|
|
379
387
|
() => (sandboxRow && workspaceConfig ? resolveRegistryRowForSandbox(workspaceConfig, sandboxRow) : null),
|
|
380
388
|
[workspaceConfig, sandboxRow]
|
|
381
389
|
);
|
|
382
390
|
|
|
391
|
+
// Template-aware activation banner. When the active workflow belongs to
|
|
392
|
+
// a seeded template (project-management today) and its provider row
|
|
393
|
+
// doesn't have a connectionId yet, surface a back-link to the API
|
|
394
|
+
// Registry / Nango panel so the user can finish setup without hunting
|
|
395
|
+
// through Data Model surfaces.
|
|
396
|
+
const templateBanner = useMemo(() => {
|
|
397
|
+
if (!workspaceConfig) return null;
|
|
398
|
+
const provenance = deriveProvenance(workspaceConfig);
|
|
399
|
+
if (provenance.template !== "project-management") return null;
|
|
400
|
+
if (!registryRow) return null;
|
|
401
|
+
const ready = hasConnectionId(registryRow);
|
|
402
|
+
const apiRegistryObjectId = String(
|
|
403
|
+
(Array.isArray(workspaceConfig?.dataModel?.objects)
|
|
404
|
+
? workspaceConfig.dataModel.objects.find((o) => o?.objectType === "api-registry")?.id
|
|
405
|
+
: "") || ""
|
|
406
|
+
);
|
|
407
|
+
const apiRegistryRowId = String(registryRow.integrationId || "").trim();
|
|
408
|
+
const backHref = apiRegistryObjectId && apiRegistryRowId
|
|
409
|
+
? `/data-model?object=${encodeURIComponent(apiRegistryObjectId)}&row=${encodeURIComponent(apiRegistryRowId)}`
|
|
410
|
+
: "/data-model";
|
|
411
|
+
return {
|
|
412
|
+
ready,
|
|
413
|
+
backHref,
|
|
414
|
+
providerConfigKey: String(registryRow.providerConfigKey || registryRow.integrationId || "").trim(),
|
|
415
|
+
};
|
|
416
|
+
}, [workspaceConfig, registryRow]);
|
|
417
|
+
|
|
383
418
|
useEffect(() => {
|
|
384
419
|
setSidecarMode(runId ? "trace" : "graph");
|
|
385
420
|
}, [runId]);
|
|
386
421
|
|
|
387
422
|
useEffect(() => {
|
|
388
423
|
if (!sandboxRow) return;
|
|
389
|
-
const
|
|
424
|
+
const draftParsed = parseOrchestrationGraph(sandboxRow[draftFieldName]);
|
|
425
|
+
const publishedParsed = parseOrchestrationGraph(sandboxRow[effectiveFieldName])
|
|
426
|
+
|| parseOrchestrationGraph(sandboxRow.orchestrationConfig)
|
|
427
|
+
|| parseOrchestrationGraph(sandboxRow.orchestrationGraph);
|
|
428
|
+
const parsed = graphHasNodes(draftParsed) || !graphHasNodes(publishedParsed) ? draftParsed : publishedParsed;
|
|
390
429
|
setOrchestrationGraph(parsed);
|
|
391
430
|
setDirty(false);
|
|
392
431
|
setGraphError("");
|
|
@@ -760,7 +799,7 @@ export default function WorkflowSurface() {
|
|
|
760
799
|
const publishReady = draftPassed && String(sandboxRow?.orchestrationDraftTestedConfig || "") === currentGraphSerialized && !dirty;
|
|
761
800
|
const savedDraftValue = String(sandboxRow?.[draftFieldName] || "").trim();
|
|
762
801
|
const draftStatus = String(sandboxRow?.orchestrationDraftStatus || "").trim();
|
|
763
|
-
const hasSavedDraft = Boolean(savedDraftValue) && draftStatus !== "published";
|
|
802
|
+
const hasSavedDraft = Boolean(savedDraftValue) && draftStatus !== "published" && graphHasNodes(parseOrchestrationGraph(savedDraftValue));
|
|
764
803
|
const isDraftMode = dirty || hasSavedDraft;
|
|
765
804
|
const canTest = !graphUnset && !graphBlankShell && Boolean(sandboxRow) && !Boolean(graphError);
|
|
766
805
|
const showDiscardDraft = isDraftMode;
|
|
@@ -865,6 +904,22 @@ export default function WorkflowSurface() {
|
|
|
865
904
|
</div>
|
|
866
905
|
</header>
|
|
867
906
|
|
|
907
|
+
{templateBanner ? (
|
|
908
|
+
<div
|
|
909
|
+
className={"workspace-template-context-banner" + (templateBanner.ready ? "" : " is-warn")}
|
|
910
|
+
role="note"
|
|
911
|
+
>
|
|
912
|
+
<span>
|
|
913
|
+
{templateBanner.ready
|
|
914
|
+
? `Provider connected via Nango${templateBanner.providerConfigKey ? ` (${templateBanner.providerConfigKey})` : ""}. Ready to run.`
|
|
915
|
+
: "Connect your provider through Nango before running this workflow."}
|
|
916
|
+
</span>
|
|
917
|
+
<Link href={templateBanner.backHref} className="workspace-template-context-link">
|
|
918
|
+
<span>{templateBanner.ready ? "Manage connection" : "Open Nango panel"}</span>
|
|
919
|
+
</Link>
|
|
920
|
+
</div>
|
|
921
|
+
) : null}
|
|
922
|
+
|
|
868
923
|
{loading ? (
|
|
869
924
|
<p className="dm-workflow-empty">Loading workflow…</p>
|
|
870
925
|
) : error ? (
|