@xfey/tutti 0.1.97 → 0.1.99

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 (61) hide show
  1. package/README.md +2 -1
  2. package/dist/artifact-feedback/index.d.ts +19 -0
  3. package/dist/artifact-feedback/index.js +196 -0
  4. package/dist/chat-assistant/index.js +5 -4
  5. package/dist/collaboration-state/task-compile-context.d.ts +1 -1
  6. package/dist/control-plane/index.js +15 -3
  7. package/dist/control-plane/scratchpad-source-messages.js +2 -1
  8. package/dist/control-plane/task-source-context.js +3 -2
  9. package/dist/control-plane/worklist-terminal-feedback.js +4 -4
  10. package/dist/server-shell/http/routes/agent-context-references.js +8 -14
  11. package/dist/server-shell/http/routes/project-api/artifacts-routes.d.ts +2 -1
  12. package/dist/server-shell/http/routes/project-api/artifacts-routes.js +1 -0
  13. package/dist/server-shell/http/routes/project-api/messages-routes.d.ts +3 -1
  14. package/dist/server-shell/http/routes/project-api/messages-routes.js +61 -29
  15. package/dist/server-shell/http/routes/project-api/openapi-viewer-routes.d.ts +0 -2
  16. package/dist/server-shell/http/routes/project-api/openapi-workspace-routes.d.ts +8 -2
  17. package/dist/server-shell/http/routes/project-api/openapi.d.ts +8 -2
  18. package/dist/server-shell/http/routes/project-api/payload-validation.js +12 -0
  19. package/dist/server-shell/http/routes/project-api/reference-files.js +6 -17
  20. package/dist/server-shell/http/routes/project-api/schemas.d.ts +8 -2
  21. package/dist/server-shell/http/routes/project-api/schemas.js +2 -0
  22. package/dist/server-shell/http/routes/project-api/types.d.ts +1 -0
  23. package/dist/server-shell/http/routes/project-api/workspace-projections.js +1 -0
  24. package/dist/server-shell/http/routes/project-api.js +2 -2
  25. package/dist/workspace-ops/constants.d.ts +0 -1
  26. package/dist/workspace-ops/constants.js +0 -1
  27. package/dist/workspace-ops/index.d.ts +3 -2
  28. package/dist/workspace-ops/index.js +3 -2
  29. package/dist/workspace-ops/project-doc-templates.js +1 -1
  30. package/dist/workspace-ops/reference-files.js +3 -2
  31. package/dist/workspace-ops/reference-metadata.d.ts +2 -2
  32. package/dist/workspace-ops/reference-metadata.js +8 -22
  33. package/dist/workspace-ops/reference-summaries.js +11 -17
  34. package/dist/workspace-ops/reference-tree.d.ts +11 -0
  35. package/dist/workspace-ops/reference-tree.js +34 -0
  36. package/dist/workspace-ops/viewer-git.d.ts +1 -0
  37. package/dist/workspace-ops/viewer-git.js +11 -0
  38. package/node_modules/@tutti/shared/dist/schemas/api/artifact-feedback.d.ts +374 -0
  39. package/node_modules/@tutti/shared/dist/schemas/api/artifact-feedback.js +83 -0
  40. package/node_modules/@tutti/shared/dist/schemas/api/clarifications.d.ts +86 -0
  41. package/node_modules/@tutti/shared/dist/schemas/api/index.d.ts +2 -1
  42. package/node_modules/@tutti/shared/dist/schemas/api/index.js +2 -1
  43. package/node_modules/@tutti/shared/dist/schemas/api/messages.d.ts +441 -2
  44. package/node_modules/@tutti/shared/dist/schemas/api/messages.js +17 -3
  45. package/node_modules/@tutti/shared/dist/schemas/api/types.d.ts +13 -1
  46. package/node_modules/@tutti/shared/dist/schemas/api/viewer-reference.d.ts +86 -5
  47. package/node_modules/@tutti/shared/dist/schemas/api/viewer-reference.js +0 -2
  48. package/package.json +1 -1
  49. package/prompts/procedures/context-sync.md +3 -3
  50. package/prompts/procedures/reference-file-summary.md +1 -1
  51. package/prompts/procedures/task-compile.md +2 -2
  52. package/prompts/prompt-flow-map.md +1 -1
  53. package/prompts/runs/task-execute.md +2 -2
  54. package/prompts/skills/read-references/SKILL.md +2 -2
  55. package/web/assets/homepage-motion-scene-BtMS4SCZ.js +1 -0
  56. package/web/assets/index-DtZ_5QLQ.js +69 -0
  57. package/web/assets/index-JY06YzFV.css +1 -0
  58. package/web/index.html +2 -2
  59. package/web/assets/homepage-motion-scene-lpr-1FjJ.js +0 -1
  60. package/web/assets/index-CQoq2PtU.js +0 -69
  61. package/web/assets/index-quWLFJgD.css +0 -1
@@ -1,4 +1,5 @@
1
1
  import type { Static } from "@sinclair/typebox";
2
+ import type { ArtifactElementAnchorSchema, ArtifactElementKindSchema, ArtifactElementTargetSchema, ArtifactFeedbackAnnotationSchema, ArtifactFeedbackCommandSchema, ArtifactFeedbackRefSchema, ArtifactSemanticContextSchema, ArtifactSemanticSnapshotSchema, ArtifactSemanticStateSchema } from "./artifact-feedback.js";
2
3
  import type { IdempotencyKeySchema, IsoDateTimeStringSchema } from "../domain/index.js";
3
4
  import type { ApiErrorCodeSchema, ApiErrorResponseSchema, CommandDispositionBaseSchema, CursorPageRequestSchema, InterruptedCommandDispositionSchema, QueryInvalidationHintSchema, RelayInvalidationHintSchema, RelaySseEventTypeSchema, SseReplayWindowPolicySchema, WorkspaceSseEventTypeSchema } from "./primitives.js";
4
5
  import type { GetProviderModelsResponseSchema, ProviderConfigInvalidReasonCodeSchema, ProviderConfigProjectionSchema, ProviderModelDiscoveryUnavailableReasonSchema, ProviderModelNameSchema, ProviderModelValidationFailureReasonSchema, ProviderUnavailableReasonCodeSchema, ProjectProviderUnavailableReasonSchema, UpdateProviderDefaultModelDispositionSchema, UpdateProviderDefaultModelPayloadSchema } from "./provider-config.js";
