@burdenoff/microfe-technospam 2026.1031.8 → 2026.1101.2

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 (29) hide show
  1. package/dist/generated/wspace-types.d.ts +288 -0
  2. package/dist/generated/wspace-types.d.ts.map +1 -1
  3. package/dist/stories/journeys/Problems.stories.d.ts.map +1 -1
  4. package/dist/technospam/api/technospamApi.d.ts +15 -0
  5. package/dist/technospam/api/technospamApi.d.ts.map +1 -1
  6. package/dist/technospam/api/technospamApi.js +200 -151
  7. package/dist/technospam/api/technospamApi.js.map +1 -1
  8. package/dist/technospam/components/ProblemsTable.d.ts +19 -0
  9. package/dist/technospam/components/ProblemsTable.d.ts.map +1 -0
  10. package/dist/technospam/components/ProblemsTable.js +117 -0
  11. package/dist/technospam/components/ProblemsTable.js.map +1 -0
  12. package/dist/technospam/components/index.d.ts +1 -0
  13. package/dist/technospam/components/index.d.ts.map +1 -1
  14. package/dist/technospam/components/index.js +2 -1
  15. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js +38 -38
  16. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js.map +1 -1
  17. package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts.map +1 -1
  18. package/dist/technospam/pages/ApplicationsProblemsPagePage.js +197 -144
  19. package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
  20. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +195 -195
  21. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
  22. package/dist/technospam/pages/CoursesCoursesPagePage.js +26 -26
  23. package/dist/technospam/pages/CoursesLessonPlayerPagePage.js +36 -36
  24. package/dist/technospam/pages/CoursesLessonPlayerPagePage.js.map +1 -1
  25. package/dist/technospam/utils/problemCatalog.d.ts +27 -0
  26. package/dist/technospam/utils/problemCatalog.d.ts.map +1 -0
  27. package/dist/technospam/utils/problemCatalog.js +68 -0
  28. package/dist/technospam/utils/problemCatalog.js.map +1 -0
  29. package/package.json +1 -1
@@ -15303,6 +15303,21 @@ export type ContextMessageAttachmentInput = {
15303
15303
  thumbnail?: InputMaybe<Scalars['String']['input']>;
15304
15304
  width?: InputMaybe<Scalars['Int']['input']>;
15305
15305
  };
