@growthub/cli 0.9.18 → 0.10.0

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 (50) hide show
  1. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/reference-options/route.js +62 -0
  2. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/refresh-sources/route.js +13 -2
  3. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/resolver-templates/route.js +23 -0
  4. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/sandbox-run/route.js +35 -5
  5. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/test-source/route.js +15 -1
  6. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/DataModelShell.jsx +2048 -0
  7. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/DataTable.jsx +1 -0
  8. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/FieldEditor.jsx +1 -0
  9. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/FieldManager.jsx +9 -0
  10. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/ObjectSidebar.jsx +41 -0
  11. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/RecordDrawer.jsx +1 -0
  12. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/ReferencePicker.jsx +244 -0
  13. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/SandboxRunPanel.jsx +21 -0
  14. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/SourceTestPanel.jsx +15 -0
  15. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/StatusPill.jsx +13 -0
  16. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/ToggleField.jsx +41 -0
  17. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/dm-shared.jsx +99 -0
  18. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/page.jsx +2 -1528
  19. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/globals.css +66 -5
  20. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/docs/connector-template-authoring.md +8 -0
  21. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/docs/data-model-reference-fields.md +15 -0
  22. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/docs/mcp-chrome-tool-connectors.md +12 -0
  23. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/docs/resolver-template-library.md +17 -0
  24. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/source-resolver-registry.js +13 -0
  25. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/README.md +12 -0
  26. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/chrome-bridge.js +22 -0
  27. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/custom-http.js +23 -0
  28. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/generic-commerce.js +22 -0
  29. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/generic-crm.js +23 -0
  30. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/generic-project-management.js +22 -0
  31. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/generic-spreadsheet.js +22 -0
  32. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/mcp-tool.js +22 -0
  33. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/template-registry.js +50 -0
  34. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/templates/webhook.js +22 -0
  35. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/references/collect-reference-options.js +133 -0
  36. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/references/reference-resolver-registry.js +17 -0
  37. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/references/resolver-loader.js +6 -0
  38. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/references/resolvers/README.md +8 -0
  39. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/references/resolvers/local-data-model.js +11 -0
  40. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/references/resolvers/source-records.js +34 -0
  41. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/sandboxes/adapters/README.md +5 -3
  42. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/sandboxes/default-local-intelligence.js +203 -0
  43. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/sandboxes/index.js +1 -0
  44. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/data-model/field-contracts.js +81 -0
  45. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/data-model/reference-option-schema.js +59 -0
  46. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/data-model/reference-options.js +29 -0
  47. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-data-model.js +527 -23
  48. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-schema.js +131 -1
  49. package/dist/index.js +3036 -1340
  50. package/package.json +1 -1
