@kortix/sdk 0.12.5 → 0.12.6

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 (115) hide show
  1. package/README.md +23 -1
  2. package/dist/core/client/kortix.d.ts +30 -0
  3. package/dist/core/client/kortix.d.ts.map +1 -1
  4. package/dist/core/client/kortix.js +27 -0
  5. package/dist/core/client/kortix.js.map +1 -1
  6. package/dist/core/http/api-client.d.ts.map +1 -1
  7. package/dist/core/http/api-client.js +41 -16
  8. package/dist/core/http/api-client.js.map +1 -1
  9. package/dist/core/rest/projects-client/apps.d.ts +216 -0
  10. package/dist/core/rest/projects-client/apps.d.ts.map +1 -0
  11. package/dist/core/rest/projects-client/apps.js +105 -0
  12. package/dist/core/rest/projects-client/apps.js.map +1 -0
  13. package/dist/core/rest/projects-client/connectors.d.ts +5 -0
  14. package/dist/core/rest/projects-client/connectors.d.ts.map +1 -1
  15. package/dist/core/rest/projects-client/connectors.js.map +1 -1
  16. package/dist/core/rest/projects-client/index.d.ts +1 -0
  17. package/dist/core/rest/projects-client/index.d.ts.map +1 -1
  18. package/dist/core/rest/projects-client/index.js +1 -0
  19. package/dist/core/rest/projects-client/index.js.map +1 -1
  20. package/dist/core/rest/projects-client/projects.d.ts +1 -1
  21. package/dist/core/rest/projects-client/projects.d.ts.map +1 -1
  22. package/dist/core/rest/projects-client/projects.js.map +1 -1
  23. package/dist/kortix.esm.min.js +16 -16
  24. package/dist/kortix.global.js +16 -16
  25. package/dist/react/index.d.ts +8 -0
  26. package/dist/react/index.d.ts.map +1 -1
  27. package/dist/react/index.js +13 -0
  28. package/dist/react/index.js.map +1 -1
  29. package/dist/react/invalidate-project.d.ts +76 -0
  30. package/dist/react/invalidate-project.d.ts.map +1 -0
  31. package/dist/react/invalidate-project.js +72 -0
  32. package/dist/react/invalidate-project.js.map +1 -0
  33. package/dist/react/provider-refresh.d.ts.map +1 -1
  34. package/dist/react/provider-refresh.js +12 -3
  35. package/dist/react/provider-refresh.js.map +1 -1
  36. package/dist/react/query-contracts.d.ts +112 -0
  37. package/dist/react/query-contracts.d.ts.map +1 -0
  38. package/dist/react/query-contracts.js +100 -0
  39. package/dist/react/query-contracts.js.map +1 -0
  40. package/dist/react/query-keys.d.ts +251 -0
  41. package/dist/react/query-keys.d.ts.map +1 -0
  42. package/dist/react/query-keys.js +249 -0
  43. package/dist/react/query-keys.js.map +1 -0
  44. package/dist/react/session-title-sync.d.ts.map +1 -1
  45. package/dist/react/session-title-sync.js +14 -4
  46. package/dist/react/session-title-sync.js.map +1 -1
  47. package/dist/react/use-admin-accounts.d.ts +85 -0
  48. package/dist/react/use-admin-accounts.d.ts.map +1 -1
  49. package/dist/react/use-admin-accounts.js +100 -0
  50. package/dist/react/use-admin-accounts.js.map +1 -1
  51. package/dist/react/use-admin-activity-analytics.d.ts +91 -0
  52. package/dist/react/use-admin-activity-analytics.d.ts.map +1 -0
  53. package/dist/react/use-admin-activity-analytics.js +83 -0
  54. package/dist/react/use-admin-activity-analytics.js.map +1 -0
  55. package/dist/react/use-admin-projects.d.ts +50 -0
  56. package/dist/react/use-admin-projects.d.ts.map +1 -0
  57. package/dist/react/use-admin-projects.js +28 -0
  58. package/dist/react/use-admin-projects.js.map +1 -0
  59. package/dist/react/use-canonical-opencode-session.d.ts.map +1 -1
  60. package/dist/react/use-canonical-opencode-session.js +12 -7
  61. package/dist/react/use-canonical-opencode-session.js.map +1 -1
  62. package/dist/react/use-gateway-catalog-sync.d.ts.map +1 -1
  63. package/dist/react/use-gateway-catalog-sync.js +5 -2
  64. package/dist/react/use-gateway-catalog-sync.js.map +1 -1
  65. package/dist/react/use-model-defaults.d.ts.map +1 -1
  66. package/dist/react/use-model-defaults.js +3 -1
  67. package/dist/react/use-model-defaults.js.map +1 -1
  68. package/dist/react/use-model-enablement.d.ts.map +1 -1
  69. package/dist/react/use-model-enablement.js +6 -2
  70. package/dist/react/use-model-enablement.js.map +1 -1
  71. package/dist/react/use-opencode-events/handle-event.d.ts +6 -0
  72. package/dist/react/use-opencode-events/handle-event.d.ts.map +1 -1
  73. package/dist/react/use-opencode-events/handle-event.js +3 -3
  74. package/dist/react/use-opencode-events/handle-event.js.map +1 -1
  75. package/dist/react/use-opencode-events/helpers.d.ts +27 -1
  76. package/dist/react/use-opencode-events/helpers.d.ts.map +1 -1
  77. package/dist/react/use-opencode-events/helpers.js +31 -6
  78. package/dist/react/use-opencode-events/helpers.js.map +1 -1
  79. package/dist/react/use-opencode-events/index.d.ts.map +1 -1
  80. package/dist/react/use-opencode-events/index.js +8 -0
  81. package/dist/react/use-opencode-events/index.js.map +1 -1
  82. package/dist/react/use-opencode-sessions/agents.d.ts.map +1 -1
  83. package/dist/react/use-opencode-sessions/agents.js +10 -1
  84. package/dist/react/use-opencode-sessions/agents.js.map +1 -1
  85. package/dist/react/use-opencode-sessions/providers.d.ts.map +1 -1
  86. package/dist/react/use-opencode-sessions/providers.js +9 -2
  87. package/dist/react/use-opencode-sessions/providers.js.map +1 -1
  88. package/dist/react/use-project-apps.d.ts +410 -0
  89. package/dist/react/use-project-apps.d.ts.map +1 -0
  90. package/dist/react/use-project-apps.js +98 -0
  91. package/dist/react/use-project-apps.js.map +1 -0
  92. package/dist/react/use-project-config.d.ts +7 -0
  93. package/dist/react/use-project-config.d.ts.map +1 -1
  94. package/dist/react/use-project-config.js +14 -4
  95. package/dist/react/use-project-config.js.map +1 -1
  96. package/dist/react/use-project-models.d.ts.map +1 -1
  97. package/dist/react/use-project-models.js +8 -2
  98. package/dist/react/use-project-models.js.map +1 -1
  99. package/dist/react/use-project-name.d.ts +23 -0
  100. package/dist/react/use-project-name.d.ts.map +1 -0
  101. package/dist/react/use-project-name.js +44 -0
  102. package/dist/react/use-project-name.js.map +1 -0
  103. package/dist/react/use-project-secrets.d.ts +5 -2
  104. package/dist/react/use-project-secrets.d.ts.map +1 -1
  105. package/dist/react/use-project-secrets.js +8 -2
  106. package/dist/react/use-project-secrets.js.map +1 -1
  107. package/dist/react/use-project-session.d.ts +40 -0
  108. package/dist/react/use-project-session.d.ts.map +1 -0
  109. package/dist/react/use-project-session.js +49 -0
  110. package/dist/react/use-project-session.js.map +1 -0
  111. package/dist/react/use-project-triggers.d.ts +4 -2
  112. package/dist/react/use-project-triggers.d.ts.map +1 -1
  113. package/dist/react/use-project-triggers.js +7 -2
  114. package/dist/react/use-project-triggers.js.map +1 -1
  115. package/package.json +2 -2
