@stigmer/react 3.4.0 → 3.4.1

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 (131) hide show
  1. package/agent/useAgentCount.d.ts +2 -0
  2. package/agent/useAgentCount.d.ts.map +1 -1
  3. package/agent/useAgentCount.js.map +1 -1
  4. package/api-key/CreateApiKeyForm.d.ts +7 -1
  5. package/api-key/CreateApiKeyForm.d.ts.map +1 -1
  6. package/api-key/CreateApiKeyForm.js +2 -2
  7. package/api-key/CreateApiKeyForm.js.map +1 -1
  8. package/datastore/useDatastoreCount.d.ts +2 -0
  9. package/datastore/useDatastoreCount.d.ts.map +1 -1
  10. package/datastore/useDatastoreCount.js.map +1 -1
  11. package/index.d.ts +4 -4
  12. package/index.d.ts.map +1 -1
  13. package/index.js +2 -2
  14. package/index.js.map +1 -1
  15. package/manifest/ApplyManifestDialog.d.ts +10 -5
  16. package/manifest/ApplyManifestDialog.d.ts.map +1 -1
  17. package/manifest/ApplyManifestDialog.js +30 -13
  18. package/manifest/ApplyManifestDialog.js.map +1 -1
  19. package/manifest/useApplyManifest.d.ts +6 -2
  20. package/manifest/useApplyManifest.d.ts.map +1 -1
  21. package/manifest/useApplyManifest.js +5 -5
  22. package/manifest/useApplyManifest.js.map +1 -1
  23. package/mcp-server/McpServerDetailView.d.ts +38 -2
  24. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  25. package/mcp-server/McpServerDetailView.js +21 -5
  26. package/mcp-server/McpServerDetailView.js.map +1 -1
  27. package/mcp-server/index.d.ts +7 -0
  28. package/mcp-server/index.d.ts.map +1 -1
  29. package/mcp-server/index.js +9 -0
  30. package/mcp-server/index.js.map +1 -1
  31. package/mcp-server/steps/EnvironmentAuthStep.d.ts +4 -0
  32. package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -1
  33. package/mcp-server/steps/EnvironmentAuthStep.js +4 -0
  34. package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -1
  35. package/mcp-server/steps/IdentityTransportStep.d.ts +6 -0
  36. package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
  37. package/mcp-server/steps/IdentityTransportStep.js +7 -1
  38. package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
  39. package/mcp-server/steps/ReviewStep.d.ts +5 -0
  40. package/mcp-server/steps/ReviewStep.d.ts.map +1 -1
  41. package/mcp-server/steps/ReviewStep.js +16 -2
  42. package/mcp-server/steps/ReviewStep.js.map +1 -1
  43. package/mcp-server/useMcpServerCount.d.ts +2 -0
  44. package/mcp-server/useMcpServerCount.d.ts.map +1 -1
  45. package/mcp-server/useMcpServerCount.js.map +1 -1
  46. package/package.json +4 -4
  47. package/resource-creation/CreationPicker.d.ts.map +1 -1
  48. package/resource-creation/CreationPicker.js +3 -3
  49. package/resource-creation/CreationPicker.js.map +1 -1
  50. package/resource-creation/WizardNav.d.ts.map +1 -1
  51. package/resource-creation/WizardNav.js +1 -1
  52. package/resource-creation/WizardNav.js.map +1 -1
  53. package/resource-detail/Section.d.ts +8 -1
  54. package/resource-detail/Section.d.ts.map +1 -1
  55. package/resource-detail/Section.js +2 -2
  56. package/resource-detail/Section.js.map +1 -1
  57. package/resource-workbench/components/ResourceWorkbench.d.ts +9 -1
  58. package/resource-workbench/components/ResourceWorkbench.d.ts.map +1 -1
  59. package/resource-workbench/components/ResourceWorkbench.js +2 -1
  60. package/resource-workbench/components/ResourceWorkbench.js.map +1 -1
  61. package/resource-workbench/hooks/useResourceCollection.d.ts +9 -0
  62. package/resource-workbench/hooks/useResourceCollection.d.ts.map +1 -1
  63. package/resource-workbench/hooks/useResourceCollection.js +2 -2
  64. package/resource-workbench/hooks/useResourceCollection.js.map +1 -1
  65. package/search/useResourceCount.d.ts +7 -0
  66. package/search/useResourceCount.d.ts.map +1 -1
  67. package/search/useResourceCount.js +2 -1
  68. package/search/useResourceCount.js.map +1 -1
  69. package/session/NewSessionViewer.d.ts.map +1 -1
  70. package/session/NewSessionViewer.js +17 -3
  71. package/session/NewSessionViewer.js.map +1 -1
  72. package/session/SessionViewer.d.ts +2 -1
  73. package/session/SessionViewer.d.ts.map +1 -1
  74. package/session/SessionViewer.js +19 -11
  75. package/session/SessionViewer.js.map +1 -1
  76. package/session/SessionViewerLayout.d.ts +90 -0
  77. package/session/SessionViewerLayout.d.ts.map +1 -0
  78. package/session/SessionViewerLayout.js +32 -0
  79. package/session/SessionViewerLayout.js.map +1 -0
  80. package/session/index.d.ts +4 -0
  81. package/session/index.d.ts.map +1 -1
  82. package/session/index.js +10 -0
  83. package/session/index.js.map +1 -1
  84. package/session/useSessionRailViews.d.ts +2 -2
  85. package/skill/useSkillCount.d.ts +2 -0
  86. package/skill/useSkillCount.d.ts.map +1 -1
  87. package/skill/useSkillCount.js.map +1 -1
  88. package/src/agent/useAgentCount.ts +2 -0
  89. package/src/api-key/CreateApiKeyForm.tsx +8 -1
  90. package/src/api-key/__tests__/CreateApiKeyForm.test.tsx +58 -0
  91. package/src/datastore/useDatastoreCount.ts +2 -0
  92. package/src/index.ts +11 -0
  93. package/src/manifest/ApplyManifestDialog.tsx +40 -16
  94. package/src/manifest/__tests__/ApplyManifestDialog.test.tsx +147 -0
  95. package/src/manifest/__tests__/useApplyManifest.test.tsx +6 -6
  96. package/src/manifest/useApplyManifest.ts +12 -8
  97. package/src/mcp-server/McpServerDetailView.tsx +52 -4
  98. package/src/mcp-server/__tests__/McpServerDetailView.test.tsx +345 -0
  99. package/src/mcp-server/index.ts +13 -0
  100. package/src/mcp-server/steps/EnvironmentAuthStep.tsx +4 -0
  101. package/src/mcp-server/steps/IdentityTransportStep.tsx +9 -1
  102. package/src/mcp-server/steps/ReviewStep.tsx +18 -1
  103. package/src/mcp-server/useMcpServerCount.ts +2 -0
  104. package/src/resource-creation/CreationPicker.tsx +7 -0
  105. package/src/resource-creation/WizardNav.tsx +1 -0
  106. package/src/resource-detail/Section.tsx +9 -1
  107. package/src/resource-workbench/components/ResourceWorkbench.tsx +13 -0
  108. package/src/resource-workbench/hooks/useResourceCollection.ts +11 -1
  109. package/src/search/useResourceCount.ts +9 -1
  110. package/src/session/NewSessionViewer.tsx +48 -61
  111. package/src/session/SessionViewer.tsx +71 -86
  112. package/src/session/SessionViewerLayout.tsx +131 -0
  113. package/src/session/__tests__/SessionViewerLayout.test.tsx +140 -0
  114. package/src/session/index.ts +14 -0
  115. package/src/session/useSessionRailViews.tsx +2 -2
  116. package/src/skill/useSkillCount.ts +2 -0
  117. package/src/test/__tests__/samples.test.ts +159 -2
  118. package/src/test/index.ts +1 -1
  119. package/src/test/samples.ts +109 -14
  120. package/src/workflow/useWorkflowCount.ts +2 -0
  121. package/test/index.d.ts +1 -1
  122. package/test/index.d.ts.map +1 -1
  123. package/test/index.js +1 -1
  124. package/test/index.js.map +1 -1
  125. package/test/samples.d.ts +79 -7
  126. package/test/samples.d.ts.map +1 -1
  127. package/test/samples.js +101 -14
  128. package/test/samples.js.map +1 -1
  129. package/workflow/useWorkflowCount.d.ts +2 -0
  130. package/workflow/useWorkflowCount.d.ts.map +1 -1
  131. package/workflow/useWorkflowCount.js.map +1 -1