@@ -0,0 +1,62 @@
1
+ /**
2
+ * POST /api/workspace/reference-options
3
+ *
4
+ * Lazy, status-aware reference picker backing store. No provider tokens in/out.
5
+ */
6
+
7
+ import { NextResponse } from "next/server";
8
+ import { readWorkspaceConfig } from "@/lib/workspace-config";
9
+ import { validateReferenceOptionsRequest } from "@/lib/data-model/reference-option-schema";
10
+ import { collectReferenceOptions } from "@/lib/adapters/references/collect-reference-options";
11
+
12
+ async function POST(request) {
13
+ let body;
14
+ try {
15
+ body = await request.json();
16
+ } catch {
17
+ return NextResponse.json({ ok: false, error: "invalid JSON body" }, { status: 400 });
18
+ }
19
+
20
+ const parsed = validateReferenceOptionsRequest(body);
21
+ if (!parsed.ok) {
22
+ return NextResponse.json(
23
+ { ok: false, error: parsed.errors.join("; ") },
24
+ { status: 400 }
25
+ );
26
+ }
27
+
28
+ let workspaceConfig;
29
+ try {
30
+ workspaceConfig = await readWorkspaceConfig();
31
+ } catch (err) {
32
+ return NextResponse.json(
33
+ { ok: false, error: `failed to read workspace config: ${err.message}` },
34
+ { status: 500 }
35
+ );
36
+ }
37
+
38
+ const result = await collectReferenceOptions(workspaceConfig, parsed.value);
39
+ if (!result.ok) {
40
+ return NextResponse.json(
41
+ {
42
+ ok: false,
43
+ options: [],
44
+ nextCursor: null,
45
+ reason: result.reason,
46
+ error: result.error || "reference resolution failed"
47
+ },
48
+ { status: 400 }
49
+ );
50
+ }
51
+
52
+ return NextResponse.json({
53
+ ok: true,
54
+ options: result.options,
55
+ nextCursor: result.nextCursor ?? null,
56
+ reason: result.reason ?? null,
57
+ total: result.total,
58
+ resolverIntegrationId: result.resolverIntegrationId
59
+ });
60
+ }
61
+
62
+ export { POST };
@@ -82,29 +82,34 @@ async function POST(request) {
82
82
 
83
83
  const refreshed = [];
84
84
  const skipped = [];
85
+ const skippedDetail = [];
85
86
 
86
87
  for (const sourceId of sourceIds) {
87
88
  const obj = dataObjects.find((o) => o.id === sourceId);
88
89
  if (!obj) {
89
90
  skipped.push(sourceId);
91
+ skippedDetail.push({ sourceId, reason: "unknown-object" });
90
92
  continue;
91
93
  }
92
94
 
93
95
  const binding = obj.binding;
94
96
  if (!binding || binding.sourceStorage !== "workspace-source-records") {
95
97
  skipped.push(sourceId);
98
+ skippedDetail.push({ sourceId, reason: "not-live-backed" });
96
99
  continue;
97
100
  }
98
101
 
99
102
  const integrationId = binding.integrationId;
100
103
  if (!integrationId) {
101
104
  skipped.push(sourceId);
105
+ skippedDetail.push({ sourceId, reason: "missing-integration-id" });
102
106
  continue;
103
107
  }
104
108
 
105
109
  const resolver = getSourceResolver(integrationId);
106
110
  if (!resolver) {
107
111
  skipped.push(sourceId);
112
+ skippedDetail.push({ sourceId, reason: "missing-resolver", integrationId });
108
113
  continue;
109
114
  }
110
115
 
@@ -116,12 +121,18 @@ async function POST(request) {
116
121
  const fetchedAt = new Date().toISOString();
117
122
  await writeWorkspaceSourceRecords(sourceId, records, { integrationId, fetchedAt });
118
123
  refreshed.push({ sourceId, integrationId, recordCount: records.length, fetchedAt });
119
- } catch {
124
+ } catch (err) {
120
125
  skipped.push(sourceId);
126
+ skippedDetail.push({
127
+ sourceId,
128
+ reason: "fetch-error",
129
+ integrationId,
130
+ message: err?.message || "fetchRecords failed"
131
+ });
121
132
  }
122
133
  }
123
134
 
124
- return NextResponse.json({ refreshed, skipped });
135
+ return NextResponse.json({ refreshed, skipped, skippedDetail });
125
136
  }
126
137
 
127
138
  export { POST };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * GET /api/workspace/resolver-templates
