@topolo/cli 0.9.7 → 0.9.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1836,12 +1836,21 @@ function redactActionResult(value) {
1836
1836
  if (!isRecord3(value)) return value;
1837
1837
  return Object.fromEntries(Object.entries(value).map(([key, item]) => [
1838
1838
  key,
1839
- isSensitiveActionResultKey(key) ? "[REDACTED]" : redactActionResult(item)
1839
+ isSensitiveActionResultKey(key, item) ? "[REDACTED]" : redactActionResult(item)
1840
1840
  ]));
1841
1841
  }
1842
- function isSensitiveActionResultKey(key) {
1842
+ function isSensitiveActionResultKey(key, value) {
1843
1843
  const normalized = key.toLowerCase().replace(/[^a-z0-9]/g, "");
1844
- return ["authorization", "cookie", "setcookie", "proxyauthorization", "capability"].includes(normalized) || /(token|secret|password|privatekey|apikey)$/.test(normalized);
1844
+ if (normalized === "capability") return isCredentialShaped(value);
1845
+ return ["authorization", "cookie", "setcookie", "proxyauthorization"].includes(normalized) || /(token|secret|password|privatekey|apikey)$/.test(normalized);
1846
+ }
1847
+ var PLAIN_ENUM_VALUE = /^[a-z][a-z0-9_-]{0,31}$/;
1848
+ function isCredentialShaped(value) {
1849
+ if (typeof value !== "string") return value !== null && value !== void 0 && typeof value !== "boolean" && typeof value !== "number";
1850
+ const trimmed = value.trim();
1851
+ if (!trimmed) return false;
1852
+ if (/^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed)) return true;
1853
+ return !PLAIN_ENUM_VALUE.test(trimmed);
1845
1854
  }