@@ -6,7 +7,7 @@ import type { ProviderUsageBreakdownProjectionSchema, ProviderUsageCategorySchem
6
7
  import type { ProjectTimelineItemKindSchema, ProjectTimelineItemSchema, ProjectTimelineItemStatusSchema, ProjectTimelineResponseSchema, ProjectTimelineTaskUpdateStateSchema, ProjectTimelineClarificationTraceSchema, ProjectTimelineTraceCardSchema, ProjectTimelineTraceLinkSchema } from "./project-timeline.js";
7
8
  import type { PresignedUploadPutSchema, RelayUploadProjectionSchema, RelayUploadPurposeSchema, Sha256DigestSchema, StagedUploadReferenceSchema, StartRelayUploadDispositionSchema, StartRelayUploadPayloadSchema, StartRelayUploadResultSchema } from "./uploads.js";
8
9
  import type { MarkReadDispositionSchema, MarkReadPayloadSchema, MarkReadResultSchema, ReadStateScopeProjectionSchema, ReadStateScopeSchema, ReadStateSummaryProjectionSchema } from "./read-state.js";
9
- import type { GetMessagesRequestSchema, MessageCreatedEventPayloadSchema, MessageProjectionSchema, MessageReferenceFileRefSchema, ReferenceFileCategorySchema, SendMainChatMessageCreatedDispositionSchema, SendMainChatMessageDispositionSchema, SendMainChatMessagePayloadSchema, SendMainChatMessageResultSchema, ArtifactPreviewRefSchema, TaskResultRefSchema, WorklistCompileRefSchema, WorklistFeedbackGeneratedFileSchema, WorklistFeedbackItemSchema, WorklistFeedbackRefSchema } from "./messages.js";
10
+ import type { GetMessagesRequestSchema, MessageCreatedEventPayloadSchema, MessageProjectionSchema, MessageReferenceFileRefSchema, ReferenceFileCategorySchema, SendMainChatMessageCreatedDispositionSchema, SendMainChatMessageArtifactChangedDispositionSchema, SendMainChatMessageArtifactUnavailableDispositionSchema, SendMainChatMessageDispositionSchema, SendMainChatMessagePayloadSchema, SendMainChatMessageResultSchema, ArtifactPreviewRefSchema, TaskResultRefSchema, WorklistCompileRefSchema, WorklistFeedbackGeneratedFileSchema, WorklistFeedbackItemSchema, WorklistFeedbackRefSchema } from "./messages.js";
10
11
  import type { CheckSkipReasonCodeSchema, ExternalSideEffectSummaryProjectionSchema, GetRecoverySummariesRequestSchema, GetRecoverySummaryResponseSchema, RecoverySummaryProjectionSchema, RunResultProjectionSchema, ScratchpadProjectionSchema, ScratchpadReceiptProjectionSchema, TaskContractProjectionSchema, TaskDetailProjectionSchema, TaskDetailResultProjectionSchema, TaskModuleProjectionSchema, TaskProjectionSchema, TaskStatusSchema, WorklistCompiledTaskSummarySchema, WorklistProjectionSchema } from "./work-items.js";
11
12
  import type { ActiveApprovalProjectionSchema, ApprovalCommandProjectionSchema, ApprovalDecisionKindSchema, ApprovalDecisionOptionProjectionSchema, ApprovalFileChangeProjectionSchema, ApprovalPermissionsProjectionSchema, ApprovalRequestKindSchema, ApprovalRequestProjectionSchema, ApprovalResolutionOutcomeSchema, ApprovalResolutionProjectionSchema, DecideApprovalDispositionSchema, DecideApprovalPayloadSchema, DecideApprovalResultSchema } from "./approvals.js";
12
13
  import type { ActiveClarificationProjectionSchema, ClarificationChangedEventPayloadSchema, ClarificationOwnerProjectionSchema, ClarificationRequestPayloadSchema, ClarificationRoundProjectionSchema, ClarificationRoundSummaryProjectionSchema, ClarificationSuccessorRefSchema, ClarificationThreadProjectionSchema, ContextRefSchema, GetClarificationRoundMessagesRequestSchema, GetClarificationRoundResponseSchema, GetClarificationThreadResponseSchema, HumanInteractionPayloadSchema, HumanRequestPayloadSchema, SendClarificationRoundMessageDispositionSchema, SendClarificationRoundMessagePayloadSchema, SendClarificationRoundMessageResultSchema, SubmitClarificationRoundDispositionSchema, SubmitClarificationRoundPayloadSchema, SubmitClarificationRoundResultSchema } from "./clarifications.js";
@@ -108,6 +109,15 @@ export type MarkReadDisposition = Static<typeof MarkReadDispositionSchema>;
108
109
  export type MarkReadResult = Static<typeof MarkReadResultSchema>;
109
110
  export type MarkReadResponse = CommandResponse<MarkReadDisposition, MarkReadResult>;
110
111
  export type ReferenceFileCategory = Static<typeof ReferenceFileCategorySchema>;
112
+ export type ArtifactElementKind = Static<typeof ArtifactElementKindSchema>;
113
+ export type ArtifactSemanticContext = Static<typeof ArtifactSemanticContextSchema>;
114
+ export type ArtifactSemanticState = Static<typeof ArtifactSemanticStateSchema>;
115
+ export type ArtifactSemanticSnapshot = Static<typeof ArtifactSemanticSnapshotSchema>;
116
+ export type ArtifactElementAnchor = Static<typeof ArtifactElementAnchorSchema>;
117
+ export type ArtifactElementTarget = Static<typeof ArtifactElementTargetSchema>;
118
+ export type ArtifactFeedbackAnnotation = Static<typeof ArtifactFeedbackAnnotationSchema>;
119
+ export type ArtifactFeedbackCommand = Static<typeof ArtifactFeedbackCommandSchema>;
120
+ export type ArtifactFeedbackRef = Static<typeof ArtifactFeedbackRefSchema>;
111
121
  export type MessageReferenceFileRef = Static<typeof MessageReferenceFileRefSchema>;
112
122
  export type WorklistCompiledTaskSummary = Static<typeof WorklistCompiledTaskSummarySchema>;
113
123
  export type WorklistCompileRef = Static<typeof WorklistCompileRefSchema>;
@@ -121,6 +131,8 @@ export type MessageWindow = TimelineWindow<MessageProjection>;
121
131
  export type SendMainChatMessagePayload = Static<typeof SendMainChatMessagePayloadSchema>;
122
132
  export type ApiInterruptedCommandDisposition = Static<typeof InterruptedCommandDispositionSchema>;
123
133
  export type SendMainChatMessageCreatedDisposition = Static<typeof SendMainChatMessageCreatedDispositionSchema>;
134
+ export type SendMainChatMessageArtifactChangedDisposition = Static<typeof SendMainChatMessageArtifactChangedDispositionSchema>;
135
+ export type SendMainChatMessageArtifactUnavailableDisposition = Static<typeof SendMainChatMessageArtifactUnavailableDispositionSchema>;
124
136
  export type SendMainChatMessageDisposition = Static<typeof SendMainChatMessageDispositionSchema>;
125
137
  export type SendMainChatMessageResult = Static<typeof SendMainChatMessageResultSchema>;
126
138
  export type GetMessagesRequest = Static<typeof GetMessagesRequestSchema>;
@@ -250,7 +250,6 @@ export declare const ReferenceDirectoryProjectionSchema: import("@sinclair/typeb
250
250
  index_path: import("@sinclair/typebox").TLiteral<"docs/reference/README.md">;
251
251
  files_path: import("@sinclair/typebox").TLiteral<"docs/reference/files">;
252
252
  images_path: import("@sinclair/typebox").TLiteral<"docs/reference/images">;
253
- tutti_path: import("@sinclair/typebox").TLiteral<"docs/reference/tutti">;
254
253
  index_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"available">, import("@sinclair/typebox").TLiteral<"missing">, import("@sinclair/typebox").TLiteral<"unreadable">]>;
255
254
  index_unreadable_reason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"restricted_path">, import("@sinclair/typebox").TLiteral<"secret_like">, import("@sinclair/typebox").TLiteral<"binary">, import("@sinclair/typebox").TLiteral<"unsupported_encoding">, import("@sinclair/typebox").TLiteral<"too_large">]>>;