3
+ *
4
+ * Lists built-in resolver / connector templates (metadata only).
5
+ */
6
+
7
+ import { NextResponse } from "next/server";
8
+ import { listResolverTemplates, getResolverTemplate } from "@/lib/adapters/integrations/templates/template-registry";
9
+
10
+ async function GET(request) {
11
+ const { searchParams } = new URL(request.url);
12
+ const id = searchParams.get("templateId");
13
+ if (id) {
14
+ const one = getResolverTemplate(id);
15
+ if (!one) {
16
+ return NextResponse.json({ ok: false, error: "template not found" }, { status: 404 });
17
+ }
18
+ return NextResponse.json({ ok: true, template: one });
19
+ }
20
+ return NextResponse.json({ ok: true, templates: listResolverTemplates() });
21
+ }
22
+
23
+ export { GET };
@@ -344,9 +344,10 @@ function buildRunResponse({
344
344
  networkAllow,
345
345
  allowList,
346
346
  result,
347
- timeoutMs
347
+ timeoutMs,
348
+ row
348
349
  }) {
349
- return {
350
+ const base = {
350
351
  runId,
351
352
  ranAt,
352
353
  runLocality,
@@ -370,6 +371,14 @@ function buildRunResponse({
370
371
  allowList,
371
372
  adapterMeta: result.adapterMeta || null
372
373
  };
374
+ if (row && (row.resolverTemplateId || row.connectorKind || row.executionLane)) {
375
+ base.templateTrace = {
376
+ resolverTemplateId: row.resolverTemplateId ? String(row.resolverTemplateId) : null,
377
+ connectorKind: row.connectorKind ? String(row.connectorKind) : null,
378
+ executionLane: row.executionLane ? String(row.executionLane) : null
379
+ };
380
+ }
381
+ return base;
373
382
  }
374
383
 
375
384
  function findSandboxRow(workspaceConfig, objectId, name) {
@@ -442,6 +451,18 @@ async function POST(request) {
442
451
  const agentCommand = instructions
443
452
  ? `Instructions:\n${instructions}\n\nPrompt:\n${command}`
444
453
  : command;
454
+ const intelligenceSandbox =
455
+ adapterId === "local-intelligence"
456
+ ? {
457
+ userIntent: agentCommand,
458
+ localModel: typeof row.localModel === "string" ? row.localModel.trim() : "",
459
+ localEndpoint: typeof row.localEndpoint === "string" ? row.localEndpoint.trim() : "",
460
+ intelligenceAdapterMode:
461
+ typeof row.intelligenceAdapterMode === "string"
462
+ ? row.intelligenceAdapterMode.trim().toLowerCase()
463
+ : "ollama",
464
+ }
465
+ : undefined;
445
466
  const lifecycleStatus = String(row.lifecycleStatus || "draft").trim().toLowerCase() === "live" ? "live" : "draft";
446
467
  const version = row.version ?? "";
447
468
  const requestedTimeout = Number(row.timeoutMs);
@@ -449,6 +470,13 @@ async function POST(request) {
449
470
  ? Math.min(requestedTimeout, SANDBOX_MAX_TIMEOUT_MS)
450
471
  : SANDBOX_DEFAULT_TIMEOUT_MS;
451
472
 
473
+ if (runLocality === "serverless" && adapterId === "local-intelligence") {
474
+ return NextResponse.json({
475
+ ok: false,
476
+ error: "`local-intelligence` applies only when runLocality is local. Switch run locality or choose a process adapter for serverless delegation.",
477
+ }, { status: 400 });
478
+ }
479
+
452
480
  if (runLocality === "serverless" && adapterId === "local-agent-host") {
453
481
  return NextResponse.json({
454
482
  ok: false,
@@ -522,7 +550,7 @@ async function POST(request) {
522
550
  name: row.Name || name,
523
551
  runtime,
524
552
  agentHost,
525
- command: adapterId === "local-agent-host" ? agentCommand : command,
553
+ command: adapterId === "local-agent-host" || adapterId === "local-intelligence" ? agentCommand : command,
526
554
  timeoutMs,
527
555
  networkAllow,
528
556
  allowList,
@@ -530,7 +558,8 @@ async function POST(request) {
530
558
  envRefSlugs,
531
559
  envRefsMissing,
532
560
  workdir,
533
- ranAt
561
+ ranAt,
562
+ ...(intelligenceSandbox ? { intelligenceSandbox } : {}),
534
563
  });
535
564
  } catch (error) {
536
565
  result = {
@@ -564,7 +593,8 @@ async function POST(request) {
564
593
  networkAllow,
565
594
  allowList,
566
595
  result,
567
- timeoutMs
596
+ timeoutMs,
597
+ row
568
598
  });
569
599
 
570
600
  const sourceId = sandboxRunSourceId(objectId, row.Name || name);
@@ -117,13 +117,27 @@ async function POST(request) {
117
117
  const columns = inferColumns(records);
118
118
  const preview = records.slice(0, PREVIEW_ROW_LIMIT);
119
119
 
120
+ const resolverMeta = {
121
+ entityTypes: Array.isArray(resolver.entityTypes) ? resolver.entityTypes : [],
122
+ configSchema: Array.isArray(resolver.configSchema) ? resolver.configSchema : null,
123
+ hasListEntities: typeof resolver.listEntities === "function",
124
+ connectorKind: typeof resolver.connectorKind === "string" ? resolver.connectorKind : null,
125
+ templateId: typeof resolver.templateId === "string" ? resolver.templateId : null,
126
+ capabilities: Array.isArray(resolver.capabilities) ? resolver.capabilities : null,
127
+ referenceSchema:
128
+ resolver.referenceSchema && typeof resolver.referenceSchema === "object" && !Array.isArray(resolver.referenceSchema)
129
+ ? resolver.referenceSchema
130
+ : null
131
+ };
132
+
120
133
  return NextResponse.json({
121
134
  ok: true,
122
135
  integrationId: integrationId.trim(),
123
136
  recordCount: records.length,
124
137
  columns,
125
138
  preview,
126
- entityTypes: resolver.entityTypes || []
139
+ entityTypes: resolverMeta.entityTypes,
140
+ resolverMeta
127
141
  });
128
142
  }
129
143