cozyclay 3.1.1 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/bin/agent/agent-routes.mjs +4 -4
- package/bin/agent/main-agent.mjs +21 -7
- package/bin/agent/main-prompt.mjs +7 -6
- package/bin/agent/script-tool.mjs +2 -1
- package/bin/agent/studio-prompt.mjs +1 -1
- package/bin/agent/studio-rebase.mjs +5 -4
- package/bin/agent/studio-task-routes.mjs +1 -1
- package/bin/agent/studio-tasks.mjs +116 -25
- package/bin/agent/studio-tools.mjs +3 -2
- package/bin/cozyclay.mjs +4 -2
- package/bin/live-endpoint.mjs +2 -0
- package/dist/app/index.html +6 -6
- package/dist/assets/TaskBoard-GR8xZm5c.js +1 -0
- package/dist/assets/{app-BlwOpest.css → app-Bhe0TpGz.css} +1 -1
- package/dist/assets/app-C4QTcDcb.js +5144 -0
- package/dist/assets/compile-worker-oy_P9HHh.js +6 -0
- package/dist/assets/motion3-compile-dgGhrvPK.js +1 -0
- package/dist/assets/scene-asset-sync-BEjjhNEo.css +1 -0
- package/dist/assets/scene-asset-sync-qoxcdrhj.js +13 -0
- package/dist/assets/task-board-BqReHzOi.js +15 -0
- package/dist/assets/workflow-C87p6E1E.js +179 -0
- package/dist/cozyclay-package.json +1 -1
- package/dist/index.html +1 -1
- package/dist/sitemap.xml +1 -1
- package/dist/workflow/index.html +4 -4
- package/mcp/README.md +1 -1
- package/mcp/live-hub.mjs +5 -3
- package/mcp/tool-handlers.mjs +5 -5
- package/package.json +1 -1
- package/src/App.jsx +42 -64
- package/src/bus-task-scopes.js +59 -11
- package/src/bus-task-targets.js +35 -9
- package/src/bus-tasks.js +23 -10
- package/src/command-bus.js +7 -4
- package/src/commands/ai.js +1 -1
- package/src/commands/export.js +1 -1
- package/src/commands/motion3.js +27 -7
- package/src/export-workspace.js +244 -0
- package/src/keyframe-pack.js +5 -1
- package/src/live-control.js +14 -7
- package/src/motion3/compile-job.js +15 -3
- package/src/motion3/compiler/channels.js +74 -24
- package/src/motion3/compiler/compile.js +2 -1
- package/src/motion3/compiler/idle.js +2 -0
- package/src/motion3/compiler/overlap.js +180 -0
- package/src/motion3/compiler/pose.js +6 -4
- package/src/motion3/compiler/validate-common.js +1 -0
- package/src/motion3/compiler/validate-parts.js +5 -1
- package/src/motion3/compiler/validate.js +30 -10
- package/src/motion3/correct.js +236 -0
- package/src/motion3/docs.js +8 -6
- package/src/motion3/face-lean.js +31 -0
- package/src/motion3/fix/index.js +5 -1
- package/src/motion3/fix/reach-body.js +172 -0
- package/src/motion3/hint-check.js +44 -0
- package/src/motion3/json-patch.js +120 -12
- package/src/motion3/lenient.js +46 -4
- package/src/motion3/object-keys.js +17 -5
- package/src/motion3/pipeline.js +46 -9
- package/src/motion3/qa/arm-checks.js +96 -0
- package/src/motion3/qa/asked.js +113 -0
- package/src/motion3/qa/goals.js +37 -8
- package/src/motion3/qa/hints-goal.js +6 -5
- package/src/motion3/qa/index.js +5 -2
- package/src/motion3/qa/key-checks.js +4 -3
- package/src/motion3/qa/motion-life.js +243 -0
- package/src/motion3/qa/spec-checks.js +15 -9
- package/src/motion3/qa/verdict.js +50 -0
- package/src/motion3/refs.js +38 -14
- package/src/motion3/repair-watch.js +132 -0
- package/src/motion3/repair.js +52 -19
- package/src/motion3/report.js +50 -9
- package/src/motion3/schema/topics.js +6 -4
- package/src/motion3/schema/types.js +1 -1
- package/src/motion3/skills/basic.js +15 -8
- package/src/motion3/skills/index.js +52 -18
- package/src/motion3/skills/info.js +1 -1
- package/src/motion3/skills/stance.js +6 -0
- package/src/motion3/skills/walk-fit.js +170 -0
- package/src/panels/PoseImagePanel.jsx +3 -2
- package/src/panels/SculptPanel.jsx +2 -2
- package/src/result-modal.jsx +3 -3
- package/src/shell/ExportFolderPreference.jsx +103 -0
- package/src/shell/PreferencesDialog.jsx +3 -166
- package/src/shell/StatusBar.jsx +1 -1
- package/src/shell/preference-controls.jsx +114 -0
- package/src/shell/preference-pages.jsx +72 -0
- package/src/shell/preferences.css +46 -0
- package/src/shot-prompt.js +29 -9
- package/src/studio-actions.js +2 -2
- package/src/studio-agent-motion.js +19 -9
- package/src/studio-agent-protocol.js +1 -1
- package/src/studio-app-binding.js +3 -2
- package/src/workflow/AgentPanel.jsx +2 -2
- package/src/workflow/CozySceneNode.jsx +1 -1
- package/src/workflow/WorkflowBuilder.jsx +2 -2
- package/src/workflow/keyframe-pack-request.js +3 -10
- package/src/workflow/task-board.css +1 -1
- package/src/workflow/task-board.js +7 -5
- package/tools/loc-baseline.json +1 -2
- package/tools/run-tests.mjs +5 -5
- package/dist/assets/TaskBoard-ngdqiu7u.js +0 -1
- package/dist/assets/app-DmR7jBkz.js +0 -5144
- package/dist/assets/compile-worker-D0pKioa0.js +0 -5
- package/dist/assets/motion3-compile-BB3_1-EB.js +0 -1
- package/dist/assets/scene-asset-sync-CBx7XRti.css +0 -1
- package/dist/assets/scene-asset-sync-Cgdtr1Yw.js +0 -13
- package/dist/assets/task-board-ErQvfoaz.js +0 -14
- package/dist/assets/workflow-zQM-EKW1.js +0 -179
|
@@ -58,7 +58,7 @@ export default function CozySceneNode({ id = "cozy-scene", data: rawData = {}, s
|
|
|
58
58
|
// No shotId: the Scene node tracks a scene, not a shot, so the embed
|
|
59
59
|
// packs the shot under its own playhead — the one being previewed.
|
|
60
60
|
const result = await requestKeyframePack(frame, { surface: "workflow" });
|
|
61
|
-
downloadPack(result);
|
|
61
|
+
await downloadPack(result);
|
|
62
62
|
attempt.succeed();
|
|
63
63
|
track("export:keyframe_pack", { entries: result.entries.length, source: "workflow" });
|
|
64
64
|
// QA hook, mirroring window.__cozyclay in the Studio: the analytics
|
|
@@ -13,7 +13,7 @@ import { FiActivity, FiBox, FiCode, FiFileText, FiFilm, FiImage, FiLink, FiMusic
|
|
|
13
13
|
import { Toaster, toast } from "react-hot-toast";
|
|
14
14
|
import { loadWorkflowGraph, normalizeWorkflowGraph, storeWorkflowGraph, WORKFLOW_STORAGE_KEY } from "../project.js";
|
|
15
15
|
import AgentPanel from "./AgentPanel.jsx";
|
|
16
|
-
import CozySceneNode from "./CozySceneNode.jsx";
|
|
16
|
+
import CozySceneNode from "./CozySceneNode.jsx"; import { saveExport } from "../export-workspace.js";
|
|
17
17
|
import { applyCozyScenePatch, normalizeCozySceneData, sceneConnectionAllowed } from "./cozy-scene-node.js";
|
|
18
18
|
import { activeSceneCharacters, characterHandleId, characterIdFromHandle, normalizeMotionInputData, motionInputOutput, parseMotionSpec } from "./motion-input.js";
|
|
19
19
|
import { DEFAULT_NODE_SCHEMAS, defaultFormValues, schemaCategoryForType, schemaModelEntries, schemaProperties } from "./node-schema.js";
|
|
@@ -652,7 +652,7 @@ export default function WorkflowBuilder() {
|
|
|
652
652
|
},
|
|
653
653
|
})), [changeModel, nodeSchemas, nodes, runScene, runWorkflow, sceneCharacters, sceneContext, sendSceneToVideo, updateNode, updateScene, uploadFile, useVersionAsReference]);
|
|
654
654
|
|
|
655
|
-
const exportGraph = useCallback(() => { const blob = new Blob([JSON.stringify(graph, null, 2)], { type: "application/json" });
|
|
655
|
+
const exportGraph = useCallback(async () => { const blob = new Blob([JSON.stringify(graph, null, 2)], { type: "application/json" }); await saveExport(blob, "cozyclay-workflow.json"); toast.success("Workflow exported"); }, [graph]);
|
|
656
656
|
const onConnect = useCallback((params) => {
|
|
657
657
|
const target = nodes.find((node) => node.id === params.target);
|
|
658
658
|
const source = nodes.find((node) => node.id === params.source);
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* window and the listener pair.
|
|
9
9
|
*/
|
|
10
10
|
import { exportFailureCode } from "../analytics.js";
|
|
11
|
+
import { saveExport } from "../export-workspace.js";
|
|
11
12
|
|
|
12
13
|
export const KEYFRAME_PACK_REQUEST = "cozyclay:export-keyframe-pack";
|
|
13
14
|
export const KEYFRAME_PACK_RESULT = "cozyclay:export-keyframe-pack-result";
|
|
@@ -64,15 +65,7 @@ export function requestKeyframePack(iframeWindow, {
|
|
|
64
65
|
});
|
|
65
66
|
}
|
|
66
67
|
|
|
67
|
-
/** Save a pack the browser already holds in memory. */
|
|
68
|
+
/** Save a pack the browser already holds in memory; resolves when handed off. */
|
|
68
69
|
export function downloadPack({ name, bytes }) {
|
|
69
|
-
|
|
70
|
-
const anchor = document.createElement("a");
|
|
71
|
-
anchor.href = url;
|
|
72
|
-
anchor.download = name || "cozyclay-shot.zip";
|
|
73
|
-
anchor.click();
|
|
74
|
-
// Revoking synchronously can race the download in some browsers; one task
|
|
75
|
-
// later is enough for the click to have been handed off.
|
|
76
|
-
setTimeout(() => URL.revokeObjectURL(url), 0);
|
|
77
|
-
return { name: anchor.download, url };
|
|
70
|
+
return saveExport(new Blob([bytes], { type: "application/zip" }), name || "cozyclay-shot.zip");
|
|
78
71
|
}
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
|
|
32
32
|
.task-dot { flex: none; width: 7px; height: 7px; border-radius: 50%; background: var(--text-3, var(--agent-text-dim)); }
|
|
33
33
|
[data-status="running"] > .task-dot, [data-status="starting"] > .task-dot { background: var(--select, var(--agent-accent)); animation: task-dot-pulse 1.2s ease-in-out infinite; }
|
|
34
|
-
[data-status="waiting"] > .task-dot, [data-status="queued"] > .task-dot { background: none; box-shadow: inset 0 0 0 1.5px var(--text-3, var(--agent-text-dim)); }
|
|
34
|
+
[data-status="waiting"] > .task-dot, [data-status="queued"] > .task-dot, [data-status="review"] > .task-dot { background: none; box-shadow: inset 0 0 0 1.5px var(--text-3, var(--agent-text-dim)); }
|
|
35
35
|
[data-status="done"] > .task-dot { background: var(--ok, var(--agent-ok)); }
|
|
36
36
|
[data-status="failed"] > .task-dot, [data-status="paused"] > .task-dot { background: var(--danger, var(--agent-alert)); }
|
|
37
37
|
@keyframes task-dot-pulse { 50% { opacity: 0.35; } }
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// toggle) or the server's COZYCLAY_STUDIO_TASKS flag: the chat then talks to the main agent (POST /agent/main), which
|
|
3
3
|
// answers at once and dispatches tasks; this board shows them. Pure parts here (the reducer, labels, the switch's
|
|
4
4
|
// storage); the network side is createTaskBoardClient; the view is TaskBoard.jsx.
|
|
5
|
-
// server events (GET /agent/main/<sessionId>/events): task.queued|waiting|started|resumed|paused|done|failed|cancelled
|
|
5
|
+
// server events (GET /agent/main/<sessionId>/events): task.queued|waiting|started|resumed|paused|review|done|failed|cancelled
|
|
6
6
|
// carry the task's view { taskId, title, status, scope, reason?, turnId?, usage, summary? }; task.sceneChanged
|
|
7
7
|
// { taskId, keys, midCommand }; main.turn { turnId } (the main agent reporting on its own)
|
|
8
8
|
// editor events (the command bus): task.userEdit { taskId, keys } (the user changed something in its scope)
|
|
@@ -25,6 +25,7 @@ export const TASK_STATUS_COPY = {
|
|
|
25
25
|
starting: ko("Starting", "시작 중"),
|
|
26
26
|
running: ko("Running", "작업 중"),
|
|
27
27
|
paused: ko("Paused: Studio lost", "일시정지: Studio 연결 끊김"),
|
|
28
|
+
review: ko("Being checked", "확인 중"),
|
|
28
29
|
done: ko("Done", "완료"),
|
|
29
30
|
failed: ko("Failed", "실패"),
|
|
30
31
|
cancelled: ko("Cancelled", "취소됨"),
|
|
@@ -92,15 +93,16 @@ export function boardGroups(board) {
|
|
|
92
93
|
const groups = { failed: [], running: [], waiting: [], done: [] };
|
|
93
94
|
for (const id of board.order) {
|
|
94
95
|
const task = board.tasks[id];
|
|
95
|
-
|
|
96
|
+
// review: the run ended but the coordinator still checks it, so it waits (and offers no cancel: not in ACTIVE_STATUSES).
|
|
97
|
+
const group = task.status === "failed" || task.status === "paused" ? "failed" : task.status === "running" || task.status === "starting" ? "running" : ACTIVE_STATUSES.has(task.status) || task.status === "review" ? "waiting" : "done";
|
|
96
98
|
groups[group].push(task);
|
|
97
99
|
}
|
|
98
100
|
return groups;
|
|
99
101
|
}
|
|
100
102
|
|
|
101
|
-
/** The task ids a turn's dispatch_task steps started, in order (a duplicate points at the task it repeats). */
|
|
102
|
-
export const dispatchedTaskIds = steps => (steps ?? []).filter(step => step.kind === "tool" && step.name
|
|
103
|
-
.
|
|
103
|
+
/** The task ids a turn's dispatch_task and dispatch_plan steps started, in order (a duplicate points at the task it repeats). */
|
|
104
|
+
export const dispatchedTaskIds = steps => (steps ?? []).filter(step => step.kind === "tool" && ["dispatch_task", "dispatch_plan"].includes(step.name))
|
|
105
|
+
.flatMap(step => (step.name === "dispatch_plan" ? step.result?.tasks ?? [] : [step.result])).map(result => result?.taskId ?? result?.duplicateOf).filter(Boolean);
|
|
104
106
|
|
|
105
107
|
/** What the task view shares between the headless board (TaskBoard.jsx) and the rows in the chat (TaskInline.jsx). */
|
|
106
108
|
function createTaskViewStore() {
|
package/tools/loc-baseline.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"mcp/verify-live-p0.mjs": 264,
|
|
16
16
|
"mcp/verify-live.mjs": 416,
|
|
17
17
|
"src/analytics.js": 1038,
|
|
18
|
-
"src/App.jsx":
|
|
18
|
+
"src/App.jsx": 4448,
|
|
19
19
|
"src/asset-pane.jsx": 643,
|
|
20
20
|
"src/camera-follow.js": 505,
|
|
21
21
|
"src/camera-move.js": 289,
|
|
@@ -58,7 +58,6 @@
|
|
|
58
58
|
"src/shell/BottomDock.jsx": 416,
|
|
59
59
|
"src/shell/DetailsSlot.jsx": 334,
|
|
60
60
|
"src/shell/MenuBar.jsx": 632,
|
|
61
|
-
"src/shell/PreferencesDialog.jsx": 269,
|
|
62
61
|
"src/shell/ViewportToolbar.jsx": 567,
|
|
63
62
|
"src/shot-authoring.js": 345,
|
|
64
63
|
"src/stage-canvas-rigs.jsx": 350,
|
package/tools/run-tests.mjs
CHANGED
|
@@ -14,7 +14,7 @@ if (!process.env.COZYCLAY_AGENT_SESSIONS_DIR) {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
const NODE_FILES = [
|
|
17
|
-
"test/motion3/verify-motion3-core.mjs", "test/motion3/verify-playback-frame-store.mjs", "test/verify-playback-render-isolation.mjs", "test/motion3/verify-motion3-idle.mjs", "test/motion3/verify-motion3-flip.mjs", "test/motion3/verify-motion3-timing.mjs", "test/motion3/verify-motion3-self.mjs", "test/motion3/verify-motion3-commands.mjs", "test/motion3/verify-motion3-exitcar.mjs", "test/motion3/verify-motion3-agentloop.mjs", "test/motion3/verify-motion3-search.mjs", "test/motion3/verify-motion3-skills.mjs", "test/motion3/verify-motion3-carried.mjs", "test/motion3/verify-motion3-people.mjs", "test/motion3/verify-motion3-hit.mjs", "test/motion3/verify-motion3-socket.mjs", "test/motion3/verify-motion3-shapes.mjs", "test/motion3/verify-motion3-grasp-fields.mjs", "test/motion3/verify-motion3-finger-contact.mjs", "test/motion3/verify-motion3-grasp-qa.mjs", "test/motion3/verify-motion3-load.mjs", "test/motion3/verify-motion3-throw.mjs", "test/motion3/verify-motion3-catch.mjs", "test/motion3/verify-motion3-grasp-hints.mjs", "test/motion3/verify-motion3-reach-human.mjs", "test/motion3/verify-motion3-stance-grasp.mjs", "test/motion3/verify-motion3-grasp-friction.mjs", "test/motion3/verify-motion3-grasp-measure.mjs", "test/motion3/verify-motion3-contracts.mjs", "test/motion3/verify-motion3-describe.mjs", "test/motion3/verify-motion3-timeline.mjs", "test/motion3/verify-motion3-probes.mjs", "test/motion3/verify-motion3-grab.mjs", "test/motion3/verify-motion3-grab-blend.mjs", "test/motion3/verify-motion3-patch.mjs", "test/motion3/verify-motion3-repair.mjs", "test/motion3/verify-motion3-specstore.mjs", "test/motion3/verify-motion3-visual.mjs", "test/motion3/verify-motion3-goals.mjs", "test/motion3/verify-motion3-prompt.mjs", "test/motion3/verify-motion3-cup.mjs", "test/verify-proxy-figure.mjs", "test/verify-text-object.mjs",
|
|
17
|
+
"test/motion3/verify-motion3-core.mjs", "test/motion3/verify-playback-frame-store.mjs", "test/verify-playback-render-isolation.mjs", "test/motion3/verify-motion3-idle.mjs", "test/motion3/verify-motion3-life.mjs", "test/motion3/verify-motion3-overlap.mjs", "test/motion3/verify-motion3-flip.mjs", "test/motion3/verify-motion3-timing.mjs", "test/motion3/verify-motion3-self.mjs", "test/motion3/verify-motion3-commands.mjs", "test/motion3/verify-motion3-exitcar.mjs", "test/motion3/verify-motion3-agentloop.mjs", "test/motion3/verify-motion3-search.mjs", "test/motion3/verify-motion3-skills.mjs", "test/motion3/verify-motion3-carried.mjs", "test/motion3/verify-motion3-people.mjs", "test/motion3/verify-motion3-hit.mjs", "test/motion3/verify-motion3-socket.mjs", "test/motion3/verify-motion3-shapes.mjs", "test/motion3/verify-motion3-grasp-fields.mjs", "test/motion3/verify-motion3-finger-contact.mjs", "test/motion3/verify-motion3-grasp-qa.mjs", "test/motion3/verify-motion3-load.mjs", "test/motion3/verify-motion3-throw.mjs", "test/motion3/verify-motion3-catch.mjs", "test/motion3/verify-motion3-grasp-hints.mjs", "test/motion3/verify-motion3-reach-human.mjs", "test/motion3/verify-motion3-stance-grasp.mjs", "test/motion3/verify-motion3-grasp-friction.mjs", "test/motion3/verify-motion3-grasp-measure.mjs", "test/motion3/verify-motion3-contracts.mjs", "test/motion3/verify-motion3-describe.mjs", "test/motion3/verify-motion3-timeline.mjs", "test/motion3/verify-motion3-probes.mjs", "test/motion3/verify-motion3-grab.mjs", "test/motion3/verify-motion3-grab-blend.mjs", "test/motion3/verify-motion3-patch.mjs", "test/motion3/verify-motion3-patch-keys.mjs", "test/motion3/verify-motion3-stuck.mjs", "test/motion3/verify-motion3-repair.mjs", "test/motion3/verify-motion3-specstore.mjs", "test/motion3/verify-motion3-visual.mjs", "test/motion3/verify-motion3-goals.mjs", "test/motion3/verify-motion3-prompt.mjs", "test/motion3/verify-motion3-cup.mjs", "test/motion3/verify-motion3-arm.mjs", "test/verify-proxy-figure.mjs", "test/verify-text-object.mjs",
|
|
18
18
|
"test/verify-proxy-figure-bounds.mjs",
|
|
19
19
|
"test/verify-character-capabilities.mjs",
|
|
20
20
|
"test/verify-root-path.mjs",
|
|
@@ -124,7 +124,7 @@ const NODE_FILES = [
|
|
|
124
124
|
"test/verify-mcp-invariants.mjs",
|
|
125
125
|
"test/verify-offscreen-export.mjs",
|
|
126
126
|
"test/verify-export-capture.mjs",
|
|
127
|
-
"test/verify-export-recovery.mjs",
|
|
127
|
+
"test/verify-export-recovery.mjs", "test/verify-export-workspace.mjs",
|
|
128
128
|
"test/verify-record-mp4-source.mjs",
|
|
129
129
|
"test/verify-timeline-extent.mjs",
|
|
130
130
|
"test/verify-otio.mjs",
|
|
@@ -196,7 +196,7 @@ const NODE_FILES = [
|
|
|
196
196
|
"mcp/verify-protocol-version.mjs",
|
|
197
197
|
"mcp/verify-tool-annotations.mjs",
|
|
198
198
|
"mcp/verify-import-mesh.mjs",
|
|
199
|
-
"mcp/verify-sculpt-object.mjs",
|
|
199
|
+
"mcp/verify-sculpt-object.mjs", "mcp/verify-project-camera.mjs",
|
|
200
200
|
"test/verify-object-path.mjs",
|
|
201
201
|
"test/verify-object-travel.mjs",
|
|
202
202
|
"test/verify-object-travel-lean.mjs",
|
|
@@ -216,7 +216,7 @@ const BROWSER_FILES = [
|
|
|
216
216
|
"test/qa-storyboard-export-browser.mjs",
|
|
217
217
|
"test/qa-proxy-figure-browser.mjs",
|
|
218
218
|
"test/qa-rail-lean-browser.mjs",
|
|
219
|
-
"test/qa-export-recovery-browser.mjs",
|
|
219
|
+
"test/qa-export-recovery-browser.mjs", "test/qa-export-workspace-browser.mjs",
|
|
220
220
|
"test/verify-camera-mode-browser.mjs",
|
|
221
221
|
"test/verify-camera-rail-browser.mjs",
|
|
222
222
|
"test/verify-cutout-browser.mjs",
|
|
@@ -255,7 +255,7 @@ const BROWSER_FILES = [
|
|
|
255
255
|
// The inventory sweep only picks up `verify*.mjs`; a browser suite named for
|
|
256
256
|
// the QA runner it needs is listed here so it still shows up in the manifest
|
|
257
257
|
// (as an EXCLUDE with its reason) instead of going unmentioned.
|
|
258
|
-
const EXTRA_INVENTORY = ["test/ik/translation-step.mjs", "test/qa-scenes-v5-migration-browser.mjs", "test/qa-agent-scenarios-browser.mjs", "test/qa-execution-outcomes-browser.mjs", "test/qa-export-recovery-browser.mjs", "test/qa-agent-view-toggle-browser.mjs", "test/qa-camera-pointer-lock-browser.mjs", "test/qa-first-edit-browser.mjs", "test/qa-ia-tail-browser.mjs", "test/qa-keyframe-pack-browser.mjs", "test/qa-preview-browser.mjs", "test/qa-reference-slots-browser.mjs", "test/qa-scene-playback-browser.mjs", "test/qa-scene-switcher-browser.mjs", "test/qa-send-to-ai-browser.mjs", "test/qa-view-menu-browser.mjs", "test/qa-live-reconnect-browser.mjs", "test/qa-clipboard-paste-browser.mjs", "test/qa-rail-lean-browser.mjs", "test/qa-rail-reach-browser.mjs", "test/qa-rail-ring-browser.mjs", "test/qa-speed-graph-browser.mjs"];
|
|
258
|
+
const EXTRA_INVENTORY = ["test/ik/translation-step.mjs", "test/qa-scenes-v5-migration-browser.mjs", "test/qa-agent-scenarios-browser.mjs", "test/qa-execution-outcomes-browser.mjs", "test/qa-export-recovery-browser.mjs", "test/qa-agent-view-toggle-browser.mjs", "test/qa-camera-pointer-lock-browser.mjs", "test/qa-first-edit-browser.mjs", "test/qa-ia-tail-browser.mjs", "test/qa-keyframe-pack-browser.mjs", "test/qa-preview-browser.mjs", "test/qa-reference-slots-browser.mjs", "test/qa-scene-playback-browser.mjs", "test/qa-scene-switcher-browser.mjs", "test/qa-send-to-ai-browser.mjs", "test/qa-view-menu-browser.mjs", "test/qa-live-reconnect-browser.mjs", "test/qa-clipboard-paste-browser.mjs", "test/qa-rail-lean-browser.mjs", "test/qa-rail-reach-browser.mjs", "test/qa-rail-ring-browser.mjs", "test/qa-speed-graph-browser.mjs", "test/qa-export-workspace-browser.mjs"];
|
|
259
259
|
|
|
260
260
|
EXTRA_INVENTORY.push("test/qa-proxy-figure-browser.mjs");
|
|
261
261
|
EXTRA_INVENTORY.push("test/qa-proxy-entry-browser.mjs");
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Ki as t,ai as n,c as r,d as i,f as a,l as o,m as s,o as c,v as l}from"./task-board-ErQvfoaz.js";import{o as u,r as d,t as f}from"./motion3-compile-BB3_1-EB.js";var p=e(t(),1),m=2e3,h=(e,t)=>new Promise(n=>{let r=setTimeout(n,e);t.addEventListener(`abort`,()=>{clearTimeout(r),n()},{once:!0})});function g(e,t){(0,p.useEffect)(()=>{let r=new Map;for(let[n,i]of Object.entries(e))for(let e of i)r.set(e,t[n]??n);let i=()=>{for(let e of document.querySelectorAll(`[data-node-id]`)){let t=r.get(e.getAttribute(`data-node-id`));t?(e.setAttribute(`data-task-scope`,t),e.setAttribute(`title`,n(`In task: ${t}`,`작업 중: ${t}`))):e.hasAttribute(`data-task-scope`)&&(e.removeAttribute(`data-task-scope`),e.removeAttribute(`title`))}};i();let a=new MutationObserver(i);return a.observe(document.body,{childList:!0,subtree:!0}),()=>{a.disconnect(),r.clear(),i()}},[e,t])}function _({sessionId:e,pulse:t,labelOf:n,onMainNote:_}){let v=(0,p.useMemo)(()=>c(),[]),y=u(),[b,x]=(0,p.useReducer)((e,t)=>t.seed?s(e,t.seed):t.reset?r():i(e,t.event),void 0,r),[S,C]=(0,p.useState)({}),[w,T]=(0,p.useState)(f),E=(0,p.useRef)(0),D=(0,p.useRef)(_);(0,p.useEffect)(()=>{E.current=b.after,D.current=_},[b.after,_]),(0,p.useEffect)(()=>{x({reset:!0}),E.current=0},[e]),(0,p.useEffect)(()=>d(T),[]),(0,p.useEffect)(()=>y.subscribe(e=>{typeof e?.type!=`string`||!e.type.startsWith(`task.`)||(C(t=>a(t,e)),(e.type===`task.userEdit`||e.type===`task.undone`)&&x({event:e}))}),[y]),(0,p.useEffect)(()=>{if(!e)return;let t=new AbortController;return(async()=>{for(;!t.signal.aborted;){try{let{tasks:n}=await v.board(e);x({seed:n}),await v.events(e,E.current,e=>{if(e.type===`main.turn`&&e.turnId){let n=``;v.frames(e.turnId,e=>{e.type===`text.delta`&&(n+=e.text??``),e.type===`tool.start`&&(n=``)},t.signal).then(()=>D.current?.(n),()=>{})}x({event:e})},t.signal)}catch{}await h(m,t.signal)}})(),()=>t.abort()},[v,e,t]);let O=b.order.filter(e=>b.tasks[e]?.status===`running`&&b.tasks[e]?.turnId),k=O.map(e=>`${e}:${b.tasks[e].turnId}`).join();return(0,p.useEffect)(()=>{let e=O.map(e=>{let t=new AbortController,{turnId:r}=b.tasks[e];return v.frames(r,t=>{let r=o(t,n);r&&x({event:{type:`task.progress`,taskId:e,status:`running`,progress:r}})},t.signal).catch(()=>{}),t});return()=>e.forEach(e=>e.abort())},[v,k,n]),g(S,(0,p.useMemo)(()=>Object.fromEntries(b.order.map(e=>[e,b.tasks[e].title])),[b])),(0,p.useEffect)(()=>{l.set({client:v,labelOf:n,undo:async e=>{let t=await y.run(`task.undo`,{taskId:e});if(t?.ok===!1)throw Error(t.message??t.code);x({event:{type:`task.undone`,taskId:e}})}})},[y,v,n]),(0,p.useEffect)(()=>{l.set({board:b,activity:w})},[b,w]),(0,p.useEffect)(()=>()=>l.set({board:r(),open:null}),[e]),null}export{_ as default};
|