1846
1855
  function resolveConfiguredServiceUrl(slug, serviceUrls) {
1847
1856
  for (const serviceKey of serviceKeyCandidates2(slug)) {
@@ -2474,6 +2483,461 @@ var TopoloOAuth = class {
2474
2483
  return parsed;
2475
2484
  }
2476
2485
  };
2486
+ var nonEmptyString2 = { type: "string", minLength: 1 };
2487
+ var stringArray3 = { type: "array", items: nonEmptyString2 };
2488
+ var actionBinding = {
2489
+ type: "object",
2490
+ properties: {
2491
+ id: nonEmptyString2,
2492
+ label: nonEmptyString2,
2493
+ actionId: nonEmptyString2,
2494
+ resourceType: nonEmptyString2,
2495
+ resourceId: nonEmptyString2,
2496
+ input: { type: "object" },
2497
+ requiresConfirmation: { type: "boolean" },
2498
+ destructive: { type: "boolean" },
2499
+ effects: stringArray3,
2500
+ verification: stringArray3,
2501
+ recovery: {
2502
+ type: "object",
2503
+ properties: {
2504
+ mode: { enum: ["not_applicable", "retry", "compensating_action"] },
2505
+ actionId: nonEmptyString2,
2506
+ instructions: nonEmptyString2
2507
+ },
2508
+ required: ["mode", "instructions"],
2509
+ additionalProperties: false
2510
+ }
2511
+ },
2512
+ required: [
2513
+ "id",
2514
+ "label",
2515
+ "actionId",
2516
+ "resourceType",
2517
+ "input",
2518
+ "requiresConfirmation",
2519
+ "destructive",
2520
+ "effects",
2521
+ "verification",
2522
+ "recovery"
2523
+ ],
2524
+ additionalProperties: false
2525
+ };
2526
+ var dimension = {
2527
+ type: "object",
2528
+ properties: { key: nonEmptyString2, label: nonEmptyString2, value: nonEmptyString2 },
2529
+ required: ["key", "label", "value"],
2530
+ additionalProperties: false
2531
+ };
2532
+ var period = {
2533
+ type: "object",
2534
+ properties: {
2535
+ start: nonEmptyString2,
2536
+ end: nonEmptyString2,
2537
+ timezone: nonEmptyString2
2538
+ },
2539
+ required: ["start", "end", "timezone"],
2540
+ additionalProperties: false
2541
+ };
2542
+ var series = {
2543
+ type: "object",
2544
+ properties: {
2545
+ id: nonEmptyString2,
2546
+ label: nonEmptyString2,
2547
+ unit: nonEmptyString2,
2548
+ points: {
2549
+ type: "array",
2550
+ items: {
2551
+ type: "object",
2552
+ properties: {
2553
+ timestamp: nonEmptyString2,
2554
+ value: { type: "number" },
2555
+ dimensions: { type: "array", items: dimension }
2556
+ },
2557
+ required: ["timestamp", "value", "dimensions"],
2558
+ additionalProperties: false
2559
+ }
2560
+ }
2561
+ },
2562
+ required: ["id", "label", "unit", "points"],
2563
+ additionalProperties: false
2564
+ };
2565
+ var contribution = {
2566
+ type: "object",
2567
+ properties: {
2568
+ summary: nonEmptyString2,
2569
+ identity: {
2570
+ type: "object",
2571
+ properties: { iconSource: { const: "catalog" } },
2572
+ required: ["iconSource"],
2573
+ additionalProperties: false
2574
+ },
2575
+ workspaceSelector: {
2576
+ type: "object",
2577
+ properties: {
2578
+ mode: { enum: ["none", "optional", "required"] },
2579
+ resourceType: nonEmptyString2,
2580
+ label: nonEmptyString2,
2581
+ supportsMultiple: { type: "boolean" }
2582
+ },
2583
+ required: ["mode", "resourceType", "label", "supportsMultiple"],
2584
+ additionalProperties: false
2585
+ },
2586
+ metricDefinitions: {
2587
+ type: "array",
2588
+ items: {
2589
+ type: "object",
2590
+ properties: {
2591
+ key: nonEmptyString2,
2592
+ label: nonEmptyString2,
2593
+ description: nonEmptyString2,
2594
+ unit: nonEmptyString2,
2595
+ semantic: {
2596
+ enum: ["gauge", "counter", "rate", "duration", "currency", "percentage"]
2597
+ },
2598
+ aggregation: {
2599
+ enum: ["last", "sum", "average", "minimum", "maximum", "count", "distinct_count"]
2600
+ }
2601
+ },
2602
+ required: ["key", "label", "description", "unit", "semantic", "aggregation"],
2603
+ additionalProperties: false
2604
+ }
2605
+ },
2606
+ seriesDefinitions: {
2607
+ type: "array",
2608
+ items: {
2609
+ type: "object",
2610
+ properties: {
2611
+ key: nonEmptyString2,
2612
+ label: nonEmptyString2,
2613
+ metricKey: nonEmptyString2,
2614
+ unit: nonEmptyString2
2615
+ },
2616
+ required: ["key", "label", "metricKey", "unit"],
2617
+ additionalProperties: false
2618
+ }
2619
+ },
2620
+ dimensions: {
2621
+ type: "array",
2622
+ items: {
2623
+ type: "object",
2624
+ properties: {
2625
+ key: nonEmptyString2,
2626
+ label: nonEmptyString2,
2627
+ description: nonEmptyString2,
2628
+ valueType: { enum: ["string", "number", "boolean", "date", "datetime"] }
2629
+ },
2630
+ required: ["key", "label", "description", "valueType"],
2631
+ additionalProperties: false
2632
+ }
2633
+ },
2634
+ lifecycleStages: {
2635
+ type: "array",
2636
+ items: {
2637
+ type: "object",
2638
+ properties: {
2639
+ key: nonEmptyString2,
2640
+ label: nonEmptyString2,
2641
+ order: { type: "number" },
2642
+ terminal: { type: "boolean" }
2643
+ },
2644
+ required: ["key", "label", "order", "terminal"],
2645
+ additionalProperties: false
2646
+ }
2647
+ },
2648
+ events: {
2649
+ type: "array",
2650
+ items: {
2651
+ type: "object",
2652
+ properties: {
2653
+ key: nonEmptyString2,
2654
+ label: nonEmptyString2,
2655
+ description: nonEmptyString2
2656
+ },
2657
+ required: ["key", "label", "description"],
2658
+ additionalProperties: false
2659
+ }
2660
+ },
2661
+ datasets: {
2662
+ type: "array",
2663
+ minItems: 1,
2664
+ items: {
2665
+ type: "object",
2666
+ properties: {
2667
+ id: nonEmptyString2,
2668
+ label: nonEmptyString2,
2669
+ description: nonEmptyString2,
2670
+ grain: nonEmptyString2,
2671
+ metricKeys: stringArray3,
2672
+ seriesKeys: stringArray3,
2673
+ dimensionKeys: stringArray3,
2674
+ eventKeys: stringArray3,
2675
+ actionIds: stringArray3
2676
+ },
2677
+ required: [
2678
+ "id",
2679
+ "label",
2680
+ "description",
2681
+ "grain",
2682
+ "metricKeys",
2683
+ "seriesKeys",
2684
+ "dimensionKeys",
2685
+ "eventKeys",
2686
+ "actionIds"
2687
+ ],
2688
+ additionalProperties: false
2689
+ }
2690
+ },
2691
+ compatibleVisualizations: {
2692
+ type: "array",
2693
+ minItems: 1,
2694
+ items: {
2695
+ enum: ["number", "line", "area", "bar", "donut", "table", "funnel", "timeline", "actions"]
2696
+ }
2697
+ },
2698
+ defaultVisualization: {
2699
+ enum: ["number", "line", "area", "bar", "donut", "table", "funnel", "timeline", "actions"]
2700
+ }
2701
+ },
2702
+ required: [
2703
+ "summary",
2704
+ "identity",
2705
+ "workspaceSelector",
2706
+ "metricDefinitions",
2707
+ "seriesDefinitions",
2708
+ "dimensions",
2709
+ "lifecycleStages",
2710
+ "events",
2711
+ "datasets",
2712
+ "compatibleVisualizations",
2713
+ "defaultVisualization"
2714
+ ],
2715
+ additionalProperties: false
2716
+ };
2717
+ var widgetItem = {
2718
+ type: "object",
2719
+ properties: {
2720
+ id: nonEmptyString2,
2721
+ version: nonEmptyString2,
2722
+ appId: nonEmptyString2,
2723
+ serviceName: nonEmptyString2,
2724
+ lastUpdated: nonEmptyString2,
2725
+ type: { enum: ["stats", "chart", "activity", "notifications", "actions"] },
2726
+ presentation: {
2727
+ type: "object",
2728
+ properties: {
2729
+ title: nonEmptyString2,
2730
+ description: nonEmptyString2,
2731
+ contexts: {
2732
+ type: "array",
2733
+ minItems: 1,
2734
+ items: { enum: ["personal", "organization", "workspace", "resource"] }
2735
+ },
2736
+ supportedSizes: {
2737
+ type: "array",
2738
+ minItems: 1,
2739
+ items: { enum: ["compact", "medium", "wide", "full"] }
2740
+ },
2741
+ defaultSize: { enum: ["compact", "medium", "wide", "full"] }
2742
+ },
2743
+ required: ["title", "contexts", "supportedSizes", "defaultSize"],
2744
+ additionalProperties: false
2745
+ },
2746
+ resource: {
2747
+ type: "object",
2748
+ properties: {
2749
+ resourceType: nonEmptyString2,
2750
+ resourceId: nonEmptyString2,
2751
+ requiredPermissions: stringArray3
2752
+ },
2753
+ required: ["resourceType", "requiredPermissions"],
2754
+ additionalProperties: false
2755
+ },
2756
+ state: {
2757
+ type: "object",
2758
+ properties: {
2759
+ status: { enum: ["ready", "empty", "unavailable", "stale", "error"] },
2760
+ observedAt: nonEmptyString2,
2761
+ lastSuccessfulAt: nonEmptyString2,
2762
+ code: nonEmptyString2,
2763
+ message: nonEmptyString2
2764
+ },
2765
+ required: ["status", "observedAt"],
2766
+ additionalProperties: false
2767
+ },
2768
+ refresh: {
2769
+ type: "object",
2770
+ properties: {
2771
+ intervalSeconds: { type: "number" },
2772
+ timeoutSeconds: { type: "number" },
2773
+ maxAgeSeconds: { type: "number" },
2774
+ staleWhileRevalidateSeconds: { type: "number" }
2775
+ },
2776
+ required: ["intervalSeconds", "timeoutSeconds", "maxAgeSeconds", "staleWhileRevalidateSeconds"],
2777
+ additionalProperties: false
2778
+ },
2779
+ configuration: {
2780
+ type: "object",
2781
+ properties: {
2782
+ allowMultipleInstances: { type: "boolean" },
2783
+ fields: {
2784
+ type: "array",
2785
+ items: {
2786
+ type: "object",
2787
+ properties: {
2788
+ key: nonEmptyString2,
2789
+ label: nonEmptyString2,
2790
+ type: { enum: ["string", "number", "boolean", "select", "multi-select", "date-range"] },
2791
+ required: { type: "boolean" },
2792
+ options: {
2793
+ type: "array",
2794
+ items: {
2795
+ type: "object",
2796
+ properties: { value: nonEmptyString2, label: nonEmptyString2 },
2797
+ required: ["value", "label"],
2798
+ additionalProperties: false
2799
+ }
2800
+ }
2801
+ },
2802
+ required: ["key", "label", "type", "required"],
2803
+ additionalProperties: false
2804
+ }
2805
+ },
2806
+ defaults: { type: "object" }
2807
+ },
2808
+ required: ["allowMultipleInstances", "fields", "defaults"],
2809
+ additionalProperties: false
2810
+ },
2811
+ drilldowns: {
2812
+ type: "array",
2813
+ items: {
2814
+ type: "object",
2815
+ properties: { id: nonEmptyString2, label: nonEmptyString2, href: nonEmptyString2 },
2816
+ required: ["id", "label", "href"],
2817
+ additionalProperties: false
2818
+ }
2819
+ },
2820
+ controls: { type: "array", items: actionBinding },
2821
+ localization: {
2822
+ type: "object",
2823
+ properties: {
2824
+ locale: nonEmptyString2,
2825
+ titleKey: nonEmptyString2,
2826
+ descriptionKey: nonEmptyString2,
2827
+ title: nonEmptyString2,
2828
+ description: nonEmptyString2
2829
+ },
2830
+ required: ["locale", "titleKey"],
2831
+ additionalProperties: false
2832
+ },
2833
+ accessibility: {
2834
+ type: "object",
2835
+ properties: { label: nonEmptyString2, description: nonEmptyString2 },
2836
+ required: ["label"],
2837
+ additionalProperties: false
2838
+ },
2839
+ contribution,
2840
+ metrics: {
2841
+ type: "array",
2842
+ items: {
2843
+ type: "object",
2844
+ properties: {
2845
+ key: nonEmptyString2,
2846
+ label: nonEmptyString2,
2847
+ value: { type: "number" },
2848
+ unit: nonEmptyString2,
2849
+ semantic: {
2850
+ enum: ["gauge", "counter", "rate", "duration", "currency", "percentage"]
2851
+ },
2852
+ aggregation: {
2853
+ enum: ["last", "sum", "average", "minimum", "maximum", "count", "distinct_count"]
2854
+ },
2855
+ period,
2856
+ dimensions: { type: "array", items: dimension },
2857
+ series
2858
+ },
2859
+ required: ["key", "label", "value", "unit", "semantic", "aggregation", "period", "dimensions"],
2860
+ additionalProperties: false
2861
+ }
2862
+ },
2863
+ chartType: { enum: ["line", "bar", "area", "pie", "donut"] },
2864
+ series: { type: "array", items: series },
2865
+ activities: { type: "array", items: { type: "object" } },
2866
+ notifications: { type: "array", items: { type: "object" } },
2867
+ unreadCount: { type: "number" },
2868
+ actions: { type: "array", items: actionBinding }
2869
+ },
2870
+ required: [
2871
+ "id",
2872
+ "version",
2873
+ "appId",
2874
+ "serviceName",
2875
+ "lastUpdated",
2876
+ "type",
2877
+ "presentation",
2878
+ "resource",
2879
+ "state",
2880
+ "refresh",
2881
+ "configuration",
2882
+ "drilldowns",
2883
+ "controls",
2884
+ "localization",
2885
+ "accessibility",
2886
+ "contribution"
2887
+ ],
2888
+ allOf: [
2889
+ { if: { properties: { type: { const: "stats" } } }, then: { required: ["metrics"] } },
2890
+ { if: { properties: { type: { const: "chart" } } }, then: { required: ["chartType", "series"] } },
2891
+ { if: { properties: { type: { const: "activity" } } }, then: { required: ["activities"] } },
2892
+ {
2893
+ if: { properties: { type: { const: "notifications" } } },
2894
+ then: { required: ["notifications", "unreadCount"] }
2895
+ },
2896
+ { if: { properties: { type: { const: "actions" } } }, then: { required: ["actions"] } }
2897
+ ],
2898
+ additionalProperties: false
2899
+ };
2900
+ var TOPOLO_WIDGET_OUTPUT_SCHEMA = Object.freeze({
2901
+ $schema: "https://json-schema.org/draft/2020-12/schema",
2902
+ type: "object",
2903
+ properties: {
2904
+ success: { type: "boolean", const: true },
2905
+ contractVersion: { type: "string", const: "3.0.0" },
2906
+ appId: nonEmptyString2,
2907
+ serviceName: nonEmptyString2,
2908
+ generatedAt: nonEmptyString2,
2909
+ widgets: { type: "array", minItems: 1, items: widgetItem },
2910
+ workspace: {
2911
+ anyOf: [
2912
+ {
2913
+ type: "object",
2914
+ properties: {
2915
+ id: { anyOf: [{ type: "string" }, { type: "number" }] },
2916
+ name: nonEmptyString2
2917
+ },
2918
+ required: ["id", "name"],
2919
+ additionalProperties: true
2920
+ },
2921
+ { type: "null" }
2922
+ ]
2923
+ },
2924
+ workspaces: {
2925
+ type: "array",
2926
+ items: {
2927
+ type: "object",
2928
+ properties: {
2929
+ id: { anyOf: [{ type: "string" }, { type: "number" }] },
2930
+ name: nonEmptyString2,
2931
+ isDefault: { type: "boolean" }
2932
+ },
2933
+ required: ["id", "name"],
2934
+ additionalProperties: false
2935
+ }
2936
+ }
2937
+ },
2938
+ required: ["success", "contractVersion", "appId", "serviceName", "generatedAt", "widgets"],
2939
+ additionalProperties: false
2940
+ });
2477
2941
  function createTopolo(options) {
2478
2942
  const client = new TopoloClient(options);
2479
2943
  return {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@topolo/cli",
3
- "version": "0.9.7",
4
- "topoloPublishedVersion": "0.9.7",
3
+ "version": "0.9.8",
4
+ "topoloPublishedVersion": "0.9.8",
5
5
  "description": "Public command-line interface for Topolo customer organizations, developers, and agents.",
6
6
  "license": "UNLICENSED",
7
7
  "author": "Topolo",
@@ -12,9 +12,11 @@
12
12
  },
13
13
  "files": [
14
14
  "dist",
15
- "skills"
15
+ "skills",
16
+ "postinstall.mjs"
16
17
  ],
17
18
  "scripts": {
19
+ "postinstall": "node postinstall.mjs",
18
20
  "build": "tsup",
19
21
  "dev": "tsup --watch",
20
22
  "typecheck": "tsc --noEmit",
@@ -26,7 +28,7 @@
26
28
  "dependencies": {
27
29
  "@modelcontextprotocol/sdk": "^1.0.0",
28
30
  "@topolo/mcp": "0.11.12",
29
- "@topolo/sdk": "0.14.2",
31
+ "@topolo/sdk": "0.14.4",
30
32
  "commander": "^12.1.0"
31
33
  },
32
34
  "devDependencies": {
@@ -0,0 +1,14 @@
1
+ const message = [
2
+ 'Topolo CLI installed successfully.',
3
+ '',
4
+ 'AI assistant: continue automatically with these setup actions:',
5
+ ' 1. Run: topolo setup',
6
+ ' 2. Authenticate: topolo auth login',
7
+ ' 3. Inspect contexts: topolo context ls --json',
8
+ ' 4. Verify: topolo doctor',
9
+ '',
10
+ 'If multiple contexts are listed, use the exact intended context returned by the CLI; do not guess organization IDs.',
11
+ 'Only pause for the browser sign-in or an operating-system permission prompt.',
12
+ ].join('\n');
13
+
14
+ process.stdout.write(`${message}\n`);