15306
+ export type ContinuousOptimisationSettings = {
15307
+ __typename?: 'ContinuousOptimisationSettings';
15308
+ /** Optimisation is opt-in per workspace and off by default. */
15309
+ enabled: Scalars['Boolean']['output'];
15310
+ enabledAt?: Maybe<Scalars['DateTime']['output']>;
15311
+ enabledBy?: Maybe<Scalars['String']['output']>;
15312
+ /** True while the fluidgrids.continuous-optimisation flag is on for the workspace (named like runFailureTriageSettings.killSwitchOn). False means the kill switch has stopped optimisation: nothing scans and the suggestions are hidden. */
15313
+ killSwitchOn: Scalars['Boolean']['output'];
15314
+ lastDigestAt?: Maybe<Scalars['DateTime']['output']>;
15315
+ lastScanAt?: Maybe<Scalars['DateTime']['output']>;
15316
+ /** Counts from the last scan: workflowsScanned, created, updated, reopened, resolved, deferred, openSuggestions. */
15317
+ lastScanSummary?: Maybe<Scalars['JSON']['output']>;
15318
+ /** The nightly scan and the weekly digest system workflows, once seeded. */
15319
+ systemWorkflows: Array<SystemWorkflowInstallation>;
15320
+ };
15306
15321
  export type ContributorStats = {
15307
15322
  __typename?: 'ContributorStats';
15308
15323
  itemsAdded: Scalars['Int']['output'];
@@ -56699,6 +56714,8 @@ export type Mutation = {
56699
56714
  /** Disconnect a channel: further events from it are refused. Already captured events are kept. For an OAuth-backed channel the integration connection is revoked as well. */
56700
56715
  disconnectTimeCampusCaptureChannel: TimeCampusCaptureChannel;
56701
56716
  dismissHealthyBowlComplianceFlag: ComplianceFlag;
56717
+ /** Dismiss an open or snoozed suggestion with a reason (and an optional note of up to 500 characters). */
56718
+ dismissOptimisationSuggestion: OptimisationSuggestion;
56702
56719
  dismissRecommendation: TimeCampusRecommendation;
56703
56720
  /**
56704
56721
  * Dismiss one of the caller's failure clusters. Later failures with the same
@@ -57006,6 +57023,11 @@ export type Mutation = {
57006
57023
  failActivityAsync: Scalars['Boolean']['output'];
57007
57024
  /** Fail, by its id, an activity that waits for an asynchronous completion. */
57008
57025
  failActivityById: Scalars['Boolean']['output'];
57026
+ /**
57027
+ * Run one scan now (the nightly workflow runs the same scan). Returns skipped with reason
57028
+ * not_enabled when optimisation is off for the workspace.
57029
+ */
57030
+ fgRunOptimisationScan: OptimisationScanResult;
57009
57031
  /**
57010
57032
  * Run one triage pass now (the hourly workflow runs the same pass). Returns
57011
57033
  * skipped with reason not_enabled or flag_off when triage is off.
@@ -58544,6 +58566,13 @@ export type Mutation = {
58544
58566
  propagateTagToChildren: Array<UniversalTagAssignment>;
58545
58567
  /** Run an agronomic sweep and return the proposals it wrote. A second sweep over unchanged data updates the open proposal rather than adding another — otherwise the inbox becomes a pile of identical cards, which is how a farmer learns to ignore it. Returns BLOCKED rows too: a treatment the compliance rail refused is recorded so the farmer can see it was considered and why it was refused. Dropping it silently looks identical to the engine never having noticed. */
58546
58568
  proposeHealthyBowlAgronomyDecisions: AgronomyDecisionSweepResult;
58569
+ /**
58570
+ * Apply a suggestion: build its change on the workflow's latest version as an OPTIMISE workflow
58571
+ * proposal owned by the caller, without a model call. Returns the suggestion with proposalId set;
58572
+ * preview the proposal with workflowProposal(id) and apply it with applyWorkflowProposal, which
58573
+ * creates a new DRAFT version. Nothing is applied by this call.
58574
+ */
58575
+ proposeOptimisation: OptimisationSuggestion;
58547
58576
  /**
58548
58577
  * Propose a fix for a failed run against the version that ran. Returns
58549
58578
  * PROCESSING; poll `workflowProposal(id)`.
@@ -59451,6 +59480,12 @@ export type Mutation = {
59451
59480
  setBigConsoleExternalEmbedsEnabled: Workspace;
59452
59481
  /** Set configuration */
59453
59482
  setConfiguration: Configuration;
59483
+ /**
59484
+ * Turn continuous optimisation on or off for this workspace. On (needs the flag) seeds and
59485
+ * activates the nightly scan system workflow, running as the caller, and the weekly digest; off
59486
+ * deactivates the scan, and the digest unless failure triage still uses it. It only ever suggests.
59487
+ */
59488
+ setContinuousOptimisationEnabled: ContinuousOptimisationSettings;
59454
59489
  /** Ask for a skill on a job posting (required or nice-to-have, optional minimum proficiency). */
59455
59490
  setCrewJobPostingSkill: CrewJobPostingSkill;
59456
59491
  /** Assign (or clear, with rlsPolicyId: null) a dashboard's RLS policy. The policy must already exist in the same workspace as the dashboard. */
@@ -59591,6 +59626,8 @@ export type Mutation = {
59591
59626
  signalWorkflowRun: WorkflowSignalResult;
59592
59627
  /** Snooze a fired weather alert until an ISO timestamp. */
59593
59628
  snoozeHealthyBowlWeatherAlert: WeatherAlertEvent;
59629
+ /** Snooze an open suggestion until a time within 90 days (30 days when until is left out). */
59630
+ snoozeOptimisationSuggestion: OptimisationSuggestion;
59594
59631
  snoozeRecommendation: TimeCampusRecommendation;
59595
59632
  /** Start a durable Fluidgrids turn. The handle is acceptance, not a completed answer. */
59596
59633
  startAssistantTurn: AssistantTurnHandle;
@@ -60864,6 +60901,11 @@ export type Mutation = {
60864
60901
  * INTERNAL: Requires actorType SERVICE
60865
60902
  */
60866
60903
  workerRunFailureTriage: WorkerRunFailureTriageResponse;
60904
+ /**
60905
+ * The step of the seeded continuous-optimisation workflow (the internal:optimisation node).
60906
+ * INTERNAL: Requires actorType SERVICE
60907
+ */
60908
+ workerRunOptimisation: WorkerRunOptimisationResponse;
60867
60909
  /**
60868
60910
  * Lease an activity attempt.
60869
60911
  * INTERNAL: Requires actorType SERVICE
@@ -67159,6 +67201,12 @@ export type MutationDismissHealthyBowlComplianceFlagArgs = {
67159
67201
  input: DismissComplianceFlagInput;
67160
67202
  };
67161
67203
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
67204
+ export type MutationDismissOptimisationSuggestionArgs = {
67205
+ id: Scalars['ID']['input'];
67206
+ note?: InputMaybe<Scalars['String']['input']>;
67207
+ reason: OptimisationDismissReason;
67208
+ };
67209
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
67162
67210
  export type MutationDismissRecommendationArgs = {
67163
67211
  id: Scalars['ID']['input'];
67164
67212
  reason?: InputMaybe<Scalars['String']['input']>;
@@ -72103,6 +72151,10 @@ export type MutationProposeHealthyBowlAgronomyDecisionsArgs = {
72103
72151
  input: ProposeAgronomyDecisionsInput;
72104
72152
  };
72105
72153
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
72154
+ export type MutationProposeOptimisationArgs = {
72155
+ suggestionId: Scalars['ID']['input'];
72156
+ };
72157
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
72106
72158
  export type MutationProposeRunFixArgs = {
72107
72159
  input: ProposeRunFixInput;
72108
72160
  };
@@ -74527,6 +74579,10 @@ export type MutationSetConfigurationArgs = {
74527
74579
  value: Scalars['JSON']['input'];
74528
74580
  };
74529
74581
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
74582
+ export type MutationSetContinuousOptimisationEnabledArgs = {
74583
+ enabled: Scalars['Boolean']['input'];
74584
+ };
74585
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
74530
74586
  export type MutationSetCrewJobPostingSkillArgs = {
74531
74587
  input: SetCrewJobPostingSkillInput;
74532
74588
  };
@@ -74851,6 +74907,11 @@ export type MutationSnoozeHealthyBowlWeatherAlertArgs = {
74851
74907
  until: Scalars['String']['input'];
74852
74908
  };
74853
74909
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
74910
+ export type MutationSnoozeOptimisationSuggestionArgs = {
74911
+ id: Scalars['ID']['input'];
74912
+ until?: InputMaybe<Scalars['DateTime']['input']>;
74913
+ };
74914
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
74854
74915
  export type MutationSnoozeRecommendationArgs = {
74855
74916
  id: Scalars['ID']['input'];
74856
74917
  until: Scalars['DateTime']['input'];
@@ -78367,6 +78428,10 @@ export type MutationWorkerRunFailureTriageArgs = {
78367
78428
  input: WorkerRunFailureTriageInput;
78368
78429
  };
78369
78430
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
78431
+ export type MutationWorkerRunOptimisationArgs = {
78432
+ input: WorkerRunOptimisationInput;
78433
+ };
78434
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
78370
78435
  export type MutationWorkerStartActivityArgs = {
78371
78436
  activityId: Scalars['ID']['input'];
78372
78437
  attempt: Scalars['Int']['input'];
@@ -79638,6 +79703,114 @@ export type OperationContext = {
79638
79703
  /** Workspace ID for workspace-level scoping */
79639
79704
  workspaceId?: Maybe<Scalars['ID']['output']>;
79640
79705
  };
79706
+ /** Why a suggestion was dismissed. NOT_APPLICABLE lowers the ranking of the same kind in this workspace. */
79707
+ export declare enum OptimisationDismissReason {
79708
+ AcceptedCost = "ACCEPTED_COST",
79709
+ NotApplicable = "NOT_APPLICABLE",
79710
+ Other = "OTHER",
79711
+ WillFixLater = "WILL_FIX_LATER"
79712
+ }
79713
+ /** What a suggestion proposes. */
79714
+ export declare enum OptimisationKind {
79715
+ /** A node fails on temporary errors (TRANSIENT, DEPENDENCY, TIMEOUT) and never retries. */
79716
+ AddRetry = "ADD_RETRY",
79717
+ /** A cheaper model class scores as well on the workflow's evaluation set. Not detected yet. */
79718
+ CheaperModel = "CHEAPER_MODEL",
79719
+ /** Most of a model node's calls repeat an earlier input. Evidence only until model nodes can cache responses. */
79720
+ EnableCache = "ENABLE_CACHE",
79721
+ /** A production agent node has no guardrail policy. Not detected yet. */
79722
+ MissingGuardrail = "MISSING_GUARDRAIL",
79723
+ /** A node fails on its own configured timeout often enough that a longer one would let it finish. */
79724
+ RaiseTimeout = "RAISE_TIMEOUT",
79725
+ /** A node of the active version never ran across many completed production runs. */
79726
+ UnusedNode = "UNUSED_NODE"
79727
+ }
79728
+ export type OptimisationScanResult = {
79729
+ __typename?: 'OptimisationScanResult';
79730
+ created: Scalars['Int']['output'];
79731
+ /** New suggestions held back by the per-scan cap of 50; a later scan stores them. */
79732
+ deferred: Scalars['Int']['output'];
79733
+ openSuggestions: Scalars['Int']['output'];
79734
+ /** not_enabled or flag_off when skipped. */
79735
+ reason?: Maybe<Scalars['String']['output']>;
79736
+ reopened: Scalars['Int']['output'];
79737
+ resolved: Scalars['Int']['output'];
79738
+ skipped: Scalars['Boolean']['output'];
79739
+ updated: Scalars['Int']['output'];
79740
+ workflowsScanned: Scalars['Int']['output'];
79741
+ };
79742
+ /** One suggestion for one node of one workflow, shared by the workspace's members. */
79743
+ export type OptimisationSuggestion = {
79744
+ __typename?: 'OptimisationSuggestion';
79745
+ /** What was seen and what the change does, in one sentence. */
79746
+ advice: Scalars['String']['output'];
79747
+ /** Whether Apply can build a canvas proposal for this kind now. */
79748
+ applicable: Scalars['Boolean']['output'];
79749
+ appliedAt?: Maybe<Scalars['DateTime']['output']>;
79750
+ appliedVersion?: Maybe<Scalars['String']['output']>;
79751
+ /** Why Apply is unavailable, when applicable is false. */
79752
+ applyBlockedReason?: Maybe<Scalars['String']['output']>;
79753
+ dismissNote?: Maybe<Scalars['String']['output']>;
79754
+ dismissReason?: Maybe<OptimisationDismissReason>;
79755
+ dismissedAt?: Maybe<Scalars['DateTime']['output']>;
79756
+ /** Estimated saving over a month in micro-USD; null when the change saves no model spend or the calls were unpriced. */
79757
+ estimatedMonthlySavingMicroUsd?: Maybe<Scalars['Float']['output']>;
79758
+ /**
79759
+ * The numbers behind the suggestion over the window (windowDays): for example executions, timeouts,
79760
+ * timeoutRate, currentTimeoutMs, p95CompletedMs and suggestedTimeoutMs (RAISE_TIMEOUT);
79761
+ * transientFailures, failuresByType and proposedRetry (ADD_RETRY); completedRuns and removedNodeIds
79762
+ * (UNUSED_NODE); calls, distinctInputs, repeatShare and costMicroUsd (ENABLE_CACHE). Never run data.
79763
+ */
79764
+ evidence: Scalars['JSON']['output'];
79765
+ firstSeenAt: Scalars['DateTime']['output'];
79766
+ id: Scalars['ID']['output'];
79767
+ /** Impact before this workspace's dismiss feedback: 1 point per cent saved a month, 5 per failed run avoided, 2 per node removed. */
79768
+ impact: Scalars['Float']['output'];
79769
+ kind: OptimisationKind;
79770
+ lastSeenAt: Scalars['DateTime']['output'];
79771
+ /** The node the suggestion is about (for UNUSED_NODE, the first node of the unused part). */
79772
+ nodeId: Scalars['String']['output'];
79773
+ nodeType?: Maybe<Scalars['String']['output']>;
79774
+ productId: Scalars['String']['output'];
79775
+ /** The latest OPTIMISE proposal made for it. Read it with workflowProposal(id); only the member who asked can. */
79776
+ proposalId?: Maybe<Scalars['ID']['output']>;
79777
+ proposedAt?: Maybe<Scalars['DateTime']['output']>;
79778
+ resolvedAt?: Maybe<Scalars['DateTime']['output']>;
79779
+ /** The newest runs behind the evidence, at most ten. */
79780
+ sampleRunIds: Array<Scalars['ID']['output']>;
79781
+ /** Ranking: impact lowered for kinds this workspace recently dismissed as not applicable. */
79782
+ score: Scalars['Float']['output'];
79783
+ snoozedUntil?: Maybe<Scalars['DateTime']['output']>;
79784
+ status: OptimisationSuggestionStatus;
79785
+ /** A short title for the kind. */
79786
+ title: Scalars['String']['output'];
79787
+ workflowKey: Scalars['String']['output'];
79788
+ workflowName?: Maybe<Scalars['String']['output']>;
79789
+ /** The ACTIVE version the evidence was read from. */
79790
+ workflowVersion: Scalars['String']['output'];
79791
+ };
79792
+ export type OptimisationSuggestionFilter = {
79793
+ kind?: InputMaybe<Array<OptimisationKind>>;
79794
+ /** Defaults to every status. */
79795
+ status?: InputMaybe<Array<OptimisationSuggestionStatus>>;
79796
+ workflowKey?: InputMaybe<Scalars['String']['input']>;
79797
+ };
79798
+ export type OptimisationSuggestionList = {
79799
+ __typename?: 'OptimisationSuggestionList';
79800
+ items: Array<OptimisationSuggestion>;
79801
+ total: Scalars['Int']['output'];
79802
+ };
79803
+ export declare enum OptimisationSuggestionStatus {
79804
+ /** Its proposal was applied as a new DRAFT version. */
79805
+ Applied = "APPLIED",
79806
+ /** Dismissed with a reason. A scan reopens it only when the evidence at least doubles. */
79807
+ Dismissed = "DISMISSED",
79808
+ Open = "OPEN",
79809
+ /** The last scan no longer saw the condition. */
79810
+ Resolved = "RESOLVED",
79811
+ /** Hidden until snoozedUntil. */
79812
+ Snoozed = "SNOOZED"
79813
+ }
79641
79814
  export type Order = {
79642
79815
  __typename?: 'Order';
79643
79816
  /** Sales channel: CSA_SUBSCRIPTION | WHOLESALE | FARMERS_MARKET | DIRECT */
@@ -87841,6 +88014,16 @@ export type PswAgedReceivables = {
87841
88014
  sixty: PswAgedReceivableBucket;
87842
88015
  thirty: PswAgedReceivableBucket;
87843
88016
  };
88017
+ /** One slice of a revenue distribution (practice area, client or engagement). id is null for the unassigned bucket (invoices with no engagement/practice area). */
88018
+ export type PswAnalyticsDistributionRow = {
88019
+ __typename?: 'PswAnalyticsDistributionRow';
88020
+ amount: Scalars['Float']['output'];
88021
+ id?: Maybe<Scalars['ID']['output']>;
88022
+ invoiceCount: Scalars['Int']['output'];
88023
+ label: Scalars['String']['output'];
88024
+ /** Share of totalInvoiced in the window, 0-100. */
88025
+ sharePct: Scalars['Float']['output'];
88026
+ };
87844
88027
  export type PswClient = {
87845
88028
  __typename?: 'PswClient';
87846
88029
  address?: Maybe<Scalars['String']['output']>;
@@ -87912,6 +88095,14 @@ export declare enum PswClientType {
87912
88095
  Individual = "INDIVIDUAL",
87913
88096
  Organization = "ORGANIZATION"
87914
88097
  }
88098
+ export type PswCollectionMonth = {
88099
+ __typename?: 'PswCollectionMonth';
88100
+ collected: Scalars['Float']['output'];
88101
+ collectionRate: Scalars['Float']['output'];
88102
+ invoiced: Scalars['Float']['output'];
88103
+ /** YYYY-MM */
88104
+ month: Scalars['String']['output'];
88105
+ };
87915
88106
  export type PswComplianceCheck = {
87916
88107
  __typename?: 'PswComplianceCheck';
87917
88108
  createdAt: Scalars['DateTime']['output'];
@@ -88723,6 +88914,40 @@ export type PswPageInfo = {
88723
88914
  cursor?: Maybe<Scalars['String']['output']>;
88724
88915
  hasMore: Scalars['Boolean']['output'];
88725
88916
  };
88917
+ export type PswPracticeAnalytics = {
88918
+ __typename?: 'PswPracticeAnalytics';
88919
+ activePractitioners: Scalars['Int']['output'];
88920
+ agedReceivables: PswAgedReceivables;
88921
+ billableHours: Scalars['Float']['output'];
88922
+ /** billableHours / totalHours, 0-100. */
88923
+ billableMixPct: Scalars['Float']['output'];
88924
+ /** activePractitioners x weeks in window x capacityHoursPerWeek. */
88925
+ capacityHours: Scalars['Float']['output'];
88926
+ capacityHoursPerWeek: Scalars['Float']['output'];
88927
+ collectionByMonth: Array<PswCollectionMonth>;
88928
+ /** totalCollected / totalInvoiced, 0-100. */
88929
+ collectionRate: Scalars['Float']['output'];
88930
+ /** Currency of every monetary figure; rows in other currencies are excluded (no FX conversion). */
88931
+ currency: Scalars['String']['output'];
88932
+ invoiceCount: Scalars['Int']['output'];
88933
+ months: Scalars['Int']['output'];
88934
+ nonBillableHours: Scalars['Float']['output'];
88935
+ outstandingInWindow: Scalars['Float']['output'];
88936
+ /** Top 10 clients by billed amount. */
88937
+ revenueByClient: Array<PswAnalyticsDistributionRow>;
88938
+ /** Top 10 engagements by billed amount. */
88939
+ revenueByEngagement: Array<PswAnalyticsDistributionRow>;
88940
+ revenueByPracticeArea: Array<PswAnalyticsDistributionRow>;
88941
+ timeToPayment: PswTimeToPayment;
88942
+ totalCollected: Scalars['Float']['output'];
88943
+ totalHours: Scalars['Float']['output'];
88944
+ /** Total of SENT, OVERDUE and PAID invoices issued in the window. */
88945
+ totalInvoiced: Scalars['Float']['output'];
88946
+ /** billableHours / capacityHours, 0-100. */
88947
+ utilizationRate: Scalars['Float']['output'];
88948
+ windowStart: Scalars['DateTime']['output'];
88949
+ workInProgress: PswWorkInProgress;
88950
+ };
88726
88951
  export type PswPracticeArea = {
88727
88952
  __typename?: 'PswPracticeArea';
88728
88953
  code?: Maybe<Scalars['String']['output']>;
@@ -89035,6 +89260,13 @@ export declare enum PswTimeEntryStatus {
89035
89260
  Rejected = "REJECTED",
89036
89261
  Submitted = "SUBMITTED"
89037
89262
  }
89263
+ export type PswTimeToPayment = {
89264
+ __typename?: 'PswTimeToPayment';
89265
+ /** Average days from sending (or issue) to payment; null when nothing was paid in the window. */
89266
+ averageDays?: Maybe<Scalars['Float']['output']>;
89267
+ medianDays?: Maybe<Scalars['Float']['output']>;
89268
+ paidInvoiceCount: Scalars['Int']['output'];
89269
+ };
89038
89270
  export type PswTrustAccount = {
89039
89271
  __typename?: 'PswTrustAccount';
89040
89272
  accountNumberLast4?: Maybe<Scalars['String']['output']>;
@@ -89220,6 +89452,14 @@ export type PswUpdateTimeEntryInput = {
89220
89452
  narrative?: InputMaybe<Scalars['String']['input']>;
89221
89453
  rate?: InputMaybe<Scalars['Float']['input']>;
89222
89454
  };
89455
+ /** Billable, unbilled, non-rejected time not yet attached to an invoice (current balance). */
89456
+ export type PswWorkInProgress = {
89457
+ __typename?: 'PswWorkInProgress';
89458
+ entryCount: Scalars['Int']['output'];
89459
+ hours: Scalars['Float']['output'];
89460
+ oldestEntryDate?: Maybe<Scalars['DateTime']['output']>;
89461
+ value: Scalars['Float']['output'];
89462
+ };
89223
89463
  export type PswWriteOff = {
89224
89464
  __typename?: 'PswWriteOff';
89225
89465
  actorId: Scalars['ID']['output'];
@@ -90011,6 +90251,8 @@ export type Query = {
90011
90251
  * its owner before saving it (BOFF-9726).
90012
90252
  */
90013
90253
  connectionsNotUsableBy: Array<Scalars['ID']['output']>;
90254
+ /** Whether continuous optimisation is on for this workspace, and the system workflows it seeded. */
90255
+ continuousOptimisationSettings: ContinuousOptimisationSettings;
90014
90256
  conversation?: Maybe<Conversation>;
90015
90257
  conversationCapabilities: ConversationFeatures;
90016
90258
  conversations: ConversationConnection;
@@ -92186,6 +92428,10 @@ export type Query = {
92186
92428
  operationConfig?: Maybe<OperationConfig>;
92187
92429
  /** Get list of operation configurations */
92188
92430
  operationConfigs: OperationConfigsListResponse;
92431
+ /** One optimisation suggestion of this workspace. Any other id is NOT_FOUND. */
92432
+ optimisationSuggestion: OptimisationSuggestion;
92433
+ /** The workspace's optimisation suggestions, best first. */
92434
+ optimisationSuggestions: OptimisationSuggestionList;
92189
92435
  /** Get total count of organizations (for analytics) */
92190
92436
  organizationCount: Scalars['Int']['output'];
92191
92437
  parser?: Maybe<Parser>;
@@ -92632,6 +92878,8 @@ export type Query = {
92632
92878
  /** Signature requests awaiting THIS actor's signature — self-scoped (Type C): the ctx.actorId filter IS the access control. */
92633
92879
  pswMyPendingSignatureRequests: PswSignatureSignerConnection;
92634
92880
  pswObligationReminder?: Maybe<PswObligationReminder>;
92881
+ /** Practice KPIs for the current workspace: collection rate, utilization, revenue by practice area/client/engagement, time to payment, WIP and aged receivables. Monetary figures cover one currency (USD by default); months is clamped to 1-36 and capacityHoursPerWeek to 1-80. */
92882
+ pswPracticeAnalytics: PswPracticeAnalytics;
92635
92883
  pswPracticeArea?: Maybe<PswPracticeArea>;
92636
92884
  pswPractitioner?: Maybe<PswPractitioner>;
92637
92885
  pswPractitionerCredential?: Maybe<PswPractitionerCredential>;
@@ -102233,6 +102481,16 @@ export type QueryOperationConfigsArgs = {
102233
102481
  pagination?: InputMaybe<WorkflowPaginationInput>;
102234
102482
  };
102235
102483
  /** Base Query type with placeholder field. Extended by individual query files. */
102484
+ export type QueryOptimisationSuggestionArgs = {
102485
+ id: Scalars['ID']['input'];
102486
+ };
102487
+ /** Base Query type with placeholder field. Extended by individual query files. */
102488
+ export type QueryOptimisationSuggestionsArgs = {
102489
+ filter?: InputMaybe<OptimisationSuggestionFilter>;
102490
+ limit?: InputMaybe<Scalars['Int']['input']>;
102491
+ offset?: InputMaybe<Scalars['Int']['input']>;
102492
+ };
102493
+ /** Base Query type with placeholder field. Extended by individual query files. */
102236
102494
  export type QueryParserArgs = {
102237
102495
  id: Scalars['ID']['input'];
102238
102496
  };
@@ -103533,6 +103791,12 @@ export type QueryPswObligationReminderArgs = {
103533
103791
  id: Scalars['ID']['input'];
103534
103792
  };
103535
103793
  /** Base Query type with placeholder field. Extended by individual query files. */
103794
+ export type QueryPswPracticeAnalyticsArgs = {
103795
+ capacityHoursPerWeek?: InputMaybe<Scalars['Float']['input']>;
103796
+ currency?: InputMaybe<Scalars['String']['input']>;
103797
+ months?: InputMaybe<Scalars['Int']['input']>;
103798
+ };
103799
+ /** Base Query type with placeholder field. Extended by individual query files. */
103536
103800
  export type QueryPswPracticeAreaArgs = {
103537
103801
  id: Scalars['ID']['input'];
103538
103802
  };
@@ -127950,6 +128214,12 @@ export type WorkerRunAiInvocationInput = {
127950
128214
  /** "platform" for a platform-managed key, "byo" for the workspace's own provider key. */
127951
128215
  credentialSource: Scalars['String']['input'];
127952
128216
  finishedAt: Scalars['DateTime']['input'];
128217
+ /**
128218
+ * BOFF-9969: SHA-256 (64 lowercase hex) of the call's canonical model input, as defined in
128219
+ * wspace-workflow-svc src/modules/optimisation/core/input-fingerprint.ts. Never the input itself.
128220
+ * Equal fingerprints mark a repeated input (a response-cache candidate). Anything else is dropped.
128221
+ */
128222
+ inputFingerprint?: InputMaybe<Scalars['String']['input']>;
127953
128223
  /** Input tokens, including cached input. */
127954
128224
  inputTokens?: InputMaybe<Scalars['Float']['input']>;
127955
128225
  latencyMs?: InputMaybe<Scalars['Int']['input']>;
@@ -128028,6 +128298,22 @@ export type WorkerRunLogLineInput = {
128028
128298
  timestamp: Scalars['DateTime']['input'];
128029
128299
  truncated?: InputMaybe<Scalars['Boolean']['input']>;
128030
128300
  };
128301
+ export type WorkerRunOptimisationInput = {
128302
+ nodeId: Scalars['String']['input'];
128303
+ /** scan */
128304
+ operation: Scalars['String']['input'];
128305
+ /** The system workflow run executing the node. */
128306
+ runId: Scalars['ID']['input'];
128307
+ workspaceId: Scalars['ID']['input'];
128308
+ };
128309
+ export type WorkerRunOptimisationResponse = {
128310
+ __typename?: 'WorkerRunOptimisationResponse';
128311
+ error?: Maybe<Scalars['String']['output']>;
128312
+ errorCode?: Maybe<Scalars['String']['output']>;
128313
+ /** The step's output for the node (JSON object). */
128314
+ output?: Maybe<Scalars['JSON']['output']>;
128315
+ success: Scalars['Boolean']['output'];
128316
+ };
128031
128317
  export type WorkerRunStatusEntry = {
128032
128318
  __typename?: 'WorkerRunStatusEntry';
128033
128319
  /** How the run executes. The worker drops a graph job that reaches a DURABLE_FN run. */
@@ -129141,6 +129427,8 @@ export declare enum WorkflowProposalKind {
129141
129427
  Author = "AUTHOR",
129142
129428
  /** One more node after a chosen node */
129143
129429
  NextNode = "NEXT_NODE",
129430
+ /** The change behind a continuous-optimisation suggestion, built without a model call (proposeOptimisation) */
129431
+ Optimise = "OPTIMISE",
129144
129432
  /** A fix for a failed run */
129145
129433
  Repair = "REPAIR"
129146
129434
  }