@@ -9,9 +9,12 @@ export { useProjectSecrets, projectSecretsKey } from './use-project-secrets.js';
9
9
  export { useProjectTriggers, projectTriggersKey } from './use-project-triggers.js';
10
10
  export { useChangeRequests, changeRequestsKey } from './use-change-requests.js';
11
11
  export { useGatewayRoutingPolicy, gatewayRoutingPolicyKey } from './use-gateway-routing-policy.js';
12
+ export { useProjectApps, useAppDeployments, useAppAccess, projectAppsKey, appDeploymentsKey, } from './use-project-apps.js';
12
13
  export { NoCompactionModelError } from './use-opencode-sessions/no-compaction-model-error.js';
13
14
  export * from './use-admin-accounts.js';
15
+ export * from './use-admin-projects.js';
14
16
  export * from './use-admin-analytics.js';
17
+ export * from './use-admin-activity-analytics.js';
15
18
  export * from './use-admin-feedback.js';
16
19
  export * from './use-system-status.js';
17
20
  export * from './use-ops-overview.js';
@@ -22,4 +25,9 @@ export * from './use-admin-sandboxes.js';
22
25
  export * from './use-authenticated-preview-url.js';
23
26
  export * from './run-pty-command.js';
24
27
  export * from './runtime-actions.js';
28
+ export * from './query-keys.js';
29
+ export * from './query-contracts.js';
30
+ export * from './use-project-name.js';
31
+ export * from './use-project-session.js';
32
+ export * from './invalidate-project.js';
25
33
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAKA,cAAc,YAAY,CAAC;AAI3B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,SAAS,GACf,MAAM,eAAe,CAAC;AAKvB,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,uBAAuB,EACvB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AAOjC,OAAO,EACL,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,sBAAsB,GAC5B,MAAM,6BAA6B,CAAC;AAOrC,cAAc,qBAAqB,CAAC;AAMpC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,oBAAoB,GAC1B,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAOtF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAMhG,OAAO,EAAE,sBAAsB,EAAE,MAAM,mDAAmD,CAAC;AAC3F,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAKA,cAAc,YAAY,CAAC;AAI3B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,SAAS,GACf,MAAM,eAAe,CAAC;AAKvB,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,uBAAuB,EACvB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AAOjC,OAAO,EACL,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,sBAAsB,GAC5B,MAAM,6BAA6B,CAAC;AAOrC,cAAc,qBAAqB,CAAC;AAMpC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,oBAAoB,GAC1B,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAOtF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAChG,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,mDAAmD,CAAC;AAC3F,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAOlC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC"}
@@ -43,13 +43,16 @@ export { useProjectSecrets, projectSecretsKey } from './use-project-secrets.js';
43
43
  export { useProjectTriggers, projectTriggersKey } from './use-project-triggers.js';
44
44
  export { useChangeRequests, changeRequestsKey } from './use-change-requests.js';
