@xfey/tutti 0.1.126 → 0.1.128
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.
- package/README.md +2 -0
- package/dist/approvals/decision-command.d.ts +2 -2
- package/dist/chat-assistant/diagnostics.d.ts +11 -3
- package/dist/chat-assistant/diagnostics.js +5 -2
- package/dist/chat-assistant/failures.d.ts +27 -0
- package/dist/chat-assistant/failures.js +102 -0
- package/dist/chat-assistant/index.d.ts +14 -2
- package/dist/chat-assistant/index.js +241 -54
- package/dist/chat-assistant/language-context.d.ts +8 -0
- package/dist/chat-assistant/language-context.js +41 -0
- package/dist/chat-assistant/requests.d.ts +30 -0
- package/dist/chat-assistant/requests.js +58 -0
- package/dist/collaboration-ingestion/clarification.js +3 -1
- package/dist/collaboration-ingestion/main-chat.js +1 -0
- package/dist/collaboration-ingestion/types.d.ts +2 -0
- package/dist/collaboration-state/clarification-snapshot.d.ts +5 -5
- package/dist/collaboration-state/communication-language.d.ts +31 -0
- package/dist/collaboration-state/communication-language.js +36 -0
- package/dist/collaboration-state/task-compile-context.d.ts +1 -1
- package/dist/collaboration-state/task-compile-context.js +20 -1
- package/dist/collaboration-state/task-compile-requests.d.ts +6 -0
- package/dist/collaboration-state/task-compile-requests.js +16 -0
- package/dist/communication-language/index.d.ts +75 -0
- package/dist/communication-language/index.js +122 -0
- package/dist/communication-language/live-smoke-cli.d.ts +2 -0
- package/dist/communication-language/live-smoke-cli.js +368 -0
- package/dist/communication-language/prompt.d.ts +22 -0
- package/dist/communication-language/prompt.js +73 -0
- package/dist/control-plane/communication-language.d.ts +33 -0
- package/dist/control-plane/communication-language.js +72 -0
- package/dist/control-plane/context-sync.js +7 -0
- package/dist/control-plane/follow-up-output.js +25 -4
- package/dist/control-plane/follow-up-start.js +17 -0
- package/dist/control-plane/project-brief-refresh.js +10 -1
- package/dist/control-plane/project-context-bootstrap.d.ts +2 -0
- package/dist/control-plane/project-context-bootstrap.js +8 -0
- package/dist/control-plane/reference-summary-refresh.js +7 -0
- package/dist/control-plane/run-start.js +14 -6
- package/dist/control-plane/scratchpad-refresh-start.d.ts +1 -0
- package/dist/control-plane/scratchpad-refresh-start.js +13 -0
- package/dist/control-plane/scratchpad-refresh.d.ts +2 -0
- package/dist/control-plane/scratchpad-refresh.js +40 -26
- package/dist/control-plane/task-compile-continuation.js +16 -1
- package/dist/control-plane/task-compile-output.js +38 -14
- package/dist/control-plane/task-compile-request-status.d.ts +6 -0
- package/dist/control-plane/task-compile-request-status.js +70 -0
- package/dist/control-plane/task-compile-start.d.ts +1 -0
- package/dist/control-plane/task-compile-start.js +62 -3
- package/dist/control-plane/types.d.ts +2 -0
- package/dist/control-plane/workflows/openai.js +48 -28
- package/dist/control-plane/workflows/types.d.ts +18 -13
- package/dist/prompt-templates/index.d.ts +1 -1
- package/dist/prompt-templates/index.js +2 -0
- package/dist/providers/failure-classification.d.ts +23 -0
- package/dist/providers/failure-classification.js +43 -0
- package/dist/reference-access/read-evidence.d.ts +2 -0
- package/dist/reference-access/read-evidence.js +5 -0
- package/dist/reference-access/service.d.ts +2 -0
- package/dist/reference-access/service.js +2 -0
- package/dist/run-pipeline/task-run-invocation.js +12 -9
- package/dist/runtime-failures.js +15 -1
- package/dist/server-shell/cli/external-reference-runtime.js +6 -3
- package/dist/server-shell/cli/host-server-runtime.js +4 -1
- package/dist/server-shell/cli/relay-registration.js +1 -0
- package/dist/server-shell/http/routes/project-api/messages-routes.js +22 -1
- package/dist/server-shell/http/routes/project-api/openapi-collaboration-routes.d.ts +140 -5
- package/dist/server-shell/http/routes/project-api/openapi-collaboration-routes.js +29 -2
- package/dist/server-shell/http/routes/project-api/openapi-skills-routes.d.ts +2 -0
- package/dist/server-shell/http/routes/project-api/openapi-workspace-routes.d.ts +6 -0
- package/dist/server-shell/http/routes/project-api/openapi.d.ts +148 -5
- package/dist/server-shell/http/routes/project-api/schemas.d.ts +6 -0
- package/dist/server-shell/http/routes/project-api/schemas.js +1 -0
- package/dist/server-shell/http/routes/project-api/types.d.ts +1 -0
- package/dist/server-shell/http/routes/project-api/workflow-routes.js +39 -3
- package/dist/server-shell/http/routes/project-api/workspace-projections.js +1 -0
- package/dist/server-shell/http/validation.js +8 -2
- package/dist/server-shell/local-console/managed-project-service.d.ts +1 -1
- package/dist/server-shell/managed-access/transport.d.ts +1 -1
- package/migrations/0023_communication_language.sql +14 -0
- package/migrations/0024_chat_requests.sql +19 -0
- package/migrations/0025_task_compile_requests.sql +50 -0
- package/migrations/README.md +3 -1
- package/node_modules/@tutti/relay-client/dist/host-control.d.ts +1 -0
- package/node_modules/@tutti/relay-client/dist/host-control.js +1 -0
- package/node_modules/@tutti/shared/dist/schemas/api/index.d.ts +1 -0
- package/node_modules/@tutti/shared/dist/schemas/api/index.js +1 -0
- package/node_modules/@tutti/shared/dist/schemas/api/operation-status.d.ts +174 -0
- package/node_modules/@tutti/shared/dist/schemas/api/operation-status.js +75 -0
- package/node_modules/@tutti/shared/dist/schemas/api/primitives.d.ts +1 -0
- package/node_modules/@tutti/shared/dist/schemas/api/primitives.js +1 -0
- package/node_modules/@tutti/shared/dist/schemas/api/workspace-commands.d.ts +1 -0
- package/node_modules/@tutti/shared/dist/schemas/api/workspace-commands.js +2 -1
- package/package.json +1 -1
- package/prompts/README.md +1 -0
- package/prompts/chat-assistant.md +1 -1
- package/prompts/communication-language-result.md +27 -0
- package/prompts/communication-language.md +50 -0
- package/prompts/procedures/follow-up-check.md +1 -1
- package/prompts/procedures/scratchpad-refresh.md +2 -2
- package/prompts/procedures/task-compile.md +1 -1
- package/prompts/prompt-flow-map.md +2 -0
- package/web/assets/{homepage-motion-scene-DyEmWwvt.js → homepage-motion-scene-BcMt0AVW.js} +1 -1
- package/web/assets/index-2eX37Jx6.js +70 -0
- package/web/assets/index-BJvKuUiT.css +1 -0
- package/web/index.html +2 -2
- package/web/assets/index-By3idT4U.js +0 -70
- package/web/assets/index-DSBjOZmJ.css +0 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { type Static } from "@sinclair/typebox";
|
|
2
|
+
export declare const OperationFailureSchema: import("@sinclair/typebox").TObject<{
|
|
3
|
+
code: import("@sinclair/typebox").TString;
|
|
4
|
+
category: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"capacity" | "access" | "configuration" | "dependency" | "interrupted" | "internal">[]>;
|
|
5
|
+
recovery: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"resend_request" | "check_provider" | "restart_host" | "contact_support" | "none">[]>;
|
|
6
|
+
diagnostic_id: import("@sinclair/typebox").TString;
|
|
7
|
+
}>;
|
|
8
|
+
export declare const ChatRequestStatusSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
|
|
9
|
+
status: import("@sinclair/typebox").TLiteral<"queued">;
|
|
10
|
+
phase: import("@sinclair/typebox").TLiteral<"queue">;
|
|
11
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
12
|
+
kind: import("@sinclair/typebox").TLiteral<"chat_answer">;
|
|
13
|
+
ref: import("@sinclair/typebox").TString;
|
|
14
|
+
}>;
|
|
15
|
+
revision: import("@sinclair/typebox").TInteger;
|
|
16
|
+
created_at: import("@sinclair/typebox").TString;
|
|
17
|
+
updated_at: import("@sinclair/typebox").TString;
|
|
18
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
19
|
+
status: import("@sinclair/typebox").TLiteral<"running">;
|
|
20
|
+
phase: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"workspace_wait">, import("@sinclair/typebox").TLiteral<"answer">]>;
|
|
21
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
22
|
+
kind: import("@sinclair/typebox").TLiteral<"chat_answer">;
|
|
23
|
+
ref: import("@sinclair/typebox").TString;
|
|
24
|
+
}>;
|
|
25
|
+
revision: import("@sinclair/typebox").TInteger;
|
|
26
|
+
created_at: import("@sinclair/typebox").TString;
|
|
27
|
+
updated_at: import("@sinclair/typebox").TString;
|
|
28
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
29
|
+
status: import("@sinclair/typebox").TLiteral<"succeeded">;
|
|
30
|
+
phase: import("@sinclair/typebox").TLiteral<"settled">;
|
|
31
|
+
response_message_id: import("@sinclair/typebox").TString;
|
|
32
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
33
|
+
kind: import("@sinclair/typebox").TLiteral<"chat_answer">;
|
|
34
|
+
ref: import("@sinclair/typebox").TString;
|
|
35
|
+
}>;
|
|
36
|
+
revision: import("@sinclair/typebox").TInteger;
|
|
37
|
+
created_at: import("@sinclair/typebox").TString;
|
|
38
|
+
updated_at: import("@sinclair/typebox").TString;
|
|
39
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
40
|
+
status: import("@sinclair/typebox").TLiteral<"failed">;
|
|
41
|
+
phase: import("@sinclair/typebox").TLiteral<"settled">;
|
|
42
|
+
failure: import("@sinclair/typebox").TObject<{
|
|
43
|
+
code: import("@sinclair/typebox").TString;
|
|
44
|
+
category: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"capacity" | "access" | "configuration" | "dependency" | "interrupted" | "internal">[]>;
|
|
45
|
+
recovery: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"resend_request" | "check_provider" | "restart_host" | "contact_support" | "none">[]>;
|
|
46
|
+
diagnostic_id: import("@sinclair/typebox").TString;
|
|
47
|
+
}>;
|
|
48
|
+
response_message_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
49
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
50
|
+
kind: import("@sinclair/typebox").TLiteral<"chat_answer">;
|
|
51
|
+
ref: import("@sinclair/typebox").TString;
|
|
52
|
+
}>;
|
|
53
|
+
revision: import("@sinclair/typebox").TInteger;
|
|
54
|
+
created_at: import("@sinclair/typebox").TString;
|
|
55
|
+
updated_at: import("@sinclair/typebox").TString;
|
|
56
|
+
}>]>;
|
|
57
|
+
export type OperationFailure = Static<typeof OperationFailureSchema>;
|
|
58
|
+
export type ChatRequestStatus = Static<typeof ChatRequestStatusSchema>;
|
|
59
|
+
export declare const WorklistSubmissionStatusSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
|
|
60
|
+
status: import("@sinclair/typebox").TLiteral<"running">;
|
|
61
|
+
phase: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"preparing">, import("@sinclair/typebox").TLiteral<"scratchpad_refresh">, import("@sinclair/typebox").TLiteral<"reference_summary_refresh">, import("@sinclair/typebox").TLiteral<"project_context_bootstrap">, import("@sinclair/typebox").TLiteral<"task_compile">]>;
|
|
62
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
63
|
+
kind: import("@sinclair/typebox").TLiteral<"worklist_submit">;
|
|
64
|
+
ref: import("@sinclair/typebox").TString;
|
|
65
|
+
}>;
|
|
66
|
+
created_at: import("@sinclair/typebox").TString;
|
|
67
|
+
activity_ref: import("@sinclair/typebox").TString;
|
|
68
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
69
|
+
status: import("@sinclair/typebox").TLiteral<"waiting_input">;
|
|
70
|
+
phase: import("@sinclair/typebox").TLiteral<"clarification">;
|
|
71
|
+
round_id: import("@sinclair/typebox").TString;
|
|
72
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
73
|
+
kind: import("@sinclair/typebox").TLiteral<"worklist_submit">;
|
|
74
|
+
ref: import("@sinclair/typebox").TString;
|
|
75
|
+
}>;
|
|
76
|
+
created_at: import("@sinclair/typebox").TString;
|
|
77
|
+
activity_ref: import("@sinclair/typebox").TString;
|
|
78
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
79
|
+
status: import("@sinclair/typebox").TLiteral<"succeeded">;
|
|
80
|
+
phase: import("@sinclair/typebox").TLiteral<"settled">;
|
|
81
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
82
|
+
kind: import("@sinclair/typebox").TLiteral<"worklist_submit">;
|
|
83
|
+
ref: import("@sinclair/typebox").TString;
|
|
84
|
+
}>;
|
|
85
|
+
created_at: import("@sinclair/typebox").TString;
|
|
86
|
+
activity_ref: import("@sinclair/typebox").TString;
|
|
87
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
88
|
+
status: import("@sinclair/typebox").TLiteral<"failed">;
|
|
89
|
+
phase: import("@sinclair/typebox").TLiteral<"settled">;
|
|
90
|
+
failure: import("@sinclair/typebox").TObject<{
|
|
91
|
+
code: import("@sinclair/typebox").TString;
|
|
92
|
+
category: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"capacity" | "access" | "configuration" | "dependency" | "interrupted" | "internal">[]>;
|
|
93
|
+
recovery: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"resend_request" | "check_provider" | "restart_host" | "contact_support" | "none">[]>;
|
|
94
|
+
diagnostic_id: import("@sinclair/typebox").TString;
|
|
95
|
+
}>;
|
|
96
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
97
|
+
kind: import("@sinclair/typebox").TLiteral<"worklist_submit">;
|
|
98
|
+
ref: import("@sinclair/typebox").TString;
|
|
99
|
+
}>;
|
|
100
|
+
created_at: import("@sinclair/typebox").TString;
|
|
101
|
+
activity_ref: import("@sinclair/typebox").TString;
|
|
102
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
103
|
+
status: import("@sinclair/typebox").TLiteral<"unknown">;
|
|
104
|
+
phase: import("@sinclair/typebox").TLiteral<"unconfirmed">;
|
|
105
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
106
|
+
kind: import("@sinclair/typebox").TLiteral<"worklist_submit">;
|
|
107
|
+
ref: import("@sinclair/typebox").TString;
|
|
108
|
+
}>;
|
|
109
|
+
created_at: import("@sinclair/typebox").TString;
|
|
110
|
+
activity_ref: import("@sinclair/typebox").TString;
|
|
111
|
+
}>]>;
|
|
112
|
+
export declare const CurrentWorklistSubmissionSchema: import("@sinclair/typebox").TObject<{
|
|
113
|
+
request: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
|
|
114
|
+
status: import("@sinclair/typebox").TLiteral<"running">;
|
|
115
|
+
phase: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"preparing">, import("@sinclair/typebox").TLiteral<"scratchpad_refresh">, import("@sinclair/typebox").TLiteral<"reference_summary_refresh">, import("@sinclair/typebox").TLiteral<"project_context_bootstrap">, import("@sinclair/typebox").TLiteral<"task_compile">]>;
|
|
116
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
117
|
+
kind: import("@sinclair/typebox").TLiteral<"worklist_submit">;
|
|
118
|
+
ref: import("@sinclair/typebox").TString;
|
|
119
|
+
}>;
|
|
120
|
+
created_at: import("@sinclair/typebox").TString;
|
|
121
|
+
activity_ref: import("@sinclair/typebox").TString;
|
|
122
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
123
|
+
status: import("@sinclair/typebox").TLiteral<"waiting_input">;
|
|
124
|
+
phase: import("@sinclair/typebox").TLiteral<"clarification">;
|
|
125
|
+
round_id: import("@sinclair/typebox").TString;
|
|
126
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
127
|
+
kind: import("@sinclair/typebox").TLiteral<"worklist_submit">;
|
|
128
|
+
ref: import("@sinclair/typebox").TString;
|
|
129
|
+
}>;
|
|
130
|
+
created_at: import("@sinclair/typebox").TString;
|
|
131
|
+
activity_ref: import("@sinclair/typebox").TString;
|
|
132
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
133
|
+
status: import("@sinclair/typebox").TLiteral<"succeeded">;
|
|
134
|
+
phase: import("@sinclair/typebox").TLiteral<"settled">;
|
|
135
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
136
|
+
kind: import("@sinclair/typebox").TLiteral<"worklist_submit">;
|
|
137
|
+
ref: import("@sinclair/typebox").TString;
|
|
138
|
+
}>;
|
|
139
|
+
created_at: import("@sinclair/typebox").TString;
|
|
140
|
+
activity_ref: import("@sinclair/typebox").TString;
|
|
141
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
142
|
+
status: import("@sinclair/typebox").TLiteral<"failed">;
|
|
143
|
+
phase: import("@sinclair/typebox").TLiteral<"settled">;
|
|
144
|
+
failure: import("@sinclair/typebox").TObject<{
|
|
145
|
+
code: import("@sinclair/typebox").TString;
|
|
146
|
+
category: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"capacity" | "access" | "configuration" | "dependency" | "interrupted" | "internal">[]>;
|
|
147
|
+
recovery: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"resend_request" | "check_provider" | "restart_host" | "contact_support" | "none">[]>;
|
|
148
|
+
diagnostic_id: import("@sinclair/typebox").TString;
|
|
149
|
+
}>;
|
|
150
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
151
|
+
kind: import("@sinclair/typebox").TLiteral<"worklist_submit">;
|
|
152
|
+
ref: import("@sinclair/typebox").TString;
|
|
153
|
+
}>;
|
|
154
|
+
created_at: import("@sinclair/typebox").TString;
|
|
155
|
+
activity_ref: import("@sinclair/typebox").TString;
|
|
156
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
157
|
+
status: import("@sinclair/typebox").TLiteral<"unknown">;
|
|
158
|
+
phase: import("@sinclair/typebox").TLiteral<"unconfirmed">;
|
|
159
|
+
operation: import("@sinclair/typebox").TObject<{
|
|
160
|
+
kind: import("@sinclair/typebox").TLiteral<"worklist_submit">;
|
|
161
|
+
ref: import("@sinclair/typebox").TString;
|
|
162
|
+
}>;
|
|
163
|
+
created_at: import("@sinclair/typebox").TString;
|
|
164
|
+
activity_ref: import("@sinclair/typebox").TString;
|
|
165
|
+
}>]>, import("@sinclair/typebox").TNull]>;
|
|
166
|
+
}>;
|
|
167
|
+
export type WorklistSubmissionStatus = Static<typeof WorklistSubmissionStatusSchema>;
|
|
168
|
+
export type CurrentWorklistSubmission = Static<typeof CurrentWorklistSubmissionSchema>;
|
|
169
|
+
export declare const WorklistSubmissionQuerySchema: import("@sinclair/typebox").TObject<{
|
|
170
|
+
workflow_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
171
|
+
command_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
172
|
+
}>;
|
|
173
|
+
export type WorklistSubmissionQuery = Static<typeof WorklistSubmissionQuerySchema>;
|
|
174
|
+
//# sourceMappingURL=operation-status.d.ts.map
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { ActivityRefSchema, ClarificationRoundRefSchema, IdempotencyKeySchema, IsoDateTimeStringSchema, MessageIdSchema, WorkflowInvocationRefSchema, } from "../domain/index.js";
|
|
3
|
+
// Shared vocabulary, not a second Task/Run state machine. Add operation kinds only
|
|
4
|
+
// when an authoritative adapter and its query contract actually exist.
|
|
5
|
+
export const OperationFailureSchema = Type.Object({
|
|
6
|
+
code: Type.String({ pattern: "^[a-z][a-z0-9_]{0,63}$" }),
|
|
7
|
+
category: Type.Union(["capacity", "access", "configuration", "dependency", "interrupted", "internal"].map((value) => Type.Literal(value))),
|
|
8
|
+
recovery: Type.Union(["resend_request", "check_provider", "restart_host", "contact_support", "none"].map((value) => Type.Literal(value))),
|
|
9
|
+
diagnostic_id: Type.String({ pattern: "^[A-Za-z0-9_-]{1,128}$" }),
|
|
10
|
+
}, { additionalProperties: false });
|
|
11
|
+
const common = {
|
|
12
|
+
operation: Type.Object({ kind: Type.Literal("chat_answer"), ref: MessageIdSchema }, { additionalProperties: false }),
|
|
13
|
+
revision: Type.Integer({ minimum: 1 }),
|
|
14
|
+
created_at: IsoDateTimeStringSchema,
|
|
15
|
+
updated_at: IsoDateTimeStringSchema,
|
|
16
|
+
};
|
|
17
|
+
export const ChatRequestStatusSchema = Type.Union([
|
|
18
|
+
Type.Object({ ...common, status: Type.Literal("queued"), phase: Type.Literal("queue") }, { additionalProperties: false }),
|
|
19
|
+
Type.Object({
|
|
20
|
+
...common,
|
|
21
|
+
status: Type.Literal("running"),
|
|
22
|
+
phase: Type.Union([Type.Literal("workspace_wait"), Type.Literal("answer")]),
|
|
23
|
+
}, { additionalProperties: false }),
|
|
24
|
+
Type.Object({
|
|
25
|
+
...common,
|
|
26
|
+
status: Type.Literal("succeeded"),
|
|
27
|
+
phase: Type.Literal("settled"),
|
|
28
|
+
response_message_id: MessageIdSchema,
|
|
29
|
+
}, { additionalProperties: false }),
|
|
30
|
+
Type.Object({
|
|
31
|
+
...common,
|
|
32
|
+
status: Type.Literal("failed"),
|
|
33
|
+
phase: Type.Literal("settled"),
|
|
34
|
+
failure: OperationFailureSchema,
|
|
35
|
+
response_message_id: Type.Optional(MessageIdSchema),
|
|
36
|
+
}, { additionalProperties: false }),
|
|
37
|
+
]);
|
|
38
|
+
const submission = {
|
|
39
|
+
operation: Type.Object({ kind: Type.Literal("worklist_submit"), ref: WorkflowInvocationRefSchema }, { additionalProperties: false }),
|
|
40
|
+
created_at: IsoDateTimeStringSchema,
|
|
41
|
+
activity_ref: ActivityRefSchema,
|
|
42
|
+
};
|
|
43
|
+
export const WorklistSubmissionStatusSchema = Type.Union([
|
|
44
|
+
Type.Object({
|
|
45
|
+
...submission,
|
|
46
|
+
status: Type.Literal("running"),
|
|
47
|
+
phase: Type.Union([
|
|
48
|
+
Type.Literal("preparing"),
|
|
49
|
+
Type.Literal("scratchpad_refresh"),
|
|
50
|
+
Type.Literal("reference_summary_refresh"),
|
|
51
|
+
Type.Literal("project_context_bootstrap"),
|
|
52
|
+
Type.Literal("task_compile"),
|
|
53
|
+
]),
|
|
54
|
+
}, { additionalProperties: false }),
|
|
55
|
+
Type.Object({
|
|
56
|
+
...submission,
|
|
57
|
+
status: Type.Literal("waiting_input"),
|
|
58
|
+
phase: Type.Literal("clarification"),
|
|
59
|
+
round_id: ClarificationRoundRefSchema,
|
|
60
|
+
}, { additionalProperties: false }),
|
|
61
|
+
Type.Object({ ...submission, status: Type.Literal("succeeded"), phase: Type.Literal("settled") }, { additionalProperties: false }),
|
|
62
|
+
Type.Object({
|
|
63
|
+
...submission,
|
|
64
|
+
status: Type.Literal("failed"),
|
|
65
|
+
phase: Type.Literal("settled"),
|
|
66
|
+
failure: OperationFailureSchema,
|
|
67
|
+
}, { additionalProperties: false }),
|
|
68
|
+
Type.Object({ ...submission, status: Type.Literal("unknown"), phase: Type.Literal("unconfirmed") }, { additionalProperties: false }),
|
|
69
|
+
]);
|
|
70
|
+
export const CurrentWorklistSubmissionSchema = Type.Object({ request: Type.Union([WorklistSubmissionStatusSchema, Type.Null()]) }, { additionalProperties: false });
|
|
71
|
+
export const WorklistSubmissionQuerySchema = Type.Object({
|
|
72
|
+
workflow_ref: Type.Optional(WorkflowInvocationRefSchema),
|
|
73
|
+
command_id: Type.Optional(IdempotencyKeySchema),
|
|
74
|
+
}, { additionalProperties: false, maxProperties: 1 });
|
|
75
|
+
//# sourceMappingURL=operation-status.js.map
|
|
@@ -79,6 +79,7 @@ export declare const ApiErrorResponseSchema: import("@sinclair/typebox").TObject
|
|
|
79
79
|
message: import("@sinclair/typebox").TString;
|
|
80
80
|
retryable: import("@sinclair/typebox").TBoolean;
|
|
81
81
|
details: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnknown>;
|
|
82
|
+
request_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
82
83
|
}>;
|
|
83
84
|
}>;
|
|
84
85
|
export declare const WorkspaceSseEventTypeSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"connection.ready">, import("@sinclair/typebox").TLiteral<"message.created">, import("@sinclair/typebox").TLiteral<"scratchpad.updated">, import("@sinclair/typebox").TLiteral<"worklist.changed">, import("@sinclair/typebox").TLiteral<"task.updated">, import("@sinclair/typebox").TLiteral<"task_detail.updated">, import("@sinclair/typebox").TLiteral<"clarification.changed">, import("@sinclair/typebox").TLiteral<"approval.changed">, import("@sinclair/typebox").TLiteral<"activity.event">, import("@sinclair/typebox").TLiteral<"execution_status.changed">, import("@sinclair/typebox").TLiteral<"provider_config.changed">, import("@sinclair/typebox").TLiteral<"workspace.recovered">, import("@sinclair/typebox").TLiteral<"query.invalidate">]>;
|
|
@@ -115,6 +115,7 @@ export const ApiErrorResponseSchema = Type.Object({
|
|
|
115
115
|
message: Type.String({ minLength: 1 }),
|
|
116
116
|
retryable: Type.Boolean(),
|
|
117
117
|
details: Type.Optional(Type.Unknown()),
|
|
118
|
+
request_id: Type.Optional(Type.String({ pattern: "^[A-Za-z0-9_-]{1,128}$" })),
|
|
118
119
|
}, { additionalProperties: false }),
|
|
119
120
|
}, { additionalProperties: false });
|
|
120
121
|
export const WorkspaceSseEventTypeSchema = Type.Union([
|
|
@@ -106,6 +106,7 @@ export declare const SubmitWorklistDispositionSchema: import("@sinclair/typebox"
|
|
|
106
106
|
retry_with_new_command_id: import("@sinclair/typebox").TLiteral<true>;
|
|
107
107
|
}>]>;
|
|
108
108
|
export declare const SubmitWorklistResultSchema: import("@sinclair/typebox").TObject<{
|
|
109
|
+
submission_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
109
110
|
activity_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
110
111
|
workflow_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
111
112
|
}>;
|
|
@@ -2,7 +2,7 @@ import { Type } from "@sinclair/typebox";
|
|
|
2
2
|
import { ActivityRefSchema, ClarificationRoundRefSchema, ClarificationThreadRefSchema, IsoDateTimeStringSchema, TaskIdSchema, RunResultIdSchema, WorkflowInvocationRefSchema, } from "../domain/index.js";
|
|
3
3
|
import { ProviderUnavailableReasonCodeSchema } from "./provider-config.js";
|
|
4
4
|
import { InterruptedCommandDispositionSchema, NonEmptyStringSchema, commandEnvelopeSchema, commandResponseSchema, commandResponseWithResultSchema, } from "./primitives.js";
|
|
5
|
-
import { ProjectDocSummaryProjectionSchema, ViewerPathSchema
|
|
5
|
+
import { ProjectDocSummaryProjectionSchema, ViewerPathSchema } from "./viewer-reference.js";
|
|
6
6
|
import { ScratchpadProjectionSchema } from "./work-items.js";
|
|
7
7
|
export const RefreshScratchpadDispositionSchema = Type.Union([
|
|
8
8
|
Type.Object({ kind: Type.Literal("accepted") }, { additionalProperties: false }),
|
|
@@ -47,6 +47,7 @@ export const SubmitWorklistDispositionSchema = Type.Union([
|
|
|
47
47
|
InterruptedCommandDispositionSchema,
|
|
48
48
|
]);
|
|
49
49
|
export const SubmitWorklistResultSchema = Type.Object({
|
|
50
|
+
submission_ref: Type.Optional(WorkflowInvocationRefSchema),
|
|
50
51
|
activity_ref: Type.Optional(ActivityRefSchema),
|
|
51
52
|
workflow_ref: Type.Optional(WorkflowInvocationRefSchema),
|
|
52
53
|
}, { additionalProperties: false });
|
package/package.json
CHANGED
package/prompts/README.md
CHANGED
|
@@ -13,6 +13,7 @@ Prompt / skill 改造后的 live 实验计划与记录见 [prompt-flow-experimen
|
|
|
13
13
|
|
|
14
14
|
## 结构
|
|
15
15
|
|
|
16
|
+
- `communication-language.md`/`communication-language-result.md`:跨流程协作语言规则与内部 provider envelope;区分任务说明、交付物与已有文档语言,见[系统规范](../../../docs/system/communication-language.md)。
|
|
16
17
|
- `procedures/`:`scratchpad_refresh`、`project_brief_refresh`、`task_compile`、`project_context_bootstrap`、`context_sync`、`reference_summary_refresh`、`follow_up_check` 等 Procedure / workflow prompt。
|
|
17
18
|
- `artifacts/`:候选实现完成后的 transient Artifact applicability 判断;只接收 bounded task / diff / repo evidence,不写回 Task contract 或 repo。
|
|
18
19
|
- `runs/`:正式 task `Run`、task-bound continuation 与 pipeline self-correction retry 等 Run pipeline prompt;task contract 可附带 receipt-derived `source_messages`、已完成 Task Compile `clarification_rounds` 与 compact `recent_references`,两类 retry 都保留它们。provider transient retry 不新增 prompt,而是复用失败 attempt 的同一 prompt family。所有 Run prompt都以持久 project workspace为 cwd contract,不设计 promotion reconcile prompt。
|
|
@@ -8,7 +8,7 @@ model_path: codex.app_server.read_only
|
|
|
8
8
|
|
|
9
9
|
You are Tutti, a read-only project Q&A assistant participating in Tutti collaboration chat.
|
|
10
10
|
|
|
11
|
-
Answer the explicit `@tutti` question concisely,
|
|
11
|
+
Answer the explicit `@tutti` question concisely, following the communication-language policy when supplied; otherwise use the user's language. Use the supplied context for ordinary discussion; use attached read-only skills when the answer requires additional evidence.
|
|
12
12
|
|
|
13
13
|
# Instructions
|
|
14
14
|
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
template_key: communication_language_result
|
|
3
|
+
owner: communication-language
|
|
4
|
+
-->
|
|
5
|
+
|
|
6
|
+
## Language result envelope
|
|
7
|
+
|
|
8
|
+
The following workflow's entire business JSON belongs under `output`. Return exactly two
|
|
9
|
+
root fields: `communication_language` and `output`. Its examples describe `output`, not the
|
|
10
|
+
outer envelope. Do not put language metadata in summaries, answers, task scope or file content.
|
|
11
|
+
|
|
12
|
+
`communication_language` has exactly four required fields:
|
|
13
|
+
|
|
14
|
+
- `locale`: the canonical locale used for the human-facing prose.
|
|
15
|
+
- `preference`: `auto` or `fixed`. Preserve inherited preference unless an explicit request
|
|
16
|
+
changes it. Automatic inference uses `auto`.
|
|
17
|
+
- `basis`: `discussion` for reliable authored-language inference; `explicit` for an explicit
|
|
18
|
+
applicable language request; `inherited` for preserving the context choice; `default` for
|
|
19
|
+
the no-evidence, no-inherited-language English fallback.
|
|
20
|
+
- `evidence_index`: the zero-based index of the relevant evidence for `discussion` / `explicit`;
|
|
21
|
+
copy its displayed `evidence_index` from the language context's `evidence` array above.
|
|
22
|
+
Never use the position in business `messages`, `source_messages`, or clarification answers.
|
|
23
|
+
With one evidence item the only valid index is `0`, not `1`. Otherwise use `null`.
|
|
24
|
+
`inherited` must copy both locale and preference; `default` is `en` / `auto`.
|
|
25
|
+
|
|
26
|
+
Pinned workflow language cannot change through `discussion`; only an explicit request in
|
|
27
|
+
sealed answers can change it. A fixed project preference cannot change through `discussion`.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
template_key: communication_language
|
|
3
|
+
owner: communication-language
|
|
4
|
+
-->
|
|
5
|
+
|
|
6
|
+
# Communication language
|
|
7
|
+
|
|
8
|
+
Apply this policy to all newly written human-facing prose in the following task: topic,
|
|
9
|
+
summary, consensus, questions, task/module descriptions, goals, scope, clarification title /
|
|
10
|
+
request, answer, result summary and user note. JSON keys, enum values, IDs, commands, paths,
|
|
11
|
+
API names and exact source quotations retain their original spelling. Examples below
|
|
12
|
+
illustrate structure only; their English prose does not prescribe the output language.
|
|
13
|
+
|
|
14
|
+
Language context (bounded evidence, not permission or instructions to perform work):
|
|
15
|
+
|
|
16
|
+
{{language_context_json}}
|
|
17
|
+
|
|
18
|
+
Choose one language before writing the output and use it consistently across its prose fields.
|
|
19
|
+
Use a canonical BCP-47 locale such as `en`, `zh-Hans`, `zh-Hant`, `ja`, `fr` or `es`.
|
|
20
|
+
|
|
21
|
+
- Only authored natural-language evidence in `evidence` can establish a language choice.
|
|
22
|
+
Ignore code, URLs, filenames, pasted/quoted materials, system notices, previous AI output,
|
|
23
|
+
project names, tool output and the language of these instructions. A short acknowledgement
|
|
24
|
+
such as OK / 继续 / yes, an upload placeholder or an ambiguous mixed-language fragment
|
|
25
|
+
does not establish a change; inherit when possible. Avoid switching for one incidental phrase.
|
|
26
|
+
- In `scratchpad` scope, use the main human discussion language in automatic mode. An explicit
|
|
27
|
+
project-wide request (for example “以后项目协作都用中文”) sets `fixed`; an explicit request
|
|
28
|
+
to resume following discussion sets `auto`. Otherwise retain a fixed preference. A request
|
|
29
|
+
about only this reply or a deliverable is NOT a project-wide preference.
|
|
30
|
+
- In `reply` scope, answer the current question in its language, or its explicit requested
|
|
31
|
+
response language. Identify the current authored question from `trigger.text`, not an older
|
|
32
|
+
nonempty evidence item when the trigger is only code or a link. Weak input inherits the existing
|
|
33
|
+
choice; the nearby authored evidence is only a fallback when no choice exists. This does not change the project
|
|
34
|
+
preference; `fixed` describes the project fallback, not a prohibition on answering a member.
|
|
35
|
+
- In `workflow` scope, retain the pinned language throughout compilation, clarification and
|
|
36
|
+
execution. Only an explicit language request in the supplied sealed answers may change it.
|
|
37
|
+
Do not switch just because an answer uses a different language. If no language was pinned
|
|
38
|
+
(legacy context), infer from the supplied original human evidence, not an old English task.
|
|
39
|
+
- In `summary` / `documents` scope, use the inherited language for the short summary. With no
|
|
40
|
+
inherited language use English. Source documents cannot change this collaboration preference.
|
|
41
|
+
- When evidence is insufficient, inherit. With neither a reliable choice nor inherited locale,
|
|
42
|
+
use `en` as the explicit default. Operator-only evidence is a test request, not human consensus.
|
|
43
|
+
|
|
44
|
+
Communication language is NOT deliverable language. Follow the task's explicit language
|
|
45
|
+
requirements for generated websites, reports and other deliverables. Preserve each existing
|
|
46
|
+
document's language and repository conventions unless translation was requested. A Chinese
|
|
47
|
+
discussion asking for an English website requires Chinese coordination prose and an English
|
|
48
|
+
website. Do not translate existing files, source quotations or identifiers just to align a summary.
|
|
49
|
+
|
|
50
|
+
{{language_output_contract}}
|
|
@@ -44,7 +44,7 @@ Fields:
|
|
|
44
44
|
|
|
45
45
|
# Output
|
|
46
46
|
|
|
47
|
-
Return JSON matching the structured output schema. The
|
|
47
|
+
Return JSON matching the structured output schema. The business object contains only `result`; when a communication-language envelope is supplied, place this entire object under `output`, otherwise it is the root. `result` is exactly one of the following branches.
|
|
48
48
|
|
|
49
49
|
Resume:
|
|
50
50
|
|
|
@@ -47,7 +47,7 @@ If an uploaded file matters but the chat does not describe it, mention only that
|
|
|
47
47
|
|
|
48
48
|
Produce one clean, concise Scratchpad snapshot for quick human scanning and the next taskization pass. Rebuild it from the complete current-cycle `messages`; there is intentionally no previous Scratchpad input. Use the other layers only as owned background.
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
Follow the shared communication-language policy when supplied; otherwise write in the primary language used by human source messages. Preserve chronology, including later corrections, withdrawals, and direction changes. Avoid repeating the same fact across fields.
|
|
51
51
|
Keep the snapshot compact, but preserve user-provided non-secret details that are needed for taskization, implementation, or acceptance. Do not replace those details with vague placeholders.
|
|
52
52
|
Think one step ahead only when it is clearly useful: if the chat implies a website, app feature, or repository change, it is acceptable to mention likely affected surfaces such as frontend UI, backend/API/data, docs, tests, assets, or migration shape. Keep these as lightweight observations, not hidden requirements.
|
|
53
53
|
|
|
@@ -81,7 +81,7 @@ Do not use `needs_human` merely because the discussion is incomplete, informal,
|
|
|
81
81
|
|
|
82
82
|
## Output
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
The business object has exactly one key: `result`. When a communication-language envelope is supplied, place this entire object under `output`; otherwise it is the root. Branches are mutually exclusive:
|
|
85
85
|
|
|
86
86
|
- `ready`: include only `decision` and `scratchpad_snapshot`; do not include `request_payload`.
|
|
87
87
|
- `needs_human`: include only `decision` and `request_payload`; do not include `scratchpad_snapshot`.
|
|
@@ -85,7 +85,7 @@ Avoid repeating the same idea across `title`, `goal`, and `scope`. Keep the task
|
|
|
85
85
|
|
|
86
86
|
# Output
|
|
87
87
|
|
|
88
|
-
Return JSON matching the structured output schema. The
|
|
88
|
+
Return JSON matching the structured output schema. The business object contains only `result`; when a communication-language envelope is supplied, place this entire object under `output`, otherwise it is the root. `result` is exactly one of the following branches.
|
|
89
89
|
|
|
90
90
|
Ready example:
|
|
91
91
|
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
## 当前背景
|
|
8
8
|
|
|
9
|
+
跨流程语言前缀统一见 [communication-language.md](./communication-language.md)。Scratchpad/Task Compile/Follow-up 的实际 provider 输出增加外层 `{ communication_language, output }`,下文各自业务 JSON 形状位于 `output`;其他模型流程仅增加语言上下文提示。共享规则不改变冻结来源、skill selection、文档权限或历史正文,详见[系统规范](../../../docs/system/communication-language.md)。
|
|
10
|
+
|
|
9
11
|
模型调用当前分成三类:
|
|
10
12
|
|
|
11
13
|
- OpenAI SDK structured output:用于轻量结构化整理和判断。调用统一经过 Responses API strict JSON schema,schema 由 TypeScript 代码绑定,prompt 只能影响内容倾向,不能新增输出字段。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e,S as t,_ as n,a as r,b as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,n as p,o as m,p as h,r as g,s as _,t as v,u as y,v as b,w as x,x as S,y as C}from"./index-By3idT4U.js";var w=e(`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`}]]),T=e(`send`,[[`path`,{d:`M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z`,key:`1ffxy3`}],[`path`,{d:`m21.854 2.147-10.94 10.939`,key:`12cjpa`}]]),E=x();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=r((e-p.runEnd)/(p.executionComplete-p.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:e,assets:r}){let i=e>=p.artifactLive,a=e>=p.artifactClick,o=e>=p.runEnd&&e<p.executionComplete,u=d(e,p.runEnd,19.2),f=d(e,p.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:r.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:a?``:`is-active`,type:`button`,"aria-label":`Chat`,tabIndex:-1,children:(0,E.jsx)(c,{"aria-hidden":`true`})}),(0,E.jsx)(`button`,{type:`button`,"aria-label":`Worklist`,tabIndex:-1,children:(0,E.jsx)(b,{"aria-hidden":`true`})}),(0,E.jsxs)(`button`,{className:a?`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(f),children:`Live`}):null]}),(0,E.jsx)(`button`,{type:`button`,"aria-label":`References`,tabIndex:-1,children:(0,E.jsx)(C,{"aria-hidden":`true`})}),(0,E.jsx)(`button`,{type:`button`,"aria-label":`Skills`,tabIndex:-1,children:(0,E.jsx)(s,{"aria-hidden":`true`})}),(0,E.jsx)(`button`,{type:`button`,"aria-label":`Timeline`,tabIndex:-1,children:(0,E.jsx)(t,{"aria-hidden":`true`})})]}),o?(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)(n,{"aria-hidden":`true`})}):null]}),(0,E.jsx)(`button`,{className:`scene-settings`,type:`button`,"aria-label":`Settings`,tabIndex:-1,children:(0,E.jsx)(h,{"aria-hidden":`true`})})]})}function N({time:e,assets:t}){let n=d(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)(c,{"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:t.humanAvatars.fey,alt:``})}),(0,E.jsx)(`i`,{className:`is-blue`,children:(0,E.jsx)(`img`,{className:`scene-avatar-image`,src:t.humanAvatars.avery,alt:``})}),(0,E.jsx)(`i`,{className:`is-yellow`,children:(0,E.jsx)(`img`,{className:`scene-avatar-image`,src:t.humanAvatars.jun,alt:``})})]})]}),(0,E.jsxs)(`div`,{className:`scene-chat-stream`,children:[(0,E.jsx)(j,{progress:d(e,1.35,2.05),author:`Fey`,avatar:`fey`,tone:`green`,timestamp:`10:12`,online:!0,assets:t,children:`🏺 Let's build an online shop for our ceramics studio.`}),(0,E.jsx)(j,{progress:d(e,2.65,3.35),author:`Avery`,avatar:`avery`,tone:`blue`,timestamp:`10:13`,online:!0,assets:t,children:`✨ Keep it warm, minimal, and editorial.`}),(0,E.jsx)(j,{progress:d(e,3.95,4.65),author:`Jun`,avatar:`jun`,tone:`yellow`,timestamp:`10:14`,online:!0,assets:t,children:`🎨 Let people preview every piece in different glazes.`}),(0,E.jsx)(j,{progress:d(e,5.25,5.95),author:`Tutti`,avatar:`tutti`,tone:`green`,timestamp:`10:15`,assets:t,children:`Got it — I'll put it together. ✨`}),(0,E.jsxs)(`article`,{className:`scene-task-result`,style:D(n),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)(S,{})}),(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)(i,{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)(T,{})]})]})}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":d(e,p.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)(v,{"aria-hidden":`true`})}),(0,E.jsx)(`h2`,{children:`Scratchpad`})]}),(0,E.jsxs)(`div`,{className:`scene-scratchpad-body`,children:[(0,E.jsxs)(A,{progress:d(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:d(e,9.85,10.65),className:`scene-scratchpad-label`,children:`Confirmed`}),(0,E.jsx)(P,{progress:d(e,10.4,11.25),icon:(0,E.jsx)(S,{}),children:`Product-first editorial layout with generous space`}),(0,E.jsx)(P,{progress:d(e,11.2,12.05),icon:(0,E.jsx)(S,{}),children:`Warm neutrals with quiet serif headlines`}),(0,E.jsx)(P,{progress:d(e,12,12.85),icon:(0,E.jsx)(S,{}),children:`Keep the collection small, curated, and story-led`}),(0,E.jsx)(A,{progress:d(e,12.75,13.55),className:`scene-scratchpad-label`,children:`Requested feature`}),(0,E.jsx)(P,{progress:d(e,13.3,14.2),icon:(0,E.jsx)(o,{}),children:`Preview every piece in clay, sage, and ink glazes`})]}),(0,E.jsxs)(`footer`,{className:`scene-scratchpad-footer`,style:D(d(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)(f,{"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:t}){let r=d(e,18.92,19.2),i=_(e),a=i.id===`complete`,o={prepare:p.runEnd,implement:p.executionPrepareEnd,validate:p.executionImplementEnd,update:p.executionValidateEnd,complete:p.executionComplete}[i.id],s=d(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)(y,{})}),(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)(S,{}):(0,E.jsx)(n,{})}),(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:t,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=d(e,p.artifactClick,33.25),n=d(e,34.25,34.52),r=d(e,34.88,35.15),i=d(e,35.55,35.82),a=g(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=d(e,t,n,m);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>=p.runCursorStart&&e<18.92){let t=V(e,p.runCursorStart,p.runCursorArrive,{x:86,y:76},{x:94.25,y:94.2});return{visible:!0,x:t.x,y:t.y,clickPulse:H(e,p.runClickStart,p.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=u(e),r=U(e),i=a(e),o=d(e,.08,1.05,m);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:o,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)(w,{}),(0,E.jsx)(`i`,{})]})]})})}export{W as HomepageMotionScene};
|
|
1
|
+
import{C as e,S as t,_ as n,a as r,b as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,n as p,o as m,p as h,r as g,s as _,t as v,u as y,v as b,w as x,x as S,y as C}from"./index-2eX37Jx6.js";var w=e(`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`}]]),T=e(`send`,[[`path`,{d:`M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z`,key:`1ffxy3`}],[`path`,{d:`m21.854 2.147-10.94 10.939`,key:`12cjpa`}]]),E=x();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=r((e-p.runEnd)/(p.executionComplete-p.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:e,assets:r}){let i=e>=p.artifactLive,a=e>=p.artifactClick,o=e>=p.runEnd&&e<p.executionComplete,u=d(e,p.runEnd,19.2),f=d(e,p.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:r.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:a?``:`is-active`,type:`button`,"aria-label":`Chat`,tabIndex:-1,children:(0,E.jsx)(c,{"aria-hidden":`true`})}),(0,E.jsx)(`button`,{type:`button`,"aria-label":`Worklist`,tabIndex:-1,children:(0,E.jsx)(b,{"aria-hidden":`true`})}),(0,E.jsxs)(`button`,{className:a?`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(f),children:`Live`}):null]}),(0,E.jsx)(`button`,{type:`button`,"aria-label":`References`,tabIndex:-1,children:(0,E.jsx)(C,{"aria-hidden":`true`})}),(0,E.jsx)(`button`,{type:`button`,"aria-label":`Skills`,tabIndex:-1,children:(0,E.jsx)(s,{"aria-hidden":`true`})}),(0,E.jsx)(`button`,{type:`button`,"aria-label":`Timeline`,tabIndex:-1,children:(0,E.jsx)(t,{"aria-hidden":`true`})})]}),o?(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)(n,{"aria-hidden":`true`})}):null]}),(0,E.jsx)(`button`,{className:`scene-settings`,type:`button`,"aria-label":`Settings`,tabIndex:-1,children:(0,E.jsx)(h,{"aria-hidden":`true`})})]})}function N({time:e,assets:t}){let n=d(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)(c,{"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:t.humanAvatars.fey,alt:``})}),(0,E.jsx)(`i`,{className:`is-blue`,children:(0,E.jsx)(`img`,{className:`scene-avatar-image`,src:t.humanAvatars.avery,alt:``})}),(0,E.jsx)(`i`,{className:`is-yellow`,children:(0,E.jsx)(`img`,{className:`scene-avatar-image`,src:t.humanAvatars.jun,alt:``})})]})]}),(0,E.jsxs)(`div`,{className:`scene-chat-stream`,children:[(0,E.jsx)(j,{progress:d(e,1.35,2.05),author:`Fey`,avatar:`fey`,tone:`green`,timestamp:`10:12`,online:!0,assets:t,children:`🏺 Let's build an online shop for our ceramics studio.`}),(0,E.jsx)(j,{progress:d(e,2.65,3.35),author:`Avery`,avatar:`avery`,tone:`blue`,timestamp:`10:13`,online:!0,assets:t,children:`✨ Keep it warm, minimal, and editorial.`}),(0,E.jsx)(j,{progress:d(e,3.95,4.65),author:`Jun`,avatar:`jun`,tone:`yellow`,timestamp:`10:14`,online:!0,assets:t,children:`🎨 Let people preview every piece in different glazes.`}),(0,E.jsx)(j,{progress:d(e,5.25,5.95),author:`Tutti`,avatar:`tutti`,tone:`green`,timestamp:`10:15`,assets:t,children:`Got it — I'll put it together. ✨`}),(0,E.jsxs)(`article`,{className:`scene-task-result`,style:D(n),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)(S,{})}),(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)(i,{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)(T,{})]})]})}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":d(e,p.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)(v,{"aria-hidden":`true`})}),(0,E.jsx)(`h2`,{children:`Scratchpad`})]}),(0,E.jsxs)(`div`,{className:`scene-scratchpad-body`,children:[(0,E.jsxs)(A,{progress:d(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:d(e,9.85,10.65),className:`scene-scratchpad-label`,children:`Confirmed`}),(0,E.jsx)(P,{progress:d(e,10.4,11.25),icon:(0,E.jsx)(S,{}),children:`Product-first editorial layout with generous space`}),(0,E.jsx)(P,{progress:d(e,11.2,12.05),icon:(0,E.jsx)(S,{}),children:`Warm neutrals with quiet serif headlines`}),(0,E.jsx)(P,{progress:d(e,12,12.85),icon:(0,E.jsx)(S,{}),children:`Keep the collection small, curated, and story-led`}),(0,E.jsx)(A,{progress:d(e,12.75,13.55),className:`scene-scratchpad-label`,children:`Requested feature`}),(0,E.jsx)(P,{progress:d(e,13.3,14.2),icon:(0,E.jsx)(o,{}),children:`Preview every piece in clay, sage, and ink glazes`})]}),(0,E.jsxs)(`footer`,{className:`scene-scratchpad-footer`,style:D(d(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)(f,{"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:t}){let r=d(e,18.92,19.2),i=_(e),a=i.id===`complete`,o={prepare:p.runEnd,implement:p.executionPrepareEnd,validate:p.executionImplementEnd,update:p.executionValidateEnd,complete:p.executionComplete}[i.id],s=d(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)(y,{})}),(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)(S,{}):(0,E.jsx)(n,{})}),(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:t,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=d(e,p.artifactClick,33.25),n=d(e,34.25,34.52),r=d(e,34.88,35.15),i=d(e,35.55,35.82),a=g(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=d(e,t,n,m);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>=p.runCursorStart&&e<18.92){let t=V(e,p.runCursorStart,p.runCursorArrive,{x:86,y:76},{x:94.25,y:94.2});return{visible:!0,x:t.x,y:t.y,clickPulse:H(e,p.runClickStart,p.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=u(e),r=U(e),i=a(e),o=d(e,.08,1.05,m);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:o,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)(w,{}),(0,E.jsx)(`i`,{})]})]})})}export{W as HomepageMotionScene};
|