@vibexp/api-client 0.59.0 → 0.61.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.
@@ -292,6 +292,7 @@ export type Prompt = {
292
292
  * Computed embedding-similarity neighborhood of this resource (up to 5), derived live at read time from vector similarity — NOT stored edges and distinct from `related`. Populated on the detail GET; empty otherwise.
293
293
  */
294
294
  similar?: Array<SimilarResource>;
295
+ freshness?: ResourceFreshnessState;
295
296
  };
296
297
  export type CreatePromptRequest = {
297
298
  name: string;
@@ -1301,6 +1302,7 @@ export type Artifact = {
1301
1302
  * Computed embedding-similarity neighborhood of this resource (up to 5), derived live at read time from vector similarity — NOT stored edges and distinct from `related`. Populated on the detail GET; empty otherwise.
1302
1303
  */
1303
1304
  similar?: Array<SimilarResource>;
1305
+ freshness?: ResourceFreshnessState;
1304
1306
  };
1305
1307
  export type CreateArtifactRequest = {
1306
1308
  /**
@@ -1899,6 +1901,7 @@ export type Memory = {
1899
1901
  * Computed embedding-similarity neighborhood of this resource (up to 5), derived live at read time from vector similarity — NOT stored edges and distinct from `related`. Populated on the detail GET; empty otherwise.
1900
1902
  */
1901
1903
  similar?: Array<SimilarResource>;
1904
+ freshness?: ResourceFreshnessState;
1902
1905
  };
1903
1906
  export type CreateMemoryRequest = {
1904
1907
  /**
@@ -2126,6 +2129,7 @@ export type Blueprint = {
2126
2129
  * Computed embedding-similarity neighborhood of this resource (up to 5), derived live at read time from vector similarity — NOT stored edges and distinct from `related`. Populated on the detail GET; empty otherwise.
2127
2130
  */
2128
2131
  similar?: Array<SimilarResource>;
2132
+ freshness?: ResourceFreshnessState;
2129
2133
  };
2130
2134
  /**
2131
2135
  * Read-only import provenance; present only for imported blueprints.
@@ -3732,6 +3736,209 @@ export type UpdateTeamFreshnessSettingsRequest = {
3732
3736
  interval_seconds: number;
3733
3737
  reversibility_enabled: boolean;
3734
3738
  };
3739
+ /**
3740
+ * The reporting window for a time-series metric. The options mirror the other analytics endpoints so one range selector drives every chart.
3741
+ *
3742
+ */
3743
+ export type FreshnessMetricsRange = '7d' | '14d' | '30d' | '60d' | '90d' | '180d';
3744
+ /**
3745
+ * One calendar day (UTC) of freshness activity, zero-filled: every day in the window is present even when nothing happened.
3746
+ *
3747
+ */
3748
+ export type FreshnessDailyStaleCount = {
3749
+ date: string;
3750
+ /**
3751
+ * Resources that became stale on this day.
3752
+ */
3753
+ marked: number;
3754
+ /**
3755
+ * Resources that stopped being stale on this day, for any reason.
3756
+ */
3757
+ cleared: number;
3758
+ /**
3759
+ * How many resources were stale at the END of this day — the level, not the flow. It is reconstructed by walking today's live count backwards through the recorded transitions, so it is exact only for the period the audit log covers; days before freshness evaluation first ran on this team read as the earliest known level rather than as zero. The most recent day reports the live count as of the request. The reconstruction is clamped at zero, so on a team whose rows were removed by a project or team deletion — which writes no audit entry — the series can flatten at 0 instead of satisfying stale_total[i] = stale_total[i-1] + marked[i] - cleared[i].
3760
+ *
3761
+ */
3762
+ stale_total: number;
3763
+ /**
3764
+ * The day's total ACTIVITY, marked + cleared — the sum of the two series, not the level. It is the field the shared time-series chart reads for its per-day total, which is why it is a flow rather than stale_total.
3765
+ *
3766
+ */
3767
+ total: number;
3768
+ };
3769
+ export type FreshnessOverTimeMetricsData = {
3770
+ range: FreshnessMetricsRange;
3771
+ /**
3772
+ * Resources marked stale across the whole window.
3773
+ */
3774
+ total_marked: number;
3775
+ /**
3776
+ * Resources cleared across the whole window.
3777
+ */
3778
+ total_cleared: number;
3779
+ /**
3780
+ * One entry per day in the window, oldest first. Serializes as `[]`, never `null`.
3781
+ */
3782
+ counts: Array<FreshnessDailyStaleCount>;
3783
+ };
3784
+ export type FreshnessOverTimeMetricsResponse = {
3785
+ status: string;
3786
+ message: string;
3787
+ data: FreshnessOverTimeMetricsData;
3788
+ };
3789
+ /**
3790
+ * How many of one resource type are stale right now.
3791
+ */
3792
+ export type FreshnessTypeCount = {
3793
+ resource_type: FreshnessRuleResourceType;
3794
+ count: number;
3795
+ };
3796
+ export type FreshnessByTypeMetricsData = {
3797
+ /**
3798
+ * Total stale resources in the team, across every type.
3799
+ */
3800
+ total_stale: number;
3801
+ /**
3802
+ * One entry per resource type, always all four, in a stable order — a type with nothing stale reports 0 rather than being omitted, so the chart's bars never move. Serializes as `[]`, never `null`.
3803
+ *
3804
+ */
3805
+ counts: Array<FreshnessTypeCount>;
3806
+ };
3807
+ export type FreshnessByTypeMetricsResponse = {
3808
+ status: string;
3809
+ message: string;
3810
+ data: FreshnessByTypeMetricsData;
3811
+ };
3812
+ /**
3813
+ * How many resources are stale right now in one project. `name` and `slug` are carried so the client can label and deep-link the bar without a second request.
3814
+ *
3815
+ */
3816
+ export type FreshnessProjectCount = {
3817
+ project_id: string;
3818
+ name: string;
3819
+ slug: string;
3820
+ count: number;
3821
+ };
3822
+ export type FreshnessByProjectMetricsData = {
3823
+ total_stale: number;
3824
+ /**
3825
+ * One entry per project in the team, including projects with nothing stale (0), ordered by count descending then name. Serializes as `[]`, never `null`.
3826
+ *
3827
+ */
3828
+ counts: Array<FreshnessProjectCount>;
3829
+ };
3830
+ export type FreshnessByProjectMetricsResponse = {
3831
+ status: string;
3832
+ message: string;
3833
+ data: FreshnessByProjectMetricsData;
3834
+ };
3835
+ /**
3836
+ * How many resources one rule currently marks. Rules have no name, so the defining fields travel with the count for the client to label the bar.
3837
+ *
3838
+ */
3839
+ export type FreshnessRuleImpact = {
3840
+ rule_id: string;
3841
+ /**
3842
+ * The project the rule is scoped to, or null for every project in the team.
3843
+ */
3844
+ project_id: string | null;
3845
+ resource_types: Array<FreshnessRuleResourceType>;
3846
+ threshold_days: number;
3847
+ /**
3848
+ * A disabled rule reports 0 — it is listed so its absence from the chart is not mistaken for deletion.
3849
+ */
3850
+ enabled: boolean;
3851
+ count: number;
3852
+ };
3853
+ export type FreshnessByRuleMetricsData = {
3854
+ /**
3855
+ * Distinct stale resources in the team. It is NOT the sum of the per-rule counts: a resource matched by two rules is counted once here and once under each rule, because staleness is a union across rules.
3856
+ *
3857
+ */
3858
+ total_stale: number;
3859
+ /**
3860
+ * One entry per rule the team has defined, including rules matching nothing, ordered by count descending then rule id. Serializes as `[]`, never `null`.
3861
+ *
3862
+ */
3863
+ counts: Array<FreshnessRuleImpact>;
3864
+ };
3865
+ export type FreshnessByRuleMetricsResponse = {
3866
+ status: string;
3867
+ message: string;
3868
+ data: FreshnessByRuleMetricsData;
3869
+ };
3870
+ /**
3871
+ * One recorded freshness transition. The log is append-only.
3872
+ */
3873
+ export type FreshnessAuditEntry = {
3874
+ id: string;
3875
+ resource_type: FreshnessRuleResourceType;
3876
+ resource_id: string;
3877
+ /**
3878
+ * The rule that caused the change, when exactly one did. Null for a reversal (caused by a read or an edit) and for a mark attributable to several rules at once — the resource's own state carries the full set.
3879
+ *
3880
+ */
3881
+ rule_id: string | null;
3882
+ /**
3883
+ * Whether the resource became stale or stopped being stale.
3884
+ */
3885
+ action: 'marked' | 'cleared';
3886
+ /**
3887
+ * What caused it — a scheduled evaluation, a read, or an edit.
3888
+ */
3889
+ reason: 'rule_run' | 'accessed' | 'edited';
3890
+ created_at: string;
3891
+ };
3892
+ /**
3893
+ * A page of the team's freshness audit log, newest first.
3894
+ */
3895
+ export type FreshnessAuditListResponse = {
3896
+ /**
3897
+ * Serializes as `[]` when the page is empty, never `null`.
3898
+ */
3899
+ entries: Array<FreshnessAuditEntry>;
3900
+ /**
3901
+ * Total entries in the team's log, ignoring pagination.
3902
+ */
3903
+ total_count: number;
3904
+ /**
3905
+ * Current page number (1-based)
3906
+ */
3907
+ page: number;
3908
+ /**
3909
+ * Number of entries per page
3910
+ */
3911
+ per_page: number;
3912
+ /**
3913
+ * Total number of pages
3914
+ */
3915
+ total_pages: number;
3916
+ };
3917
+ /**
3918
+ * The resource's staleness state. Present only when the resource is stale; absent means fresh.
3919
+ *
3920
+ */
3921
+ export type ResourceFreshnessState = {
3922
+ /**
3923
+ * Today the only state a resource can be in while it has freshness state at all. It is modelled as an enum rather than a boolean so a future state can be added without changing the field's type.
3924
+ *
3925
+ */
3926
+ status: 'stale';
3927
+ /**
3928
+ * When the resource was FIRST marked stale. It is preserved across re-evaluations that keep it stale, so it is the age a client can show.
3929
+ *
3930
+ */
3931
+ since: string;
3932
+ /**
3933
+ * Every rule that currently marks this resource — staleness is a union across rules, so this answers "why is this stale". Serializes as `[]`, never `null`.
3934
+ *
3935
+ */
3936
+ matched_rule_ids: Array<string>;
3937
+ /**
3938
+ * What produced the current state.
3939
+ */
3940
+ reason: 'rule_run' | 'accessed' | 'edited';
3941
+ };
3735
3942
  /**
3736
3943
  * The search ranking settings in effect for a team, with enough context for a client to render the whole settings surface from this one response: the effective values, where they came from, the instance defaults to preview a reset against, and the instance-owned candidate cap.
3737
3944
  *
@@ -5140,6 +5347,10 @@ export type ListArtifactsData = {
5140
5347
  team_id: string;
5141
5348
  };
5142
5349
  query?: {
5350
+ /**
5351
+ * Filter to resources currently flagged stale by the team's freshness rules (epic #726). Omit for no freshness filtering. Returns 400 for any other value — a silently ignored filter would return the full list, which looks like a legitimate answer.
5352
+ */
5353
+ freshness?: 'stale';
5143
5354
  /**
5144
5355
  * Filter by project ID
5145
5356
  */
@@ -5280,6 +5491,10 @@ export type ListArtifactsByProjectData = {
5280
5491
  project_id: string;
5281
5492
  };
5282
5493
  query?: {
5494
+ /**
5495
+ * Filter to resources currently flagged stale by the team's freshness rules (epic #726). Omit for no freshness filtering. Returns 400 for any other value — a silently ignored filter would return the full list, which looks like a legitimate answer.
5496
+ */
5497
+ freshness?: 'stale';
5283
5498
  /**
5284
5499
  * Filter by status
5285
5500
  */
@@ -6066,6 +6281,10 @@ export type ListMemoriesData = {
6066
6281
  team_id: string;
6067
6282
  };
6068
6283
  query?: {
6284
+ /**
6285
+ * Filter to resources currently flagged stale by the team's freshness rules (epic #726). Omit for no freshness filtering. Returns 400 for any other value — a silently ignored filter would return the full list, which looks like a legitimate answer.
6286
+ */
6287
+ freshness?: 'stale';
6069
6288
  /**
6070
6289
  * Filter memories by project ID
6071
6290
  */
@@ -6466,6 +6685,10 @@ export type ListSpecLibrariesData = {
6466
6685
  team_id: string;
6467
6686
  };
6468
6687
  query?: {
6688
+ /**
6689
+ * Filter to resources currently flagged stale by the team's freshness rules (epic #726). Omit for no freshness filtering. Returns 400 for any other value — a silently ignored filter would return the full list, which looks like a legitimate answer.
6690
+ */
6691
+ freshness?: 'stale';
6469
6692
  /**
6470
6693
  * Filter by project name
6471
6694
  */
@@ -6614,6 +6837,10 @@ export type ListSpecLibrariesByProjectData = {
6614
6837
  project_id: string;
6615
6838
  };
6616
6839
  query?: {
6840
+ /**
6841
+ * Filter to resources currently flagged stale by the team's freshness rules (epic #726). Omit for no freshness filtering. Returns 400 for any other value — a silently ignored filter would return the full list, which looks like a legitimate answer.
6842
+ */
6843
+ freshness?: 'stale';
6617
6844
  /**
6618
6845
  * Filter by status
6619
6846
  */
@@ -6966,6 +7193,10 @@ export type ListPromptsData = {
6966
7193
  team_id: string;
6967
7194
  };
6968
7195
  query?: {
7196
+ /**
7197
+ * Filter to resources currently flagged stale by the team's freshness rules (epic #726). Omit for no freshness filtering. Returns 400 for any other value — a silently ignored filter would return the full list, which looks like a legitimate answer.
7198
+ */
7199
+ freshness?: 'stale';
6969
7200
  /**
6970
7201
  * Page number for pagination
6971
7202
  */
@@ -12370,6 +12601,206 @@ export type UpdateTeamFreshnessSettingsResponses = {
12370
12601
  200: TeamFreshnessSettings;
12371
12602
  };
12372
12603
  export type UpdateTeamFreshnessSettingsResponse = UpdateTeamFreshnessSettingsResponses[keyof UpdateTeamFreshnessSettingsResponses];
12604
+ export type GetFreshnessOverTimeMetricsData = {
12605
+ body?: never;
12606
+ path: {
12607
+ /**
12608
+ * Team identifier
12609
+ */
12610
+ team_id: string;
12611
+ };
12612
+ query?: {
12613
+ /**
12614
+ * The reporting window. Defaults to 30d.
12615
+ */
12616
+ range?: FreshnessMetricsRange;
12617
+ };
12618
+ url: '/api/v1/{team_id}/freshness/metrics/over-time';
12619
+ };
12620
+ export type GetFreshnessOverTimeMetricsErrors = {
12621
+ /**
12622
+ * Invalid team_id or query parameter
12623
+ */
12624
+ 400: ErrorResponse;
12625
+ /**
12626
+ * Authentication required
12627
+ */
12628
+ 401: ErrorResponse;
12629
+ /**
12630
+ * Caller is not a member of the team
12631
+ */
12632
+ 403: ErrorResponse;
12633
+ /**
12634
+ * Failed to build the team's freshness over-time metrics
12635
+ */
12636
+ 500: ErrorResponse;
12637
+ };
12638
+ export type GetFreshnessOverTimeMetricsError = GetFreshnessOverTimeMetricsErrors[keyof GetFreshnessOverTimeMetricsErrors];
12639
+ export type GetFreshnessOverTimeMetricsResponses = {
12640
+ /**
12641
+ * Metrics retrieved successfully
12642
+ */
12643
+ 200: FreshnessOverTimeMetricsResponse;
12644
+ };
12645
+ export type GetFreshnessOverTimeMetricsResponse = GetFreshnessOverTimeMetricsResponses[keyof GetFreshnessOverTimeMetricsResponses];
12646
+ export type GetFreshnessByTypeMetricsData = {
12647
+ body?: never;
12648
+ path: {
12649
+ /**
12650
+ * Team identifier
12651
+ */
12652
+ team_id: string;
12653
+ };
12654
+ query?: never;
12655
+ url: '/api/v1/{team_id}/freshness/metrics/by-type';
12656
+ };
12657
+ export type GetFreshnessByTypeMetricsErrors = {
12658
+ /**
12659
+ * Invalid team_id or query parameter
12660
+ */
12661
+ 400: ErrorResponse;
12662
+ /**
12663
+ * Authentication required
12664
+ */
12665
+ 401: ErrorResponse;
12666
+ /**
12667
+ * Caller is not a member of the team
12668
+ */
12669
+ 403: ErrorResponse;
12670
+ /**
12671
+ * Failed to build the team's freshness by-type metrics
12672
+ */
12673
+ 500: ErrorResponse;
12674
+ };
12675
+ export type GetFreshnessByTypeMetricsError = GetFreshnessByTypeMetricsErrors[keyof GetFreshnessByTypeMetricsErrors];
12676
+ export type GetFreshnessByTypeMetricsResponses = {
12677
+ /**
12678
+ * Metrics retrieved successfully
12679
+ */
12680
+ 200: FreshnessByTypeMetricsResponse;
12681
+ };
12682
+ export type GetFreshnessByTypeMetricsResponse = GetFreshnessByTypeMetricsResponses[keyof GetFreshnessByTypeMetricsResponses];
12683
+ export type GetFreshnessByProjectMetricsData = {
12684
+ body?: never;
12685
+ path: {
12686
+ /**
12687
+ * Team identifier
12688
+ */
12689
+ team_id: string;
12690
+ };
12691
+ query?: never;
12692
+ url: '/api/v1/{team_id}/freshness/metrics/by-project';
12693
+ };
12694
+ export type GetFreshnessByProjectMetricsErrors = {
12695
+ /**
12696
+ * Invalid team_id or query parameter
12697
+ */
12698
+ 400: ErrorResponse;
12699
+ /**
12700
+ * Authentication required
12701
+ */
12702
+ 401: ErrorResponse;
12703
+ /**
12704
+ * Caller is not a member of the team
12705
+ */
12706
+ 403: ErrorResponse;
12707
+ /**
12708
+ * Failed to build the team's freshness by-project metrics
12709
+ */
12710
+ 500: ErrorResponse;
12711
+ };
12712
+ export type GetFreshnessByProjectMetricsError = GetFreshnessByProjectMetricsErrors[keyof GetFreshnessByProjectMetricsErrors];
12713
+ export type GetFreshnessByProjectMetricsResponses = {
12714
+ /**
12715
+ * Metrics retrieved successfully
12716
+ */
12717
+ 200: FreshnessByProjectMetricsResponse;
12718
+ };
12719
+ export type GetFreshnessByProjectMetricsResponse = GetFreshnessByProjectMetricsResponses[keyof GetFreshnessByProjectMetricsResponses];
12720
+ export type GetFreshnessByRuleMetricsData = {
12721
+ body?: never;
12722
+ path: {
12723
+ /**
12724
+ * Team identifier
12725
+ */
12726
+ team_id: string;
12727
+ };
12728
+ query?: never;
12729
+ url: '/api/v1/{team_id}/freshness/metrics/by-rule';
12730
+ };
12731
+ export type GetFreshnessByRuleMetricsErrors = {
12732
+ /**
12733
+ * Invalid team_id or query parameter
12734
+ */
12735
+ 400: ErrorResponse;
12736
+ /**
12737
+ * Authentication required
12738
+ */
12739
+ 401: ErrorResponse;
12740
+ /**
12741
+ * Caller is not a member of the team
12742
+ */
12743
+ 403: ErrorResponse;
12744
+ /**
12745
+ * Failed to build the team's freshness by-rule metrics
12746
+ */
12747
+ 500: ErrorResponse;
12748
+ };
12749
+ export type GetFreshnessByRuleMetricsError = GetFreshnessByRuleMetricsErrors[keyof GetFreshnessByRuleMetricsErrors];
12750
+ export type GetFreshnessByRuleMetricsResponses = {
12751
+ /**
12752
+ * Metrics retrieved successfully
12753
+ */
12754
+ 200: FreshnessByRuleMetricsResponse;
12755
+ };
12756
+ export type GetFreshnessByRuleMetricsResponse = GetFreshnessByRuleMetricsResponses[keyof GetFreshnessByRuleMetricsResponses];
12757
+ export type ListFreshnessAuditData = {
12758
+ body?: never;
12759
+ path: {
12760
+ /**
12761
+ * Team identifier
12762
+ */
12763
+ team_id: string;
12764
+ };
12765
+ query?: {
12766
+ /**
12767
+ * Page number (1-based). The upper bound is not a storage limit — it keeps page * limit inside the range the offset arithmetic can represent, so an absurd page is rejected rather than silently wrapping around to the first one.
12768
+ *
12769
+ */
12770
+ page?: number;
12771
+ /**
12772
+ * Entries per page
12773
+ */
12774
+ limit?: number;
12775
+ };
12776
+ url: '/api/v1/{team_id}/freshness/audit';
12777
+ };
12778
+ export type ListFreshnessAuditErrors = {
12779
+ /**
12780
+ * Invalid team_id or query parameter
12781
+ */
12782
+ 400: ErrorResponse;
12783
+ /**
12784
+ * Authentication required
12785
+ */
12786
+ 401: ErrorResponse;
12787
+ /**
12788
+ * Caller is not a member of the team
12789
+ */
12790
+ 403: ErrorResponse;
12791
+ /**
12792
+ * Failed to list the team's freshness audit log
12793
+ */
12794
+ 500: ErrorResponse;
12795
+ };
12796
+ export type ListFreshnessAuditError = ListFreshnessAuditErrors[keyof ListFreshnessAuditErrors];
12797
+ export type ListFreshnessAuditResponses = {
12798
+ /**
12799
+ * Audit log retrieved successfully
12800
+ */
12801
+ 200: FreshnessAuditListResponse;
12802
+ };
12803
+ export type ListFreshnessAuditResponse = ListFreshnessAuditResponses[keyof ListFreshnessAuditResponses];
12373
12804
  export type ListEmbeddingProvidersSettingsData = {
12374
12805
  body?: never;
12375
12806
  path: {