45
45
  export { useGatewayRoutingPolicy, gatewayRoutingPolicyKey } from './use-gateway-routing-policy.js';
46
+ export { useProjectApps, useAppDeployments, useAppAccess, projectAppsKey, appDeploymentsKey, } from './use-project-apps.js';
46
47
  // The expected "no compaction model configured" configuration state thrown by
47
48
  // `useSummarizeOpenCodeSession`'s mutation when every model-resolution fallback
48
49
  // tier fails. Re-exported here so hosts + the telemetry noise gate can
49
50
  // `instanceof`-match it without reaching into the hook's internal path.
50
51
  export { NoCompactionModelError } from './use-opencode-sessions/no-compaction-model-error.js';
51
52
  export * from './use-admin-accounts.js';
53
+ export * from './use-admin-projects.js';
52
54
  export * from './use-admin-analytics.js';
55
+ export * from './use-admin-activity-analytics.js';
53
56
  export * from './use-admin-feedback.js';
54
57
  export * from './use-system-status.js';
55
58
  export * from './use-ops-overview.js';
@@ -60,4 +63,14 @@ export * from './use-admin-sandboxes.js';
60
63
  export * from './use-authenticated-preview-url.js';
61
64
  export * from './run-pty-command.js';
62
65
  export * from './runtime-actions.js';