256
255
  }>;
@@ -266,7 +265,6 @@ export declare const ReferenceSummaryProjectionSchema: import("@sinclair/typebox
266
265
  export declare const ReferenceFileProjectionSchema: import("@sinclair/typebox").TObject<{
267
266
  path: import("@sinclair/typebox").TString;
268
267
  name: import("@sinclair/typebox").TString;
269
- source: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"human_upload">, import("@sinclair/typebox").TLiteral<"tutti_output">]>;
270
268
  category: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"file">, import("@sinclair/typebox").TLiteral<"image">]>;
271
269
  size_bytes: import("@sinclair/typebox").TInteger;
272
270
  media_type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
@@ -308,14 +306,12 @@ export declare const GetReferenceFilesResponseSchema: import("@sinclair/typebox"
308
306
  index_path: import("@sinclair/typebox").TLiteral<"docs/reference/README.md">;
309
307
  files_path: import("@sinclair/typebox").TLiteral<"docs/reference/files">;
310
308
  images_path: import("@sinclair/typebox").TLiteral<"docs/reference/images">;
311
- tutti_path: import("@sinclair/typebox").TLiteral<"docs/reference/tutti">;
312
309
  index_status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"available">, import("@sinclair/typebox").TLiteral<"missing">, import("@sinclair/typebox").TLiteral<"unreadable">]>;
313
310
  index_unreadable_reason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"restricted_path">, import("@sinclair/typebox").TLiteral<"secret_like">, import("@sinclair/typebox").TLiteral<"binary">, import("@sinclair/typebox").TLiteral<"unsupported_encoding">, import("@sinclair/typebox").TLiteral<"too_large">]>>;
314
311
  }>;
315
312
  items: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
316
313
  path: import("@sinclair/typebox").TString;
317
314
  name: import("@sinclair/typebox").TString;
318
- source: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"human_upload">, import("@sinclair/typebox").TLiteral<"tutti_output">]>;
319
315
  category: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"file">, import("@sinclair/typebox").TLiteral<"image">]>;
320
316
  size_bytes: import("@sinclair/typebox").TInteger;
321
317
  media_type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
@@ -359,7 +355,6 @@ export declare const UploadReferenceFileResultSchema: import("@sinclair/typebox"
359
355
  file: import("@sinclair/typebox").TObject<{
360
356
  path: import("@sinclair/typebox").TString;
361
357
  name: import("@sinclair/typebox").TString;
362
- source: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"human_upload">, import("@sinclair/typebox").TLiteral<"tutti_output">]>;
363
358
  category: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"file">, import("@sinclair/typebox").TLiteral<"image">]>;
364
359
  size_bytes: import("@sinclair/typebox").TInteger;
365
360
  media_type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
@@ -496,6 +491,92 @@ export declare const UploadReferenceFileResultSchema: import("@sinclair/typebox"
496
491
  task_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
497
492
  run_result_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
498
493
  }>>;
494
+ artifact_feedback: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
495
+ kind: import("@sinclair/typebox").TLiteral<"artifact_feedback">;
496
+ version: import("@sinclair/typebox").TLiteral<1>;
497
+ preview_generation: import("@sinclair/typebox").TString;
498
+ artifact_title: import("@sinclair/typebox").TString;
499
+ inspector_version: import("@sinclair/typebox").TLiteral<1>;
500
+ summary: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
501
+ annotations: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
502
+ document_url: import("@sinclair/typebox").TString;
503
+ comment: import("@sinclair/typebox").TString;
504
+ target: import("@sinclair/typebox").TObject<{
505
+ snapshot: import("@sinclair/typebox").TObject<{
506
+ element_kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"control">, import("@sinclair/typebox").TLiteral<"content">, import("@sinclair/typebox").TLiteral<"container">]>;
507
+ tag_name: import("@sinclair/typebox").TString;
508
+ role: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
509
+ accessible_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
510
+ text_excerpt: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
511
+ context: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
512
+ tag_name: import("@sinclair/typebox").TString;
513
+ role: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
514
+ accessible_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
515
+ }>>;
516
+ state: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
517
+ expanded: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
518
+ selected: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
519
+ checked: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
520
+ pressed: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
521
+ disabled: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
522
+ }>>;
523
+ }>;
524
+ anchor: import("@sinclair/typebox").TObject<{
525
+ version: import("@sinclair/typebox").TLiteral<1>;
526
+ explicit_anchor: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
527
+ stable_attributes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
528
+ id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
529
+ test_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
530
+ }>>;
531
+ semantic_path: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
532
+ role: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
533
+ accessible_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
534
+ }>>;
535
+ selector_path: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
536
+ root: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"document">, import("@sinclair/typebox").TLiteral<"open_shadow_root">]>;
537
+ selector: import("@sinclair/typebox").TString;
538
+ }>>;
539
+ }>;
540
+ fallback_context: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
541
+ snapshot: import("@sinclair/typebox").TObject<{
542
+ element_kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"control">, import("@sinclair/typebox").TLiteral<"content">, import("@sinclair/typebox").TLiteral<"container">]>;
543
+ tag_name: import("@sinclair/typebox").TString;
544
+ role: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
545
+ accessible_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
546
+ text_excerpt: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
547
+ context: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
548
+ tag_name: import("@sinclair/typebox").TString;
549
+ role: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
550
+ accessible_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
551
+ }>>;
552
+ state: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
553
+ expanded: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
554
+ selected: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
555
+ checked: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
556
+ pressed: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
557
+ disabled: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
558
+ }>>;
559
+ }>;
560
+ anchor: import("@sinclair/typebox").TObject<{
561
+ version: import("@sinclair/typebox").TLiteral<1>;
562
+ explicit_anchor: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
563
+ stable_attributes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
564
+ id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
565
+ test_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
566
+ }>>;
567
+ semantic_path: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
568
+ role: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
569
+ accessible_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
570
+ }>>;
571
+ selector_path: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
572
+ root: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"document">, import("@sinclair/typebox").TLiteral<"open_shadow_root">]>;
573
+ selector: import("@sinclair/typebox").TString;
574
+ }>>;
575
+ }>;
576
+ }>>;
577
+ }>;
578
+ }>>;
579
+ }>>;
499
580
  }>>;