@@ -1,7 +1,9 @@
1
- import { describe, it, expect } from "vitest";
1
+ import { describe, it, expect, afterEach, vi } from "vitest";
2
+ import { timestampDate } from "@bufbuild/protobuf/wkt";
2
3
  import { ExecutionPhase, MessageType, ToolCallStatus, ExecutionArtifactKind } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
3
4
  import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
4
- import { samples } from "../samples";
5
+ import { formatDuration } from "../../execution/ToolCallDetail";
6
+ import { samples, SAMPLE_INSTANT, sampleInstant, sampleDate } from "../samples";
5
7
 
6
8
  describe("samples", () => {
7
9
  describe("session", () => {
@@ -169,3 +171,158 @@ describe("samples", () => {
169
171
  });
170
172
  });
171
173
  });
174
+
175
+ // ---------------------------------------------------------------------------
176
+ // Determinism — the reason these factories exist. A `samples.*` value is
177
+ // rendered into Scenar tours that replay in the browser and export to video
178
+ // frame by frame, so any live-clock read paints a pixel that changes between
179
+ // runs (scenar-cloud DD-006). These tests are the regression lock: each one
180
+ // FAILS if a factory is reverted to reading the clock.
181
+ // ---------------------------------------------------------------------------
182
+
183
+ describe("samples determinism", () => {
184
+ afterEach(() => {
185
+ vi.useRealTimers();
186
+ });
187
+
188
+ // A zero-arg call for every factory, with representative arguments. The
189
+ // completeness test below asserts this map covers `samples` exactly, so a
190
+ // newly-added factory that reads the clock cannot slip past the stability
191
+ // sweep unnoticed.
192
+ const invoke: Record<keyof typeof samples, () => unknown> = {
193
+ session: () => samples.session(),
194
+ agent: () => samples.agent(),
195
+ agentExecution: () => samples.agentExecution(),
196
+ skill: () => samples.skill(),
197
+ mcpServer: () => samples.mcpServer(),
198
+ environment: () => samples.environment(),
199
+ agentInstance: () => samples.agentInstance(),
200
+ apiKey: () => samples.apiKey(),
201
+ humanMessage: () => samples.humanMessage("hello"),
202
+ aiMessage: () => samples.aiMessage("hi"),
203
+ toolCall: () => samples.toolCall("lookup_order", '{"orderId":"123"}'),
204
+ artifact: () => samples.artifact("report.md"),
205
+ sessionList: () => samples.sessionList(),
206
+ agentExecutionList: () => samples.agentExecutionList(),
207
+ searchResponse: () => samples.searchResponse(),
208
+ apiKeyList: () => samples.apiKeyList(),
209
+ searchResult: () => samples.searchResult(),
210
+ };
211
+
212
+ it("the stability sweep covers every factory", () => {
213
+ expect(Object.keys(invoke).sort()).toEqual(Object.keys(samples).sort());
214
+ });
215
+
216
+ // Two calls under system clocks a full calendar day apart must produce
217
+ // identical objects. The day boundary is deliberate: it is what reproduces
218
+ // the `apiKey` bug (a `createdAt` date that changed daily) and the message
219
+ // and tool-call timestamp drift, none of which a same-millisecond back-to-
220
+ // back call would expose.
221
+ it.each(Object.keys(invoke) as (keyof typeof samples)[])(
222
+ "%s is identical across a day boundary",
223
+ (name) => {
224
+ vi.useFakeTimers();
225
+
226
+ vi.setSystemTime(new Date("2026-03-01T08:15:00Z"));
227
+ const first = invoke[name]();
228
+
229
+ vi.setSystemTime(new Date("2026-03-02T21:45:30Z"));
230
+ const second = invoke[name]();
231
+
232
+ expect(second).toEqual(first);
233
+ },
234
+ );
235
+
236
+ it("stamps the frozen instant on every timestamped primitive", () => {
237
+ expect(samples.humanMessage("x").timestamp).toBe(SAMPLE_INSTANT);
238
+ expect(samples.aiMessage("x").timestamp).toBe(SAMPLE_INSTANT);
239
+ expect(samples.artifact("x").createdAt).toBe(SAMPLE_INSTANT);
240
+ expect(samples.toolCall("x", "y").startedAt).toBe(SAMPLE_INSTANT);
241
+
242
+ const createdAt = samples.apiKey().status?.audit?.specAudit?.createdAt;
243
+ expect(createdAt).toBeDefined();
244
+ expect(timestampDate(createdAt!).toISOString()).toBe(SAMPLE_INSTANT);
245
+ });
246
+
247
+ it("renders a stable duration chip rather than the old 0ms flake", () => {
248
+ const tc = samples.toolCall("lookup_order", "{}");
249
+ expect(formatDuration(tc.startedAt, tc.completedAt)).toBe("1.2s");
250
+ });
251
+
252
+ it("derives a clock-free tool-call id from the name", () => {
253
+ expect(samples.toolCall("process_return", "{}").id).toBe("tc-process_return");
254
+ });
255
+
256
+ it("honors an ApiKeyOverrides.createdAt override", () => {
257
+ const frozen = "2026-01-02T03:04:05.000Z";
258
+ const key = samples.apiKey({ createdAt: frozen });
259
+ const createdAt = key.status?.audit?.specAudit?.createdAt;
260
+ expect(timestampDate(createdAt!).toISOString()).toBe(frozen);
261
+ });
262
+ });
263
+
264
+ // ---------------------------------------------------------------------------
265
+ // The reader offset window — why SAMPLE_INSTANT is 11:00 UTC. Components
266
+ // format dates in the reader's local time, and real UTC offsets span −11:00
267
+ // to +14:00 (25 hours against a 24-hour day), so no instant renders one
268
+ // calendar date everywhere. The supported window is UTC−11:00 (Midway)
269
+ // through UTC+12:45 (Chatham, southern winter): every inhabited zone except
270
+ // Tongatapu (+13) and Kiritimati (+14). Local date is monotonic in offset,
271
+ // so agreement at the two boundaries proves agreement throughout.
272
+ //
273
+ // `scripts/verify-scenar-tours.mjs` exports the same boundaries as
274
+ // READER_OFFSET_WINDOW (its own test locks those values); this suite locks
275
+ // the anchor's side of the contract.
276
+ // ---------------------------------------------------------------------------
277
+
278
+ describe("SAMPLE_INSTANT reader offset window", () => {
279
+ const WEST_OFFSET_MINUTES = -11 * 60; // UTC−11:00, Midway
280
+ const EAST_OFFSET_MINUTES = 12 * 60 + 45; // UTC+12:45, Chatham (Jul)
281
+
282
+ /** Calendar date (YYYY-MM-DD) the instant renders at a fixed UTC offset. */
283
+ const localDateAtOffset = (iso: string, offsetMinutes: number): string =>
284
+ new Date(Date.parse(iso) + offsetMinutes * 60_000).toISOString().slice(0, 10);
285
+
286
+ it("renders one calendar date at both window boundaries", () => {
287
+ const west = localDateAtOffset(SAMPLE_INSTANT, WEST_OFFSET_MINUTES);
288
+ const east = localDateAtOffset(SAMPLE_INSTANT, EAST_OFFSET_MINUTES);
289
+ expect(west).toBe("2026-07-20");
290
+ expect(east).toBe("2026-07-20");
291
+ });
292
+
293
+ // The two anchors this one replaced, kept as negative cases so nobody
294
+ // "corrects" the constant back: 09:30Z was the original tour-world instant
295
+ // (read Jul 19 in Honolulu); noon was SAMPLE_INSTANT's first value and the
296
+ // once-planned fix (read Jul 21 in Auckland, Fiji, and Chatham).
297
+ it.each([
298
+ ["2026-07-20T09:30:00.000Z", "drifts at the west boundary"],
299
+ ["2026-07-20T12:00:00.000Z", "drifts at the east boundary"],
300
+ ])("rejected anchor %s %s", (iso) => {
301
+ expect(localDateAtOffset(iso, WEST_OFFSET_MINUTES)).not.toBe(
302
+ localDateAtOffset(iso, EAST_OFFSET_MINUTES),
303
+ );
304
+ });
305
+ });
306
+
307
+ describe("sampleInstant / sampleDate derivation", () => {
308
+ it("sampleInstant with no delta is the anchor itself", () => {
309
+ expect(sampleInstant()).toBe(SAMPLE_INSTANT);
310
+ });
311
+
312
+ it("applies positive and negative deltas exactly", () => {
313
+ expect(sampleInstant(2_400)).toBe("2026-07-20T11:00:02.400Z");
314
+ expect(sampleInstant(-86_400_000)).toBe("2026-07-19T11:00:00.000Z");
315
+ });
316
+
317
+ it("sampleDate agrees with sampleInstant at every delta", () => {
318
+ for (const deltaMs of [0, 1_200, 2_400, -3_600_000, 86_400_000]) {
319
+ expect(sampleDate(deltaMs).toISOString()).toBe(sampleInstant(deltaMs));
320
+ }
321
+ });
322
+
323
+ it("the default toolCall span derives from the anchor", () => {
324
+ const tc = samples.toolCall("lookup_order", "{}");
325
+ expect(tc.startedAt).toBe(sampleInstant());
326
+ expect(tc.completedAt).toBe(sampleInstant(1_200));
327
+ });
328
+ });
package/src/test/index.ts CHANGED
@@ -3,4 +3,4 @@
3
3
  // Provides domain-specific data builders for unit tests, Storybook,