66
+ // The client-cache-unification `qk` key factory (rooted at `'kx'`, disjoint
67
+ // from `kortixKeys`'s `'kortix'` root above) + its four freshness tiers, the
68
+ // single `useProjectName` accessor, and the invalidation/optimistic-write
69
+ // helpers that keep the projects-list and project-detail caches in sync. See
70
+ // `query-keys.ts` for why the root segment is `'kx'` and not `'kortix'`.
71
+ export * from './query-keys.js';
72
+ export * from './query-contracts.js';
73
+ export * from './use-project-name.js';
74
+ export * from './use-project-session.js';
75
+ export * from './invalidate-project.js';
63
76
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,0EAA0E;AAC1E,gFAAgF;AAChF,qEAAqE;AACrE,cAAc,YAAY,CAAC;AAE3B,+EAA+E;AAC/E,qEAAqE;AACrE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,iBAAiB,GAKlB,MAAM,eAAe,CAAC;AAEvB,qEAAqE;AACrE,8EAA8E;AAC9E,4EAA4E;AAC5E,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,uBAAuB,GAExB,MAAM,yBAAyB,CAAC;AAEjC,8EAA8E;AAC9E,0EAA0E;AAC1E,uEAAuE;AACvE,iEAAiE;AACjE,8BAA8B;AAC9B,OAAO,EACL,eAAe,GAMhB,MAAM,6BAA6B,CAAC;AAErC,0EAA0E;AAC1E,8DAA8D;AAC9D,sEAAsE;AACtE,yEAAyE;AACzE,4EAA4E;AAC5E,cAAc,qBAAqB,CAAC;AAEpC,0EAA0E;AAC1E,4EAA4E;AAC5E,2EAA2E;AAC3E,uEAAuE;AACvE,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,GAajB,MAAM,oBAAoB,CAAC;AAE5B,yEAAyE;AACzE,mEAAmE;AACnE,2EAA2E;AAC3E,yEAAyE;AACzE,uEAAuE;AACvE,yCAAyC;AACzC,OAAO,EAAE,YAAY,EAAiB,WAAW,EAAsB,MAAM,QAAQ,CAAC;AAEtF,uEAAuE;AACvE,uEAAuE;AACvE,yEAAyE;AACzE,0EAA0E;AAC1E,oDAAoD;AACpD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEhG,8EAA8E;AAC9E,gFAAgF;AAChF,uEAAuE;AACvE,wEAAwE;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mDAAmD,CAAC;AAC3F,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,0EAA0E;AAC1E,gFAAgF;AAChF,qEAAqE;AACrE,cAAc,YAAY,CAAC;AAE3B,+EAA+E;AAC/E,qEAAqE;AACrE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,iBAAiB,GAKlB,MAAM,eAAe,CAAC;AAEvB,qEAAqE;AACrE,8EAA8E;AAC9E,4EAA4E;AAC5E,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,uBAAuB,GAExB,MAAM,yBAAyB,CAAC;AAEjC,8EAA8E;AAC9E,0EAA0E;AAC1E,uEAAuE;AACvE,iEAAiE;AACjE,8BAA8B;AAC9B,OAAO,EACL,eAAe,GAMhB,MAAM,6BAA6B,CAAC;AAErC,0EAA0E;AAC1E,8DAA8D;AAC9D,sEAAsE;AACtE,yEAAyE;AACzE,4EAA4E;AAC5E,cAAc,qBAAqB,CAAC;AAEpC,0EAA0E;AAC1E,4EAA4E;AAC5E,2EAA2E;AAC3E,uEAAuE;AACvE,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,GAajB,MAAM,oBAAoB,CAAC;AAE5B,yEAAyE;AACzE,mEAAmE;AACnE,2EAA2E;AAC3E,yEAAyE;AACzE,uEAAuE;AACvE,yCAAyC;AACzC,OAAO,EAAE,YAAY,EAAiB,WAAW,EAAsB,MAAM,QAAQ,CAAC;AAEtF,uEAAuE;AACvE,uEAAuE;AACvE,yEAAyE;AACzE,0EAA0E;AAC1E,oDAAoD;AACpD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAChG,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,8EAA8E;AAC9E,gFAAgF;AAChF,uEAAuE;AACvE,wEAAwE;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mDAAmD,CAAC;AAC3F,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAElC,4EAA4E;AAC5E,6EAA6E;AAC7E,0EAA0E;AAC1E,6EAA6E;AAC7E,yEAAyE;AACzE,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,76 @@
1
+ import type { QueryClient, QueryKey } from '@tanstack/react-query';
2
+ /** Everything belonging to one project. Use after a write with broad effect. */
3
+ export declare function invalidateProject(qc: QueryClient, projectId: string): Promise<void>;
4
+ /**
5
+ * A project's NAME lives in two caches: every projects-LIST entry and the
6
+ * detail entry. Rename previously invalidated only `qk.projects.list()` — the
7
+ * single accountless slot — so the sidebar and the project home title
8
+ * disagreed until eviction. That was ALSO a second, narrower bug on top of
9
+ * the first: `qk.projects.list(accountId)` and `qk.projects.list()` are
10
+ * SIBLINGS under `qk.projects.scope()`, not parent and child (see
11
+ * `query-keys.ts`'s own warning about exactly this collision shape) — so
12
+ * invalidating `list()` alone never reached the account-scoped list every
13
+ * real project switcher actually reads. Reaching every list form needs the
14
+ * two-element `qk.projects.scope()` PREFIX, not the three-element `list()`
15
+ * key. Both invalidations, always, or the bug returns.
16
+ */
17
+ export declare function invalidateProjectIdentity(qc: QueryClient, projectId: string): Promise<void>;
18
+ type ProjectsListEntry = {
19
+ project_id: string;
20
+ name: string;
21
+ };
22
+ type ProjectDetailEntry = {
23
+ project?: {
24
+ name?: string;
25
+ };
26
+ };
27
+ /**
28
+ * Exactly what `writeProjectNameOptimistically` overwrote, restorable with
29
+ * `restoreProjectName`. `lists` is an array, not a single entry, because the
30
+ * project can be cached under several account-scoped list keys at once — see
31
+ * `invalidateProjectIdentity`'s doc comment for why that's a prefix, not a
32
+ * single key. A key with no snapshot row was never cached at write time, and
33
+ * `restoreProjectName` will correctly leave it alone.
34
+ */
35
+ export interface ProjectNameSnapshot {
36
+ detail: ProjectDetailEntry | undefined;
37
+ lists: Array<{
38
+ queryKey: QueryKey;
39
+ data: ProjectsListEntry[] | undefined;
40
+ }>;
41
+ }
42
+ /**
43
+ * Paint the new name in the same frame the rename dialog closes, instead of a
44
+ * round-trip later. Callers still invalidate on settle; this only removes the
45
+ * visible lag. A missing cache entry is not an error — nothing to update yet.
46
+ *
47
+ * Returns a snapshot of exactly what it overwrote, so the caller can restore
48
+ * it with `restoreProjectName` if the mutation fails — see that function's
49
+ * doc comment for why a failed rename used to leave the optimistic name
50
+ * cached permanently. `setQueryData` needs an exact key, so the list side
51
+ * can't just target the `qk.projects.scope()` prefix directly — it fans out
52
+ * with `setQueriesData`, verified empirically to update every matching list
53
+ * entry and nothing outside the prefix (confirmed against the real TanStack
54
+ * engine: two sibling list keys both update, an unrelated
55
+ * `qk.project.detail` entry does not).
56
+ */
57
+ export declare function writeProjectNameOptimistically(qc: QueryClient, projectId: string, name: string): ProjectNameSnapshot;
58
+ /**
59
+ * Put back exactly what `writeProjectNameOptimistically` overwrote. THE
60
+ * Critical-path fix: `onMutate` used to write the optimistic name but never
61
+ * snapshot what it overwrote, and `onError` only showed a toast — so a FAILED
62
+ * rename left the wrong name cached until `invalidateQueries` happened to hit
63
+ * a mounted observer, which (with `refetchOnMount: false`, before that was
64
+ * also fixed) it never did. The wrong name was permanent until a hard
65
+ * refresh.
66
+ *
67
+ * Restores each snapshotted list key individually rather than re-invalidating
68
+ * broadly: a key with no row in `snapshot.lists` was never cached at write
69
+ * time (or was populated by an unrelated mutation AFTER the snapshot), and
70
+ * this leaves it untouched rather than evicting data this rollback never saw.
71
+ * `setQueryData(key, undefined)` is a verified no-op (does not evict an
72
+ * existing entry), so a snapshot that captured nothing is safely a no-op too.
73
+ */
74
+ export declare function restoreProjectName(qc: QueryClient, projectId: string, snapshot: ProjectNameSnapshot): void;
75
+ export {};
76
+ //# sourceMappingURL=invalidate-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidate-project.d.ts","sourceRoot":"","sources":["../../src/react/invalidate-project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGnE,gFAAgF;AAChF,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,WAAW,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,KAAK,iBAAiB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9D,KAAK,kBAAkB,GAAG;IAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACvC,KAAK,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;CAC7E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,WAAW,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,mBAAmB,CAkBrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,WAAW,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,mBAAmB,GAC5B,IAAI,CAKN"}
@@ -0,0 +1,72 @@
1
+ import { qk } from './query-keys.js';
2
+ /** Everything belonging to one project. Use after a write with broad effect. */
3
+ export async function invalidateProject(qc, projectId) {
4
+ await qc.invalidateQueries({ queryKey: qk.project.scope(projectId) });
5
+ }
6
+ /**
7
+ * A project's NAME lives in two caches: every projects-LIST entry and the
8
+ * detail entry. Rename previously invalidated only `qk.projects.list()` — the
9
+ * single accountless slot — so the sidebar and the project home title
10
+ * disagreed until eviction. That was ALSO a second, narrower bug on top of
11
+ * the first: `qk.projects.list(accountId)` and `qk.projects.list()` are
12
+ * SIBLINGS under `qk.projects.scope()`, not parent and child (see
13
+ * `query-keys.ts`'s own warning about exactly this collision shape) — so
14
+ * invalidating `list()` alone never reached the account-scoped list every
15
+ * real project switcher actually reads. Reaching every list form needs the
16
+ * two-element `qk.projects.scope()` PREFIX, not the three-element `list()`
17
+ * key. Both invalidations, always, or the bug returns.
18
+ */
19
+ export async function invalidateProjectIdentity(qc, projectId) {
20
+ await Promise.all([
21
+ qc.invalidateQueries({ queryKey: qk.projects.scope() }),
22
+ qc.invalidateQueries({ queryKey: qk.project.detail(projectId) }),
23
+ ]);
24
+ }
25
+ /**
26
+ * Paint the new name in the same frame the rename dialog closes, instead of a
27
+ * round-trip later. Callers still invalidate on settle; this only removes the
28
+ * visible lag. A missing cache entry is not an error — nothing to update yet.
29
+ *
30
+ * Returns a snapshot of exactly what it overwrote, so the caller can restore
31
+ * it with `restoreProjectName` if the mutation fails — see that function's
32
+ * doc comment for why a failed rename used to leave the optimistic name
33
+ * cached permanently. `setQueryData` needs an exact key, so the list side
34
+ * can't just target the `qk.projects.scope()` prefix directly — it fans out
35
+ * with `setQueriesData`, verified empirically to update every matching list
36
+ * entry and nothing outside the prefix (confirmed against the real TanStack
37
+ * engine: two sibling list keys both update, an unrelated
38
+ * `qk.project.detail` entry does not).
39
+ */
40
+ export function writeProjectNameOptimistically(qc, projectId, name) {
41
+ const lists = qc.getQueriesData({ queryKey: qk.projects.scope() });
42
+ const snapshot = {
43
+ detail: qc.getQueryData(qk.project.detail(projectId)),
44
+ lists: lists.map(([queryKey, data]) => ({ queryKey, data })),
45
+ };
46
+ qc.setQueriesData({ queryKey: qk.projects.scope() }, (prev) => prev?.map((p) => (p.project_id === projectId ? { ...p, name } : p)));
47
+ qc.setQueryData(qk.project.detail(projectId), (prev) => prev?.project ? { ...prev, project: { ...prev.project, name } } : prev);
48
+ return snapshot;
49
+ }
50
+ /**
51
+ * Put back exactly what `writeProjectNameOptimistically` overwrote. THE
52
+ * Critical-path fix: `onMutate` used to write the optimistic name but never
53
+ * snapshot what it overwrote, and `onError` only showed a toast — so a FAILED
54
+ * rename left the wrong name cached until `invalidateQueries` happened to hit
55
+ * a mounted observer, which (with `refetchOnMount: false`, before that was
56
+ * also fixed) it never did. The wrong name was permanent until a hard
57
+ * refresh.
58
+ *
59
+ * Restores each snapshotted list key individually rather than re-invalidating
60
+ * broadly: a key with no row in `snapshot.lists` was never cached at write
61
+ * time (or was populated by an unrelated mutation AFTER the snapshot), and
62
+ * this leaves it untouched rather than evicting data this rollback never saw.
63
+ * `setQueryData(key, undefined)` is a verified no-op (does not evict an
64
+ * existing entry), so a snapshot that captured nothing is safely a no-op too.
65
+ */
66
+ export function restoreProjectName(qc, projectId, snapshot) {
67
+ for (const { queryKey, data } of snapshot.lists) {
68
+ qc.setQueryData(queryKey, data);
69
+ }
70
+ qc.setQueryData(qk.project.detail(projectId), snapshot.detail);
71
+ }
72
+ //# sourceMappingURL=invalidate-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidate-project.js","sourceRoot":"","sources":["../../src/react/invalidate-project.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAe,EAAE,SAAiB;IACxE,MAAM,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,EAAe,EACf,SAAiB;IAEjB,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;QACvD,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;KACjE,CAAC,CAAC;AACL,CAAC;AAkBD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,8BAA8B,CAC5C,EAAe,EACf,SAAiB,EACjB,IAAY;IAEZ,MAAM,KAAK,GAAG,EAAE,CAAC,cAAc,CAAsB,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAwB;QACpC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAqB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;KAC7D,CAAC;IAEF,EAAE,CAAC,cAAc,CACf,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EACjC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9E,CAAC;IACF,EAAE,CAAC,YAAY,CACb,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAC5B,CAAC,IAAoC,EAAE,EAAE,CACvC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CACzE,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,kBAAkB,CAChC,EAAe,EACf,SAAiB,EACjB,QAA6B;IAE7B,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAChD,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;AACjE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider-refresh.d.ts","sourceRoot":"","sources":["../../src/react/provider-refresh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAOzD,KAAK,kCAAkC,GAAG;IACxC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAKF;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAWT;AAaD,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,kCAAuC,GAC5C,IAAI,CA8CN"}
1
+ {"version":3,"file":"provider-refresh.d.ts","sourceRoot":"","sources":["../../src/react/provider-refresh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAQzD,KAAK,kCAAkC,GAAG;IACxC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAKF;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAWT;AAaD,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,kCAAuC,GAC5C,IAAI,CAsDN"}
@@ -3,6 +3,7 @@ import { listProjectSecrets } from '../core/rest/projects-client/index.js';
3
3
  import { connectedGatewayProviderIdsFromSecretNames } from './provider-selection.js';
4
4
  import { configKeys } from './use-opencode-config.js';
5
5
  import { clearProjectProviderCache, opencodeKeys } from './use-opencode-sessions/index.js';
6
+ import { qk } from './query-keys.js';
6
7
  const CONVERGE_POLL_MS = 2_500;
7
8
  const CONVERGE_DEADLINE_MS = 45_000;
8
9
  /**
@@ -26,8 +27,8 @@ function invalidateProviderQueries(queryClient, projectId) {
26
27
  const projectProviderKey = ['project-providers', projectId];
27
28
  clearProjectProviderCache(projectId);
28
29
  void queryClient.invalidateQueries({ queryKey: projectProviderKey });
29
- void queryClient.invalidateQueries({ queryKey: ['project-secrets', projectId] });
30
- void queryClient.refetchQueries({ queryKey: ['project-secrets', projectId], type: 'all' });
30
+ void queryClient.invalidateQueries({ queryKey: qk.project.secrets(projectId) });
31
+ void queryClient.refetchQueries({ queryKey: qk.project.secrets(projectId), type: 'all' });
31
32
  void queryClient.refetchQueries({ queryKey: projectProviderKey, type: 'all' });
32
33
  void queryClient.invalidateQueries({ queryKey: opencodeKeys.providers() });
33
34
  void queryClient.invalidateQueries({ queryKey: configKeys.all });
@@ -59,8 +60,16 @@ export function refreshProjectProviderState(queryClient, projectId, opts = {}) {
59
60
  const poll = async () => {
60
61
  let connected = false;
61
62
  try {
63
+ // Same key `useProjectSecrets`/the Customize secrets view read —
64
+ // pre-migration this was a standalone flat `project-secrets` array
65
+ // literal, so every poll's `fetchQuery` populated a cache entry no
66
+ // `useQuery` observer ever read: a real network request whose result
67
+ // no UI ever saw. Sharing `qk.project.secrets(id)` means the poll's
68
+ // fresh (`staleTime: 0`) fetch is the SAME entry the secrets UI
69
+ // renders from, so the picker/secrets list update from this poll
70
+ // too, not only from the `refetchQueries` burst below.
62
71
  const secrets = await queryClient.fetchQuery({
63
- queryKey: ['project-secrets', projectId],
72
+ queryKey: qk.project.secrets(projectId),
64
73
  queryFn: () => listProjectSecrets(projectId),
65
74
  staleTime: 0,
66
75
  });
@@ -1 +1 @@
1
- {"version":3,"file":"provider-refresh.js","sourceRoot":"","sources":["../../src/react/provider-refresh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider-refresh.js","sourceRoot":"","sources":["../../src/react/provider-refresh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * One freshness contract per entity, declared once.
3
+ *
4
+ * `staleTime` is per-OBSERVER in React Query, not per-key. Seven call sites
5
+ * reading the flat `project-detail` key therefore declared seven answers to "when
6
+ * does a server-side change reach the user", and which one governed depended
7
+ * on which pages happened to be mounted. Tiers remove the choice from the call
8
+ * site: a consumer spreads a contract, it never authors one.
9
+ *
10
+ * `refetchOnMount` is `true` everywhere, DELIBERATELY, and it is the second
11
+ * time this file has gotten it wrong — the first version said `false`
12
+ * "because explicit invalidation is the freshness channel". That is
13
+ * empirically false: `invalidateQueries` defaults to `refetchType: 'active'`,
14
+ * which only refetches queries with a currently-mounted observer. An
15
+ * invalidated entry with NO mounted observer — the exact shape of a route the
16
+ * user has navigated away from — is marked invalidated but never refetched,
17
+ * and `refetchOnMount:false` means the next mount doesn't refetch it either.
18
+ * It serves its stale (or, worse, wrongly-optimistic — see
19
+ * `invalidate-project.ts`) value for the rest of `gcTime`. Verified against
20
+ * the real TanStack engine:
21
+ *
22
+ * refetchOnMount:false -> {"seen":"OPTIMISTIC","totalFetches":1} wrong value survives
23
+ * refetchOnMount:true -> {"seen":"SERVER","totalFetches":2} self-heals
24
+ *
25
+ * This is NOT a tradeoff against "wasted" fetches on remount, because
26
+ * `refetchOnMount:true` still respects `staleTime` — it only refetches an
27
+ * entry that is actually stale or invalidated. A remount of FRESH data costs
28
+ * the same either way:
29
+ *
30
+ * FRESH-FALSE {"refetchedOnRemount":0,"isPending":false}
31
+ * FRESH-TRUE {"refetchedOnRemount":0,"isPending":false}
32
+ *
33
+ * Do not "optimise" this back to `false` without redoing both probes above.
34
+ */
35
+ export type FreshnessTier = 'live' | 'config' | 'inventory' | 'volatile';
36
+ export declare function contract(tier: FreshnessTier): {
37
+ staleTime: number;
38
+ gcTime: number;
39
+ refetchOnMount: true;
40
+ };
41
+ /**
42
+ * Entity → tier. Adding an entity here without a tier is a type error, which
43
+ * is the point: a new query cannot quietly inherit the global default.
44
+ */
45
+ export declare const FRESHNESS: {
46
+ readonly projectsList: "inventory";
47
+ readonly projectSummary: "config";
48
+ readonly projectDetail: "config";
49
+ readonly projectConfig: "config";
50
+ readonly session: "inventory";
51
+ readonly sessions: "inventory";
52
+ readonly messages: "live";
53
+ readonly connectors: "config";
54
+ readonly connectorConfig: "config";
55
+ readonly secrets: "config";
56
+ readonly apps: "inventory";
57
+ readonly appDeployments: "inventory";
58
+ readonly policies: "config";
59
+ readonly executorPolicies: "config";
60
+ readonly access: "inventory";
61
+ readonly accessRequests: "inventory";
62
+ readonly pendingInvites: "inventory";
63
+ readonly groupGrants: "inventory";
64
+ readonly resourceGrants: "inventory";
65
+ readonly files: "config";
66
+ readonly fileSource: "config";
67
+ readonly branches: "config";
68
+ /**
69
+ * NOT live sandbox health — the sandbox TEMPLATE catalog.
70
+ * `listProjectSandboxes` is `GET /projects/:id/sandboxes` returning
71
+ * `SandboxTemplatesResponse` (`{ items, default_slug, provider_mode, … }`),
72
+ * byte-for-byte the same call `sandboxTemplates` below already makes. Live
73
+ * health is a different entity entirely — `getProjectSandboxHealth`,
74
+ * `GET /projects/:id/sandbox-health`, read by `project-sandbox-alert.tsx`
75
+ * under its own key with its own adaptive `refetchInterval` (8s while a
76
+ * build is active, 120s otherwise). Nothing on THIS key is time-sensitive.
77
+ *
78
+ * Was `volatile` (5s) on the strength of the word "sandbox". Its
79
+ * pre-migration window was 60s, every change to it arrives through this
80
+ * app's own mutations (`sandbox-template-form.tsx`, `sandbox-view.tsx` —
81
+ * all three invalidate this key), and `refetchOnMount: true` at 5s meant a
82
+ * refetch on essentially every project landing. `config` restores the
83
+ * original window and matches the twin below, which reads the same
84
+ * response.
85
+ */
86
+ readonly sandboxes: "config";
87
+ readonly sandboxTemplates: "config";
88
+ readonly snapshots: "config";
89
+ readonly modelPicker: "config";
90
+ /**
91
+ * Analytics aggregates over a `days` window — overview, series, breakdown,
92
+ * sessions, errors — plus budgets and keys.
93
+ *
94
+ * The aggregates accumulate from TRAFFIC (agent runs, other members),
95
+ * which no mutation of ours announces, so they cannot be `config`. But they
96
+ * are aggregates over days: a 5-second window buys nothing a 30-second one
97
+ * doesn't, and cost real requests — `refetchOnMount: true` at `volatile`
98
+ * refetched all five on every Customize -> Gateway open. `inventory` is
99
+ * both the honest description ("can also change from another member") and
100
+ * exactly their pre-migration 30s window.
101
+ *
102
+ * Budgets and keys ride the same tier at 30s against a pre-migration 15s.
103
+ * Safe: both are mutated only through this UI and both invalidate on
104
+ * success (`use-project-gateway.ts`), so staleTime only ever bounds an
105
+ * out-of-band change. `gatewayLogs` opts out entirely — it sets
106
+ * `refetchInterval: 10_000` and no contract, because a log tail genuinely
107
+ * is a tail.
108
+ */
109
+ readonly gateway: "inventory";
110
+ readonly triggers: "config";
111
+ };
112
+ //# sourceMappingURL=query-contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-contracts.d.ts","sourceRoot":"","sources":["../../src/react/query-contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;AAyBzE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,aAAa;;;;EAM3C;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;IAuBpB;;;;;;;;;;;;;;;;;OAiBG;;;;;IAKH;;;;;;;;;;;;;;;;;;OAkBG;;;CAG6C,CAAC"}
@@ -0,0 +1,100 @@
1
+ const GC_TIME = 30 * 60 * 1000;
2
+ const TIERS = {
3
+ /** Kept current by SSE events. Polling it would be redundant and racy. */
4
+ live: { staleTime: Infinity },
5
+ /** Changes arrive through this app's own mutations, which invalidate. */
6
+ config: { staleTime: 60_000 },
7
+ /** Can also change from another member or another tab. */
8
+ inventory: { staleTime: 30_000 },
9
+ /**
10
+ * Genuinely time-sensitive; no mutation announces the change, AND a
11
+ * 30-second-old value would actively mislead.
12
+ *
13
+ * UNCLAIMED as of the `sandboxes`/`gateway` review below. Kept because
14
+ * `FreshnessTier` is a published string-literal union and dropping a member
15
+ * is a breaking change — not because anything needs it. The first two
16
+ * entities put here got it for sounding urgent rather than being urgent, so
17
+ * the bar for the next claimant is the second clause: name the reader that
18
+ * is materially wrong at t+30s.
19
+ */
20
+ volatile: { staleTime: 5_000 },
21
+ };
22
+ export function contract(tier) {
23
+ return {
24
+ staleTime: TIERS[tier].staleTime,
25
+ gcTime: GC_TIME,
26
+ refetchOnMount: true,
27
+ };
28
+ }
29
+ /**
30
+ * Entity → tier. Adding an entity here without a tier is a type error, which
31
+ * is the point: a new query cannot quietly inherit the global default.
32
+ */
33
+ export const FRESHNESS = {
34
+ projectsList: 'inventory',
35
+ projectSummary: 'config',
36
+ projectDetail: 'config',
37
+ projectConfig: 'config',
38
+ session: 'inventory',
39
+ sessions: 'inventory',
40
+ messages: 'live',
41
+ connectors: 'config',
42
+ connectorConfig: 'config',
43
+ secrets: 'config',
44
+ apps: 'inventory',
45
+ appDeployments: 'inventory',
46
+ policies: 'config',
47
+ executorPolicies: 'config',
48
+ access: 'inventory',
49
+ accessRequests: 'inventory',
50
+ pendingInvites: 'inventory',
51
+ groupGrants: 'inventory',
52
+ resourceGrants: 'inventory',
53
+ files: 'config',
54
+ fileSource: 'config',
55
+ branches: 'config',
56
+ /**
57
+ * NOT live sandbox health — the sandbox TEMPLATE catalog.
58
+ * `listProjectSandboxes` is `GET /projects/:id/sandboxes` returning
59
+ * `SandboxTemplatesResponse` (`{ items, default_slug, provider_mode, … }`),
60
+ * byte-for-byte the same call `sandboxTemplates` below already makes. Live
61
+ * health is a different entity entirely — `getProjectSandboxHealth`,
62
+ * `GET /projects/:id/sandbox-health`, read by `project-sandbox-alert.tsx`
63
+ * under its own key with its own adaptive `refetchInterval` (8s while a
64
+ * build is active, 120s otherwise). Nothing on THIS key is time-sensitive.
65
+ *
66
+ * Was `volatile` (5s) on the strength of the word "sandbox". Its
67
+ * pre-migration window was 60s, every change to it arrives through this
68
+ * app's own mutations (`sandbox-template-form.tsx`, `sandbox-view.tsx` —
69
+ * all three invalidate this key), and `refetchOnMount: true` at 5s meant a
70
+ * refetch on essentially every project landing. `config` restores the
71
+ * original window and matches the twin below, which reads the same
72
+ * response.
73
+ */
74
+ sandboxes: 'config',
75
+ sandboxTemplates: 'config',
76
+ snapshots: 'config',
77
+ modelPicker: 'config',
78
+ /**
79
+ * Analytics aggregates over a `days` window — overview, series, breakdown,
80
+ * sessions, errors — plus budgets and keys.
81
+ *
82
+ * The aggregates accumulate from TRAFFIC (agent runs, other members),
83
+ * which no mutation of ours announces, so they cannot be `config`. But they
84
+ * are aggregates over days: a 5-second window buys nothing a 30-second one
85
+ * doesn't, and cost real requests — `refetchOnMount: true` at `volatile`
86
+ * refetched all five on every Customize -> Gateway open. `inventory` is
87
+ * both the honest description ("can also change from another member") and
88
+ * exactly their pre-migration 30s window.
89
+ *
90
+ * Budgets and keys ride the same tier at 30s against a pre-migration 15s.
91
+ * Safe: both are mutated only through this UI and both invalidate on
92
+ * success (`use-project-gateway.ts`), so staleTime only ever bounds an
93
+ * out-of-band change. `gatewayLogs` opts out entirely — it sets
94
+ * `refetchInterval: 10_000` and no contract, because a log tail genuinely
95
+ * is a tail.
96
+ */
97
+ gateway: 'inventory',
98
+ triggers: 'config',
99
+ };
100
+ //# sourceMappingURL=query-contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-contracts.js","sourceRoot":"","sources":["../../src/react/query-contracts.ts"],"names":[],"mappings":"AAoCA,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE/B,MAAM,KAAK,GAAiD;IAC1D,0EAA0E;IAC1E,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE;IAC7B,yEAAyE;IACzE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;IAC7B,0DAA0D;IAC1D,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;IAChC;;;;;;;;;;OAUG;IACH,QAAQ,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;CAC/B,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,IAAmB;IAC1C,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS;QAChC,MAAM,EAAE,OAAO;QACf,cAAc,EAAE,IAAa;KAC9B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,YAAY,EAAE,WAAW;IACzB,cAAc,EAAE,QAAQ;IACxB,aAAa,EAAE,QAAQ;IACvB,aAAa,EAAE,QAAQ;IACvB,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,QAAQ;IACpB,eAAe,EAAE,QAAQ;IACzB,OAAO,EAAE,QAAQ;IACjB,IAAI,EAAE,WAAW;IACjB,cAAc,EAAE,WAAW;IAC3B,QAAQ,EAAE,QAAQ;IAClB,gBAAgB,EAAE,QAAQ;IAC1B,MAAM,EAAE,WAAW;IACnB,cAAc,EAAE,WAAW;IAC3B,cAAc,EAAE,WAAW;IAC3B,WAAW,EAAE,WAAW;IACxB,cAAc,EAAE,WAAW;IAC3B,KAAK,EAAE,QAAQ;IACf,UAAU,EAAE,QAAQ;IACpB,QAAQ,EAAE,QAAQ;IAClB;;;;;;;;;;;;;;;;;OAiBG;IACH,SAAS,EAAE,QAAQ;IACnB,gBAAgB,EAAE,QAAQ;IAC1B,SAAS,EAAE,QAAQ;IACnB,WAAW,EAAE,QAAQ;IACrB;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,QAAQ;CAC8B,CAAC"}