500
581
  clarification_card: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
501
582
  thread_id: import("@sinclair/typebox").TString;
@@ -164,7 +164,6 @@ export const ReferenceDirectoryProjectionSchema = Type.Object({
164
164
  index_path: Type.Literal("docs/reference/README.md"),
165
165
  files_path: Type.Literal("docs/reference/files"),
166
166
  images_path: Type.Literal("docs/reference/images"),
167
- tutti_path: Type.Literal("docs/reference/tutti"),
168
167
  index_status: Type.Union([
169
168
  Type.Literal("available"),
170
169
  Type.Literal("missing"),
@@ -196,7 +195,6 @@ export const ReferenceSummaryProjectionSchema = Type.Object({
196
195
  export const ReferenceFileProjectionSchema = Type.Object({
197
196
  path: ViewerPathSchema,
198
197
  name: NonEmptyStringSchema,
199
- source: Type.Union([Type.Literal("human_upload"), Type.Literal("tutti_output")]),
200
198
  category: ReferenceFileCategorySchema,
201
199
  size_bytes: Type.Integer({ minimum: 0 }),
202
200
  media_type: Type.Optional(NonEmptyStringSchema),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xfey/tutti",
3
- "version": "0.1.97",
3
+ "version": "0.1.99",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -16,9 +16,9 @@ Use repository inspection and attached skills only when useful:
16
16
 
17
17
  - Use `read-project-docs` for existing project documents and availability.
18
18
  - Use `read-worklist` when repo state or completed formal tasks can explain the current implementation stage. Do not turn task results into a changelog.
19
- - Use `read-references` only when a human-uploaded reference file's actual content matters.
19
+ - Use `read-references` only when a file in the shared project Reference space actually matters.
20
20
 
21
- Reference upload events, file names, media types, and paths do not prove file contents. Read the relevant file before relying on it.
21
+ Reference creation events, file names, media types, paths, and summaries do not prove file contents. Read the relevant file before relying on it.
22
22
 
23
23
  # Documentation Scope
24
24
 
@@ -62,5 +62,5 @@ Return only JSON matching this schema:
62
62
  If no concrete documentation update is needed, return an empty `updates` array:
63
63
 
64
64
  ```json
65
- {"summary":"Checked current docs against repository facts; no updates needed.","updates":[]}
65
+ { "summary": "Checked current docs against repository facts; no updates needed.", "updates": [] }
66
66
  ```
@@ -6,7 +6,7 @@ model_path: codex.app_server.read_only
6
6
 
7
7
  # Role
8
8
 
9
- You summarize one human-uploaded Tutti reference file.
9
+ You summarize one file from Tutti's shared project Reference space.
10
10
 
11
11
  # Runtime
12
12
 
@@ -36,9 +36,9 @@ You compile Tutti's Scratchpad into an append-only Worklist proposal for post-ba
36
36
  Tutti can expose direct user-viewable outputs through two repo-backed surfaces when a task result is meant for project members to inspect:
37
37
 
38
38
  - a single active visual artifact, declared by `tutti.artifact.json`, for previewable pages, apps, dashboards, or similar interactive outputs;
39
- - generated files under `docs/reference/tutti/**`, for reviewable files such as reports, notes, specs, exports, or similar outputs.
39
+ - generated files in the shared `docs/reference/**` space, directly at the root or under a meaningful semantic subfolder, for reviewable files such as reports, notes, specs, exports, or similar outputs.
40
40
 
41
- Treat these as delivery surfaces, not as task subjects by themselves. Human-uploaded references still live under `docs/reference/files/` or `docs/reference/images/`, and stable project facts still belong in the relevant project docs or README-style files.
41
+ Treat these as delivery surfaces, not as task subjects by themselves. Browser uploads continue to enter the Host-managed `docs/reference/files/` or `docs/reference/images/` partitions, `docs/reference/README.md` remains Host-owned, and stable project facts still belong in the relevant project docs or README-style files.
42
42
 
43
43
  When the Scratchpad clearly asks for one of these direct deliverables, include a concise task `scope` item naming the expected surface. If a completion card should call out the result or generated file name, the scope may also mention `user_note_candidate`. Do not add artifact or generated-reference outputs solely to create feedback for ordinary implementation tasks.
44
44
 
@@ -377,7 +377,7 @@ Provider raw 输出:根对象只包含 `result`;`result` 内二选一输出
377
377
  - Reference Files 不通过 built-in skill 暴露;若任务契约或 Project Docs 指向 `docs/reference/` 中资料,Codex 可直接读取相关 repo 文件正文。
378
378
  - `goal / scope` 决定本次执行边界;`source_messages` 与 compile `clarification_rounds` 只提供该边界引用的精确材料,不自动扩展任务目标。
379
379
 
380
- 输出:根对象只包含 `result`;`result` 内四选一输出 `completed.{summary,user_note_candidate}`、`completed_no_repo_changes.{summary,user_note_candidate}`、`needs_human.{title,summary,request}` 或 `failed.summary`。`user_note_candidate` 是可选最终反馈候选,字段必填但可为 `null`;生成给用户直接查看的文件应写入 `docs/reference/tutti/`。`completed_no_repo_changes` 只用于任务契约不要求 repository file changes 的情况。`needs_human` payload 必须能直接作为 task-bound clarification request 使用:解释为什么 frozen contract 下无法安全继续,并提出一个具体、可回答、非 secret 的问题。
380
+ 输出:根对象只包含 `result`;`result` 内四选一输出 `completed.{summary,user_note_candidate}`、`completed_no_repo_changes.{summary,user_note_candidate}`、`needs_human.{title,summary,request}` 或 `failed.summary`。`user_note_candidate` 是可选最终反馈候选,字段必填但可为 `null`;生成给用户直接查看的文件应写入共享 `docs/reference/` 根目录或有意义的语义子目录,同时避开 Host-owned `README.md` 和通常由浏览器上传使用的 `files/`、`images/` 分区。`completed_no_repo_changes` 只用于任务契约不要求 repository file changes 的情况。`needs_human` payload 必须能直接作为 task-bound clarification request 使用:解释为什么 frozen contract 下无法安全继续,并提出一个具体、可回答、非 secret 的问题。
381
381
 
382
382
  下游:Run pipeline 收集真实 Git diff 作为 `changed_paths`;`needs_human` 时 Control Plane 记录 `Run.needs_human`、打开 task-bound clarification 并把 task 迁回 `pending`;有 repo candidate 的 `completed` 结果先执行 Artifact candidate gate 与 checks,再在当前 `tutti/mainline` 创建 accepted commit + immutable activity tag;空 diff 的 `completed_no_repo_changes` 结果跳过 Artifact gate、checks 与 accepted checkpoint,记录 `promotion.status = not_attempted`。
383
383
 
@@ -33,9 +33,9 @@ For a continuation, the same task is already present in this conversation. The i
33
33
 
34
34
  Use attached skills only when they help the task. `read-worklist` may clarify related formal work without expanding this task. `read-project-docs` may clarify architecture, setup, and maintenance rules. User skills may guide implementation but do not override the task, command policy, workspace policy, checks, or redaction rules.
35
35
 
36
- Human-uploaded references are under `docs/reference/`. Read a relevant source file before relying on it; do not infer its contents from a name, path, media type, upload message, or summary.
36
+ Project members and Tutti share `docs/reference/**` as the member-viewable Reference space. Read a relevant source file before relying on it; do not infer its contents from a name, path, media type, upload message, or summary.
37
37
 
38
- `docs/reference/tutti/**` is reserved for generated files that project members should inspect in the References UI. Use it for explicit reviewable deliverables, not temporary output, logs, internal notes, or canonical project documentation. Use a meaningful subfolder when it helps explain a group of files.
38
+ When this task needs to create an explicit reviewable deliverable, write it directly under `docs/reference/` or use a meaningful semantic subfolder such as `docs/reference/reports/`. Do not put temporary output, logs, internal notes, or canonical project documentation there. Do not overwrite unrelated existing References. `docs/reference/files/` and `docs/reference/images/` are normally reserved for Host-managed browser uploads, and `docs/reference/README.md` is Host-owned; do not modify them unless the task explicitly requires that exact existing file.
39
39
 
40
40
  # Documentation
41
41
 
@@ -5,7 +5,7 @@ description: List and read bounded Tutti reference files when the turn has refer
5
5
 
6
6
  # Read References
7
7
 
8
- Use this skill when a Tutti app-server turn needs user-uploaded reference material.
8
+ Use this skill when a Tutti app-server turn needs material from the shared project Reference space. Files may have been uploaded by a project member or created by Tutti in an earlier Run.
9
9
 
10
10
  When a Tutti context API runtime hint is present and includes `references:list`, list available references through:
11
11
 
@@ -19,7 +19,7 @@ When a listed text file is relevant and the hint includes `references:read`, rea
19
19
 
20
20
  Read responses may include the same `summary` object alongside text or unavailable metadata.
21
21
 
22
- Read only reference files that are relevant to the current task or question. Do not infer file contents from upload messages, names, media types, or paths alone. If a file is unavailable, restricted, binary, too large, or unsupported, use the returned disposition instead of guessing.
22
+ Read only reference files that are relevant to the current task or question. Do not infer file contents from creation events, names, media types, paths, or summaries alone. If a file is unavailable, restricted, binary, too large, or unsupported, use the returned disposition instead of guessing.
23
23
 
24
24
  This skill is read-only. Do not attempt to create, update, refresh, or write reference summaries from this skill.
25
25
 
@@ -0,0 +1 @@
1
+ import{C as e,S as t,T as n,_ as r,a as i,b as a,c as o,d as s,f as c,g as l,h as u,i as d,l as f,m as p,n as m,o as h,p as g,r as _,s as v,t as y,u as b,v as x,w as S,x as C,y as w}from"./index-DtZ_5QLQ.js";var T=S(`mouse-pointer-2`,[[`path`,{d:`M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z`,key:`edeuup`}]]),E=n();function D(e){return{"--reveal":e}}function O(e,t,n){let r=(e,t)=>Number.parseInt(e.slice(t,t+2),16),i=i=>Math.round(r(e,i)+(r(t,i)-r(e,i))*n).toString(16).padStart(2,`0`);return`#${i(1)}${i(3)}${i(5)}`}function k(e){let t=i((e-m.runEnd)/(m.executionComplete-m.runEnd));return t+t*t-t*t*t}function A({progress:e,children:t,className:n=``}){return(0,E.jsx)(`div`,{className:`scene-reveal ${n}`,style:D(e),children:t})}function j({progress:e,author:t,avatar:n,tone:r,timestamp:i,online:a=!1,assets:o,children:s}){return(0,E.jsxs)(`article`,{className:`scene-message`,style:D(e),children:[(0,E.jsx)(`span`,{className:`scene-avatar is-${r} ${n===`tutti`?`is-tutti`:``} ${a?`is-online`:``}`,"aria-hidden":`true`,children:n===`tutti`?(0,E.jsx)(`img`,{className:`scene-avatar-image`,src:o.tuttiAvatarSrc,alt:``}):(0,E.jsx)(`img`,{className:`scene-avatar-image`,src:o.humanAvatars[n],alt:``})}),(0,E.jsxs)(`div`,{className:`scene-message-copy`,children:[(0,E.jsxs)(`header`,{children:[(0,E.jsx)(`strong`,{children:t}),(0,E.jsx)(`span`,{children:i})]}),(0,E.jsx)(`p`,{children:s})]})]})}function M({time:t,assets:n}){let i=t>=m.artifactLive,o=t>=m.artifactClick,s=t>=m.runEnd&&t<m.executionComplete,u=f(t,m.runEnd,19.2),d=f(t,m.artifactLive,30.92);return(0,E.jsxs)(`aside`,{className:`scene-sidebar`,children:[(0,E.jsx)(`button`,{className:`scene-brand`,type:`button`,"aria-label":`Tutti`,tabIndex:-1,children:(0,E.jsx)(`img`,{src:n.logoSrc,alt:``})}),(0,E.jsxs)(`div`,{className:`scene-nav-stack`,children:[(0,E.jsxs)(`nav`,{className:`scene-nav`,"aria-label":`Workspace pages`,children:[(0,E.jsx)(`button`,{className:o?``:`is-active`,type:`button`,"aria-label":`Chat`,tabIndex:-1,children:(0,E.jsx)(r,{"aria-hidden":`true`})}),(0,E.jsx)(`button`,{type:`button`,"aria-label":`Worklist`,tabIndex:-1,children:(0,E.jsx)(w,{"aria-hidden":`true`})}),(0,E.jsxs)(`button`,{className:o?`is-active`:``,type:`button`,"aria-label":`Artifacts`,tabIndex:-1,children:[(0,E.jsx)(l,{"aria-hidden":`true`}),i?(0,E.jsx)(`span`,{className:`scene-live-pill`,style:D(d),children:`Live`}):null]}),(0,E.jsx)(`button`,{type:`button`,"aria-label":`References`,tabIndex:-1,children:(0,E.jsx)(a,{"aria-hidden":`true`})}),(0,E.jsx)(`button`,{type:`button`,"aria-label":`Skills`,tabIndex:-1,children:(0,E.jsx)(c,{"aria-hidden":`true`})}),(0,E.jsx)(`button`,{type:`button`,"aria-label":`Timeline`,tabIndex:-1,children:(0,E.jsx)(e,{"aria-hidden":`true`})})]}),s?(0,E.jsx)(`button`,{className:`scene-status-entry is-running`,style:D(u),type:`button`,"aria-label":`Task running`,tabIndex:-1,children:(0,E.jsx)(x,{"aria-hidden":`true`})}):null]}),(0,E.jsx)(`button`,{className:`scene-settings`,type:`button`,"aria-label":`Settings`,tabIndex:-1,children:(0,E.jsx)(g,{"aria-hidden":`true`})})]})}function N({time:e,assets:n}){let i=f(e,30.35,30.92);return(0,E.jsxs)(`section`,{className:`scene-panel scene-chat-panel`,children:[(0,E.jsxs)(`header`,{className:`scene-panel-header`,children:[(0,E.jsx)(`span`,{className:`scene-icon-tile`,children:(0,E.jsx)(r,{"aria-hidden":`true`})}),(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`h2`,{children:`Morrow Studio`}),(0,E.jsx)(`p`,{children:`Ceramics storefront`})]}),(0,E.jsxs)(`span`,{className:`scene-members`,"aria-hidden":`true`,children:[(0,E.jsx)(`i`,{className:`is-green`,children:(0,E.jsx)(`img`,{className:`scene-avatar-image`,src:n.humanAvatars.fey,alt:``})}),(0,E.jsx)(`i`,{className:`is-blue`,children:(0,E.jsx)(`img`,{className:`scene-avatar-image`,src:n.humanAvatars.avery,alt:``})}),(0,E.jsx)(`i`,{className:`is-yellow`,children:(0,E.jsx)(`img`,{className:`scene-avatar-image`,src:n.humanAvatars.jun,alt:``})})]})]}),(0,E.jsxs)(`div`,{className:`scene-chat-stream`,children:[(0,E.jsx)(j,{progress:f(e,1.35,2.05),author:`Fey`,avatar:`fey`,tone:`green`,timestamp:`10:12`,online:!0,assets:n,children:`🏺 Let's build an online shop for our ceramics studio.`}),(0,E.jsx)(j,{progress:f(e,2.65,3.35),author:`Avery`,avatar:`avery`,tone:`blue`,timestamp:`10:13`,online:!0,assets:n,children:`✨ Keep it warm, minimal, and editorial.`}),(0,E.jsx)(j,{progress:f(e,3.95,4.65),author:`Jun`,avatar:`jun`,tone:`yellow`,timestamp:`10:14`,online:!0,assets:n,children:`🎨 Let people preview every piece in different glazes.`}),(0,E.jsx)(j,{progress:f(e,5.25,5.95),author:`Tutti`,avatar:`tutti`,tone:`green`,timestamp:`10:15`,assets:n,children:`Got it — I'll put it together. ✨`}),(0,E.jsxs)(`article`,{className:`scene-task-result`,style:D(i),children:[(0,E.jsx)(`span`,{className:`scene-task-result-rail`,"aria-hidden":`true`}),(0,E.jsx)(`span`,{className:`scene-task-result-icon`,"aria-hidden":`true`,children:(0,E.jsx)(t,{})}),(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`span`,{children:`Task completed`}),(0,E.jsx)(`strong`,{children:`Build ceramics storefront`}),(0,E.jsx)(`small`,{children:`Storefront`}),(0,E.jsx)(`p`,{children:`Warm editorial shopping and glaze previews are ready in Artifacts.`})]}),(0,E.jsx)(C,{className:`scene-task-result-chevron`,"aria-hidden":`true`})]})]}),(0,E.jsxs)(`div`,{className:`scene-composer`,"aria-hidden":`true`,children:[(0,E.jsx)(`span`,{children:`Write a message`}),(0,E.jsx)(p,{})]})]})}function P({progress:e,icon:t,children:n}){return(0,E.jsxs)(`div`,{className:`scene-scratchpad-row`,style:D(e),children:[(0,E.jsx)(`span`,{"aria-hidden":`true`,children:t}),(0,E.jsx)(`p`,{children:n})]})}function F({time:e}){return(0,E.jsxs)(`section`,{className:`scene-panel scene-scratchpad-panel`,style:{"--scratchpad-collapse":f(e,m.runEnd,19.18)},children:[(0,E.jsxs)(`header`,{className:`scene-panel-header`,children:[(0,E.jsx)(`span`,{className:`scene-icon-tile`,children:(0,E.jsx)(y,{"aria-hidden":`true`})}),(0,E.jsx)(`h2`,{children:`Scratchpad`})]}),(0,E.jsxs)(`div`,{className:`scene-scratchpad-body`,children:[(0,E.jsxs)(A,{progress:f(e,8.95,10),className:`scene-scratchpad-intro`,children:[(0,E.jsx)(`h3`,{children:`Ceramics storefront`}),(0,E.jsx)(`p`,{children:`A warm, editorial storefront for a small-batch studio, centered on tactile product discovery.`})]}),(0,E.jsx)(A,{progress:f(e,9.85,10.65),className:`scene-scratchpad-label`,children:`Confirmed`}),(0,E.jsx)(P,{progress:f(e,10.4,11.25),icon:(0,E.jsx)(t,{}),children:`Product-first editorial layout with generous space`}),(0,E.jsx)(P,{progress:f(e,11.2,12.05),icon:(0,E.jsx)(t,{}),children:`Warm neutrals with quiet serif headlines`}),(0,E.jsx)(P,{progress:f(e,12,12.85),icon:(0,E.jsx)(t,{}),children:`Keep the collection small, curated, and story-led`}),(0,E.jsx)(A,{progress:f(e,12.75,13.55),className:`scene-scratchpad-label`,children:`Requested feature`}),(0,E.jsx)(P,{progress:f(e,13.3,14.2),icon:(0,E.jsx)(s,{}),children:`Preview every piece in clay, sage, and ink glazes`})]}),(0,E.jsxs)(`footer`,{className:`scene-scratchpad-footer`,style:D(f(e,15.7,16.8)),children:[(0,E.jsxs)(`span`,{className:`scene-writing-mark`,children:[(0,E.jsx)(`strong`,{children:`Updated`}),(0,E.jsx)(`span`,{children:`just now`})]}),(0,E.jsxs)(`button`,{className:`scene-run-button`,type:`button`,tabIndex:-1,children:[(0,E.jsx)(u,{"aria-hidden":`true`}),(0,E.jsx)(`span`,{children:`Run`})]})]})]})}function I(e,t){let n=Math.max(0,Math.floor((e-t)*50/5)*5);return`${Math.floor(n/60)}m${(n%60).toString().padStart(2,`0`)}s`}function L({time:e,scoreSrc:n}){let r=f(e,18.92,19.2),i=v(e),a=i.id===`complete`,o={prepare:m.runEnd,implement:m.executionPrepareEnd,validate:m.executionImplementEnd,update:m.executionValidateEnd,complete:m.executionComplete}[i.id],s=f(e,o,o+.32),c=k(e);return(0,E.jsx)(`div`,{className:`scene-execution`,style:{"--reveal":r,"--stage-reveal":s},children:(0,E.jsxs)(`article`,{className:`homepage-motion-panel homepage-motion-execution-panel homepage-motion-execution-card is-score-${a?`complete`:`running`}`,children:[(0,E.jsx)(`header`,{className:`homepage-motion-panel-header`,children:(0,E.jsxs)(`div`,{className:`homepage-motion-panel-title`,children:[(0,E.jsx)(`span`,{className:`scene-icon-tile`,"aria-hidden":`true`,children:(0,E.jsx)(b,{})}),(0,E.jsx)(`h3`,{children:`Tutti is working on`})]})}),(0,E.jsxs)(`div`,{className:`homepage-motion-execution-body`,children:[(0,E.jsxs)(`div`,{className:`homepage-motion-execution-step homepage-motion-execution-stage is-${a?`complete`:`running`} has-marker`,children:[(0,E.jsx)(`span`,{className:`homepage-motion-execution-marker ${a?`is-done`:`is-running`}`,"aria-hidden":`true`,children:a?(0,E.jsx)(t,{}):(0,E.jsx)(x,{})}),(0,E.jsx)(`span`,{className:`homepage-motion-execution-step-content homepage-motion-execution-stage-copy`,children:(0,E.jsxs)(`span`,{className:`homepage-motion-execution-step-title`,children:[(0,E.jsx)(`span`,{className:`homepage-motion-execution-step-label`,children:i.label}),a?null:(0,E.jsx)(`span`,{className:`homepage-motion-execution-step-elapsed`,children:` (${I(e,o)})`})]})},i.id)]}),(0,E.jsx)(`div`,{className:`homepage-motion-running-score ${a?`is-complete`:``}`,role:`img`,"aria-label":`Ode to Joy score phrase`,children:(0,E.jsx)(`div`,{className:`homepage-motion-score-passage`,style:{"--score-translate-x":`${-395.3*c}px`},"aria-hidden":`true`,children:(0,E.jsx)(`img`,{src:n,alt:``,draggable:!1})})})]})]})})}function R({color:e,variant:t=`vase`,className:n=``}){let r={"--ceramic-color":e};return t===`cup`?(0,E.jsxs)(`svg`,{className:`ceramic-object is-cup ${n}`,viewBox:`0 0 260 260`,style:r,"aria-hidden":`true`,children:[(0,E.jsx)(`path`,{className:`ceramic-main`,d:`M54 64h132l-9 126c-2 26-20 42-46 42h-22c-26 0-44-16-46-42Z`}),(0,E.jsx)(`path`,{className:`ceramic-outline`,d:`M186 92h18c34 0 34 72 1 76h-27`}),(0,E.jsx)(`ellipse`,{className:`ceramic-rim`,cx:`120`,cy:`64`,rx:`66`,ry:`13`}),(0,E.jsx)(`path`,{className:`ceramic-highlight`,d:`M78 90c5 62 4 91 20 114`})]}):t===`bowl`?(0,E.jsxs)(`svg`,{className:`ceramic-object is-bowl ${n}`,viewBox:`0 0 300 220`,style:r,"aria-hidden":`true`,children:[(0,E.jsx)(`ellipse`,{className:`ceramic-rim`,cx:`150`,cy:`55`,rx:`116`,ry:`24`}),(0,E.jsx)(`path`,{className:`ceramic-main`,d:`M34 55c8 82 45 132 116 132S258 137 266 55c-42 25-190 25-232 0Z`}),(0,E.jsx)(`path`,{className:`ceramic-highlight`,d:`M72 82c18 45 40 70 70 82`}),(0,E.jsx)(`path`,{className:`ceramic-base`,d:`M112 185h76`})]}):(0,E.jsxs)(`svg`,{className:`ceramic-object is-vase ${n}`,viewBox:`0 0 320 420`,style:r,"aria-hidden":`true`,children:[(0,E.jsx)(`path`,{className:`ceramic-main`,d:`M116 56c7 38-17 61-36 96-31 56-28 157 5 199 33 42 117 42 150 0 33-42 36-143 5-199-19-35-43-58-36-96Z`}),(0,E.jsx)(`ellipse`,{className:`ceramic-rim`,cx:`160`,cy:`56`,rx:`44`,ry:`12`}),(0,E.jsx)(`ellipse`,{className:`ceramic-base`,cx:`160`,cy:`365`,rx:`66`,ry:`13`}),(0,E.jsx)(`path`,{className:`ceramic-highlight`,d:`M108 153c-25 64-23 145 1 185`})]})}function z({time:e}){let t=f(e,m.artifactClick,33.25),n=f(e,34.25,34.52),r=f(e,34.88,35.15),i=f(e,35.55,35.82),a=_(e),o=O(`#d9cbb4`,`#c56f4f`,n);e>=34.88&&(o=O(`#c56f4f`,`#6f9275`,r)),e>=35.55&&(o=O(`#6f9275`,`#243a46`,i));let s=e>=35.55?`ink`:e>=34.88?`sage`:e>=34.25?`clay`:null,c={"--artifact-scroll":a};return(0,E.jsxs)(`section`,{className:`scene-panel scene-artifact-panel`,style:D(t),children:[(0,E.jsxs)(`header`,{className:`scene-panel-header`,children:[(0,E.jsx)(`span`,{className:`scene-icon-tile`,children:(0,E.jsx)(l,{"aria-hidden":`true`})}),(0,E.jsx)(`h2`,{children:`Artifacts`}),(0,E.jsx)(`span`,{className:`scene-ready-tag`,children:`Ready`})]}),(0,E.jsx)(`div`,{className:`scene-artifact-canvas`,children:(0,E.jsxs)(`div`,{className:`artifact-page-frame`,style:c,children:[(0,E.jsxs)(`div`,{className:`artifact-page-nav`,children:[(0,E.jsx)(`strong`,{children:`Morrow`}),(0,E.jsx)(`span`,{children:`Objects · Journal · Studio`})]}),(0,E.jsxs)(`section`,{className:`artifact-hero`,children:[(0,E.jsxs)(`div`,{className:`artifact-hero-copy`,children:[(0,E.jsx)(`span`,{className:`artifact-eyebrow`,children:`Hand-finished in small batches`}),(0,E.jsx)(`h3`,{children:`Objects for slower days.`}),(0,E.jsx)(`p`,{children:`Quiet forms, warm glazes, and useful pieces made to live with.`}),(0,E.jsx)(`button`,{type:`button`,tabIndex:-1,children:`Explore the collection`})]}),(0,E.jsxs)(`div`,{className:`artifact-hero-object`,children:[(0,E.jsx)(R,{color:o}),(0,E.jsxs)(`div`,{className:`artifact-glaze-picker`,"aria-label":`Glaze preview`,children:[(0,E.jsx)(`span`,{children:`Glaze`}),(0,E.jsx)(`i`,{className:s===`clay`?`is-active is-clay`:`is-clay`}),(0,E.jsx)(`i`,{className:s===`sage`?`is-active is-sage`:`is-sage`}),(0,E.jsx)(`i`,{className:s===`ink`?`is-active is-ink`:`is-ink`})]})]})]}),(0,E.jsxs)(`section`,{className:`artifact-collection`,children:[(0,E.jsxs)(`header`,{children:[(0,E.jsx)(`span`,{children:`Selected pieces`}),(0,E.jsx)(`p`,{children:`Everyday forms shaped for the rituals around them.`})]}),(0,E.jsxs)(`div`,{className:`artifact-product-grid`,children:[(0,E.jsxs)(`article`,{children:[(0,E.jsx)(R,{color:`#b9785f`,variant:`cup`}),(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`strong`,{children:`Low cup`}),(0,E.jsx)(`span`,{children:`Rust glaze`})]})]}),(0,E.jsxs)(`article`,{children:[(0,E.jsx)(R,{color:`#819283`,variant:`vase`}),(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`strong`,{children:`Field vase`}),(0,E.jsx)(`span`,{children:`Sage glaze`})]})]}),(0,E.jsxs)(`article`,{children:[(0,E.jsx)(R,{color:`#d5c7af`,variant:`bowl`}),(0,E.jsxs)(`div`,{children:[(0,E.jsx)(`strong`,{children:`Gather bowl`}),(0,E.jsx)(`span`,{children:`Flax glaze`})]})]})]})]}),(0,E.jsxs)(`section`,{className:`artifact-studio`,children:[(0,E.jsx)(`span`,{children:`Made by hand · Meant for every day`}),(0,E.jsx)(`h3`,{children:`Useful things can still feel special.`}),(0,E.jsx)(`p`,{children:`We make a small number of considered objects, slowly and close to home.`}),(0,E.jsx)(`button`,{type:`button`,tabIndex:-1,children:`Visit the studio`})]}),(0,E.jsxs)(`footer`,{className:`artifact-page-footer`,children:[(0,E.jsx)(`strong`,{children:`Morrow Ceramics`}),(0,E.jsx)(`span`,{className:`artifact-built-with`,children:`Built with Tutti.`}),(0,E.jsx)(`span`,{children:`Small batch · Est. 2026`})]})]})})]})}function B(e,t,n){return e+(t-e)*n}function V(e,t,n,r,i){let a=f(e,t,n,h);return{x:B(r.x,i.x,a),y:B(r.y,i.y,a)}}function H(e,t,n){return e<t||e>n?0:Math.sin(Math.PI*((e-t)/(n-t)))}function U(e){if(e>=m.runCursorStart&&e<18.92){let t=V(e,m.runCursorStart,m.runCursorArrive,{x:86,y:76},{x:94.25,y:94.2});return{visible:!0,x:t.x,y:t.y,clickPulse:H(e,m.runClickStart,m.runEnd)}}if(e>=31&&e<33.45){let t=V(e,31,32.22,{x:50,y:58},{x:4,y:22.85});return{visible:!0,x:t.x,y:t.y,clickPulse:H(e,32.28,32.6)}}return{visible:!1,x:50,y:50,clickPulse:0}}function W({time:e,assets:t}){let n=d(e),r=U(e),i=o(e),a=f(e,.08,1.05,h);return(0,E.jsx)(`div`,{className:`motion-scene`,role:`img`,"aria-label":`Tutti workflow animation from team discussion to a generated ceramics storefront`,style:{opacity:i,visibility:i<=.001?`hidden`:`visible`},children:(0,E.jsxs)(`div`,{className:`motion-stage`,style:{opacity:a,transform:`translate(50%, 50%) scale(${n.scale}) translate(${-n.centerX*100}%, ${-n.centerY*100}%)`},children:[(0,E.jsx)(M,{time:e,assets:t}),(0,E.jsxs)(`div`,{className:`scene-workspace-layer`,children:[(0,E.jsx)(N,{time:e,assets:t}),(0,E.jsx)(F,{time:e}),(0,E.jsx)(L,{time:e,scoreSrc:t.scoreSrc})]}),(0,E.jsx)(z,{time:e}),(0,E.jsxs)(`span`,{className:`scene-cursor ${r.visible?`is-visible`:``}`,style:{left:`${r.x}%`,top:`${r.y}%`,"--click-pulse":r.clickPulse},"aria-hidden":`true`,children:[(0,E.jsx)(T,{}),(0,E.jsx)(`i`,{})]})]})})}export{W as HomepageMotionScene};