4
4
  // Playwright, and Scenar preview scenarios.
5
5
 
6
- export { samples } from "./samples.js";
6
+ export { samples, SAMPLE_INSTANT, sampleInstant, sampleDate } from "./samples.js";
@@ -1,4 +1,5 @@
1
1
  import { create } from "@bufbuild/protobuf";
2
+ import { timestampFromDate } from "@bufbuild/protobuf/wkt";
2
3
  import { AgentSchema, type Agent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
3
4
  import { AgentSpecSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb";
4
5
  import {
@@ -75,6 +76,77 @@ import {
75
76
  type SearchResult,
76
77
  } from "@stigmer/protos/ai/stigmer/search/v1/io_pb";
77
78
 
79
+ // ---------------------------------------------------------------------------
80
+ // The frozen instant
81
+ // ---------------------------------------------------------------------------
82
+
83
+ /**
84
+ * The frozen instant every timestamped `samples.*` factory defaults to — the
85
+ * tour world's single clock. Anything in a demo that needs an instant derives
86
+ * from this one via {@link sampleInstant} / {@link sampleDate}; nothing
87
+ * authors a second instant of its own (`scripts/verify-scenar-tours.mjs`
88
+ * enforces that under `demos/tours/`).
89
+ *
90
+ * These factories must never read the live clock. A `samples.*` value is
91
+ * rendered into Scenar tours that replay in the browser and export to video
92
+ * frame by frame; a clock read paints a pixel that changes between runs, which
93
+ * breaks the "same source, same result" guarantee (scenar-cloud DD-006).
94
+ *
95
+ * The date is `2026-07-20`, the tour world's demo day. The time is 11:00 UTC,
96
+ * chosen by the *reader offset window*: components format dates in the
97
+ * reader's local time (e.g. `ApiKeyListPanel` via `toLocaleDateString`), and
98
+ * real UTC offsets span −11:00 (Midway) to +14:00 (Kiritimati) — a 25-hour
99
+ * range against a 24-hour day, so **no instant renders one calendar date
100
+ * everywhere**. The supported window is UTC−11:00 through UTC+12:45 — every
101
+ * inhabited zone except Tongatapu (+13, ~100k) and Kiritimati (+14, ~6k).
102
+ * 11:00Z holds `Jul 20` across that whole window; the previous noon anchor
103
+ * flipped to `Jul 21` at UTC+12:45 and beyond (Auckland, Fiji, Chatham).
104
+ * Instants whose calendar *date* is rendered must stay inside the window's
105
+ * stable band, 11:00:00Z–11:14:59Z — the anchor sits at its start so all
106
+ * derivation headroom points forward. Duration deltas (end minus start) are
107
+ * zone-invariant and may leave the band freely.
108
+ *
109
+ * The window stabilises the rendered *date*, not the rendered *string*:
110
+ * locale-unpinned formatters still vary the format per reader ("Jul 20, 2026"
111
+ * vs "20 Jul 2026"), and a component that renders a *time of day* is
112
+ * zone-dependent no matter which instant is chosen. The property test in
113
+ * `__tests__/samples.test.ts` locks the date-stability claim at both window
114
+ * boundaries.
115
+ */
116
+ export const SAMPLE_INSTANT = "2026-07-20T11:00:00.000Z";
117
+
118
+ /** {@link SAMPLE_INSTANT} in epoch milliseconds, the base all derivation uses. */
119
+ const SAMPLE_INSTANT_MS = Date.parse(SAMPLE_INSTANT);
120
+
121
+ /**
122
+ * An ISO-8601 instant `deltaMs` after {@link SAMPLE_INSTANT} — the way a
123
+ * fixture expresses "2.4 seconds later" or "a day earlier" without authoring
124
+ * a second instant. `sampleInstant()` with no argument is the anchor itself.
125
+ *
126
+ * Prefer this over a hand-written literal even for values that never render:
127
+ * derivation keeps the whole fixture world moving together if the demo day is
128
+ * ever refreshed, and the tour gate rejects authored instant literals anyway.
129
+ */
130
+ export function sampleInstant(deltaMs = 0): string {
131
+ return new Date(SAMPLE_INSTANT_MS + deltaMs).toISOString();
132
+ }
133
+
134
+ /**
135
+ * {@link sampleInstant} as a `Date`, for APIs that take one (e.g. protobuf's
136
+ * `timestampFromDate`). Same instant, same derivation rule.
137
+ */
138
+ export function sampleDate(deltaMs = 0): Date {
139
+ return new Date(SAMPLE_INSTANT_MS + deltaMs);
140
+ }
141
+
142
+ /**
143
+ * When a default {@link samples.toolCall} completes: {@link SAMPLE_INSTANT}
144
+ * plus 1.2s, so the rendered duration chip reads a stable "1.2s" — long
145
+ * enough to never collapse to the "0ms" that two adjacent live clock reads
146
+ * used to produce.
147
+ */
148
+ const SAMPLE_TOOL_CALL_COMPLETED_AT = sampleInstant(1_200);
149
+
78
150
  // ---------------------------------------------------------------------------
79
151
  // Override interfaces — flat projections of commonly-customized fields
80
152
  // ---------------------------------------------------------------------------
@@ -145,6 +217,8 @@ export interface ApiKeyOverrides {
145
217
  readonly fingerprint?: string;
146
218
  readonly neverExpires?: boolean;
147
219
  readonly keyHash?: string;
220
+ /** Frozen ISO-8601 instant for the key's `createdAt`. Defaults to {@link SAMPLE_INSTANT}. */
221
+ readonly createdAt?: string;
148
222
  }
149
223
 
150
224
  export interface SearchResultOverrides {
@@ -166,17 +240,30 @@ export interface SearchResultOverrides {
166
240
  *
167
241
  * Each factory returns a realistic protobuf object with sensible defaults.
168
242
  * Pass an overrides object to customize the most commonly-needed fields.
169
- * For deeper customization, modify the returned object directly — protobuf
170
- * messages from `create()` are mutable plain objects.
243
+ *
244
+ * Every timestamp is frozen at {@link SAMPLE_INSTANT} — these factories never
245
+ * read the live clock, so a fixture renders identical pixels on every browser
246
+ * replay and every video-export frame (scenar-cloud DD-006). Do not
247
+ * reintroduce `Date.now()` or `new Date()` here.
248
+ *
249
+ * For a value the overrides do not cover — a different timestamp, a distinct
250
+ * tool-call id — modify the returned object directly rather than growing the
251
+ * override surface: protobuf messages from `create()` are mutable plain
252
+ * objects. Timestamps derive from the anchor via {@link sampleInstant} rather
253
+ * than a hand-written literal, so the fixture world keeps a single clock.
171
254
  *
172
255
  * @example
173
256
  * ```ts
174
- * import { samples } from "@stigmer/react/test";
257
+ * import { samples, sampleInstant } from "@stigmer/react/test";
175
258
  *
176
259
  * const scenario = buildScenario(
177
260
  * fixtures.session.get(() => samples.session({ subject: "My topic" })),
178
261
  * fixtures.agent.getByReference(() => samples.agent({ name: "My Agent" })),
179
262
  * );
263
+ *
264
+ * // Deeper customization — derive "5 seconds later" from the anchor:
265
+ * const later = samples.humanMessage("later");
266
+ * later.timestamp = sampleInstant(5_000);
180
267
  * ```
181
268
  */
182
269
  export const samples = {
@@ -363,7 +450,7 @@ export const samples = {
363
450
  status: create(ApiKeyStatusSchema, {
364
451
  audit: create(ApiResourceAuditSchema, {
365
452
  specAudit: create(ApiResourceAuditInfoSchema, {
366
- createdAt: { seconds: BigInt(Math.floor(Date.now() / 1000)), nanos: 0 },
453
+ createdAt: timestampFromDate(new Date(o?.createdAt ?? SAMPLE_INSTANT)),
367
454
  }),
368
455
  }),
369
456
  }),
@@ -372,44 +459,52 @@ export const samples = {
372
459
 
373
460
  // ---- Message & artifact primitives ----
374
461
 
375
- /** A human (user) message. */
462
+ /** A human (user) message, stamped at {@link SAMPLE_INSTANT}. */
376
463
  humanMessage(content: string): AgentMessage {
377
464
  return create(AgentMessageSchema, {
378
465
  type: MessageType.MESSAGE_HUMAN,
379
466
  content,
380
- timestamp: new Date().toISOString(),
467
+ timestamp: SAMPLE_INSTANT,
381
468
  });
382
469
  },
383
470
 
384
- /** An AI (assistant) message, optionally with tool calls. */
471
+ /** An AI (assistant) message, optionally with tool calls, stamped at {@link SAMPLE_INSTANT}. */
385
472
  aiMessage(content: string, toolCalls?: ToolCall[]): AgentMessage {
386
473
  return create(AgentMessageSchema, {
387
474
  type: MessageType.MESSAGE_AI,
388
475
  content,
389
- timestamp: new Date().toISOString(),
476
+ timestamp: SAMPLE_INSTANT,
390
477
  toolCalls: toolCalls ?? [],
391
478
  });
392
479
  },
393
480
 
394
- /** A completed tool call with a result. */
481
+ /**
482
+ * A completed tool call with a result, spanning {@link SAMPLE_INSTANT} to 1.2s
483
+ * later so its duration chip reads a stable "1.2s".
484
+ *
485
+ * The `id` is `tc-${name}`, derived from the name so it is stable across
486
+ * runs. Two tool calls sharing a name therefore share an id — if a single
487
+ * demo renders both and one drives an approval (`useApproval(toolCall.id)`),
488
+ * build the second by hand with a distinct id via `create(ToolCallSchema)`.
489
+ */
395
490
  toolCall(name: string, result: string): ToolCall {
396
491
  return create(ToolCallSchema, {
397
- id: `tc-${name}-${Date.now()}`,
492
+ id: `tc-${name}`,
398
493
  name,
399
494
  result,
400
495
  status: ToolCallStatus.TOOL_CALL_COMPLETED,
401
- startedAt: new Date().toISOString(),
402
- completedAt: new Date().toISOString(),
496
+ startedAt: SAMPLE_INSTANT,
497
+ completedAt: SAMPLE_TOOL_CALL_COMPLETED_AT,
403
498
  });
404
499
  },
405
500
 
406
- /** A file artifact produced by an execution. */
501
+ /** A file artifact produced by an execution, stamped at {@link SAMPLE_INSTANT}. */
407
502
  artifact(name: string, kind?: ExecutionArtifactKind): ExecutionArtifact {
408
503
  return create(ExecutionArtifactSchema, {
409
504
  name,
410
505
  kind: kind ?? ExecutionArtifactKind.FILE,
411
506
  storageKey: `demo-artifact-${name}`,
412
- createdAt: new Date().toISOString(),
507
+ createdAt: SAMPLE_INSTANT,
413
508
  });
414
509
  },
415
510
 
@@ -17,6 +17,8 @@ export interface UseWorkflowCountOptions {
17
17
  * @default "org"
18
18
  */
19
19
  readonly scope?: ResourceListScope;
20
+ /** Opaque token that forces a recount when its value changes. */
21
+ readonly refetchToken?: unknown;
20
22
  }
21
23
 
22
24
  /** Return value of {@link useWorkflowCount}. */
package/test/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { samples } from "./samples.js";
1
+ export { samples, SAMPLE_INSTANT, sampleInstant, sampleDate } from "./samples.js";
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
package/test/index.js CHANGED
@@ -2,5 +2,5 @@
2
2
  //
3
3
  // Provides domain-specific data builders for unit tests, Storybook,
4
4
  // Playwright, and Scenar preview scenarios.
5
- export { samples } from "./samples.js";
5
+ export { samples, SAMPLE_INSTANT, sampleInstant, sampleDate } from "./samples.js";
6
6
  //# sourceMappingURL=index.js.map
package/test/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,EAAE;AACF,oEAAoE;AACpE,4CAA4C;AAE5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,EAAE;AACF,oEAAoE;AACpE,4CAA4C;AAE5C,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
package/test/samples.d.ts CHANGED
@@ -14,6 +14,55 @@ import { type SessionList } from "@stigmer/protos/ai/stigmer/agentic/session/v1/
14
14
  import { type Skill } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/api_pb";
15
15
  import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
16
16
  import { type SearchResponse, type SearchResult } from "@stigmer/protos/ai/stigmer/search/v1/io_pb";
17
+ /**
18
+ * The frozen instant every timestamped `samples.*` factory defaults to — the
19
+ * tour world's single clock. Anything in a demo that needs an instant derives
20
+ * from this one via {@link sampleInstant} / {@link sampleDate}; nothing
21
+ * authors a second instant of its own (`scripts/verify-scenar-tours.mjs`
22
+ * enforces that under `demos/tours/`).
23
+ *
24
+ * These factories must never read the live clock. A `samples.*` value is
25
+ * rendered into Scenar tours that replay in the browser and export to video
26
+ * frame by frame; a clock read paints a pixel that changes between runs, which
27
+ * breaks the "same source, same result" guarantee (scenar-cloud DD-006).
28
+ *
29
+ * The date is `2026-07-20`, the tour world's demo day. The time is 11:00 UTC,
30
+ * chosen by the *reader offset window*: components format dates in the
31
+ * reader's local time (e.g. `ApiKeyListPanel` via `toLocaleDateString`), and
32
+ * real UTC offsets span −11:00 (Midway) to +14:00 (Kiritimati) — a 25-hour
33
+ * range against a 24-hour day, so **no instant renders one calendar date
34
+ * everywhere**. The supported window is UTC−11:00 through UTC+12:45 — every
35
+ * inhabited zone except Tongatapu (+13, ~100k) and Kiritimati (+14, ~6k).
36
+ * 11:00Z holds `Jul 20` across that whole window; the previous noon anchor
37
+ * flipped to `Jul 21` at UTC+12:45 and beyond (Auckland, Fiji, Chatham).
38
+ * Instants whose calendar *date* is rendered must stay inside the window's
39
+ * stable band, 11:00:00Z–11:14:59Z — the anchor sits at its start so all
40
+ * derivation headroom points forward. Duration deltas (end minus start) are
41
+ * zone-invariant and may leave the band freely.
42
+ *
43
+ * The window stabilises the rendered *date*, not the rendered *string*:
44
+ * locale-unpinned formatters still vary the format per reader ("Jul 20, 2026"
45
+ * vs "20 Jul 2026"), and a component that renders a *time of day* is
46
+ * zone-dependent no matter which instant is chosen. The property test in
47
+ * `__tests__/samples.test.ts` locks the date-stability claim at both window
48
+ * boundaries.
49
+ */
50
+ export declare const SAMPLE_INSTANT = "2026-07-20T11:00:00.000Z";
51
+ /**
52
+ * An ISO-8601 instant `deltaMs` after {@link SAMPLE_INSTANT} — the way a
53
+ * fixture expresses "2.4 seconds later" or "a day earlier" without authoring
54
+ * a second instant. `sampleInstant()` with no argument is the anchor itself.
55
+ *
56
+ * Prefer this over a hand-written literal even for values that never render:
57
+ * derivation keeps the whole fixture world moving together if the demo day is
58
+ * ever refreshed, and the tour gate rejects authored instant literals anyway.
59
+ */
60
+ export declare function sampleInstant(deltaMs?: number): string;
61
+ /**
62
+ * {@link sampleInstant} as a `Date`, for APIs that take one (e.g. protobuf's
63
+ * `timestampFromDate`). Same instant, same derivation rule.
64
+ */
65
+ export declare function sampleDate(deltaMs?: number): Date;
17
66
  export interface SessionOverrides {
18
67
  readonly id?: string;
19
68
  readonly name?: string;
@@ -73,6 +122,8 @@ export interface ApiKeyOverrides {
73
122
  readonly fingerprint?: string;
74
123
  readonly neverExpires?: boolean;
75
124
  readonly keyHash?: string;
125
+ /** Frozen ISO-8601 instant for the key's `createdAt`. Defaults to {@link SAMPLE_INSTANT}. */
126
+ readonly createdAt?: string;
76
127
  }
77
128
  export interface SearchResultOverrides {
78
129
  readonly id?: string;
@@ -88,17 +139,30 @@ export interface SearchResultOverrides {
88
139
  *
89
140
  * Each factory returns a realistic protobuf object with sensible defaults.
90
141
  * Pass an overrides object to customize the most commonly-needed fields.
91
- * For deeper customization, modify the returned object directly — protobuf
92
- * messages from `create()` are mutable plain objects.
142
+ *
143
+ * Every timestamp is frozen at {@link SAMPLE_INSTANT} — these factories never
144
+ * read the live clock, so a fixture renders identical pixels on every browser
145
+ * replay and every video-export frame (scenar-cloud DD-006). Do not
146
+ * reintroduce `Date.now()` or `new Date()` here.
147
+ *
148
+ * For a value the overrides do not cover — a different timestamp, a distinct
149
+ * tool-call id — modify the returned object directly rather than growing the
150
+ * override surface: protobuf messages from `create()` are mutable plain
151
+ * objects. Timestamps derive from the anchor via {@link sampleInstant} rather
152
+ * than a hand-written literal, so the fixture world keeps a single clock.
93
153
  *
94
154
  * @example
95
155
  * ```ts
96
- * import { samples } from "@stigmer/react/test";
156
+ * import { samples, sampleInstant } from "@stigmer/react/test";
97
157
  *
98
158
  * const scenario = buildScenario(
99
159
  * fixtures.session.get(() => samples.session({ subject: "My topic" })),
100
160
  * fixtures.agent.getByReference(() => samples.agent({ name: "My Agent" })),
101
161
  * );
162
+ *
163
+ * // Deeper customization — derive "5 seconds later" from the anchor:
164
+ * const later = samples.humanMessage("later");
165
+ * later.timestamp = sampleInstant(5_000);
102
166
  * ```
103
167
  */
104
168
  export declare const samples: {
@@ -142,13 +206,21 @@ export declare const samples: {
142
206
  * Default: `demo-api-key` with fingerprint `Ab1c2D` and no expiry.
143
207
  */
144
208
  readonly apiKey: (o?: ApiKeyOverrides) => ApiKey;
145
- /** A human (user) message. */
209
+ /** A human (user) message, stamped at {@link SAMPLE_INSTANT}. */
146
210
  readonly humanMessage: (content: string) => AgentMessage;
147
- /** An AI (assistant) message, optionally with tool calls. */
211
+ /** An AI (assistant) message, optionally with tool calls, stamped at {@link SAMPLE_INSTANT}. */
148
212
  readonly aiMessage: (content: string, toolCalls?: ToolCall[]) => AgentMessage;
149
- /** A completed tool call with a result. */
213
+ /**
214
+ * A completed tool call with a result, spanning {@link SAMPLE_INSTANT} to 1.2s
215
+ * later so its duration chip reads a stable "1.2s".
216
+ *
217
+ * The `id` is `tc-${name}`, derived from the name so it is stable across
218
+ * runs. Two tool calls sharing a name therefore share an id — if a single
219
+ * demo renders both and one drives an approval (`useApproval(toolCall.id)`),
220
+ * build the second by hand with a distinct id via `create(ToolCallSchema)`.
221
+ */
150
222
  readonly toolCall: (name: string, result: string) => ToolCall;
151
- /** A file artifact produced by an execution. */
223
+ /** A file artifact produced by an execution, stamped at {@link SAMPLE_INSTANT}. */
152
224
  readonly artifact: (name: string, kind?: ExecutionArtifactKind) => ExecutionArtifact;
153
225
  /** A session list response. Defaults to one demo session. */
154
226
  readonly sessionList: (entries?: Session[]) => SessionList;
@@ -1 +1 @@
1
- {"version":3,"file":"samples.d.ts","sourceRoot":"","sources":["../../src/test/samples.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,oDAAoD,CAAC;AAE7F,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,6DAA6D,CAAC;AACrE,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,kEAAkE,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,cAAc,EAGf,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,4DAA4D,CAAC;AACpE,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,QAAQ,EACd,MAAM,iEAAiE,CAAC;AAEzE,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,4DAA4D,CAAC;AAEpE,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,0DAA0D,CAAC;AAClE,OAAO,EAGL,KAAK,MAAM,EACZ,MAAM,iDAAiD,CAAC;AAEzD,OAAO,EAEL,KAAK,OAAO,EACb,MAAM,gDAAgD,CAAC;AAKxD,OAAO,EAEL,KAAK,SAAS,EACf,MAAM,wDAAwD,CAAC;AAEhE,OAAO,EAEL,KAAK,OAAO,EACb,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,qDAAqD,CAAC;AAE7D,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,oDAAoD,CAAC;AAE7F,OAAO,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAEtH,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,4CAA4C,CAAC;AAMpD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,OAAO;IAClB;;;OAGG;2BACS,gBAAgB,KAAG,OAAO;IAkBtC;;;OAGG;yBACO,cAAc,KAAG,KAAK;IAmBhC;;;OAGG;kCACgB,uBAAuB,KAAG,cAAc;IA+B3D;;;OAGG;yBACO,cAAc,KAAG,KAAK;IAmBhC;;;OAGG;6BACW,kBAAkB,KAAG,SAAS;IAkB5C;;;OAGG;+BACa,oBAAoB,KAAG,WAAW;IAalD;;;OAGG;iCACe,sBAAsB,KAAG,aAAa;IAgBxD;;;OAGG;0BACQ,eAAe,KAAG,MAAM;IA0BnC,8BAA8B;qCACR,MAAM,KAAG,YAAY;IAQ3C,6DAA6D;kCAC1C,MAAM,cAAc,QAAQ,EAAE,KAAG,YAAY;IAShE,2CAA2C;8BAC5B,MAAM,UAAU,MAAM,KAAG,QAAQ;IAWhD,gDAAgD;8BACjC,MAAM,SAAS,qBAAqB,KAAG,iBAAiB;IAWvE,6DAA6D;qCACvC,OAAO,EAAE,KAAG,WAAW;IAQ7C,wEAAwE;4CAC3C,cAAc,EAAE,KAAG,kBAAkB;IAQlE;;;OAGG;wCAES,YAAY,EAAE,eACX,MAAM,KAClB,cAAc;IASjB,8DAA8D;oCACzC,MAAM,EAAE,KAAG,OAAO;IAKvC,oCAAoC;gCACnB,qBAAqB,KAAG,YAAY;CAa7C,CAAC"}
1
+ {"version":3,"file":"samples.d.ts","sourceRoot":"","sources":["../../src/test/samples.ts"],"names":[],"mappings":"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"}