From bc4fd70f412bae0bad9be8c4c3987b17d7b3d9b0 Mon Sep 17 00:00:00 2001 From: FaustusutsuaF <145342909+FaustusutsuaF@users.noreply.github.com> Date: Wed, 28 Oct 2026 22:30:52 +0800 Subject: [PATCH 1/2] feat(worker): export workflow and activity spans over OTLP (#61) Signed-off-by: FaustusutsuaF <145342909+FaustusutsuaF@users.noreply.github.com> --- PUBLIC_EXPORT_MANIFEST.json | 4204 +++++++++-------- apps/worker/package.json | 1 + apps/worker/src/activity-observability.ts | 43 +- apps/worker/src/memory-maintenance-worker.ts | 10 +- apps/worker/src/memory-mutation-worker.ts | 10 +- .../src/room-background-continuation.ts | 19 +- apps/worker/src/worker.ts | 17 +- .../workflow-observability-interceptors.ts | 170 + apps/worker/src/workflow-span-context.ts | 199 + apps/worker/src/workflow-spans-sink.ts | 111 + .../tests/activity-observability.test.ts | 39 +- .../room-background-continuation.test.ts | 14 +- apps/worker/tests/support/traced-workflows.ts | 75 + .../tests/workflow-span-context.test.ts | 152 + .../tests/workflow-span-integration.test.ts | 298 ++ apps/worker/tests/workflow-spans-sink.test.ts | 114 + docs/configuration-reference.md | 14 + docs/quality/KNOWN_LIMITATIONS.md | 2 +- docs/quality/observability.md | 36 +- docs/quality/review-findings.json | 2 +- package-lock.json | 20 + packages/contracts/src/observability.ts | 28 + packages/contracts/src/schemas.ts | 18 + .../contracts/tests/observability.test.ts | 14 + packages/runtime/src/otlp-span-exporter.ts | 39 +- .../tests/otlp-span-exporter-flush.test.ts | 94 + .../runtime/tests/otlp-span-links.test.ts | 73 + 27 files changed, 3715 insertions(+), 2101 deletions(-) create mode 100644 apps/worker/src/workflow-observability-interceptors.ts create mode 100644 apps/worker/src/workflow-span-context.ts create mode 100644 apps/worker/src/workflow-spans-sink.ts create mode 100644 apps/worker/tests/support/traced-workflows.ts create mode 100644 apps/worker/tests/workflow-span-context.test.ts create mode 100644 apps/worker/tests/workflow-span-integration.test.ts create mode 100644 apps/worker/tests/workflow-spans-sink.test.ts create mode 100644 packages/runtime/tests/otlp-span-exporter-flush.test.ts create mode 100644 packages/runtime/tests/otlp-span-links.test.ts diff --git a/PUBLIC_EXPORT_MANIFEST.json b/PUBLIC_EXPORT_MANIFEST.json index a5746cf44..282747c4c 100644 --- a/PUBLIC_EXPORT_MANIFEST.json +++ b/PUBLIC_EXPORT_MANIFEST.json @@ -2,7 +2,7 @@ "format": "spaceapp-public-export", "schemaVersion": 2, "sourceCommit": "8d5bf21b3228e5ea89557ab56b6a3bee352fc5a5", - "fileCount": 4948, + "fileCount": 4957, "transformations": 421, "files": [ { @@ -17,78 +17,12 @@ "sha256": "d299c7406ce2f3ce2bc0eb56bc1445a77f220602629c6644b9abeb62ebfdc9d8", "size": 9 }, - { - "path": "CONTRIBUTING.md", - "sourceObjectId": "078772388754304e33d238fefaad2f04e9120107", - "sha256": "14f559c40ed46089c3fb74339d1b225cdd817fc61ef5a39bf1dce8ea28a83216", - "size": 5143 - }, - { - "path": "LICENSE", - "sourceObjectId": "1eebfc1c4a99df80734f1c1418744ab1311027f1", - "sha256": "820058d133bb9e7dca206f310256375e2751ee23697489337a5337530458ac29", - "size": 1086 - }, - { - "path": "README.md", - "sourceObjectId": "fd303d486def36df68ab63e24b7d17b27e49299d", - "sha256": "386b6387952b4f05aae1f18cb5ca97d7c48296c5e552c7b5c267dff27396418f", - "size": 25012 - }, - { - "path": "THIRD_PARTY_LICENSES/caveman.txt", - "sourceObjectId": "1b482f11a13fdb89b4c5dc532dafe07bfc94d4eb", - "sha256": "011a77e083092af8774c74c8351d629e0b111c3255fb308c6a9cd46bdade7823", - "size": 14347 - }, - { - "path": "THIRD_PARTY_LICENSES/codex-lb.txt", - "sourceObjectId": "5c04dbd787f805212e38f0b498a663d01c8b040b", - "sha256": "4b5776e1f0fc8e87ae06b207b29d5c1d495694a7785f02a75ed5d8029ff2b09a", - "size": 1454 - }, - { - "path": "THIRD_PARTY_LICENSES/google-material-symbols.txt", - "sourceObjectId": "93d0008cc44359aebbc310d80bd5f548586cea81", - "sha256": "917c3e72b3f54147beb4912bbab7b4bbef4287b78a89b0c0c062a12c623a4675", - "size": 11640 - }, - { - "path": "THIRD_PARTY_LICENSES/headroom.txt", - "sourceObjectId": "210152d7b238c3f7884a28d11134d7ae74a6ad0e", - "sha256": "db2b817ecc04c139a7a62ba2d2ebdf82596b96a39ab156a226bbe32f7cff7049", - "size": 13513 - }, - { - "path": "THIRD_PARTY_LICENSES/ponytail.txt", - "sourceObjectId": "79ee101909076f21c51fb04438858db080a779c8", - "sha256": "916e5f3af739f03ff7ebf5a276d8d24b978b32d201e96568100988e0d97bb6fc", - "size": 1449 - }, - { - "path": "THIRD_PARTY_LICENSES/tree-sitter-grammars.txt", - "sourceObjectId": "654414787d876290d2111e1f00d537e17ef45c91", - "sha256": "09f262f08426edddfe08525956c44fbfd871ae6db362a16642c3f9f1916318b7", - "size": 2802 - }, - { - "path": "THIRD_PARTY_LICENSES/unidiff-rs.txt", - "sourceObjectId": "5658fc4cd77e8766417c639796370f6bc5b452c7", - "sha256": "e60c783cac3401b6b51870135027e660c3e91bb85fca02ab0fcb78b7741e0f7c", - "size": 1379 - }, { "path": "agent-skills/job-applications/SKILL.md", "sourceObjectId": "2c5d4975971fcb60a8984d450968ae8ea8436458", "sha256": "5502d723900c16de1c50db810eeb9f1f285060f324c6f75264643a7c934751d9", "size": 546 }, - { - "path": "agent-skills/space-active-agent-stress/SKILL.md", - "sourceObjectId": "6ddd6d181108ecce061c1624d4e4ea749f8463ae", - "sha256": "903e627048ff509eef4cec61642900de0050ba4f4da783161418405e8d0fc14b", - "size": 3704 - }, { "path": "agent-skills/space-active-agent-stress/agents/openai.yaml", "sourceObjectId": "067262dd9b4d5aab5c07ffd22d02f91c1ad51058", @@ -102,16 +36,10 @@ "size": 3545 }, { - "path": "agent-skills/space-anthropic-skills/SKILL.md", - "sourceObjectId": "3a520fffc85353ed72aebf366f9c8a4e2b229fe5", - "sha256": "875ae1a223aebe6fa46b9e04597ab0c2a04a3fe8c52e890c95e1b17305b4e35b", - "size": 1165 - }, - { - "path": "agent-skills/space-anthropic-skills/UPSTREAM.md", - "sourceObjectId": "ac42f9768c022c7ac6cbaa4349377888a4dfed3a", - "sha256": "967325c2aaad6a792026e7f607500e9f01eb35179f842c19dbc7a90bece3a58b", - "size": 1884 + "path": "agent-skills/space-active-agent-stress/SKILL.md", + "sourceObjectId": "6ddd6d181108ecce061c1624d4e4ea749f8463ae", + "sha256": "903e627048ff509eef4cec61642900de0050ba4f4da783161418405e8d0fc14b", + "size": 3704 }, { "path": "agent-skills/space-anthropic-skills/mcp-builder/LICENSE.txt", @@ -119,12 +47,6 @@ "sha256": "bc6b3af2f331cbc7fb0da1344efb2cbe5877a31498b4d70dbc7000f3405a1362", "size": 11345 }, - { - "path": "agent-skills/space-anthropic-skills/mcp-builder/SKILL.md", - "sourceObjectId": "49d97127f689906998067452f96d0c173388f6a5", - "sha256": "421d1d0db069f2ab55d25130fd6e720712686e718047b4e8e248da96c5f804ca", - "size": 11003 - }, { "path": "agent-skills/space-anthropic-skills/mcp-builder/reference/evaluation.md", "sourceObjectId": "e81c403c644803346e4b58f7b7ea7fac6b4ffa33", @@ -150,16 +72,10 @@ "size": 25099 }, { - "path": "agent-skills/space-anthropic-skills/skill-creator/LICENSE.txt", - "sourceObjectId": "4f881c52d1f72f4cfb720e339e2d35c3058d01a9", - "sha256": "bc6b3af2f331cbc7fb0da1344efb2cbe5877a31498b4d70dbc7000f3405a1362", - "size": 11345 - }, - { - "path": "agent-skills/space-anthropic-skills/skill-creator/SKILL.md", - "sourceObjectId": "31ad734c61ea0dfcd6a58971916d467a69d3d2e3", - "sha256": "afeac242534be1a59dcab8251556584fae099f08f08922e80f9d3e5ca3d240ca", - "size": 30177 + "path": "agent-skills/space-anthropic-skills/mcp-builder/SKILL.md", + "sourceObjectId": "49d97127f689906998067452f96d0c173388f6a5", + "sha256": "421d1d0db069f2ab55d25130fd6e720712686e718047b4e8e248da96c5f804ca", + "size": 11003 }, { "path": "agent-skills/space-anthropic-skills/skill-creator/agents/analyzer.md", @@ -197,6 +113,12 @@ "sha256": "a53213426ee1100441d701a3a0d49cda7a842f992d2c36463f4d3cc0258575fa", "size": 44998 }, + { + "path": "agent-skills/space-anthropic-skills/skill-creator/LICENSE.txt", + "sourceObjectId": "4f881c52d1f72f4cfb720e339e2d35c3058d01a9", + "sha256": "bc6b3af2f331cbc7fb0da1344efb2cbe5877a31498b4d70dbc7000f3405a1362", + "size": 11345 + }, { "path": "agent-skills/space-anthropic-skills/skill-creator/references/schemas.md", "sourceObjectId": "b6eeaa2d4a34c1653069585c6c5603da39a5bdbe", @@ -252,10 +174,22 @@ "size": 1661 }, { - "path": "agent-skills/space-app-diagnostics/SKILL.md", - "sourceObjectId": "87219f80c4eff121ca2cfc9148795de967d24377", - "sha256": "39f55e2a05ed45659aa9071076ac6d6f2a74c87f317dae59e86130d7ec657fb0", - "size": 6525 + "path": "agent-skills/space-anthropic-skills/skill-creator/SKILL.md", + "sourceObjectId": "31ad734c61ea0dfcd6a58971916d467a69d3d2e3", + "sha256": "afeac242534be1a59dcab8251556584fae099f08f08922e80f9d3e5ca3d240ca", + "size": 30177 + }, + { + "path": "agent-skills/space-anthropic-skills/SKILL.md", + "sourceObjectId": "3a520fffc85353ed72aebf366f9c8a4e2b229fe5", + "sha256": "875ae1a223aebe6fa46b9e04597ab0c2a04a3fe8c52e890c95e1b17305b4e35b", + "size": 1165 + }, + { + "path": "agent-skills/space-anthropic-skills/UPSTREAM.md", + "sourceObjectId": "ac42f9768c022c7ac6cbaa4349377888a4dfed3a", + "sha256": "967325c2aaad6a792026e7f607500e9f01eb35179f842c19dbc7a90bece3a58b", + "size": 1884 }, { "path": "agent-skills/space-app-diagnostics/agents/openai.yaml", @@ -270,10 +204,10 @@ "size": 6114 }, { - "path": "agent-skills/space-app-studio/SKILL.md", - "sourceObjectId": "9acc9deb144395967bc82f4ee47c9e8abd86653e", - "sha256": "2d9db639323ef68728d5e7797b5ca98c8a6bdecb36af1021608ab7de750a0f33", - "size": 9448 + "path": "agent-skills/space-app-diagnostics/SKILL.md", + "sourceObjectId": "87219f80c4eff121ca2cfc9148795de967d24377", + "sha256": "39f55e2a05ed45659aa9071076ac6d6f2a74c87f317dae59e86130d7ec657fb0", + "size": 6525 }, { "path": "agent-skills/space-app-studio/agents/openai.yaml", @@ -287,12 +221,24 @@ "sha256": "504d856917c8cea1692f5b066e263e0d634b6a42695cd77fe48597d72527dbd5", "size": 3369 }, + { + "path": "agent-skills/space-app-studio/SKILL.md", + "sourceObjectId": "9acc9deb144395967bc82f4ee47c9e8abd86653e", + "sha256": "2d9db639323ef68728d5e7797b5ca98c8a6bdecb36af1021608ab7de750a0f33", + "size": 9448 + }, { "path": "agent-skills/space-claude-security/LICENSE", "sourceObjectId": "aadec62f5cf87aae35a0423382bca6f2849abdb5", "sha256": "a9ac868c004c4cce26430b3117767b46397ba4fa25026b1e5ea6694b463baf4b", "size": 1065 }, + { + "path": "agent-skills/space-claude-security/security-review/security-review.md", + "sourceObjectId": "93651ea8b92194a1f739eaf5115ea493746df300", + "sha256": "dd1d451f909dbb8798f4a4de010c35e7dd9152f02bb2f7988442cdd138f29e39", + "size": 10837 + }, { "path": "agent-skills/space-claude-security/SKILL.md", "sourceObjectId": "ebff1d5546531b20b41f8d7a3278efaa37ad7881", @@ -305,18 +251,6 @@ "sha256": "900d5dbf3325d60d8e7943cdf12a40a51ef0306db051500521ec30593841e550", "size": 638 }, - { - "path": "agent-skills/space-claude-security/security-review/security-review.md", - "sourceObjectId": "93651ea8b92194a1f739eaf5115ea493746df300", - "sha256": "dd1d451f909dbb8798f4a4de010c35e7dd9152f02bb2f7988442cdd138f29e39", - "size": 10837 - }, - { - "path": "agent-skills/space-cli-render-diagnostics/SKILL.md", - "sourceObjectId": "c592bafa5b9a9ae83d54a4297de04e39e4b59ca7", - "sha256": "4e58650427f100fdc3c8c9ecbc21bc0f43a2cc8af28d538eb157320a7bcbc36b", - "size": 8490 - }, { "path": "agent-skills/space-cli-render-diagnostics/agents/openai.yaml", "sourceObjectId": "2d59bd62635d30452e158430671002f514ae411c", @@ -329,18 +263,18 @@ "sha256": "2eb2980c0c02d518ed0817dd11812b326b9166fd6acbce92126c856ebd24d899", "size": 2383 }, + { + "path": "agent-skills/space-cli-render-diagnostics/SKILL.md", + "sourceObjectId": "c592bafa5b9a9ae83d54a4297de04e39e4b59ca7", + "sha256": "4e58650427f100fdc3c8c9ecbc21bc0f43a2cc8af28d538eb157320a7bcbc36b", + "size": 8490 + }, { "path": "agent-skills/space-control-mcp/SKILL.md", "sourceObjectId": "f488174fd985056f99e772cedee40152c17ec2be", "sha256": "a5e234230921c39c21ec8e5d47c77adc9c48e3f4acb2b97045ff9cc337625032", "size": 10435 }, - { - "path": "agent-skills/space-design/SKILL.md", - "sourceObjectId": "b1ab798ba75c41ac94ecdd9bc7d6ab01c8f8944e", - "sha256": "77c97f4c251a7c04009805f3b20a802e394a4837433ae27d7d0c8d56d4117281", - "size": 8250 - }, { "path": "agent-skills/space-design/agents/openai.yaml", "sourceObjectId": "ae214368c1c569bed55bab55402dc97fd1217d12", @@ -378,10 +312,10 @@ "size": 2491 }, { - "path": "agent-skills/space-freelance-copilot/SKILL.md", - "sourceObjectId": "a93e86b46c9680ee57b7f1e771f4ef7575eaebe2", - "sha256": "40d6f5b670ece3b2476ec93040dbc5c9a5c08644904929d1a8081cb8421c996c", - "size": 14880 + "path": "agent-skills/space-design/SKILL.md", + "sourceObjectId": "b1ab798ba75c41ac94ecdd9bc7d6ab01c8f8944e", + "sha256": "77c97f4c251a7c04009805f3b20a802e394a4837433ae27d7d0c8d56d4117281", + "size": 8250 }, { "path": "agent-skills/space-freelance-copilot/agents/openai.yaml", @@ -408,22 +342,10 @@ "size": 1185 }, { - "path": "agent-skills/space-google-workspace/LICENSE", - "sourceObjectId": "d645695673349e3947e8e5ae42332d0ac3164cd7", - "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", - "size": 11358 - }, - { - "path": "agent-skills/space-google-workspace/SKILL.md", - "sourceObjectId": "757801948d74a60d145551cc7c54602fe9f69019", - "sha256": "fd80e36fa3da71c33095f1f7ea11a62d0ace41e9de73afd8311b5bbd7869ded4", - "size": 2936 - }, - { - "path": "agent-skills/space-google-workspace/UPSTREAM.md", - "sourceObjectId": "c42b6c7da8097c860c9db5e83ba1af6a5a1145bb", - "sha256": "5cc4fbcf3149bc22f8857ea97c7863809fcdc5f7efdbc7d26193369328477820", - "size": 1668 + "path": "agent-skills/space-freelance-copilot/SKILL.md", + "sourceObjectId": "a93e86b46c9680ee57b7f1e771f4ef7575eaebe2", + "sha256": "40d6f5b670ece3b2476ec93040dbc5c9a5c08644904929d1a8081cb8421c996c", + "size": 14880 }, { "path": "agent-skills/space-google-workspace/gws-admin-reports/SKILL.md", @@ -689,6 +611,12 @@ "sha256": "17b209c8ed5e3aa0ed5df768d007e5c7098c2693fde97fe2500dc9613708103f", "size": 1423 }, + { + "path": "agent-skills/space-google-workspace/LICENSE", + "sourceObjectId": "d645695673349e3947e8e5ae42332d0ac3164cd7", + "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "size": 11358 + }, { "path": "agent-skills/space-google-workspace/persona-content-creator/SKILL.md", "sourceObjectId": "f9846fc6c4e6180fe47455f5473b29db26c7ec75", @@ -996,22 +924,16 @@ "size": 922 }, { - "path": "agent-skills/space-gstack/SKILL.md", - "sourceObjectId": "8a9f6027400ca9d143e9c3371db365f541fb03e7", - "sha256": "99800e841ae21f503401aa46e97285c5e5ca6962d4cba0b4552c89802b3c7dde", - "size": 3032 - }, - { - "path": "agent-skills/space-gstack/UPSTREAM.md", - "sourceObjectId": "28f1d335647640a225176387406311451fb11723", - "sha256": "1346f6911bde1898f0681de08e063f502a48cb0cde4b251a80ad39ec1a2e0d3e", - "size": 7389 + "path": "agent-skills/space-google-workspace/SKILL.md", + "sourceObjectId": "757801948d74a60d145551cc7c54602fe9f69019", + "sha256": "fd80e36fa3da71c33095f1f7ea11a62d0ace41e9de73afd8311b5bbd7869ded4", + "size": 2936 }, { - "path": "agent-skills/space-gstack/document-release/SKILL.md", - "sourceObjectId": "404531ed3ab9f93d02cb97150d99b2dafa281cd9", - "sha256": "96369e219d851db5b0931f42c96095d4631a90f6cb1b3f1589c1f0bf99b45c41", - "size": 11327 + "path": "agent-skills/space-google-workspace/UPSTREAM.md", + "sourceObjectId": "c42b6c7da8097c860c9db5e83ba1af6a5a1145bb", + "sha256": "5cc4fbcf3149bc22f8857ea97c7863809fcdc5f7efdbc7d26193369328477820", + "size": 1668 }, { "path": "agent-skills/space-gstack/document-release/sections/audit-scope.md", @@ -1025,6 +947,12 @@ "sha256": "ab34b1c64fa2fcf3044ef57b811222edc3129513c1d91ae42dcfa895ac2cb34a", "size": 13379 }, + { + "path": "agent-skills/space-gstack/document-release/SKILL.md", + "sourceObjectId": "404531ed3ab9f93d02cb97150d99b2dafa281cd9", + "sha256": "96369e219d851db5b0931f42c96095d4631a90f6cb1b3f1589c1f0bf99b45c41", + "size": 11327 + }, { "path": "agent-skills/space-gstack/office-hours/SKILL.md", "sourceObjectId": "2b35886db97fa6789d6be186f880e598ec00026b", @@ -1037,24 +965,30 @@ "sha256": "88b3438c9483048a32d8f3c3b02aa97372a6967e6f9797e16c1396db09f96c28", "size": 12074 }, - { - "path": "agent-skills/space-gstack/plan-eng-review/SKILL.md", - "sourceObjectId": "8788b1a606cbb13006f6499b9f4b4915e042b875", - "sha256": "06974644ab10f7e18a4723eb16d0f052cefb34a5def4754bcd66159725ab3097", - "size": 17448 - }, { "path": "agent-skills/space-gstack/plan-eng-review/sections/review-sections.md", "sourceObjectId": "c074eaf850e89c1ca1e0f0645d7ba5614c93edca", "sha256": "932289b4ecd0ff2362f9b14a3d73234ecd19dfc37e5e353da776fad60e155be5", "size": 58730 }, + { + "path": "agent-skills/space-gstack/plan-eng-review/SKILL.md", + "sourceObjectId": "8788b1a606cbb13006f6499b9f4b4915e042b875", + "sha256": "06974644ab10f7e18a4723eb16d0f052cefb34a5def4754bcd66159725ab3097", + "size": 17448 + }, { "path": "agent-skills/space-gstack/retro/SKILL.md", "sourceObjectId": "54f10e862721bcb994d94f5ff158c151b2a8011a", "sha256": "cb9ae664a94d93f1dd6353c1888898a5dd8cc097640fff65b4f2a6b908300d91", "size": 12274 }, + { + "path": "agent-skills/space-gstack/SKILL.md", + "sourceObjectId": "8a9f6027400ca9d143e9c3371db365f541fb03e7", + "sha256": "99800e841ae21f503401aa46e97285c5e5ca6962d4cba0b4552c89802b3c7dde", + "size": 3032 + }, { "path": "agent-skills/space-gstack/test-audit/SKILL.md", "sourceObjectId": "b482787383208933e63df6869f829d99d7f85a1c", @@ -1062,46 +996,10 @@ "size": 13394 }, { - "path": "agent-skills/space-huashu-design/SKILL.md", - "sourceObjectId": "54e2878f739695231bf1189241008edbae902bb2", - "sha256": "2384d6278ba8ff0be6ed34b146115082a987c6b76bce839a6c6b885e80047c7c", - "size": 3435 - }, - { - "path": "agent-skills/space-huashu-design/UPSTREAM.md", - "sourceObjectId": "72fe3c1f689d92a9389a6cf8a77371079a7d506a", - "sha256": "8131904769f83c0733599991c263f9427e5b59763cd52fc216205e41f426eeef", - "size": 2610 - }, - { - "path": "agent-skills/space-huashu-design/huashu-design/LICENSE", - "sourceObjectId": "ed67368a2a79ed7be97b2a4852330cdac5b8b12a", - "sha256": "6d6a2a9caf2e6d2b76974050427053b2892d8aa4c33fd168ce63a537fcee9d96", - "size": 1086 - }, - { - "path": "agent-skills/space-huashu-design/huashu-design/README.en.md", - "sourceObjectId": "f88df6255c679147b6873b1275ea13601ecb1b57", - "sha256": "c1b09cb4b11065bea973323051858b40e4a44a5d6cce2bf8299cec1eea35f5fd", - "size": 18758 - }, - { - "path": "agent-skills/space-huashu-design/huashu-design/README.md", - "sourceObjectId": "4b79e8757052ea617c15f14c2991e78f719d013c", - "sha256": "4b4ad3824e5b1854421d573de1ae0be13eda18d27dfdda230b0745cbf5cdae07", - "size": 19726 - }, - { - "path": "agent-skills/space-huashu-design/huashu-design/SECURITY.md", - "sourceObjectId": "90b8286cf0d76bdd2614f2e36e987ce327df623b", - "sha256": "ee84ca336248b8f73568f9b9920b4d01385ca4608739be251355908c7bd4eaa3", - "size": 5226 - }, - { - "path": "agent-skills/space-huashu-design/huashu-design/SKILL.md", - "sourceObjectId": "f82221435cb0812709204b96b61f52286647e833", - "sha256": "aca3abfeeaf95f936f8d400825bf585f819d9b11c200dc4d13c2dc8576cedc9f", - "size": 65271 + "path": "agent-skills/space-gstack/UPSTREAM.md", + "sourceObjectId": "28f1d335647640a225176387406311451fb11723", + "sha256": "1346f6911bde1898f0681de08e063f502a48cb0cde4b251a80ad39ec1a2e0d3e", + "size": 7389 }, { "path": "agent-skills/space-huashu-design/huashu-design/assets/android_frame.jsx", @@ -1181,12 +1079,6 @@ "sha256": "b35ca20aa41f6a52ad7248969a25eadaf607d3379f79fd1f4cb841fca423886c", "size": 1826 }, - { - "path": "agent-skills/space-huashu-design/huashu-design/assets/showcases/INDEX.md", - "sourceObjectId": "b934665e1fb49a65847cba01d25e00745c3a7591", - "sha256": "01a3b2a574c12ba811edb37c698672680c4cd7e7d64a2edd69c6ea1a78b9c74d", - "size": 5538 - }, { "path": "agent-skills/space-huashu-design/huashu-design/assets/showcases/cover/cover-build.html", "sourceObjectId": "25380833bdcabc776aa1efc278f1bb606c7fdb13", @@ -1205,6 +1097,12 @@ "sha256": "c8436fb562d34a76931bc936bcbd907be2d29ea33b476d306b3a80b5c9594b1b", "size": 11823 }, + { + "path": "agent-skills/space-huashu-design/huashu-design/assets/showcases/INDEX.md", + "sourceObjectId": "b934665e1fb49a65847cba01d25e00745c3a7591", + "sha256": "01a3b2a574c12ba811edb37c698672680c4cd7e7d64a2edd69c6ea1a78b9c74d", + "size": 5538 + }, { "path": "agent-skills/space-huashu-design/huashu-design/assets/showcases/infographic/infographic-build.html", "sourceObjectId": "325c2fa5edcfb841c2796980d28ef8904986ce90", @@ -1469,12 +1367,30 @@ "sha256": "2ec9e8ed6c897d7e196dca3d6820cf92f1bb9408ad80bc4b964d746102d4b09d", "size": 26413 }, + { + "path": "agent-skills/space-huashu-design/huashu-design/LICENSE", + "sourceObjectId": "ed67368a2a79ed7be97b2a4852330cdac5b8b12a", + "sha256": "6d6a2a9caf2e6d2b76974050427053b2892d8aa4c33fd168ce63a537fcee9d96", + "size": 1086 + }, { "path": "agent-skills/space-huashu-design/huashu-design/package.json", "sourceObjectId": "b4e196f955f8bbce979773d54b6618e15f69c7f0", "sha256": "b87b4e078e1372c337a7616ff42181fd54a47cd2d459742d363264984de0ef3f", "size": 133 }, + { + "path": "agent-skills/space-huashu-design/huashu-design/README.en.md", + "sourceObjectId": "f88df6255c679147b6873b1275ea13601ecb1b57", + "sha256": "c1b09cb4b11065bea973323051858b40e4a44a5d6cce2bf8299cec1eea35f5fd", + "size": 18758 + }, + { + "path": "agent-skills/space-huashu-design/huashu-design/README.md", + "sourceObjectId": "4b79e8757052ea617c15f14c2991e78f719d013c", + "sha256": "4b4ad3824e5b1854421d573de1ae0be13eda18d27dfdda230b0745cbf5cdae07", + "size": 19726 + }, { "path": "agent-skills/space-huashu-design/huashu-design/references/ai-video-review.md", "sourceObjectId": "a4f80a1f9f45e04cf0f20736b4176a4c89ac716e", @@ -1793,6 +1709,18 @@ "sha256": "7a0a3243f51a1c816944a948a5caba239c63c9890327a60d80934d493153e9e4", "size": 5451 }, + { + "path": "agent-skills/space-huashu-design/huashu-design/SECURITY.md", + "sourceObjectId": "90b8286cf0d76bdd2614f2e36e987ce327df623b", + "sha256": "ee84ca336248b8f73568f9b9920b4d01385ca4608739be251355908c7bd4eaa3", + "size": 5226 + }, + { + "path": "agent-skills/space-huashu-design/huashu-design/SKILL.md", + "sourceObjectId": "f82221435cb0812709204b96b61f52286647e833", + "sha256": "aca3abfeeaf95f936f8d400825bf585f819d9b11c200dc4d13c2dc8576cedc9f", + "size": 65271 + }, { "path": "agent-skills/space-huashu-design/huashu-design/test-prompts.json", "sourceObjectId": "b2daacd4454212745d09ccff21bc66ba36e0c446", @@ -1800,22 +1728,16 @@ "size": 2760 }, { - "path": "agent-skills/space-hyperframes/LICENSE", - "sourceObjectId": "ae06b37e1c5116ccfaa615ac25ec1aabf5658d8c", - "sha256": "4259155fb06f127687ee7b0a8a3682d45132db0f2da26cbc0b7a2d1e796436b8", - "size": 10763 - }, - { - "path": "agent-skills/space-hyperframes/SKILL.md", - "sourceObjectId": "e204e423cb4b3ea6f20edb93bd5ef7564d0cc63a", - "sha256": "0dbe07caa91dbd71f3db3765a6e36dd0c1ee1a4e167f8eaf280b7b731d1779f8", - "size": 2542 + "path": "agent-skills/space-huashu-design/SKILL.md", + "sourceObjectId": "54e2878f739695231bf1189241008edbae902bb2", + "sha256": "2384d6278ba8ff0be6ed34b146115082a987c6b76bce839a6c6b885e80047c7c", + "size": 3435 }, { - "path": "agent-skills/space-hyperframes/UPSTREAM.md", - "sourceObjectId": "87072bac0de4220c7ebc3e8910de2a5ea2d0718c", - "sha256": "72e2ab786302dc6cc117a53bc4e7cedcf524f42e9681c19f50a52139912c5507", - "size": 1882 + "path": "agent-skills/space-huashu-design/UPSTREAM.md", + "sourceObjectId": "72fe3c1f689d92a9389a6cf8a77371079a7d506a", + "sha256": "8131904769f83c0733599991c263f9427e5b59763cd52fc216205e41f426eeef", + "size": 2610 }, { "path": "agent-skills/space-hyperframes/embedded-captions/.gitignore", @@ -1823,18 +1745,6 @@ "sha256": "f48ec93898d7c053f987a8d2904e6923af09900358ad39a9e4d2e6c61eb52f97", "size": 516 }, - { - "path": "agent-skills/space-hyperframes/embedded-captions/CATALOG.md", - "sourceObjectId": "8e6d1cd1cc49475b4c6c2c2d61ac1e249f835d1f", - "sha256": "f1eb0a6781980862fac9bbfe06be5bc9f70d5fb9c493aa159c82673b33379585", - "size": 54574 - }, - { - "path": "agent-skills/space-hyperframes/embedded-captions/SKILL.md", - "sourceObjectId": "eadedc22341d1c02e66f2d75f26d2e083a87ac37", - "sha256": "983a4e61310d05c4a5c5a4fff2262c24ef1929478831e3afb76b0ab584b09bce", - "size": 34642 - }, { "path": "agent-skills/space-hyperframes/embedded-captions/assets/fonts/char-widths.json", "sourceObjectId": "55b37510169d05933b9475b9aab9bd81d2b84467", @@ -1854,10 +1764,10 @@ "size": 71046 }, { - "path": "agent-skills/space-hyperframes/embedded-captions/dna/README.md", - "sourceObjectId": "af5cdc74dd0249ceb2266c46620597ea5742d3a6", - "sha256": "3e0dcb20140a8d73ea166dfde7af27f5d4cd492fd9ad2805c5c8dd064ba58f1c", - "size": 12207 + "path": "agent-skills/space-hyperframes/embedded-captions/CATALOG.md", + "sourceObjectId": "8e6d1cd1cc49475b4c6c2c2d61ac1e249f835d1f", + "sha256": "f1eb0a6781980862fac9bbfe06be5bc9f70d5fb9c493aa159c82673b33379585", + "size": 54574 }, { "path": "agent-skills/space-hyperframes/embedded-captions/dna/chrome.json", @@ -1913,18 +1823,18 @@ "sha256": "eeaab8bbc1c53f191452f9914ec9fc79ed8a82d58711b98dfb25517a864f7aa6", "size": 1567 }, + { + "path": "agent-skills/space-hyperframes/embedded-captions/dna/README.md", + "sourceObjectId": "af5cdc74dd0249ceb2266c46620597ea5742d3a6", + "sha256": "3e0dcb20140a8d73ea166dfde7af27f5d4cd492fd9ad2805c5c8dd064ba58f1c", + "size": 12207 + }, { "path": "agent-skills/space-hyperframes/embedded-captions/dna/velocity.json", "sourceObjectId": "8650e1de63ec34a4f376b0f7c435404160f79bbd", "sha256": "bc39c5748cb3f913b0685821ba3f4f878fe930bffe2aae3089ad56c5291cb7a0", "size": 1968 }, - { - "path": "agent-skills/space-hyperframes/embedded-captions/modes/cinematic/README.md", - "sourceObjectId": "f78ae5b93845cafd5bf132dc46199a029abf8475", - "sha256": "c95d0d2374ba6b3a0e721bbf9c66c125aaedd738e78c04591a9552e0f1fcfa46", - "size": 2677 - }, { "path": "agent-skills/space-hyperframes/embedded-captions/modes/cinematic/_archive/champion/spec.md", "sourceObjectId": "a200654f400a304a6c0760f02f9dc3a7c12a56c2", @@ -1979,6 +1889,12 @@ "sha256": "7d57fc7009007ac173bcebcdffaaedb6dba9da56ef8d9f69470ab989d1327470", "size": 17093 }, + { + "path": "agent-skills/space-hyperframes/embedded-captions/modes/cinematic/README.md", + "sourceObjectId": "f78ae5b93845cafd5bf132dc46199a029abf8475", + "sha256": "c95d0d2374ba6b3a0e721bbf9c66c125aaedd738e78c04591a9552e0f1fcfa46", + "size": 2677 + }, { "path": "agent-skills/space-hyperframes/embedded-captions/modes/standard/_anatomy.md", "sourceObjectId": "74a0e9a20745b051c9916100aee622531ea21139", @@ -2268,10 +2184,10 @@ "size": 2847 }, { - "path": "agent-skills/space-hyperframes/embedded-captions/themes/README.md", - "sourceObjectId": "11081b5bdcbc0a5548a93c9cb540b3ac546bdf69", - "sha256": "5ce273a6baa1997a933fef31994b1461ae6d4d78c7532d65c2770d3fed32d7b0", - "size": 84288 + "path": "agent-skills/space-hyperframes/embedded-captions/SKILL.md", + "sourceObjectId": "eadedc22341d1c02e66f2d75f26d2e083a87ac37", + "sha256": "983a4e61310d05c4a5c5a4fff2262c24ef1929478831e3afb76b0ab584b09bce", + "size": 34642 }, { "path": "agent-skills/space-hyperframes/embedded-captions/themes/anchor.json", @@ -2375,6 +2291,12 @@ "sha256": "4f5c5d5068695e12f332d51397594d5300062c66582abcdf8e55e29d77261f6e", "size": 2106 }, + { + "path": "agent-skills/space-hyperframes/embedded-captions/themes/README.md", + "sourceObjectId": "11081b5bdcbc0a5548a93c9cb540b3ac546bdf69", + "sha256": "5ce273a6baa1997a933fef31994b1461ae6d4d78c7532d65c2770d3fed32d7b0", + "size": 84288 + }, { "path": "agent-skills/space-hyperframes/embedded-captions/themes/scoreboard.json", "sourceObjectId": "3ac0800a1a0689fc7101b801cb3f4a7dcbb4a1fd", @@ -2423,12 +2345,6 @@ "sha256": "a63c5f97bf7b7b55d281d5fbb8a05fb3376a66a140c70a1df652d9242b1890d0", "size": 2100 }, - { - "path": "agent-skills/space-hyperframes/faceless-explainer/SKILL.md", - "sourceObjectId": "664e64326354da4dc667ab85fffb9c09a6a69a8f", - "sha256": "8d2173d2ad8ff1fc4c6b40e6e455233e6ada180055c11ae8f75d6625da3925a1", - "size": 31056 - }, { "path": "agent-skills/space-hyperframes/faceless-explainer/references/cut-catalog.md", "sourceObjectId": "10dd44122c1b3d7d5a65ed53d13a574baa7d7694", @@ -2591,18 +2507,18 @@ "sha256": "b084fa8a6ad45e60af27fc9c146cc3a57a6bcd795251dc89ddcc6f29af0702e6", "size": 2519 }, + { + "path": "agent-skills/space-hyperframes/faceless-explainer/SKILL.md", + "sourceObjectId": "664e64326354da4dc667ab85fffb9c09a6a69a8f", + "sha256": "8d2173d2ad8ff1fc4c6b40e6e455233e6ada180055c11ae8f75d6625da3925a1", + "size": 31056 + }, { "path": "agent-skills/space-hyperframes/faceless-explainer/sub-agents/frame-worker.md", "sourceObjectId": "e8e86d276adaa577c1fa7aba804bd160d970161e", "sha256": "883dcf7947380d220dcf763d7aef92dfab0ef273b40aff899ea3ba2a082ee20d", "size": 2028 }, - { - "path": "agent-skills/space-hyperframes/figma/SKILL.md", - "sourceObjectId": "f19ec095b95a5d893c9209d756944d07043bba31", - "sha256": "7de64558985ceec0afcaaaebb432a44b6188d640825cffa5929809d94765d1c3", - "size": 18312 - }, { "path": "agent-skills/space-hyperframes/figma/scripts/verify-motion.mjs", "sourceObjectId": "38247a8fa4f058dfd76d157b69fb2ed8acb979da", @@ -2610,10 +2526,10 @@ "size": 5050 }, { - "path": "agent-skills/space-hyperframes/general-video/SKILL.md", - "sourceObjectId": "1b2e81744c51f1125bb66eb47fcbe98a6c31fd78", - "sha256": "8806c0eef5d1d24dd4850b2856ac03e9cd8775557a70d1f7a8e04b635a539a3d", - "size": 21609 + "path": "agent-skills/space-hyperframes/figma/SKILL.md", + "sourceObjectId": "f19ec095b95a5d893c9209d756944d07043bba31", + "sha256": "7de64558985ceec0afcaaaebb432a44b6188d640825cffa5929809d94765d1c3", + "size": 18312 }, { "path": "agent-skills/space-hyperframes/general-video/scripts/frame-packets.mjs", @@ -2639,18 +2555,18 @@ "sha256": "61811e09110856e1439c29875e4a4ad7701ae45d4045f9d1dcb6a7929698e4c0", "size": 479 }, + { + "path": "agent-skills/space-hyperframes/general-video/SKILL.md", + "sourceObjectId": "1b2e81744c51f1125bb66eb47fcbe98a6c31fd78", + "sha256": "8806c0eef5d1d24dd4850b2856ac03e9cd8775557a70d1f7a8e04b635a539a3d", + "size": 21609 + }, { "path": "agent-skills/space-hyperframes/general-video/sub-agents/frame-worker.md", "sourceObjectId": "4eeca14fdc3d2fc4f81fe767d316e9e9ccb0da4d", "sha256": "447395b986126769a0d169c468f3f24b324781761130bc5155802656d1f22999", "size": 2519 }, - { - "path": "agent-skills/space-hyperframes/hyperframes-animation/SKILL.md", - "sourceObjectId": "e5299de70e3c7339fcc4b8870f195b6f2e0069af", - "sha256": "b35f1f8eff68e9ff480a5d5d343a1bf5a40ebb7d0d9be20b0b980cfdb36047f3", - "size": 8471 - }, { "path": "agent-skills/space-hyperframes/hyperframes-animation/adapters/animate-text.md", "sourceObjectId": "27e52925fc132b1aab63aa7cd8f9fa198b14a07a", @@ -3275,18 +3191,18 @@ "sha256": "504125ede3efaf687dba15de699c0100bf1fd47855fc83c98aec5c6fb9a4168f", "size": 4279 }, + { + "path": "agent-skills/space-hyperframes/hyperframes-animation/SKILL.md", + "sourceObjectId": "e5299de70e3c7339fcc4b8870f195b6f2e0069af", + "sha256": "b35f1f8eff68e9ff480a5d5d343a1bf5a40ebb7d0d9be20b0b980cfdb36047f3", + "size": 8471 + }, { "path": "agent-skills/space-hyperframes/hyperframes-animation/techniques.md", "sourceObjectId": "ba6d6a11ac1703a8b8431884f5b7025c0a914643", "sha256": "0227f5c4451807d4d425c626cf11ebddffecc228eccbcb63b9c206e0a4f7bd1b", "size": 17428 }, - { - "path": "agent-skills/space-hyperframes/hyperframes-animation/transitions/TRANSITION-REGISTRY.md", - "sourceObjectId": "a0d35b324b127bead2342d7b2fcc09e7024b1f17", - "sha256": "2c6d12342700149fdadada9fa64b518d128118cc0d44863e1cf2a5ee0804ac6e", - "size": 8281 - }, { "path": "agent-skills/space-hyperframes/hyperframes-animation/transitions/catalog.md", "sourceObjectId": "3d40b9db5c520fc642fafe5b0e2f351ce2e12e1e", @@ -3378,10 +3294,10 @@ "size": 13857 }, { - "path": "agent-skills/space-hyperframes/hyperframes-audio/SKILL.md", - "sourceObjectId": "1f01987a136907f9177b7b516eff192fa748e748", - "sha256": "daf3250390426ef096a7d2f71082919418099decbd1f31288640a43b43c7e293", - "size": 26560 + "path": "agent-skills/space-hyperframes/hyperframes-animation/transitions/TRANSITION-REGISTRY.md", + "sourceObjectId": "a0d35b324b127bead2342d7b2fcc09e7024b1f17", + "sha256": "2c6d12342700149fdadada9fa64b518d128118cc0d44863e1cf2a5ee0804ac6e", + "size": 8281 }, { "path": "agent-skills/space-hyperframes/hyperframes-audio/references/attributes.md", @@ -3426,10 +3342,10 @@ "size": 479 }, { - "path": "agent-skills/space-hyperframes/hyperframes-cli/SKILL.md", - "sourceObjectId": "e9068bc9af8b1f6d113c09aae01134f3504dd4f0", - "sha256": "8bba949a98797fd01b4c88600486730083524a81377d0c0d44b07ee1cae48321", - "size": 24551 + "path": "agent-skills/space-hyperframes/hyperframes-audio/SKILL.md", + "sourceObjectId": "1f01987a136907f9177b7b516eff192fa748e748", + "sha256": "daf3250390426ef096a7d2f71082919418099decbd1f31288640a43b43c7e293", + "size": 26560 }, { "path": "agent-skills/space-hyperframes/hyperframes-cli/references/beats.md", @@ -3492,10 +3408,10 @@ "size": 11389 }, { - "path": "agent-skills/space-hyperframes/hyperframes-core/SKILL.md", - "sourceObjectId": "97e68da11f2b12b4e887ed9acda73b4cc97c441e", - "sha256": "18ac7784765cc29af5a4d88f2a63a15deaf5395985009af188b5e3718edcfe3d", - "size": 12643 + "path": "agent-skills/space-hyperframes/hyperframes-cli/SKILL.md", + "sourceObjectId": "e9068bc9af8b1f6d113c09aae01134f3504dd4f0", + "sha256": "8bba949a98797fd01b4c88600486730083524a81377d0c0d44b07ee1cae48321", + "size": 24551 }, { "path": "agent-skills/space-hyperframes/hyperframes-core/references/composition-patterns.md", @@ -3558,16 +3474,10 @@ "size": 8420 }, { - "path": "agent-skills/space-hyperframes/hyperframes-creative/SKILL.md", - "sourceObjectId": "8ecb3cd7144b10676ff908e41f052c970cdb4930", - "sha256": "9da7b7ac84c8d884b54125887ecca1a645a38337013082b96af2fdc0259c945a", - "size": 6563 - }, - { - "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/biennale-yellow/FRAME.md", - "sourceObjectId": "c082ea2fefdd47bd2679d72d6a50a3a41aa99eaf", - "sha256": "76d22cced9c152b0edb520543cf34c4ce772a312caa7211c40d4315b53c053cf", - "size": 17789 + "path": "agent-skills/space-hyperframes/hyperframes-core/SKILL.md", + "sourceObjectId": "97e68da11f2b12b4e887ed9acda73b4cc97c441e", + "sha256": "18ac7784765cc29af5a4d88f2a63a15deaf5395985009af188b5e3718edcfe3d", + "size": 12643 }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/biennale-yellow/caption-skin.html", @@ -3582,10 +3492,10 @@ "size": 34908 }, { - "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/blockframe/FRAME.md", - "sourceObjectId": "00e4d88318288c8c138716d266b13dcb31350d57", - "sha256": "ef8d9d47a209bed4ccc2d928c14a81cdaecb5129f5dc0cdc0dc40afc7ef92931", - "size": 16292 + "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/biennale-yellow/FRAME.md", + "sourceObjectId": "c082ea2fefdd47bd2679d72d6a50a3a41aa99eaf", + "sha256": "76d22cced9c152b0edb520543cf34c4ce772a312caa7211c40d4315b53c053cf", + "size": 17789 }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/blockframe/caption-skin.html", @@ -3600,12 +3510,12 @@ "size": 38856 }, { - "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/blue-professional/FRAME.md", - "sourceObjectId": "e821dee2dccc8e424ac160ca6714d561027cce46", - "sha256": "62e9a445885f6057084493de385a8ce20c3b4a299ae36a553ef54884f06bad68", - "size": 17202 - }, - { + "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/blockframe/FRAME.md", + "sourceObjectId": "00e4d88318288c8c138716d266b13dcb31350d57", + "sha256": "ef8d9d47a209bed4ccc2d928c14a81cdaecb5129f5dc0cdc0dc40afc7ef92931", + "size": 16292 + }, + { "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/blue-professional/caption-skin.html", "sourceObjectId": "5a599c2703c2453e50cf263cb31bcb6f5b576872", "sha256": "a4cec56e723db7fc6b6f0c71a52314f80fc3f3f6c43747ae46af8a0761aa0c8b", @@ -3618,10 +3528,10 @@ "size": 39108 }, { - "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/bold-poster/FRAME.md", - "sourceObjectId": "c9f31256cd127913c3ff2457811f8467639da539", - "sha256": "af756ef993099f9ac78328f676eb79a6572ff0e9c2aacf12787471cd4525b171", - "size": 15984 + "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/blue-professional/FRAME.md", + "sourceObjectId": "e821dee2dccc8e424ac160ca6714d561027cce46", + "sha256": "62e9a445885f6057084493de385a8ce20c3b4a299ae36a553ef54884f06bad68", + "size": 17202 }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/bold-poster/caption-skin.html", @@ -3636,10 +3546,10 @@ "size": 32385 }, { - "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/broadside/FRAME.md", - "sourceObjectId": "4dff52def23bb5492844cbbc25a25c19909c6fc4", - "sha256": "3af0a1e5e61bece19841671672d7732082f03d5699b713475e90323a21dbcc89", - "size": 16303 + "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/bold-poster/FRAME.md", + "sourceObjectId": "c9f31256cd127913c3ff2457811f8467639da539", + "sha256": "af756ef993099f9ac78328f676eb79a6572ff0e9c2aacf12787471cd4525b171", + "size": 15984 }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/broadside/caption-skin.html", @@ -3654,10 +3564,10 @@ "size": 33899 }, { - "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/capsule/FRAME.md", - "sourceObjectId": "a37f828c847c031f1603406ce1440a8fc2b4f803", - "sha256": "f06dba67a3859f7c732b5177f7bcc58c94592caa5d6bbbcc6730a7876f5baa7a", - "size": 17214 + "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/broadside/FRAME.md", + "sourceObjectId": "4dff52def23bb5492844cbbc25a25c19909c6fc4", + "sha256": "3af0a1e5e61bece19841671672d7732082f03d5699b713475e90323a21dbcc89", + "size": 16303 }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/capsule/caption-skin.html", @@ -3672,10 +3582,10 @@ "size": 43052 }, { - "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/cartesian/FRAME.md", - "sourceObjectId": "a00c21d9250ace9886fc835834993b9d63f64b3f", - "sha256": "3dc6a31813a333b2a7a1509ddbd3b4dabbbd7e12e6479b6cff10d69c185fec95", - "size": 17294 + "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/capsule/FRAME.md", + "sourceObjectId": "a37f828c847c031f1603406ce1440a8fc2b4f803", + "sha256": "f06dba67a3859f7c732b5177f7bcc58c94592caa5d6bbbcc6730a7876f5baa7a", + "size": 17214 }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/cartesian/caption-skin.html", @@ -3690,10 +3600,10 @@ "size": 35340 }, { - "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/cobalt-grid/FRAME.md", - "sourceObjectId": "af52eec8f3cd86880530f4c0169c9cf422e31e4e", - "sha256": "62a6c9e6e5188cc29b9c0098e9bb8e72c23f152d9a99dd92c58139d26b69b19f", - "size": 17286 + "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/cartesian/FRAME.md", + "sourceObjectId": "a00c21d9250ace9886fc835834993b9d63f64b3f", + "sha256": "3dc6a31813a333b2a7a1509ddbd3b4dabbbd7e12e6479b6cff10d69c185fec95", + "size": 17294 }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/cobalt-grid/caption-skin.html", @@ -3708,10 +3618,10 @@ "size": 47020 }, { - "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/code-editorial/FRAME.md", - "sourceObjectId": "aa15b65eab5c50e8b4c861b525f7365f9f6c925f", - "sha256": "b1c123526634e31a3e36cff9856e3b4322f2f778d2c7f573aa35a9ee1e90deb7", - "size": 20600 + "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/cobalt-grid/FRAME.md", + "sourceObjectId": "af52eec8f3cd86880530f4c0169c9cf422e31e4e", + "sha256": "62a6c9e6e5188cc29b9c0098e9bb8e72c23f152d9a99dd92c58139d26b69b19f", + "size": 17286 }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/code-editorial/caption-skin.html", @@ -3744,10 +3654,10 @@ "size": 43711 }, { - "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/coral/FRAME.md", - "sourceObjectId": "0c73b04acba1d4b86e5285daa90273b5e346a3c9", - "sha256": "8530ecb36d1bb2d53392d88d972df35beeba19a5bcb3260fc9b18a58de7cdfe8", - "size": 18950 + "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/code-editorial/FRAME.md", + "sourceObjectId": "aa15b65eab5c50e8b4c861b525f7365f9f6c925f", + "sha256": "b1c123526634e31a3e36cff9856e3b4322f2f778d2c7f573aa35a9ee1e90deb7", + "size": 20600 }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/coral/caption-skin.html", @@ -3762,10 +3672,10 @@ "size": 36472 }, { - "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/creative-mode/FRAME.md", - "sourceObjectId": "e00e6fed67b6a1a1f366119714d548238427d752", - "sha256": "c1a1359502d9fc79ef267305291fe0f651219c72d88088cee32327dd933dead8", - "size": 19605 + "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/coral/FRAME.md", + "sourceObjectId": "0c73b04acba1d4b86e5285daa90273b5e346a3c9", + "sha256": "8530ecb36d1bb2d53392d88d972df35beeba19a5bcb3260fc9b18a58de7cdfe8", + "size": 18950 }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/creative-mode/caption-skin.html", @@ -3780,10 +3690,10 @@ "size": 38750 }, { - "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/daisy-days/FRAME.md", - "sourceObjectId": "ed3ebf49e0a0f78cb5ac543e5c175d8da4c07541", - "sha256": "42d827dbd279990052e171d04380b5e6bbc111ae391dc283deb7a452e70b9b97", - "size": 17445 + "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/creative-mode/FRAME.md", + "sourceObjectId": "e00e6fed67b6a1a1f366119714d548238427d752", + "sha256": "c1a1359502d9fc79ef267305291fe0f651219c72d88088cee32327dd933dead8", + "size": 19605 }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/daisy-days/caption-skin.html", @@ -3798,10 +3708,10 @@ "size": 42293 }, { - "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/editorial-forest/FRAME.md", - "sourceObjectId": "83e2594f6301b54d98569ad478417d6fbb0d95ed", - "sha256": "ceeb2ab768367da1e1f3e1eca36ab9feeb3de3e4d15493319b0044c3d869329c", - "size": 17019 + "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/daisy-days/FRAME.md", + "sourceObjectId": "ed3ebf49e0a0f78cb5ac543e5c175d8da4c07541", + "sha256": "42d827dbd279990052e171d04380b5e6bbc111ae391dc283deb7a452e70b9b97", + "size": 17445 }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/editorial-forest/caption-skin.html", @@ -3815,6 +3725,12 @@ "sha256": "bb87b88b91184f4fee7f02eea63ed35d9d378fa89fad8988326e31e82a43dbb1", "size": 36847 }, + { + "path": "agent-skills/space-hyperframes/hyperframes-creative/frame-presets/editorial-forest/FRAME.md", + "sourceObjectId": "83e2594f6301b54d98569ad478417d6fbb0d95ed", + "sha256": "ceeb2ab768367da1e1f3e1eca36ab9feeb3de3e4d15493319b0044c3d869329c", + "size": 17019 + }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/palettes/bold-energetic.md", "sourceObjectId": "e60e2d76a481c0f1f3853374532411426b261f9e", @@ -3989,18 +3905,18 @@ "sha256": "504125ede3efaf687dba15de699c0100bf1fd47855fc83c98aec5c6fb9a4168f", "size": 4279 }, + { + "path": "agent-skills/space-hyperframes/hyperframes-creative/SKILL.md", + "sourceObjectId": "8ecb3cd7144b10676ff908e41f052c970cdb4930", + "sha256": "9da7b7ac84c8d884b54125887ecca1a645a38337013082b96af2fdc0259c945a", + "size": 6563 + }, { "path": "agent-skills/space-hyperframes/hyperframes-creative/templates/design-picker.html", "sourceObjectId": "6cb6f0878dc1b1e7296664b193c080a91babc335", "sha256": "c417139fef8e21b34d56a85cedda8b9597c9574e0727ce603a4743c4ee592c1a", "size": 44098 }, - { - "path": "agent-skills/space-hyperframes/hyperframes-keyframes/SKILL.md", - "sourceObjectId": "559dd0bc16ab0b6595cc470df6a5d3e113894adf", - "sha256": "d6484e8367ed522f2a89af9ec30ae3cd86ae243b5a23c5ab00a7a682e3d1a791", - "size": 16263 - }, { "path": "agent-skills/space-hyperframes/hyperframes-keyframes/agents/openai.yaml", "sourceObjectId": "2cb053d51e335257ba2bab26d0049d82849bda32", @@ -4014,10 +3930,10 @@ "size": 6692 }, { - "path": "agent-skills/space-hyperframes/hyperframes-registry/SKILL.md", - "sourceObjectId": "fd6d552902a67a5f18f258728bd304fe50cfea24", - "sha256": "f1925b202cabd125b509658b11db593b55340b1926ecb056fc31aa4233a2b4f6", - "size": 9933 + "path": "agent-skills/space-hyperframes/hyperframes-keyframes/SKILL.md", + "sourceObjectId": "559dd0bc16ab0b6595cc470df6a5d3e113894adf", + "sha256": "d6484e8367ed522f2a89af9ec30ae3cd86ae243b5a23c5ab00a7a682e3d1a791", + "size": 16263 }, { "path": "agent-skills/space-hyperframes/hyperframes-registry/examples/add-block.md", @@ -4085,18 +4001,18 @@ "sha256": "6c8341c29fdae6de4f9fd1560a668d11cf34731b81fe5a06c9aeb4a000047b2a", "size": 1723 }, + { + "path": "agent-skills/space-hyperframes/hyperframes-registry/SKILL.md", + "sourceObjectId": "fd6d552902a67a5f18f258728bd304fe50cfea24", + "sha256": "f1925b202cabd125b509658b11db593b55340b1926ecb056fc31aa4233a2b4f6", + "size": 9933 + }, { "path": "agent-skills/space-hyperframes/hyperframes-studio/SKILL.md", "sourceObjectId": "07bb48bdfa51a4eba079ae367bdb64abbd3f1690", "sha256": "7449da3952155e40e7d76fc29d4415b4030ab6f7f3ff9c3b94fa1b159cad46c4", "size": 12074 }, - { - "path": "agent-skills/space-hyperframes/hyperframes/SKILL.md", - "sourceObjectId": "ca16962a5b54ecbd1507e94d9b902821dc156094", - "sha256": "a277e9e46b3b5b8619639a353a4af3f46f8ae4f2e622ba802d5af730d135f410", - "size": 21061 - }, { "path": "agent-skills/space-hyperframes/hyperframes/references/brief-contract.md", "sourceObjectId": "eec0e03f44ee9c80a25041c0fb795eb16f8926f9", @@ -4277,18 +4193,24 @@ "sha256": "abfdf2498b57509438077803bee3a626c6fc13e1014ae066e5281edbfc4ca23d", "size": 4398 }, + { + "path": "agent-skills/space-hyperframes/hyperframes/SKILL.md", + "sourceObjectId": "ca16962a5b54ecbd1507e94d9b902821dc156094", + "sha256": "a277e9e46b3b5b8619639a353a4af3f46f8ae4f2e622ba802d5af730d135f410", + "size": 21061 + }, + { + "path": "agent-skills/space-hyperframes/LICENSE", + "sourceObjectId": "ae06b37e1c5116ccfaa615ac25ec1aabf5658d8c", + "sha256": "4259155fb06f127687ee7b0a8a3682d45132db0f2da26cbc0b7a2d1e796436b8", + "size": 10763 + }, { "path": "agent-skills/space-hyperframes/media-use/.gitignore", "sourceObjectId": "17df1e2dbcfacf1e381b6153b10eac6002151231", "sha256": "a299ec0fcdb6bc6670cf9fb22eefe3fcc37730e2e554b7f54e25de88be1ede02", "size": 17 }, - { - "path": "agent-skills/space-hyperframes/media-use/SKILL.md", - "sourceObjectId": "67ae64d349b7ba2ae7afded5d82db8216679c73c", - "sha256": "0f08ff6b493a46e0505dcc9c0c607e517e0eb70e7dc2b7b5c1f51b4f27bb6181", - "size": 9684 - }, { "path": "agent-skills/space-hyperframes/media-use/audio/assets/sfx/CREDITS.md", "sourceObjectId": "750d6e83934164d6cb38f6cc96269104dc4695b4", @@ -4445,6 +4367,12 @@ "sha256": "daf0b162a9c3fc1a20cc22dff19566530e198459a10afcdf42ad39bec2426f55", "size": 1654 }, + { + "path": "agent-skills/space-hyperframes/media-use/audio/scripts/lib/gemini-auth_test.py", + "sourceObjectId": "598d4b4a92fcac6ac7cbce1ace6f50c6fb3f8689", + "sha256": "5f524492aa5d4fa77c45bfed0002a33045677bd1c28027ff80554c9911f32b66", + "size": 4430 + }, { "path": "agent-skills/space-hyperframes/media-use/audio/scripts/lib/gemini-auth.mjs", "sourceObjectId": "e20a6a44d19101814964c335be8767e71203c154", @@ -4463,12 +4391,6 @@ "sha256": "4a74c9e910914d57c715b0ed487e6e8ce2af265e32edfe04e8432780a6ffe0b0", "size": 3097 }, - { - "path": "agent-skills/space-hyperframes/media-use/audio/scripts/lib/gemini-auth_test.py", - "sourceObjectId": "598d4b4a92fcac6ac7cbce1ace6f50c6fb3f8689", - "sha256": "5f524492aa5d4fa77c45bfed0002a33045677bd1c28027ff80554c9911f32b66", - "size": 4430 - }, { "path": "agent-skills/space-hyperframes/media-use/audio/scripts/lib/gemini-tts.mjs", "sourceObjectId": "bf94cb891256bfe0a1375f13037dfd134cad91b9", @@ -4589,18 +4511,18 @@ "sha256": "8f3c50a19e14c6d0b6c2d871892be8fa1022d6ee5653f3f5224c955f4afdf862", "size": 3336 }, - { - "path": "agent-skills/space-hyperframes/media-use/luts/README.md", - "sourceObjectId": "dc3ed9ae55b6909732ca8f06cf8c89dc99da2bc6", - "sha256": "c06cbbf2aab80cbf8aa25c83497202a63107a61e083b6c199a89d513e8096a3b", - "size": 1087 - }, { "path": "agent-skills/space-hyperframes/media-use/luts/index.json", "sourceObjectId": "9f6725c4a7c80c4b368a01196f57c0dcdc3a44c1", "sha256": "988ac83c14bc3a9ef09aa6ab64459a0aa9e766e96361738136970ec89df1675a", "size": 1997 }, + { + "path": "agent-skills/space-hyperframes/media-use/luts/README.md", + "sourceObjectId": "dc3ed9ae55b6909732ca8f06cf8c89dc99da2bc6", + "sha256": "c06cbbf2aab80cbf8aa25c83497202a63107a61e083b6c199a89d513e8096a3b", + "size": 1087 + }, { "path": "agent-skills/space-hyperframes/media-use/references/audio.md", "sourceObjectId": "c789da86854d65e04d0f1f8df38efffb84f6fcf2", @@ -4836,10 +4758,10 @@ "size": 9849 }, { - "path": "agent-skills/space-hyperframes/motion-graphics/SKILL.md", - "sourceObjectId": "06611a3e1a96af3898736e2833e2456c90bb7d5c", - "sha256": "0024b21e05ca584b81598347abb58e4735988d56fe23721e70be9b08b805fce2", - "size": 16013 + "path": "agent-skills/space-hyperframes/media-use/SKILL.md", + "sourceObjectId": "67ae64d349b7ba2ae7afded5d82db8216679c73c", + "sha256": "0f08ff6b493a46e0505dcc9c0c607e517e0eb70e7dc2b7b5c1f51b4f27bb6181", + "size": 9684 }, { "path": "agent-skills/space-hyperframes/motion-graphics/agents/builder.md", @@ -4931,18 +4853,18 @@ "sha256": "9fc6361185696c12106adc478f07ad9a4061d17ae4d392c3743ea1cb3c8c2807", "size": 2538 }, - { - "path": "agent-skills/space-hyperframes/motion-graphics/grounding/PROTOCOL.md", - "sourceObjectId": "b6e460e558b0f8b550f99a73a34520e327436de7", - "sha256": "01a5bd32b14c13d5b7a396184f633d11e61c24910470461c4351b03d1a3a65a5", - "size": 3108 - }, { "path": "agent-skills/space-hyperframes/motion-graphics/grounding/locate.mjs", "sourceObjectId": "6e65ec22dfd311c50f2d2a834cee109c197e233d", "sha256": "7572b3dadf3561495a1ad4c67b1fd7dd6e871c65aec8ca13574fc52649ce66cd", "size": 8236 }, + { + "path": "agent-skills/space-hyperframes/motion-graphics/grounding/PROTOCOL.md", + "sourceObjectId": "b6e460e558b0f8b550f99a73a34520e327436de7", + "sha256": "01a5bd32b14c13d5b7a396184f633d11e61c24910470461c4351b03d1a3a65a5", + "size": 3108 + }, { "path": "agent-skills/space-hyperframes/motion-graphics/phases/source/guide.md", "sourceObjectId": "26297a758a8dfa601e9850efeb73410298b543e4", @@ -4974,10 +4896,10 @@ "size": 10674 }, { - "path": "agent-skills/space-hyperframes/music-to-video/SKILL.md", - "sourceObjectId": "ea7c085dfe95e18471499769f2acce985d72b810", - "sha256": "b5e6cdfdf5c8b30de18541d96c63038d3754134e1f0fef17284bcc87f02cf259", - "size": 19041 + "path": "agent-skills/space-hyperframes/motion-graphics/SKILL.md", + "sourceObjectId": "06611a3e1a96af3898736e2833e2456c90bb7d5c", + "sha256": "0024b21e05ca584b81598347abb58e4735988d56fe23721e70be9b08b805fce2", + "size": 16013 }, { "path": "agent-skills/space-hyperframes/music-to-video/references/frame-skeleton.md", @@ -5387,12 +5309,6 @@ "sha256": "ef8d1783b44c434be16c8125768aef95e8bad9405252b95ebec9ff69f1dce21a", "size": 2413 }, - { - "path": "agent-skills/space-hyperframes/music-to-video/references/motion-primitives/text-spectral-rays/USAGE.md", - "sourceObjectId": "1b261eb67184cf6b4b9a38d0cdd20c7662f948c9", - "sha256": "bb2cae8966c4eef4b381244097f7995b7ec4b02dd9dbfd5f3fd6473d9a5c7c11", - "size": 2401 - }, { "path": "agent-skills/space-hyperframes/music-to-video/references/motion-primitives/text-spectral-rays/index.html", "sourceObjectId": "1aabbe79124be2674d589fe827655be19f0ea3f7", @@ -5405,6 +5321,12 @@ "sha256": "164f582e24620fb7b08d94651876e86640b1cd3195e1c1255f28858ef64b96e2", "size": 11504 }, + { + "path": "agent-skills/space-hyperframes/music-to-video/references/motion-primitives/text-spectral-rays/USAGE.md", + "sourceObjectId": "1b261eb67184cf6b4b9a38d0cdd20c7662f948c9", + "sha256": "bb2cae8966c4eef4b381244097f7995b7ec4b02dd9dbfd5f3fd6473d9a5c7c11", + "size": 2401 + }, { "path": "agent-skills/space-hyperframes/music-to-video/references/motion-primitives/text-wave-distort/index.html", "sourceObjectId": "2e954e194f445e75d5d2530652c69c0b1f94df93", @@ -5579,18 +5501,18 @@ "sha256": "c0883b116ea0030a94cecac826e1bf464f92622166813032f75163cb261d0b6f", "size": 6698 }, + { + "path": "agent-skills/space-hyperframes/music-to-video/SKILL.md", + "sourceObjectId": "ea7c085dfe95e18471499769f2acce985d72b810", + "sha256": "b5e6cdfdf5c8b30de18541d96c63038d3754134e1f0fef17284bcc87f02cf259", + "size": 19041 + }, { "path": "agent-skills/space-hyperframes/music-to-video/sub-agents/frame-worker.md", "sourceObjectId": "2f9b9d8b764de3aa8070e4d95a92fe7b2dd35efb", "sha256": "649e9bad3cc30f564a06068bb600fc13b51a33c55e479aa43871e2cdaf561dee", "size": 5124 }, - { - "path": "agent-skills/space-hyperframes/pr-to-video/SKILL.md", - "sourceObjectId": "4a3d59a2683ffded3c2eb54adae15416fdd68067", - "sha256": "998a72af1d731b7e761637b9156e4307b75ea0f2ea0ea88fa1023806c95dbdbd", - "size": 33921 - }, { "path": "agent-skills/space-hyperframes/pr-to-video/references/code-vocabulary.md", "sourceObjectId": "470ca9ef075f6bf6f11ce8f384e1ecbd84e6f7cd", @@ -5789,18 +5711,18 @@ "sha256": "09766905d3ab01c4de65d4610ff321814753a9ef6b26d89e8bf5be7c11a22b49", "size": 8291 }, + { + "path": "agent-skills/space-hyperframes/pr-to-video/SKILL.md", + "sourceObjectId": "4a3d59a2683ffded3c2eb54adae15416fdd68067", + "sha256": "998a72af1d731b7e761637b9156e4307b75ea0f2ea0ea88fa1023806c95dbdbd", + "size": 33921 + }, { "path": "agent-skills/space-hyperframes/pr-to-video/sub-agents/frame-worker.md", "sourceObjectId": "de1b564bfd0708a158585b30bcea471bbb7a181b", "sha256": "d24b67ee6ee797014d94a944fc24b6e1e58b260d5fe094e97e16aeab1e839222", "size": 6957 }, - { - "path": "agent-skills/space-hyperframes/product-launch-video/SKILL.md", - "sourceObjectId": "2d8af7c762fd5c5f51b6d19f3d41d59b0e3e05c4", - "sha256": "3ddf2eba0cde37175178cdcf0127570a04a7051482c844e81ac5179dd6783b93", - "size": 35785 - }, { "path": "agent-skills/space-hyperframes/product-launch-video/references/cut-catalog.md", "sourceObjectId": "b29cf39cd1ec3b8cf40cde8aa92c607df50ca912", @@ -6011,6 +5933,12 @@ "sha256": "0ede495b9922af9d834da783a31103fab188e1bd8c30e01ad5356a342d082be6", "size": 2890 }, + { + "path": "agent-skills/space-hyperframes/product-launch-video/SKILL.md", + "sourceObjectId": "2d8af7c762fd5c5f51b6d19f3d41d59b0e3e05c4", + "sha256": "3ddf2eba0cde37175178cdcf0127570a04a7051482c844e81ac5179dd6783b93", + "size": 35785 + }, { "path": "agent-skills/space-hyperframes/product-launch-video/sub-agents/frame-worker.md", "sourceObjectId": "715eed877a7efc23e2f28b1a6f084f2d85c6eb87", @@ -6023,12 +5951,6 @@ "sha256": "cf122cb0a8ca076f44265bece4e3c39ea57ca31af105e567d7b68c362eb51d7d", "size": 4743 }, - { - "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/SKILL.md", - "sourceObjectId": "2b121141d1b3033a5e29c5b0d9a9036cf2db8354", - "sha256": "883495113b6130e7ee48724bc00705cd28966197ef0bc2d8543a2ff2d6776187", - "size": 11080 - }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/.gitkeep", "sourceObjectId": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", @@ -6053,12 +5975,6 @@ "sha256": "dfeca00985d7133f301ce322e69359f20b7df359c9724067fcee6079b605ab8e", "size": 128 }, - { - "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/README.md", - "sourceObjectId": "7b496809c034fcbab4dc310d43f3c294a0bb8f83", - "sha256": "12dfb3609e2be9b112ea92036049296cbfa11696bda471e79c6061eeb2d3009e", - "size": 2221 - }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/expected.json", "sourceObjectId": "4565c532c60a49bbf09137aff407a09d32f62101", @@ -6077,6 +5993,12 @@ "sha256": "bda6a0df4d5abf1fb129f708c7b1f2e79e2f6bbfb304fc937e681215d0f8fa51", "size": 1097 }, + { + "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/README.md", + "sourceObjectId": "7b496809c034fcbab4dc310d43f3c294a0bb8f83", + "sha256": "12dfb3609e2be9b112ea92036049296cbfa11696bda471e79c6061eeb2d3009e", + "size": 2221 + }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/package.json", "sourceObjectId": "1c33b63b42205ab6fd3b6a252bbc4dbb2fcf15d0", @@ -6090,8 +6012,14 @@ "size": 497 }, { - "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/src/Root.tsx", - "sourceObjectId": "f8dd727705610772456a6fc862bec089cd245ae8", + "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/src/index.ts", + "sourceObjectId": "f31c790edb3e2f1611a701c7637cc396353d1ff7", + "sha256": "957e481dd33a29b4a55ae0e95dbf763b7e48c37c427ca4bd1275faf34bc07a74", + "size": 109 + }, + { + "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/src/Root.tsx", + "sourceObjectId": "f8dd727705610772456a6fc862bec089cd245ae8", "sha256": "e3e158828c415ba90c158755d997eff6d5034e4ccd5c16dec7c5f271bcb3cc06", "size": 259 }, @@ -6101,12 +6029,6 @@ "sha256": "6ffcc488718b52a5206332881186331a9424e9c14d06c64ecc8219bff7718f8f", "size": 773 }, - { - "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/src/index.ts", - "sourceObjectId": "f31c790edb3e2f1611a701c7637cc396353d1ff7", - "sha256": "957e481dd33a29b4a55ae0e95dbf763b7e48c37c427ca4bd1275faf34bc07a74", - "size": 109 - }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/tsconfig.json", "sourceObjectId": "eb6f0f806538ff0e3cd203d339f52f836c6040ab", @@ -6119,12 +6041,6 @@ "sha256": "cbb4f717d6250eaee0f2c345417c80ef82b7db570d37f1128ad2c02f7788727e", "size": 215 }, - { - "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/README.md", - "sourceObjectId": "f2a17160206fe8c29c82b4942df22d6180a33642", - "sha256": "d6c6591c58ce2b6e211bab45baf573ce9e522e2795a86ce0ded5542d043c9997", - "size": 3274 - }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/expected.json", "sourceObjectId": "df13d4b6dbd8060114cc21a0792b9b67a1af4880", @@ -6155,6 +6071,12 @@ "sha256": "8c1695814c80cd6fe6bdb9b8fbe68660997bc0743fff0bb1f7ef51d6660560e3", "size": 1769 }, + { + "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/README.md", + "sourceObjectId": "f2a17160206fe8c29c82b4942df22d6180a33642", + "sha256": "d6c6591c58ce2b6e211bab45baf573ce9e522e2795a86ce0ded5542d043c9997", + "size": 3274 + }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/package.json", "sourceObjectId": "88b08833aee1e8afc19d01f2e030f98a47cb0801", @@ -6167,6 +6089,12 @@ "sha256": "105f9af576e76af26840b1ba6ccfd0f98415a26ecf00c2895490ae77fc1d9a06", "size": 497 }, + { + "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/src/index.ts", + "sourceObjectId": "f31c790edb3e2f1611a701c7637cc396353d1ff7", + "sha256": "957e481dd33a29b4a55ae0e95dbf763b7e48c37c427ca4bd1275faf34bc07a74", + "size": 109 + }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/src/MultiScene.tsx", "sourceObjectId": "362d967fa6b18812166074964d2d270c3fabd767", @@ -6179,12 +6107,6 @@ "sha256": "0d17fc76061ebcddfeabeea2caeb721b0f0fe7d2c6cd1e2fea116d5832dc49c1", "size": 264 }, - { - "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/src/index.ts", - "sourceObjectId": "f31c790edb3e2f1611a701c7637cc396353d1ff7", - "sha256": "957e481dd33a29b4a55ae0e95dbf763b7e48c37c427ca4bd1275faf34bc07a74", - "size": 109 - }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/tsconfig.json", "sourceObjectId": "eb6f0f806538ff0e3cd203d339f52f836c6040ab", @@ -6203,12 +6125,6 @@ "sha256": "dfeca00985d7133f301ce322e69359f20b7df359c9724067fcee6079b605ab8e", "size": 128 }, - { - "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/README.md", - "sourceObjectId": "711733364946942177dae6d091938c267f201ac7", - "sha256": "cc18dd2d50e77116a733264294d59360a7a908d3a83cafb7825f911c1269648e", - "size": 5026 - }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/expected.json", "sourceObjectId": "f97159709a7040904e6b1a9f78dcf91e5fa2024c", @@ -6239,6 +6155,12 @@ "sha256": "aaec12aabff46337f7bfff2ea5d6c13e488b40f95868b1bd6c0657a56dd81910", "size": 1707 }, + { + "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/README.md", + "sourceObjectId": "711733364946942177dae6d091938c267f201ac7", + "sha256": "cc18dd2d50e77116a733264294d59360a7a908d3a83cafb7825f911c1269648e", + "size": 5026 + }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/package.json", "sourceObjectId": "d5acfc24d132bf292546940326229f2c2f639909", @@ -6251,18 +6173,6 @@ "sha256": "105f9af576e76af26840b1ba6ccfd0f98415a26ecf00c2895490ae77fc1d9a06", "size": 497 }, - { - "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/Root.tsx", - "sourceObjectId": "5932bcd458ca40f73173fa12d4ab0cef997e5e58", - "sha256": "113fdac2ac92f90f135abbcc1e24ace0fd2ff50f861c93db94599f82771f1985", - "size": 681 - }, - { - "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/Stargazed.tsx", - "sourceObjectId": "4579c6d9aa0691d5d4b5f112f4758c7240eea765", - "sha256": "151be9c45dbb626de4ad148f6a099b94b8cf1e717b79e98f9409a398cf4d8bb6", - "size": 970 - }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/components/AnimatedNumber.tsx", "sourceObjectId": "d1a03f5e707524c97ae7b79a2b2c74dfc2488527", @@ -6287,6 +6197,12 @@ "sha256": "957e481dd33a29b4a55ae0e95dbf763b7e48c37c427ca4bd1275faf34bc07a74", "size": 109 }, + { + "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/Root.tsx", + "sourceObjectId": "5932bcd458ca40f73173fa12d4ab0cef997e5e58", + "sha256": "113fdac2ac92f90f135abbcc1e24ace0fd2ff50f861c93db94599f82771f1985", + "size": 681 + }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/scenes/OutroScene.tsx", "sourceObjectId": "3121b49dd4f2d8ad6a4358c13d2cd6d60bd34762", @@ -6305,18 +6221,18 @@ "sha256": "24cabaabcd364c3e434aa8ac46929830c54eca3edaf355c143f0bac8b1d851c3", "size": 1230 }, + { + "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/Stargazed.tsx", + "sourceObjectId": "4579c6d9aa0691d5d4b5f112f4758c7240eea765", + "sha256": "151be9c45dbb626de4ad148f6a099b94b8cf1e717b79e98f9409a398cf4d8bb6", + "size": 970 + }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/tsconfig.json", "sourceObjectId": "eb6f0f806538ff0e3cd203d339f52f836c6040ab", "sha256": "cc24d56b89415ebbfdff594c246957974a16c8603803fedeff515edbee5f5c58", "size": 337 }, - { - "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/README.md", - "sourceObjectId": "ac36e230d34e964cbf9105a584642da5f53cb12c", - "sha256": "1ecada7bc9e9313d188cc3e1d2c731ab5e41f4ab7b9ee157dfec91a63afe4b9d", - "size": 2825 - }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/01-use-state.tsx", "sourceObjectId": "d022bb277ab00d1b8e362dca824582efd2826d4c", @@ -6371,6 +6287,12 @@ "sha256": "fff7f57d87ec185c3f4b95debabcb1c8dd3ea8012af7b6b3a83486900fc095c5", "size": 2784 }, + { + "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/README.md", + "sourceObjectId": "ac36e230d34e964cbf9105a584642da5f53cb12c", + "sha256": "1ecada7bc9e9313d188cc3e1d2c731ab5e41f4ab7b9ee157dfec91a63afe4b9d", + "size": 2825 + }, { "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/validate.sh", "sourceObjectId": "e7180f48c78421d7505147273eab617005fb2511", @@ -6468,10 +6390,16 @@ "size": 3066 }, { - "path": "agent-skills/space-hyperframes/slideshow/SKILL.md", - "sourceObjectId": "42cd47c28a1ee1f721426cd7465233e503e919ef", - "sha256": "a17b9d27ec3a3256bda717cf4796b8b8bd1d6770fbd4dbf5cd2f7f59662ac11e", - "size": 33915 + "path": "agent-skills/space-hyperframes/remotion-to-hyperframes/SKILL.md", + "sourceObjectId": "2b121141d1b3033a5e29c5b0d9a9036cf2db8354", + "sha256": "883495113b6130e7ee48724bc00705cd28966197ef0bc2d8543a2ff2d6776187", + "size": 11080 + }, + { + "path": "agent-skills/space-hyperframes/SKILL.md", + "sourceObjectId": "e204e423cb4b3ea6f20edb93bd5ef7564d0cc63a", + "sha256": "0dbe07caa91dbd71f3db3765a6e36dd0c1ee1a4e167f8eaf280b7b731d1779f8", + "size": 2542 }, { "path": "agent-skills/space-hyperframes/slideshow/references/standalone-harness.md", @@ -6480,16 +6408,10 @@ "size": 44170 }, { - "path": "agent-skills/space-hyperframes/talking-head-recut/NOTICE.md", - "sourceObjectId": "38712c90e33710ffbb70dae7f91f130115430155", - "sha256": "0e0a88d4eb584a1a0805930d30918ceebf0824fbb594731ebaa069eea9849995", - "size": 1826 - }, - { - "path": "agent-skills/space-hyperframes/talking-head-recut/SKILL.md", - "sourceObjectId": "e34ff0de6c0afffe507a0be110b414909f8675c2", - "sha256": "84bb6ba0ac3cb0505f09dd1ded0a07e2298daed6c33c05d7bb9a56d0ade53d2c", - "size": 65513 + "path": "agent-skills/space-hyperframes/slideshow/SKILL.md", + "sourceObjectId": "42cd47c28a1ee1f721426cd7465233e503e919ef", + "sha256": "a17b9d27ec3a3256bda717cf4796b8b8bd1d6770fbd4dbf5cd2f7f59662ac11e", + "size": 33915 }, { "path": "agent-skills/space-hyperframes/talking-head-recut/assets/vendor/gsap.min.js", @@ -6503,6 +6425,12 @@ "sha256": "19e9d258e8739a967aa3aef8779bb31a965a14fb35a78012366d14280cbeae35", "size": 912 }, + { + "path": "agent-skills/space-hyperframes/talking-head-recut/NOTICE.md", + "sourceObjectId": "38712c90e33710ffbb70dae7f91f130115430155", + "sha256": "0e0a88d4eb584a1a0805930d30918ceebf0824fbb594731ebaa069eea9849995", + "size": 1826 + }, { "path": "agent-skills/space-hyperframes/talking-head-recut/references/DESIGN_INDEX.md", "sourceObjectId": "393bbd1430d473311653c49a5efc0a173167e48d", @@ -6612,28 +6540,16 @@ "size": 7210 }, { - "path": "agent-skills/space-impeccable/LICENSE", - "sourceObjectId": "bb3f6d23b1f8025514a62a12b51b47d73e3c9aa9", - "sha256": "02bb8c3b4e70190e3986c0404ad2fd8d639b4f534252d82379cc1b502b6d1812", - "size": 10766 - }, - { - "path": "agent-skills/space-impeccable/SKILL.md", - "sourceObjectId": "27f2e5f7e7afd8d6dd54cd059bbc8fc9a412061d", - "sha256": "7b1702448ee58fb863ed5e38d65f3d2880a402c52447396fd4069cdb76598974", - "size": 3019 - }, - { - "path": "agent-skills/space-impeccable/UPSTREAM.md", - "sourceObjectId": "33018b7b4e05bdc6ab9edbf9d26b006af724dd89", - "sha256": "11bc1f04ebc9996e64556447f507ee90a64cd761872894152a52a5c17ffe72f3", - "size": 1559 + "path": "agent-skills/space-hyperframes/talking-head-recut/SKILL.md", + "sourceObjectId": "e34ff0de6c0afffe507a0be110b414909f8675c2", + "sha256": "84bb6ba0ac3cb0505f09dd1ded0a07e2298daed6c33c05d7bb9a56d0ade53d2c", + "size": 65513 }, { - "path": "agent-skills/space-impeccable/impeccable/SKILL.md", - "sourceObjectId": "b9d82965dd59a45596c5b63a1cf4207168a272a7", - "sha256": "58c0252bca04521de87007aeb495f7ec99dc4c7341bc890fe82b6d577573af91", - "size": 12263 + "path": "agent-skills/space-hyperframes/UPSTREAM.md", + "sourceObjectId": "87072bac0de4220c7ebc3e8910de2a5ea2d0718c", + "sha256": "72e2ab786302dc6cc117a53bc4e7cedcf524f42e9681c19f50a52139912c5507", + "size": 1882 }, { "path": "agent-skills/space-impeccable/impeccable/agents/impeccable_asset_producer.toml", @@ -6935,12 +6851,6 @@ "sha256": "1c81a831f9dd28b908306fa06e2f2944ca4595ff3df6570750c10bf806465f00", "size": 13918 }, - { - "path": "agent-skills/space-impeccable/impeccable/scripts/VERSION", - "sourceObjectId": "71d6a66eda4c751cd57798e19de8b770703abdd6", - "sha256": "9940d4b5219de8404015bc18af844c88d7e9e9105682a5d47b1d369d027dbd25", - "size": 7 - }, { "path": "agent-skills/space-impeccable/impeccable/scripts/command-metadata.json", "sourceObjectId": "89891ea4df179d5a07cf3aef42e84dafb1d05689", @@ -7002,10 +6912,34 @@ "size": 29290 }, { - "path": "agent-skills/space-job-applications/SKILL.md", - "sourceObjectId": "96b5da14e7bc5740c5d1bd7f069b31963420d995", - "sha256": "bbc4e26cad9cd223c372ca27305d8a0a818ff499856a645031a8039530d17248", - "size": 22249 + "path": "agent-skills/space-impeccable/impeccable/scripts/VERSION", + "sourceObjectId": "71d6a66eda4c751cd57798e19de8b770703abdd6", + "sha256": "9940d4b5219de8404015bc18af844c88d7e9e9105682a5d47b1d369d027dbd25", + "size": 7 + }, + { + "path": "agent-skills/space-impeccable/impeccable/SKILL.md", + "sourceObjectId": "b9d82965dd59a45596c5b63a1cf4207168a272a7", + "sha256": "58c0252bca04521de87007aeb495f7ec99dc4c7341bc890fe82b6d577573af91", + "size": 12263 + }, + { + "path": "agent-skills/space-impeccable/LICENSE", + "sourceObjectId": "bb3f6d23b1f8025514a62a12b51b47d73e3c9aa9", + "sha256": "02bb8c3b4e70190e3986c0404ad2fd8d639b4f534252d82379cc1b502b6d1812", + "size": 10766 + }, + { + "path": "agent-skills/space-impeccable/SKILL.md", + "sourceObjectId": "27f2e5f7e7afd8d6dd54cd059bbc8fc9a412061d", + "sha256": "7b1702448ee58fb863ed5e38d65f3d2880a402c52447396fd4069cdb76598974", + "size": 3019 + }, + { + "path": "agent-skills/space-impeccable/UPSTREAM.md", + "sourceObjectId": "33018b7b4e05bdc6ab9edbf9d26b006af724dd89", + "sha256": "11bc1f04ebc9996e64556447f507ee90a64cd761872894152a52a5c17ffe72f3", + "size": 1559 }, { "path": "agent-skills/space-job-applications/agents/openai.yaml", @@ -7055,6 +6989,12 @@ "sha256": "58a3a8313fcb18d676fdae29ee70c28b439dfbe31a34505e33d1ccbb4501d9c2", "size": 1166 }, + { + "path": "agent-skills/space-job-applications/SKILL.md", + "sourceObjectId": "96b5da14e7bc5740c5d1bd7f069b31963420d995", + "sha256": "bbc4e26cad9cd223c372ca27305d8a0a818ff499856a645031a8039530d17248", + "size": 22249 + }, { "path": "agent-skills/space-karpathy-guidelines/SKILL.md", "sourceObjectId": "c59511ab4daa3de893d2294d5831f6ff2d1d3fec", @@ -7067,12 +7007,6 @@ "sha256": "3a614d4561f7de67927966245c2d3bbf85f5a759c32fe0f941ebb92f554120ea", "size": 581 }, - { - "path": "agent-skills/space-mail-copilot/SKILL.md", - "sourceObjectId": "8cbf647347e2adc41dc64549db3339dbedcccbd7", - "sha256": "70f7fb1de65c1c6da60855f1c742dc8a98898ddb2488755a965693ca6f0e2d6e", - "size": 11167 - }, { "path": "agent-skills/space-mail-copilot/agents/openai.yaml", "sourceObjectId": "bfd67cf283b2e2b3929c32d07983dcc42315f40e", @@ -7080,10 +7014,10 @@ "size": 454 }, { - "path": "agent-skills/space-marketing-copilot/SKILL.md", - "sourceObjectId": "8f3fbcdae3f4d9aa1f9971b5b4827b4773ae5174", - "sha256": "5c4368a02a10149851f200018149ffbe206778beccb149aeef627cb1dc89eac2", - "size": 11780 + "path": "agent-skills/space-mail-copilot/SKILL.md", + "sourceObjectId": "8cbf647347e2adc41dc64549db3339dbedcccbd7", + "sha256": "70f7fb1de65c1c6da60855f1c742dc8a98898ddb2488755a965693ca6f0e2d6e", + "size": 11167 }, { "path": "agent-skills/space-marketing-copilot/agents/openai.yaml", @@ -7104,22 +7038,10 @@ "size": 4177 }, { - "path": "agent-skills/space-mattpocock-skills/SKILL.md", - "sourceObjectId": "e6785aeefc4c7ad990f91b25bfe68a7677bb7f84", - "sha256": "6995422c6299e0f99a7501172237452b090864cbcfd5d2265b4557a3ff5fe547", - "size": 1014 - }, - { - "path": "agent-skills/space-mattpocock-skills/UPSTREAM.md", - "sourceObjectId": "3a575b5f1a16ef281dedff6402063dd262444d52", - "sha256": "fe16d07d35a1604fde3823daa655f490c2d29739676a27225d783ee54e9c7934", - "size": 1414 - }, - { - "path": "agent-skills/space-mattpocock-skills/git-guardrails-claude-code/SKILL.md", - "sourceObjectId": "f5c121c073941b060248487d63164306fce025f2", - "sha256": "aa09033478de360f1aa0bd153dc566ff0ee6255d50b7685955a37a4345a6db6e", - "size": 3230 + "path": "agent-skills/space-marketing-copilot/SKILL.md", + "sourceObjectId": "8f3fbcdae3f4d9aa1f9971b5b4827b4773ae5174", + "sha256": "5c4368a02a10149851f200018149ffbe206778beccb149aeef627cb1dc89eac2", + "size": 11780 }, { "path": "agent-skills/space-mattpocock-skills/git-guardrails-claude-code/agents/openai.yaml", @@ -7134,10 +7056,10 @@ "size": 507 }, { - "path": "agent-skills/space-mattpocock-skills/handoff/SKILL.md", - "sourceObjectId": "f82571f54a76670420bb1515ffbfb3bf38cb25c3", - "sha256": "71c1e9a9b194f838db8b265f2c50ce5e6d4357282f4c88d1997788c5005cc293", - "size": 1697 + "path": "agent-skills/space-mattpocock-skills/git-guardrails-claude-code/SKILL.md", + "sourceObjectId": "f5c121c073941b060248487d63164306fce025f2", + "sha256": "aa09033478de360f1aa0bd153dc566ff0ee6255d50b7685955a37a4345a6db6e", + "size": 3230 }, { "path": "agent-skills/space-mattpocock-skills/handoff/agents/openai.yaml", @@ -7146,10 +7068,22 @@ "size": 141 }, { - "path": "agent-skills/space-media-studio/SKILL.md", - "sourceObjectId": "13f3dfc5b3c367de97b026af210db2f48e6c6a42", - "sha256": "6a96373f34ac012a987426ed6c209037bffc586642b08bfe07dec39cd239fdc0", - "size": 11805 + "path": "agent-skills/space-mattpocock-skills/handoff/SKILL.md", + "sourceObjectId": "f82571f54a76670420bb1515ffbfb3bf38cb25c3", + "sha256": "71c1e9a9b194f838db8b265f2c50ce5e6d4357282f4c88d1997788c5005cc293", + "size": 1697 + }, + { + "path": "agent-skills/space-mattpocock-skills/SKILL.md", + "sourceObjectId": "e6785aeefc4c7ad990f91b25bfe68a7677bb7f84", + "sha256": "6995422c6299e0f99a7501172237452b090864cbcfd5d2265b4557a3ff5fe547", + "size": 1014 + }, + { + "path": "agent-skills/space-mattpocock-skills/UPSTREAM.md", + "sourceObjectId": "3a575b5f1a16ef281dedff6402063dd262444d52", + "sha256": "fe16d07d35a1604fde3823daa655f490c2d29739676a27225d783ee54e9c7934", + "size": 1414 }, { "path": "agent-skills/space-media-studio/agents/openai.yaml", @@ -7170,16 +7104,10 @@ "size": 3788 }, { - "path": "agent-skills/space-no-ai-slop/SKILL.md", - "sourceObjectId": "310e6fcb16b82d9bad44c9b6026f4421e0ee9e27", - "sha256": "2c97ef4b8405ff95eccc1bba0096975695d9412151dc8d200e931e199ee311a8", - "size": 10890 - }, - { - "path": "agent-skills/space-no-ai-slop/UPSTREAM.md", - "sourceObjectId": "44a288498ef9fd45d443cfe073ac1b13fc8d1796", - "sha256": "d1e27d3ab30cd0a040eb97868088955104802ba1a3640d8629514b53f1fc5e10", - "size": 1384 + "path": "agent-skills/space-media-studio/SKILL.md", + "sourceObjectId": "13f3dfc5b3c367de97b026af210db2f48e6c6a42", + "sha256": "6a96373f34ac012a987426ed6c209037bffc586642b08bfe07dec39cd239fdc0", + "size": 11805 }, { "path": "agent-skills/space-no-ai-slop/agents/openai.yaml", @@ -7194,22 +7122,16 @@ "size": 3214 }, { - "path": "agent-skills/space-openseo/LICENSE", - "sourceObjectId": "d7d884f16474e989ff443e080f6e0d1ddb42c444", - "sha256": "c23e0aa0cdc924726993ffc8eb96e5283a7e8aaa7e068f1200277eb6df0f0f06", - "size": 1068 - }, - { - "path": "agent-skills/space-openseo/SKILL.md", - "sourceObjectId": "e0c9af7abc99579e7ef674c37312cb9a8a09c18b", - "sha256": "f8f67511d0f4834262d0503b5006863f06deaecf629e2ada41a99181b5b7afc8", - "size": 2794 + "path": "agent-skills/space-no-ai-slop/SKILL.md", + "sourceObjectId": "310e6fcb16b82d9bad44c9b6026f4421e0ee9e27", + "sha256": "2c97ef4b8405ff95eccc1bba0096975695d9412151dc8d200e931e199ee311a8", + "size": 10890 }, { - "path": "agent-skills/space-openseo/UPSTREAM.md", - "sourceObjectId": "2a313ef792f4325254c8680859dc4722266148cd", - "sha256": "34b835656a75f2060072b2808749369a33a7d9fc19a1b3052591965bb00fb7c9", - "size": 735 + "path": "agent-skills/space-no-ai-slop/UPSTREAM.md", + "sourceObjectId": "44a288498ef9fd45d443cfe073ac1b13fc8d1796", + "sha256": "d1e27d3ab30cd0a040eb97868088955104802ba1a3640d8629514b53f1fc5e10", + "size": 1384 }, { "path": "agent-skills/space-openseo/ai-prompt-research/SKILL.md", @@ -7247,6 +7169,12 @@ "sha256": "d4973d428f94bf335c8ffb567223e8d2014b0be545a78bd3361bfb1fc82a887b", "size": 7013 }, + { + "path": "agent-skills/space-openseo/LICENSE", + "sourceObjectId": "d7d884f16474e989ff443e080f6e0d1ddb42c444", + "sha256": "c23e0aa0cdc924726993ffc8eb96e5283a7e8aaa7e068f1200277eb6df0f0f06", + "size": 1068 + }, { "path": "agent-skills/space-openseo/link-prospecting/SKILL.md", "sourceObjectId": "eb676eae14b21a130ba9d097f52ddb986166fd31", @@ -7284,16 +7212,16 @@ "size": 21622 }, { - "path": "agent-skills/space-planning-with-files/SKILL.md", - "sourceObjectId": "bddd7b563c959922b7526b49949a89b476114d0f", - "sha256": "347647197d3e655bc35dd06e796cb8a3ead6c0facf0d01a757b022b857d74f8a", - "size": 9673 + "path": "agent-skills/space-openseo/SKILL.md", + "sourceObjectId": "e0c9af7abc99579e7ef674c37312cb9a8a09c18b", + "sha256": "f8f67511d0f4834262d0503b5006863f06deaecf629e2ada41a99181b5b7afc8", + "size": 2794 }, { - "path": "agent-skills/space-planning-with-files/UPSTREAM.md", - "sourceObjectId": "00bd1bc61fb7282ba1837ffb8ec2754da815f99a", - "sha256": "d4390420f0eb01b4431dec7ce1dc12b1bc6d65f190b5cd8eea4961557e6fbbca", - "size": 1871 + "path": "agent-skills/space-openseo/UPSTREAM.md", + "sourceObjectId": "2a313ef792f4325254c8680859dc4722266148cd", + "sha256": "34b835656a75f2060072b2808749369a33a7d9fc19a1b3052591965bb00fb7c9", + "size": 735 }, { "path": "agent-skills/space-planning-with-files/examples.md", @@ -7331,6 +7259,12 @@ "sha256": "236e069f2e26b25358e7e2882d36376ed64f290de0d3c34a9ffff1b6c8b07de3", "size": 15855 }, + { + "path": "agent-skills/space-planning-with-files/SKILL.md", + "sourceObjectId": "bddd7b563c959922b7526b49949a89b476114d0f", + "sha256": "347647197d3e655bc35dd06e796cb8a3ead6c0facf0d01a757b022b857d74f8a", + "size": 9673 + }, { "path": "agent-skills/space-planning-with-files/templates/analytics_findings.md", "sourceObjectId": "250ac59197ff7691a1f661f97fc0539eee6ddec0", @@ -7362,10 +7296,10 @@ "size": 2257 }, { - "path": "agent-skills/space-progress/SKILL.md", - "sourceObjectId": "23b8a1ec98217bc2007739afae36e266cf985ac9", - "sha256": "cf8ad243ef5bdbebb5e971d893166ab2ffad5a68ccd173350b0ac49b633cbb1e", - "size": 3350 + "path": "agent-skills/space-planning-with-files/UPSTREAM.md", + "sourceObjectId": "00bd1bc61fb7282ba1837ffb8ec2754da815f99a", + "sha256": "d4390420f0eb01b4431dec7ce1dc12b1bc6d65f190b5cd8eea4961557e6fbbca", + "size": 1871 }, { "path": "agent-skills/space-progress/agents/openai.yaml", @@ -7374,10 +7308,10 @@ "size": 399 }, { - "path": "agent-skills/space-security-copilot/SKILL.md", - "sourceObjectId": "917bf367c9ac371828401a8d60c3586b25ac9559", - "sha256": "c2e7917dd297b02e1e0ff02f8bac3aa9f0ffb0ef71c2763abcada1d24f63a8fc", - "size": 7655 + "path": "agent-skills/space-progress/SKILL.md", + "sourceObjectId": "23b8a1ec98217bc2007739afae36e266cf985ac9", + "sha256": "cf8ad243ef5bdbebb5e971d893166ab2ffad5a68ccd173350b0ac49b633cbb1e", + "size": 3350 }, { "path": "agent-skills/space-security-copilot/agents/openai.yaml", @@ -7385,6 +7319,12 @@ "sha256": "2f2aafc83927937f67943a1ed92aabdb886ace03fdc3156edf89ff84f10fd6a5", "size": 527 }, + { + "path": "agent-skills/space-security-copilot/SKILL.md", + "sourceObjectId": "917bf367c9ac371828401a8d60c3586b25ac9559", + "sha256": "c2e7917dd297b02e1e0ff02f8bac3aa9f0ffb0ef71c2763abcada1d24f63a8fc", + "size": 7655 + }, { "path": "agent-skills/space-stripe-best-practices/LICENSE", "sourceObjectId": "12ba71df9de6655fda1cca170243a405085d8b12", @@ -7397,18 +7337,6 @@ "sha256": "74f2a7fd1b5cdd18611b6e04f378c533ea5e4402ee723b6ea61674e2c4ba4c42", "size": 1409 }, - { - "path": "agent-skills/space-stripe-best-practices/UPSTREAM.md", - "sourceObjectId": "9628bd456ceff0c497e7d3daf926b8573a5c91aa", - "sha256": "72c08c7c32ecd608804cd35144253b296e9241ca66f5dda8ae7bb204fd606a74", - "size": 662 - }, - { - "path": "agent-skills/space-stripe-best-practices/stripe-best-practices/SKILL.md", - "sourceObjectId": "e5790de15f51d8714792be66fbefb7099944c54d", - "sha256": "2a85f02dbed48bb1e1863b80836151028512aa72f079467647a48833107acacc", - "size": 6246 - }, { "path": "agent-skills/space-stripe-best-practices/stripe-best-practices/references/billing.md", "sourceObjectId": "293fd0e1cb3555b5ea3fd2a82c751b0e76d6e04b", @@ -7446,22 +7374,16 @@ "size": 793 }, { - "path": "agent-skills/space-superpowers/SKILL.md", - "sourceObjectId": "203de08cc15dc08ae95d7fc4c703e38acd57b8aa", - "sha256": "cf535fcbb248f5289ac1de49f991172c201af533148ca02876587b7359f3fd85", - "size": 4021 - }, - { - "path": "agent-skills/space-superpowers/UPSTREAM.md", - "sourceObjectId": "3260fd95751d1ae2e398594129d35bb95a86956f", - "sha256": "afccc05c40be82b683fc198c76a406ee1596d76e7dbeb5f576eeaab97b079397", - "size": 1750 + "path": "agent-skills/space-stripe-best-practices/stripe-best-practices/SKILL.md", + "sourceObjectId": "e5790de15f51d8714792be66fbefb7099944c54d", + "sha256": "2a85f02dbed48bb1e1863b80836151028512aa72f079467647a48833107acacc", + "size": 6246 }, { - "path": "agent-skills/space-superpowers/brainstorming/SKILL.md", - "sourceObjectId": "e3f17885f8d5f87d7a92f0469141662b476e1288", - "sha256": "a32d2255354775aa124855aa7100cf276bea096fff4ebb3a0edf57be216e6c72", - "size": 17548 + "path": "agent-skills/space-stripe-best-practices/UPSTREAM.md", + "sourceObjectId": "9628bd456ceff0c497e7d3daf926b8573a5c91aa", + "sha256": "72c08c7c32ecd608804cd35144253b296e9241ca66f5dda8ae7bb204fd606a74", + "size": 662 }, { "path": "agent-skills/space-superpowers/brainstorming/scripts/frame-template.html", @@ -7493,6 +7415,12 @@ "sha256": "0b5ccbbd57f62d3ed88993f7940b5ee0e5c0fc9b21c550c623da4f6292e47daf", "size": 3263 }, + { + "path": "agent-skills/space-superpowers/brainstorming/SKILL.md", + "sourceObjectId": "e3f17885f8d5f87d7a92f0469141662b476e1288", + "sha256": "a32d2255354775aa124855aa7100cf276bea096fff4ebb3a0edf57be216e6c72", + "size": 17548 + }, { "path": "agent-skills/space-superpowers/brainstorming/spec-document-reviewer-prompt.md", "sourceObjectId": "60993129de3c445efeff53987b5297dc1acf3eb1", @@ -7505,12 +7433,6 @@ "sha256": "6ffcb038b53254bd31debaa15e12dcd4ff24bd63d690e0b644ac6396701cf2e2", "size": 13413 }, - { - "path": "agent-skills/space-superpowers/diagnosing-superpowers/SKILL.md", - "sourceObjectId": "f1d479fbc49e29b1984ef5ffa00ad20334445a14", - "sha256": "5a652f8132cc901eb5ca61f89157839f87a2f20aed037fc7a2b51051bc37cd19", - "size": 6904 - }, { "path": "agent-skills/space-superpowers/diagnosing-superpowers/prompts/analyst-common.md", "sourceObjectId": "d7c4033065f1390b4bb681a5d81968cd2190867d", @@ -7601,6 +7523,12 @@ "sha256": "6d1dced083e5d978448a78df298cf515531b0eb39b2854a4a2afbffeb69a7435", "size": 1859 }, + { + "path": "agent-skills/space-superpowers/diagnosing-superpowers/SKILL.md", + "sourceObjectId": "f1d479fbc49e29b1984ef5ffa00ad20334445a14", + "sha256": "5a652f8132cc901eb5ca61f89157839f87a2f20aed037fc7a2b51051bc37cd19", + "size": 6904 + }, { "path": "agent-skills/space-superpowers/diagnosing-superpowers/templates/bundle-README.md", "sourceObjectId": "c469b157b511c073abc787b102e5383637cb0cf2", @@ -7631,12 +7559,6 @@ "sha256": "1968923066f3b707eb01d1992cdf4c42284c3855f70253b9cd5000ff45fca13c", "size": 6078 }, - { - "path": "agent-skills/space-superpowers/executing-plans/SKILL.md", - "sourceObjectId": "49077ad961268a840d7dcb5d8c5d06c46fc276ae", - "sha256": "f38e8f2ddcf079f65493adc713c1fed78421dfaf5f4dbf6b3a6b2b1d95466e71", - "size": 20405 - }, { "path": "agent-skills/space-superpowers/executing-plans/scripts/task-done", "sourceObjectId": "dd09871b06d93488902e0f8836d7836b25fbbfba", @@ -7649,6 +7571,12 @@ "sha256": "f833693c8fce3700fc9f841562d80f8015cd40f652c168a3405ac3e46947a1fe", "size": 963 }, + { + "path": "agent-skills/space-superpowers/executing-plans/SKILL.md", + "sourceObjectId": "49077ad961268a840d7dcb5d8c5d06c46fc276ae", + "sha256": "f38e8f2ddcf079f65493adc713c1fed78421dfaf5f4dbf6b3a6b2b1d95466e71", + "size": 20405 + }, { "path": "agent-skills/space-superpowers/finishing-a-development-branch/SKILL.md", "sourceObjectId": "fa8aecaf8813f1b19d19996f7957d1b0121f2d9c", @@ -7661,12 +7589,6 @@ "sha256": "091df1629510af1b92fc4abd6f96732ebedb4cb2c0f3457e8f2740b0504a2438", "size": 6203 }, - { - "path": "agent-skills/space-superpowers/requesting-code-review/SKILL.md", - "sourceObjectId": "6d995da5c7d8d6c5a3cc63ddb701427f88ec2021", - "sha256": "cfcee1b06774e7c0517f1e09be1a11f2d5680257072723e709ddbcf7e08b795a", - "size": 2977 - }, { "path": "agent-skills/space-superpowers/requesting-code-review/code-reviewer.md", "sourceObjectId": "6d358b5d7d450c83cacbe450b7dbd4e673b694ad", @@ -7674,10 +7596,16 @@ "size": 6449 }, { - "path": "agent-skills/space-superpowers/subagent-driven-development/SKILL.md", - "sourceObjectId": "f7bbf6a01b519807ec00baf5e98522bed33f8834", - "sha256": "8dde5589ee083fb4999106d116f01c8fdaf3116a8a9813fdedeb80329de49046", - "size": 32577 + "path": "agent-skills/space-superpowers/requesting-code-review/SKILL.md", + "sourceObjectId": "6d995da5c7d8d6c5a3cc63ddb701427f88ec2021", + "sha256": "cfcee1b06774e7c0517f1e09be1a11f2d5680257072723e709ddbcf7e08b795a", + "size": 2977 + }, + { + "path": "agent-skills/space-superpowers/SKILL.md", + "sourceObjectId": "203de08cc15dc08ae95d7fc4c703e38acd57b8aa", + "sha256": "cf535fcbb248f5289ac1de49f991172c201af533148ca02876587b7359f3fd85", + "size": 4021 }, { "path": "agent-skills/space-superpowers/subagent-driven-development/implementer-prompt.md", @@ -7709,24 +7637,18 @@ "sha256": "cc563538e09abf719b34ddf4b2fa7a65cf3b301729039dbfa923cb060f729146", "size": 1322 }, + { + "path": "agent-skills/space-superpowers/subagent-driven-development/SKILL.md", + "sourceObjectId": "f7bbf6a01b519807ec00baf5e98522bed33f8834", + "sha256": "8dde5589ee083fb4999106d116f01c8fdaf3116a8a9813fdedeb80329de49046", + "size": 32577 + }, { "path": "agent-skills/space-superpowers/subagent-driven-development/task-reviewer-prompt.md", "sourceObjectId": "5c619bc510440b7bf156e78c4dfc60f198963cf0", "sha256": "bfed55c8f19d0ff6ed57b0fe09127c92890e9311c6c73917129598826bf9ebe8", "size": 9031 }, - { - "path": "agent-skills/space-superpowers/systematic-debugging/CREATION-LOG.md", - "sourceObjectId": "9aa03092809feaf93c9bfa985252f6f1c9624692", - "sha256": "c24733a5b1821bd6bed1fc950261f0b9f4e90097e0bbb96459d8179713730789", - "size": 4257 - }, - { - "path": "agent-skills/space-superpowers/systematic-debugging/SKILL.md", - "sourceObjectId": "095d194ac041502905f15b01d22d294fb94db8b2", - "sha256": "808fc5717aa88ad65efff312b11c186294d3e6ee301afb584e2f86599b137787", - "size": 9465 - }, { "path": "agent-skills/space-superpowers/systematic-debugging/condition-based-waiting-example.ts", "sourceObjectId": "703a06b653160d060bbf46ab5c6e0cd7446bd592", @@ -7739,6 +7661,12 @@ "sha256": "e89fec8400d6cd50f43407cec9fab50976ba4d55d0ec2eb51c0bd68036b54c26", "size": 3516 }, + { + "path": "agent-skills/space-superpowers/systematic-debugging/CREATION-LOG.md", + "sourceObjectId": "9aa03092809feaf93c9bfa985252f6f1c9624692", + "sha256": "c24733a5b1821bd6bed1fc950261f0b9f4e90097e0bbb96459d8179713730789", + "size": 4257 + }, { "path": "agent-skills/space-superpowers/systematic-debugging/defense-in-depth.md", "sourceObjectId": "e2483354dc2b62478a2624e34ca18bc0efe887b2", @@ -7757,6 +7685,12 @@ "sha256": "75b933b6a8c40bdb2031b10f21654395b56ec6ab6bc7b018c18d3fe57aeb7fb8", "size": 5321 }, + { + "path": "agent-skills/space-superpowers/systematic-debugging/SKILL.md", + "sourceObjectId": "095d194ac041502905f15b01d22d294fb94db8b2", + "sha256": "808fc5717aa88ad65efff312b11c186294d3e6ee301afb584e2f86599b137787", + "size": 9465 + }, { "path": "agent-skills/space-superpowers/systematic-debugging/test-academic.md", "sourceObjectId": "23a6ed7a2044e0c44d74c3101406140f4851aa41", @@ -7793,18 +7727,18 @@ "sha256": "51471c853306ff92ca8bb41dcaea05f31c0e46b03651f8f3c99754b7172f4ae1", "size": 8268 }, + { + "path": "agent-skills/space-superpowers/UPSTREAM.md", + "sourceObjectId": "3260fd95751d1ae2e398594129d35bb95a86956f", + "sha256": "afccc05c40be82b683fc198c76a406ee1596d76e7dbeb5f576eeaab97b079397", + "size": 1750 + }, { "path": "agent-skills/space-superpowers/using-git-worktrees/SKILL.md", "sourceObjectId": "1381dacb3516b94382dd6ec736ede21ee8ede2b3", "sha256": "8cfb86f121269e8f7f12361e6795c4f6738828340e28964c9229d365666c9edd", "size": 6813 }, - { - "path": "agent-skills/space-superpowers/using-superpowers/SKILL.md", - "sourceObjectId": "069d578445805a28b8dacbf70cdf045e1673def0", - "sha256": "82c5c8866ad7f5dd4440ce66bd7806ba48a2f13771beae5cf112e53f08fe36ba", - "size": 3192 - }, { "path": "agent-skills/space-superpowers/using-superpowers/references/antigravity-tools.md", "sourceObjectId": "2e1eac90534af6e1f27df4e18410be8a7b442448", @@ -7847,6 +7781,12 @@ "sha256": "703dbc83d23ecab9c6f388460c38abc482e9dee2fe6772a8c7a255152ad3a4d5", "size": 1242 }, + { + "path": "agent-skills/space-superpowers/using-superpowers/SKILL.md", + "sourceObjectId": "069d578445805a28b8dacbf70cdf045e1673def0", + "sha256": "82c5c8866ad7f5dd4440ce66bd7806ba48a2f13771beae5cf112e53f08fe36ba", + "size": 3192 + }, { "path": "agent-skills/space-superpowers/verification-before-completion/SKILL.md", "sourceObjectId": "7d45333cc4a49c57a80df6c1fe2fa777a207afbc", @@ -7859,12 +7799,6 @@ "sha256": "a6c67c1900064347c2a329990dd3c555657c51c3ec53b259a08aa01a2c26139a", "size": 10335 }, - { - "path": "agent-skills/space-superpowers/writing-skills/SKILL.md", - "sourceObjectId": "182dfad177c9940d8ea388be322aadddd6c4db5f", - "sha256": "bbdfe742f853562e643a3d40d64476359d47881e39cef80a189283fa26d11ab9", - "size": 26623 - }, { "path": "agent-skills/space-superpowers/writing-skills/anthropic-best-practices.md", "sourceObjectId": "15ea9eae223d9081b602618849791c07a7758f3d", @@ -7895,24 +7829,18 @@ "sha256": "c7f412cc629461c4d10287e668731874c0497707023e3e3f74a5355eb2cee196", "size": 4968 }, + { + "path": "agent-skills/space-superpowers/writing-skills/SKILL.md", + "sourceObjectId": "182dfad177c9940d8ea388be322aadddd6c4db5f", + "sha256": "bbdfe742f853562e643a3d40d64476359d47881e39cef80a189283fa26d11ab9", + "size": 26623 + }, { "path": "agent-skills/space-superpowers/writing-skills/testing-skills-with-subagents.md", "sourceObjectId": "a5acfeac86f34c7bc625d064e10c8a2f8180b696", "sha256": "c711346852c911b24a84aa161e0cff06a4cd7f4e2fa9e9c0a266cead5afcbade", "size": 12558 }, - { - "path": "agent-skills/space-taste-skill/SKILL.md", - "sourceObjectId": "e733213c6bafd05377b11c29e79cfc03a629758a", - "sha256": "f20aaf3115f2049e8ab93f9409869d78b9fab30894798d801dd328c422969da3", - "size": 2789 - }, - { - "path": "agent-skills/space-taste-skill/UPSTREAM.md", - "sourceObjectId": "3d426075e1ff7281a0d6e87c2c2a0bdfa70e24d1", - "sha256": "d95e68cef8e175010fd800987685805a35a00291d0bdb45d661e3bbaafec533b", - "size": 1620 - }, { "path": "agent-skills/space-taste-skill/brandkit/SKILL.md", "sourceObjectId": "d76399f666af97ac8c142928e02602d9732e78aa", @@ -7973,6 +7901,12 @@ "sha256": "98ad3e5b051bfb71b2795f7e8a6aa0d32b51ee095606c098a4b2822ac07926c9", "size": 15060 }, + { + "path": "agent-skills/space-taste-skill/SKILL.md", + "sourceObjectId": "e733213c6bafd05377b11c29e79cfc03a629758a", + "sha256": "f20aaf3115f2049e8ab93f9409869d78b9fab30894798d801dd328c422969da3", + "size": 2789 + }, { "path": "agent-skills/space-taste-skill/soft-skill/SKILL.md", "sourceObjectId": "4038f41ec0137ec92e98ed0151fe3b7038b9329e", @@ -8003,24 +7937,18 @@ "sha256": "aa194351b246b8b4799099d4ed7b033d29eab6e6e3d58d8d2172978be7b3ec89", "size": 87253 }, + { + "path": "agent-skills/space-taste-skill/UPSTREAM.md", + "sourceObjectId": "3d426075e1ff7281a0d6e87c2c2a0bdfa70e24d1", + "sha256": "d95e68cef8e175010fd800987685805a35a00291d0bdb45d661e3bbaafec533b", + "size": 1620 + }, { "path": "agent-skills/space-tool-routing/SKILL.md", "sourceObjectId": "6e7472563e33f5fa8fc4fc9d57442675c7086ddc", "sha256": "02a8458e49caf703b53a1dbe72b53be4fcabde7a51e4576bea1e9a3b19bae7ab", "size": 1551 }, - { - "path": "agent-skills/space-ui-ux-pro-max/SKILL.md", - "sourceObjectId": "566873a56e7ca43362de94c729b8be8a6b6d6aba", - "sha256": "21b21135ff84d6e61b3f43ff33279171b501ca323e3fc81853d095f9a917426c", - "size": 16133 - }, - { - "path": "agent-skills/space-ui-ux-pro-max/UPSTREAM.md", - "sourceObjectId": "c2757727cc1094f29f2c557f7cb3917dce87ed92", - "sha256": "724d26c3d80beb9f012c895b229e001a09faa417a3c1a11348a363afa79caf54", - "size": 1645 - }, { "path": "agent-skills/space-ui-ux-pro-max/data/app-interface.csv", "sourceObjectId": "95e328c807a23be02c9c32c736d0fa19109c6076", @@ -8298,10 +8226,16 @@ "size": 52230 }, { - "path": "agent-skills/space-vault/SKILL.md", - "sourceObjectId": "37995f946bf19952e43b9bf01a965d2eb36488e4", - "sha256": "dd1e96ec1903b483be8316fd38c62d3a4cca8df6cc4617ca99897f003d315065", - "size": 6587 + "path": "agent-skills/space-ui-ux-pro-max/SKILL.md", + "sourceObjectId": "566873a56e7ca43362de94c729b8be8a6b6d6aba", + "sha256": "21b21135ff84d6e61b3f43ff33279171b501ca323e3fc81853d095f9a917426c", + "size": 16133 + }, + { + "path": "agent-skills/space-ui-ux-pro-max/UPSTREAM.md", + "sourceObjectId": "c2757727cc1094f29f2c557f7cb3917dce87ed92", + "sha256": "724d26c3d80beb9f012c895b229e001a09faa417a3c1a11348a363afa79caf54", + "size": 1645 }, { "path": "agent-skills/space-vault/agents/openai.yaml", @@ -8310,10 +8244,10 @@ "size": 481 }, { - "path": "agent-skills/space-video/SKILL.md", - "sourceObjectId": "6e0608697251b2909b25ea3712d3a99cfea4e0d1", - "sha256": "f2baa5899a173c727701fa15dbf9df4b00c30000fd3ac41680209be35263ed46", - "size": 9223 + "path": "agent-skills/space-vault/SKILL.md", + "sourceObjectId": "37995f946bf19952e43b9bf01a965d2eb36488e4", + "sha256": "dd1e96ec1903b483be8316fd38c62d3a4cca8df6cc4617ca99897f003d315065", + "size": 6587 }, { "path": "agent-skills/space-video/agents/openai.yaml", @@ -8352,16 +8286,16 @@ "size": 3046 }, { - "path": "agent-skills/space-wshobson-skills/SKILL.md", - "sourceObjectId": "b57f9be5a7c7b7cbf04a53f7f38009c13beb47c5", - "sha256": "e9eeba62415cf404f31332e54856cf10fe2b8a5fb63d99a19bc4a3c18ecb14f4", - "size": 5008 + "path": "agent-skills/space-video/SKILL.md", + "sourceObjectId": "6e0608697251b2909b25ea3712d3a99cfea4e0d1", + "sha256": "f2baa5899a173c727701fa15dbf9df4b00c30000fd3ac41680209be35263ed46", + "size": 9223 }, { - "path": "agent-skills/space-wshobson-skills/UPSTREAM.md", - "sourceObjectId": "3522fb85c4ef64574ec0061e00147fe56422f0d3", - "sha256": "92dcc847bdb20102dd6ad4cce5878b2858047b94b3c3e52b995bfc9a02dd49b4", - "size": 1716 + "path": "agent-skills/space-wshobson-skills/attack-tree-construction/references/details.md", + "sourceObjectId": "c1ae2a1693379767c479203aa953e670397381ec", + "sha256": "0d9f9efa4402a9e1846d2f922e44f9027e2d8c1ebc282f4326a9eb082cc9f5b3", + "size": 19817 }, { "path": "agent-skills/space-wshobson-skills/attack-tree-construction/SKILL.md", @@ -8370,10 +8304,10 @@ "size": 2613 }, { - "path": "agent-skills/space-wshobson-skills/attack-tree-construction/references/details.md", - "sourceObjectId": "c1ae2a1693379767c479203aa953e670397381ec", - "sha256": "0d9f9efa4402a9e1846d2f922e44f9027e2d8c1ebc282f4326a9eb082cc9f5b3", - "size": 19817 + "path": "agent-skills/space-wshobson-skills/connectivity-triage/references/details.md", + "sourceObjectId": "77989df0e297d15a69eead226031158e7d8a66b1", + "sha256": "38244fb0faf77e0a213a490c7e87208f4da477500542d6a92360c92a2f3cfd4f", + "size": 15168 }, { "path": "agent-skills/space-wshobson-skills/connectivity-triage/SKILL.md", @@ -8382,10 +8316,10 @@ "size": 8101 }, { - "path": "agent-skills/space-wshobson-skills/connectivity-triage/references/details.md", - "sourceObjectId": "77989df0e297d15a69eead226031158e7d8a66b1", - "sha256": "38244fb0faf77e0a213a490c7e87208f4da477500542d6a92360c92a2f3cfd4f", - "size": 15168 + "path": "agent-skills/space-wshobson-skills/distributed-tracing/references/details.md", + "sourceObjectId": "e9f2e780795f001edce436153e5172929fc4fd58", + "sha256": "2c941c4d4dd5907031d9fc21818f5258fed37864f0234055d9b8775a5b40690d", + "size": 8005 }, { "path": "agent-skills/space-wshobson-skills/distributed-tracing/SKILL.md", @@ -8393,24 +8327,12 @@ "sha256": "0d1126fba0efea8dba3adfda2ce15b1868b3db29240d8be8388ebc1657ba31a0", "size": 2105 }, - { - "path": "agent-skills/space-wshobson-skills/distributed-tracing/references/details.md", - "sourceObjectId": "e9f2e780795f001edce436153e5172929fc4fd58", - "sha256": "2c941c4d4dd5907031d9fc21818f5258fed37864f0234055d9b8775a5b40690d", - "size": 8005 - }, { "path": "agent-skills/space-wshobson-skills/grafana-dashboards/SKILL.md", "sourceObjectId": "0d67ccf0e7e28208378831cf38f969621b48c62d", "sha256": "9ee1be2a4913dfd0f0f804ebf1447b002f5193041c9da2c2a7f8a400ac2477c0", "size": 7986 }, - { - "path": "agent-skills/space-wshobson-skills/incident-runbook-templates/SKILL.md", - "sourceObjectId": "70632a7d6383d19bc32198ed52c6bee9db41bb9c", - "sha256": "fd9ca9b9bc958da514039d59e453b05182208c7410696273d2c62350ff3ad1aa", - "size": 5463 - }, { "path": "agent-skills/space-wshobson-skills/incident-runbook-templates/references/details.md", "sourceObjectId": "9b107078b9f88ce7d0a2db46b3b244fe16b6796a", @@ -8418,10 +8340,10 @@ "size": 8769 }, { - "path": "agent-skills/space-wshobson-skills/javascript-testing-patterns/SKILL.md", - "sourceObjectId": "9102d72c46491ba9b36886fc10603e4583e524d9", - "sha256": "d99e1d7344ca7b87395c7e49f6c635ea67fe16d57f4698d72c78d405020f5782", - "size": 14629 + "path": "agent-skills/space-wshobson-skills/incident-runbook-templates/SKILL.md", + "sourceObjectId": "70632a7d6383d19bc32198ed52c6bee9db41bb9c", + "sha256": "fd9ca9b9bc958da514039d59e453b05182208c7410696273d2c62350ff3ad1aa", + "size": 5463 }, { "path": "agent-skills/space-wshobson-skills/javascript-testing-patterns/references/advanced-testing-patterns.md", @@ -8430,10 +8352,10 @@ "size": 12837 }, { - "path": "agent-skills/space-wshobson-skills/modern-javascript-patterns/SKILL.md", - "sourceObjectId": "a7739c7372c520ae6370fad2d8ee0b1a9c1a057d", - "sha256": "32e203b8d944115102986dcb3cf4c48918edc5dbf6942668875970121809c064", - "size": 2189 + "path": "agent-skills/space-wshobson-skills/javascript-testing-patterns/SKILL.md", + "sourceObjectId": "9102d72c46491ba9b36886fc10603e4583e524d9", + "sha256": "d99e1d7344ca7b87395c7e49f6c635ea67fe16d57f4698d72c78d405020f5782", + "size": 14629 }, { "path": "agent-skills/space-wshobson-skills/modern-javascript-patterns/references/advanced-patterns.md", @@ -8448,10 +8370,10 @@ "size": 10362 }, { - "path": "agent-skills/space-wshobson-skills/nodejs-backend-patterns/SKILL.md", - "sourceObjectId": "516bae620afc0afa257fed08e3def7549e6a33fb", - "sha256": "d52e1150accdc27e916f0962c9ba0872fcbe8a7d849d905dcc795c0f9d05aeae", - "size": 1995 + "path": "agent-skills/space-wshobson-skills/modern-javascript-patterns/SKILL.md", + "sourceObjectId": "a7739c7372c520ae6370fad2d8ee0b1a9c1a057d", + "sha256": "32e203b8d944115102986dcb3cf4c48918edc5dbf6942668875970121809c064", + "size": 2189 }, { "path": "agent-skills/space-wshobson-skills/nodejs-backend-patterns/references/advanced-patterns.md", @@ -8466,10 +8388,10 @@ "size": 15001 }, { - "path": "agent-skills/space-wshobson-skills/on-call-handoff-patterns/SKILL.md", - "sourceObjectId": "fac98d35f10b3e6b1b1fdca485c7fe6613b3cc29", - "sha256": "46d03bf3a2922e77d0393dc6c0f0342056a25af15bee7c7523b0adc6d1e5d49e", - "size": 3701 + "path": "agent-skills/space-wshobson-skills/nodejs-backend-patterns/SKILL.md", + "sourceObjectId": "516bae620afc0afa257fed08e3def7549e6a33fb", + "sha256": "d52e1150accdc27e916f0962c9ba0872fcbe8a7d849d905dcc795c0f9d05aeae", + "size": 1995 }, { "path": "agent-skills/space-wshobson-skills/on-call-handoff-patterns/references/details.md", @@ -8478,10 +8400,10 @@ "size": 6276 }, { - "path": "agent-skills/space-wshobson-skills/postmortem-writing/SKILL.md", - "sourceObjectId": "f68b37f973cbca925ce4503c656166968b7faf97", - "sha256": "1a9d5b19b9ab32acb6616fb0990b8307888da0169537929916762d91501b84e0", - "size": 6795 + "path": "agent-skills/space-wshobson-skills/on-call-handoff-patterns/SKILL.md", + "sourceObjectId": "fac98d35f10b3e6b1b1fdca485c7fe6613b3cc29", + "sha256": "46d03bf3a2922e77d0393dc6c0f0342056a25af15bee7c7523b0adc6d1e5d49e", + "size": 3701 }, { "path": "agent-skills/space-wshobson-skills/postmortem-writing/references/details.md", @@ -8490,10 +8412,10 @@ "size": 5851 }, { - "path": "agent-skills/space-wshobson-skills/prometheus-configuration/SKILL.md", - "sourceObjectId": "f38371dd5bc691e97c11709298a61060928f1ade", - "sha256": "e28770f8645d98ce351e6de07535af743a126cd61fc7576485175f9f49e0d9a9", - "size": 1795 + "path": "agent-skills/space-wshobson-skills/postmortem-writing/SKILL.md", + "sourceObjectId": "f68b37f973cbca925ce4503c656166968b7faf97", + "sha256": "1a9d5b19b9ab32acb6616fb0990b8307888da0169537929916762d91501b84e0", + "size": 6795 }, { "path": "agent-skills/space-wshobson-skills/prometheus-configuration/references/details.md", @@ -8501,12 +8423,24 @@ "sha256": "5c2f5e07012c033a0b8eb58f728287f1ff0230bc1f32bc3b199e54387eecd32c", "size": 8315 }, + { + "path": "agent-skills/space-wshobson-skills/prometheus-configuration/SKILL.md", + "sourceObjectId": "f38371dd5bc691e97c11709298a61060928f1ade", + "sha256": "e28770f8645d98ce351e6de07535af743a126cd61fc7576485175f9f49e0d9a9", + "size": 1795 + }, { "path": "agent-skills/space-wshobson-skills/sast-configuration/SKILL.md", "sourceObjectId": "9d6f85c082fd0062b3ecc42f40c32723e017b554", "sha256": "f9c0aae423d2963356d4751bca507054689c15f7c3cdecfaf01e06c8cd98531e", "size": 5403 }, + { + "path": "agent-skills/space-wshobson-skills/security-requirement-extraction/references/details.md", + "sourceObjectId": "2adbdd8b830cda6c903c572e37329bc6c47b793d", + "sha256": "e304b0e15e876dfc99e09302491fa1c635e0a509e5a04b91ed1047b6400f12da", + "size": 21889 + }, { "path": "agent-skills/space-wshobson-skills/security-requirement-extraction/SKILL.md", "sourceObjectId": "a56194330bf9f70cc78a24539d1ce6c5fea8845d", @@ -8514,10 +8448,16 @@ "size": 2537 }, { - "path": "agent-skills/space-wshobson-skills/security-requirement-extraction/references/details.md", - "sourceObjectId": "2adbdd8b830cda6c903c572e37329bc6c47b793d", - "sha256": "e304b0e15e876dfc99e09302491fa1c635e0a509e5a04b91ed1047b6400f12da", - "size": 21889 + "path": "agent-skills/space-wshobson-skills/SKILL.md", + "sourceObjectId": "b57f9be5a7c7b7cbf04a53f7f38009c13beb47c5", + "sha256": "e9eeba62415cf404f31332e54856cf10fe2b8a5fb63d99a19bc4a3c18ecb14f4", + "size": 5008 + }, + { + "path": "agent-skills/space-wshobson-skills/slo-implementation/references/details.md", + "sourceObjectId": "8a5b02b8e662cbb63e76b531945378347adce12a", + "sha256": "5ec829a44c438dd828e910ab7db9986768d79e5b9cb550ca217ed71376cedce9", + "size": 1378 }, { "path": "agent-skills/space-wshobson-skills/slo-implementation/SKILL.md", @@ -8526,10 +8466,10 @@ "size": 7163 }, { - "path": "agent-skills/space-wshobson-skills/slo-implementation/references/details.md", - "sourceObjectId": "8a5b02b8e662cbb63e76b531945378347adce12a", - "sha256": "5ec829a44c438dd828e910ab7db9986768d79e5b9cb550ca217ed71376cedce9", - "size": 1378 + "path": "agent-skills/space-wshobson-skills/stride-analysis-patterns/references/details.md", + "sourceObjectId": "14dad1d62f5a72efb83d68f71372090766c7cbf9", + "sha256": "c386eb04dacbbb52eaaed318e7681549c40bd4686cce2f0d17d24f1c03ae1049", + "size": 18499 }, { "path": "agent-skills/space-wshobson-skills/stride-analysis-patterns/SKILL.md", @@ -8538,10 +8478,10 @@ "size": 2452 }, { - "path": "agent-skills/space-wshobson-skills/stride-analysis-patterns/references/details.md", - "sourceObjectId": "14dad1d62f5a72efb83d68f71372090766c7cbf9", - "sha256": "c386eb04dacbbb52eaaed318e7681549c40bd4686cce2f0d17d24f1c03ae1049", - "size": 18499 + "path": "agent-skills/space-wshobson-skills/threat-mitigation-mapping/references/details.md", + "sourceObjectId": "c7bac62dd0c2c1eb88f91c7e47ae3e3145dfaa4e", + "sha256": "767e373e9a7b321095352f856499965a4abe999f247cde2415edcf2e038a045b", + "size": 23581 }, { "path": "agent-skills/space-wshobson-skills/threat-mitigation-mapping/SKILL.md", @@ -8550,10 +8490,10 @@ "size": 3346 }, { - "path": "agent-skills/space-wshobson-skills/threat-mitigation-mapping/references/details.md", - "sourceObjectId": "c7bac62dd0c2c1eb88f91c7e47ae3e3145dfaa4e", - "sha256": "767e373e9a7b321095352f856499965a4abe999f247cde2415edcf2e038a045b", - "size": 23581 + "path": "agent-skills/space-wshobson-skills/typescript-advanced-types/references/details.md", + "sourceObjectId": "6b1b9a15c1103c8ebbebba1a3cb696ab7ad9dab9", + "sha256": "036a1dd41283384f086ac0eeb4f63c899b042ad68815a8ce00afebf606b55c44", + "size": 9027 }, { "path": "agent-skills/space-wshobson-skills/typescript-advanced-types/SKILL.md", @@ -8562,10 +8502,10 @@ "size": 8035 }, { - "path": "agent-skills/space-wshobson-skills/typescript-advanced-types/references/details.md", - "sourceObjectId": "6b1b9a15c1103c8ebbebba1a3cb696ab7ad9dab9", - "sha256": "036a1dd41283384f086ac0eeb4f63c899b042ad68815a8ce00afebf606b55c44", - "size": 9027 + "path": "agent-skills/space-wshobson-skills/UPSTREAM.md", + "sourceObjectId": "3522fb85c4ef64574ec0061e00147fe56422f0d3", + "sha256": "92dcc847bdb20102dd6ad4cce5878b2858047b94b3c3e52b995bfc9a02dd49b4", + "size": 1716 }, { "path": "apps/api/package.json", @@ -14993,12 +14933,6 @@ "sha256": "0629afabba82bef13b5ac3aaa09636441cfc5642a8b8241593e3d0902cadfdbe", "size": 1252 }, - { - "path": "apps/web/PUBLIC-MOCK.md", - "sourceObjectId": "746d1e25cc835241a7d63db9389f16547dee3448", - "sha256": "63ac9573399aea6dfee0fadb21031635f1bef6bb13b98cfb9b94bc8ffc46ae60", - "size": 2675 - }, { "path": "apps/web/feature.html", "sourceObjectId": "2c9a88db4d22299a38e0042b6e131523e43c0881", @@ -15029,6 +14963,12 @@ "sha256": "f9ca85ca3055d720cd12be2f1291c0cca3b8b4560398c4f065d89fa051126a1d", "size": 1378 }, + { + "path": "apps/web/PUBLIC-MOCK.md", + "sourceObjectId": "746d1e25cc835241a7d63db9389f16547dee3448", + "sha256": "63ac9573399aea6dfee0fadb21031635f1bef6bb13b98cfb9b94bc8ffc46ae60", + "size": 2675 + }, { "path": "apps/web/public/brand/aira-core.svg", "sourceObjectId": "a751ee0fdbffa51546ee43f4fa1ff44eb2903cac", @@ -15365,12 +15305,6 @@ "sha256": "ffadba2020fc2deb0d82a10b080115d0316fd7c7acbc5bd846951acdea06668c", "size": 1206 }, - { - "path": "apps/web/public/dots/README.md", - "sourceObjectId": "f3e3aca874445473d93aa21230494c2b3e348086", - "sha256": "b2a150e715b1d678f1ee8551ea5fa31e3d757afd7e68c606fbc1e369a4de4fd6", - "size": 2087 - }, { "path": "apps/web/public/dots/byte.svg", "sourceObjectId": "576f5d6fce10b51b361409af409c939241de987b", @@ -15407,6 +15341,12 @@ "sha256": "5b3176a95f6ea5fda1115bf0d5dc6e80ddc6b8e962bc41f70b260439ce5fc6ee", "size": 8049 }, + { + "path": "apps/web/public/dots/README.md", + "sourceObjectId": "f3e3aca874445473d93aa21230494c2b3e348086", + "sha256": "b2a150e715b1d678f1ee8551ea5fa31e3d757afd7e68c606fbc1e369a4de4fd6", + "size": 2087 + }, { "path": "apps/web/public/entry-loading.css", "sourceObjectId": "2cfe8fdfdf355250bf541e29b383446935b3bd2c", @@ -15503,18 +15443,6 @@ "sha256": "e4a18386a8a6a9231979f96db26178c3d9893d624924631f145e2abb5eac9395", "size": 22348 }, - { - "path": "apps/web/src/App.tsx", - "sourceObjectId": "a27a6653021b87f3e5c2df594ce6f8c787553804", - "sha256": "a8538177b04379991d0423bf5ff3b89942c4cc7b30bd4deb79e4aea8ce0e48ce", - "size": 346042 - }, - { - "path": "apps/web/src/SpaceBrand.tsx", - "sourceObjectId": "425047d28d1698facd8e23f044c66be38a9c004d", - "sha256": "46a88dbd86beddf675cdadead7679d024907c690a7f4998a3d676f2d3a7ff2f7", - "size": 4213 - }, { "path": "apps/web/src/api.ts", "sourceObjectId": "ec132219041a89d6b4800ff4d83e74ab776b742c", @@ -15551,6 +15479,12 @@ "sha256": "81e937e7f0e036c4e31416b6a5c0fdf0e8ef7adde0e9afd572fd302d7863debe", "size": 3281 }, + { + "path": "apps/web/src/App.tsx", + "sourceObjectId": "a27a6653021b87f3e5c2df594ce6f8c787553804", + "sha256": "a8538177b04379991d0423bf5ff3b89942c4cc7b30bd4deb79e4aea8ce0e48ce", + "size": 346042 + }, { "path": "apps/web/src/artifact-events.ts", "sourceObjectId": "90a64fc461719951de843e0791d3b7188898212f", @@ -15743,6 +15677,24 @@ "sha256": "659f78ff3dfbb7b3c39ffcfe330fd23df9b65b5c451ae1b46297eaf3ffb12ea3", "size": 2129 }, + { + "path": "apps/web/src/demo/demo-fixture.ts", + "sourceObjectId": "5ada04d9c683cd7d503c4941703d2246e8bd1cea", + "sha256": "3cce0b18d9f8da80a4cd7180634925ae29ba0ba612a70bdcb2634fa59ac8460b", + "size": 51588 + }, + { + "path": "apps/web/src/demo/demo-health.ts", + "sourceObjectId": "ded61070ca223c27f23db77c86db04637ecd26ba", + "sha256": "f7f71eb2f368aabc2480d6d99224bfa445ec3b849d4dcf12e966438397b6ed3e", + "size": 4354 + }, + { + "path": "apps/web/src/demo/demo-runtime.ts", + "sourceObjectId": "d9da6fd5cc2798c5eaa20ad2e7b54f17218e50d3", + "sha256": "fe892b86969cf79a12ca932baa6964a52dd20d66eda684ec90061196aa61ec48", + "size": 8498 + }, { "path": "apps/web/src/demo/DemoGuide.tsx", "sourceObjectId": "85cf284dad7ef4b8b7a95b9de8fe578ba46988fa", @@ -15761,42 +15713,24 @@ "sha256": "ed926f727b7f693734ff8a5ac4fe00d3c898a1e32fcea39baef54aa75d82a447", "size": 138917 }, + { + "path": "apps/web/src/demo/feature-entry.tsx", + "sourceObjectId": "9fc3b1e4ebd5ceff1a57d03fad22a94034f74726", + "sha256": "e4819c55bde8967508f7e9ef8e6cc83601597e45a14b8e25cdcbfb334817d003", + "size": 1443 + }, + { + "path": "apps/web/src/demo/feature-showcase.css", + "sourceObjectId": "3c995b994940c2bc11453665db96b7aa2e6507ee", + "sha256": "0ff0e7dca159954e95efdea62445f647d4f3e80e0c8ef39c5d31149b9a7797e2", + "size": 906 + }, { "path": "apps/web/src/demo/FeatureShowcase.tsx", "sourceObjectId": "6fc2867d1ad3f0a60b8c867db9bf817abfcc9139", "sha256": "9de1c258ae0ff453a3cf9805f8d87f768b16009ee7d1e935d4ae8bdd298f1852", "size": 7646 }, - { - "path": "apps/web/src/demo/demo-fixture.ts", - "sourceObjectId": "5ada04d9c683cd7d503c4941703d2246e8bd1cea", - "sha256": "3cce0b18d9f8da80a4cd7180634925ae29ba0ba612a70bdcb2634fa59ac8460b", - "size": 51588 - }, - { - "path": "apps/web/src/demo/demo-health.ts", - "sourceObjectId": "ded61070ca223c27f23db77c86db04637ecd26ba", - "sha256": "f7f71eb2f368aabc2480d6d99224bfa445ec3b849d4dcf12e966438397b6ed3e", - "size": 4354 - }, - { - "path": "apps/web/src/demo/demo-runtime.ts", - "sourceObjectId": "d9da6fd5cc2798c5eaa20ad2e7b54f17218e50d3", - "sha256": "fe892b86969cf79a12ca932baa6964a52dd20d66eda684ec90061196aa61ec48", - "size": 8498 - }, - { - "path": "apps/web/src/demo/feature-entry.tsx", - "sourceObjectId": "9fc3b1e4ebd5ceff1a57d03fad22a94034f74726", - "sha256": "e4819c55bde8967508f7e9ef8e6cc83601597e45a14b8e25cdcbfb334817d003", - "size": 1443 - }, - { - "path": "apps/web/src/demo/feature-showcase.css", - "sourceObjectId": "3c995b994940c2bc11453665db96b7aa2e6507ee", - "sha256": "0ff0e7dca159954e95efdea62445f647d4f3e80e0c8ef39c5d31149b9a7797e2", - "size": 906 - }, { "path": "apps/web/src/demo/mock-browser-socket.ts", "sourceObjectId": "8b7450dd9e60a3871c200823c617b7c3e1d9280c", @@ -15894,10 +15828,10 @@ "size": 698 }, { - "path": "apps/web/src/features/SurfaceErrorBoundary.tsx", - "sourceObjectId": "bc89d7dd46fe91b4ad88a590e40a2f11ec394888", - "sha256": "624786dfc078e16819dea2fa5d6484bcd8c890077d5b314b0fc28a0f77f0cfc7", - "size": 2156 + "path": "apps/web/src/features/action-surfaces/action-surface-shared.ts", + "sourceObjectId": "e0b41ca97fd997d7a7bd09bc57ceba21e46be66e", + "sha256": "1b87adc932f8cf37853b4a34c1818db421a8921151cc587844ccc5ba7c95d727", + "size": 1280 }, { "path": "apps/web/src/features/action-surfaces/DesktopActionManager.tsx", @@ -15912,10 +15846,10 @@ "size": 8501 }, { - "path": "apps/web/src/features/action-surfaces/action-surface-shared.ts", - "sourceObjectId": "e0b41ca97fd997d7a7bd09bc57ceba21e46be66e", - "sha256": "1b87adc932f8cf37853b4a34c1818db421a8921151cc587844ccc5ba7c95d727", - "size": 1280 + "path": "apps/web/src/features/admin-codex-tools/admin-codex-tools.css", + "sourceObjectId": "a1922fce14f9962e21422a24bffa03588a5dd39b", + "sha256": "2ab3a98af2b51829e161bb35a7f141bfd77bfae1b23cf4a56781a3617cde34a6", + "size": 13777 }, { "path": "apps/web/src/features/admin-codex-tools/AdminCodexToolsDialog.tsx", @@ -15924,10 +15858,16 @@ "size": 23493 }, { - "path": "apps/web/src/features/admin-codex-tools/admin-codex-tools.css", - "sourceObjectId": "a1922fce14f9962e21422a24bffa03588a5dd39b", - "sha256": "2ab3a98af2b51829e161bb35a7f141bfd77bfae1b23cf4a56781a3617cde34a6", - "size": 13777 + "path": "apps/web/src/features/admin-operations/admin-operation-utils.ts", + "sourceObjectId": "58fda8d388e1c52f1489e4095c3d869dd91af63b", + "sha256": "4fb3a4b4ffc19878bf768f8b94dfffd7bca64e225adcff231558bc955e8667c6", + "size": 1690 + }, + { + "path": "apps/web/src/features/admin-operations/admin-operations.css", + "sourceObjectId": "d7238d4c02cf91f0816feb03cad1246010573121", + "sha256": "50c21b8d67d2297aff9de453e216078a64f88fbb876edefbc2766bf942f97491", + "size": 33276 }, { "path": "apps/web/src/features/admin-operations/AdminOperationsDialog.tsx", @@ -15935,12 +15875,24 @@ "sha256": "e6a564feb0222ec64e827afa8fe89c235bec3b50447af6932e77c9dd318df839", "size": 6931 }, + { + "path": "apps/web/src/features/admin-operations/cli-update-run.ts", + "sourceObjectId": "dbe1a4494403dbfd56334175a1e31a39d8a00c88", + "sha256": "4aa8a0e216e9231c44e8286656e0d37a3de861b37f43d66e9e2f4d118f837b31", + "size": 2319 + }, { "path": "apps/web/src/features/admin-operations/CliUpdateAllPanel.tsx", "sourceObjectId": "f1e25a693944f721650af3a4c95ab1dcefecba8d", "sha256": "bc81e16ca87a5ae80edc20608a71ec82c489d3a3f202a118e63fdd25a95ea62c", "size": 22420 }, + { + "path": "apps/web/src/features/admin-operations/maintenance-hub.css", + "sourceObjectId": "0bfb111318f5591518ea2fbf4343f762b4f10d89", + "sha256": "5a13a0459a8b63ae124d6c487918dc9e3a7c1b411f6a8fbd6200be0df0fc10da", + "size": 3973 + }, { "path": "apps/web/src/features/admin-operations/MaintenanceHub.tsx", "sourceObjectId": "f801ba283f0a887298d9f8911f1505d7872b6929", @@ -15966,28 +15918,16 @@ "size": 10940 }, { - "path": "apps/web/src/features/admin-operations/admin-operation-utils.ts", - "sourceObjectId": "58fda8d388e1c52f1489e4095c3d869dd91af63b", - "sha256": "4fb3a4b4ffc19878bf768f8b94dfffd7bca64e225adcff231558bc955e8667c6", - "size": 1690 - }, - { - "path": "apps/web/src/features/admin-operations/admin-operations.css", - "sourceObjectId": "d7238d4c02cf91f0816feb03cad1246010573121", - "sha256": "50c21b8d67d2297aff9de453e216078a64f88fbb876edefbc2766bf942f97491", - "size": 33276 - }, - { - "path": "apps/web/src/features/admin-operations/cli-update-run.ts", - "sourceObjectId": "dbe1a4494403dbfd56334175a1e31a39d8a00c88", - "sha256": "4aa8a0e216e9231c44e8286656e0d37a3de861b37f43d66e9e2f4d118f837b31", - "size": 2319 + "path": "apps/web/src/features/agent-files/agent-files-api.ts", + "sourceObjectId": "5a58287f87c051385f2704217000e70fee21361a", + "sha256": "80f945aae55172d6c8a5797d068c08b594e84bde78212e0919df9ae0c8f5220b", + "size": 1218 }, { - "path": "apps/web/src/features/admin-operations/maintenance-hub.css", - "sourceObjectId": "0bfb111318f5591518ea2fbf4343f762b4f10d89", - "sha256": "5a13a0459a8b63ae124d6c487918dc9e3a7c1b411f6a8fbd6200be0df0fc10da", - "size": 3973 + "path": "apps/web/src/features/agent-files/agent-files-dock.css", + "sourceObjectId": "ecbf6df320dcb262e43139872bbd29f25d558b7d", + "sha256": "a347fe835795d3f82363e92c0a11465c4f2444b8c61896936a4d06cbeedccd80", + "size": 12995 }, { "path": "apps/web/src/features/agent-files/AgentFilesDock.tsx", @@ -15996,16 +15936,22 @@ "size": 80138 }, { - "path": "apps/web/src/features/agent-files/agent-files-api.ts", - "sourceObjectId": "5a58287f87c051385f2704217000e70fee21361a", - "sha256": "80f945aae55172d6c8a5797d068c08b594e84bde78212e0919df9ae0c8f5220b", - "size": 1218 + "path": "apps/web/src/features/agent-pane/agent-action-availability.ts", + "sourceObjectId": "522960e220519d299376aad7a3b50b811e654914", + "sha256": "756b805e020039a2df0a6076c0807690a876309068f29c496dfa34652b094ff4", + "size": 3295 }, { - "path": "apps/web/src/features/agent-files/agent-files-dock.css", - "sourceObjectId": "ecbf6df320dcb262e43139872bbd29f25d558b7d", - "sha256": "a347fe835795d3f82363e92c0a11465c4f2444b8c61896936a4d06cbeedccd80", - "size": 12995 + "path": "apps/web/src/features/agent-pane/agent-pane-draft.ts", + "sourceObjectId": "fd6720fa387019d665cd2d159e4c57c82af7d0d2", + "sha256": "0921b8274417a30506dd9a5a3c849fdb3e48efbef730699837edd9f91d51546c", + "size": 2387 + }, + { + "path": "apps/web/src/features/agent-pane/agent-pane-model-selection.ts", + "sourceObjectId": "7114d7c3c7058bf2ae6073b1e6354789899daab0", + "sha256": "7da3ebd0e7427e873bfc3bc2a05da7b42ab2066f89f7989b6644ca843a093b9c", + "size": 1958 }, { "path": "apps/web/src/features/agent-pane/AgentPane.tsx", @@ -16013,12 +15959,30 @@ "sha256": "a052d0cd3fd1d13bbbf2e67dd9fcad834d28eab0ccce5ceb9fa97ffd4f7315ac", "size": 85209 }, + { + "path": "apps/web/src/features/agent-pane/chat-submission.ts", + "sourceObjectId": "39c9c47b94c5d036585b5d7daaae57b78b693e8b", + "sha256": "645bac9acab43c30cbe0465cc8e6af45d3c0238cb3b5ac26709060835c7dc2b3", + "size": 2306 + }, { "path": "apps/web/src/features/agent-pane/ChatMarkdown.tsx", "sourceObjectId": "33bac896dfa4bf931ca628f53b10d247c9f06f8c", "sha256": "79048b58b749789b1c255aa72c14e1e736dd8eb78a45c5a641cc867d30b0b765", "size": 4132 }, + { + "path": "apps/web/src/features/agent-pane/codex-chat-types.ts", + "sourceObjectId": "561b4fa1ebc1a2b7ce2e933818e3042e63333f7d", + "sha256": "c6f506af603d22ae2c9dd668cc514ad6ff7377bd1b2454ff132ee5b892e3be4b", + "size": 585 + }, + { + "path": "apps/web/src/features/agent-pane/codex-thread-readiness.ts", + "sourceObjectId": "7eb60b9eb0691b35a2fc31342936a31494a51bcf", + "sha256": "600b618bcfe35c45f41f2fb75fea1c73054918481907e6d5b9d4683836306686", + "size": 1278 + }, { "path": "apps/web/src/features/agent-pane/CodexComposer.tsx", "sourceObjectId": "3e0f881f4a424b23110b11daf3102acee3981681", @@ -16031,6 +15995,36 @@ "sha256": "3283c4f273d4b1cc29b1f7090a0266b5ae633baad3a62e2d645365e2ae110039", "size": 10030 }, + { + "path": "apps/web/src/features/agent-pane/connector-result.ts", + "sourceObjectId": "977197a5ea099f46f9466998ecbeda7935cdc465", + "sha256": "338f203b0b0feb4b87c7e652334ca07127061b9bf31e16dbf510c33b7defa437", + "size": 4202 + }, + { + "path": "apps/web/src/features/agent-pane/dot-avatar-art.tsx", + "sourceObjectId": "83dda01c38cccf9f9e0850e5c772405c692d17c6", + "sha256": "aba745905c57de8da3677944335cd1a12a8ffc635e6b04b80b5fa3f66155ba7d", + "size": 30144 + }, + { + "path": "apps/web/src/features/agent-pane/dot-avatar.css", + "sourceObjectId": "2f1e99a4107d7a5055cfb97644804dbfe0d4d6ee", + "sha256": "f2baeec8e2fc07fbca854807ad5577d6c4a54cf781798cce7fce672567e19feb", + "size": 10565 + }, + { + "path": "apps/web/src/features/agent-pane/dot-drafts.ts", + "sourceObjectId": "bc313d2382ee098b7a913eb9b96c9df2babd4be3", + "sha256": "d927858b8abc30085ed8d83cedac33707a8d7cfc18f2408426abfc4c578bbc2b", + "size": 1479 + }, + { + "path": "apps/web/src/features/agent-pane/dot-home-events.ts", + "sourceObjectId": "4399200f1c83df7d453003c729bf8a1511e40c27", + "sha256": "bf1377b9422c897d63674759b81cb8fca3723f6bd8d684777b94d345b66c73e6", + "size": 2470 + }, { "path": "apps/web/src/features/agent-pane/DotApprovals.tsx", "sourceObjectId": "6385814a2a490c895f14eb4357a2966eefb5bf48", @@ -16115,6 +16109,12 @@ "sha256": "2fa2f467e84dce8b15df972c1a4f1efeb1537f988e32476c8a69b61b386eba5c", "size": 2351 }, + { + "path": "apps/web/src/features/agent-pane/dots-chat.css", + "sourceObjectId": "b3112fa8793d067480f8789c06328b5dfc20381c", + "sha256": "81c5626837deca8f5d1f6efd9fd85952d48854c58df4dc0a521f7c341ec9093c", + "size": 44483 + }, { "path": "apps/web/src/features/agent-pane/DotSchedules.tsx", "sourceObjectId": "40bd0acac3cd302b8c8bd47da73663f501de1f60", @@ -16133,6 +16133,24 @@ "sha256": "3ad8c05231881f636fb21f21c0ffc808cc5f6d224b1914043926f123e2eb4a14", "size": 19843 }, + { + "path": "apps/web/src/features/agent-pane/events.ts", + "sourceObjectId": "b8c7e5111fa731e45a48a671010a445b9ba55b66", + "sha256": "a750a365b533bda0839545ca4dcd0cf054e787c7e0603523fda2c18745cb5a17", + "size": 2710 + }, + { + "path": "apps/web/src/features/agent-pane/greek-layout-converter.ts", + "sourceObjectId": "9a4a41a95e20beda5e5ffe5a60333788168cfba9", + "sha256": "24960726342ed0f4b8084a5e8ea6790742d04228103876bc54f8b2fce598e381", + "size": 66869 + }, + { + "path": "apps/web/src/features/agent-pane/index.ts", + "sourceObjectId": "2709e41d8487d9bf216c0d7dda1d960a483fd327", + "sha256": "a578240a9bb6ef82ab4ec5f05f9a95bc3f1091b99f56f8788953bdc85d806009", + "size": 234 + }, { "path": "apps/web/src/features/agent-pane/TaskAcceptanceDialog.tsx", "sourceObjectId": "cf25404b8e674bf3fa458df9aaed7e2d449b240d", @@ -16146,130 +16164,52 @@ "size": 10429 }, { - "path": "apps/web/src/features/agent-pane/agent-action-availability.ts", - "sourceObjectId": "522960e220519d299376aad7a3b50b811e654914", - "sha256": "756b805e020039a2df0a6076c0807690a876309068f29c496dfa34652b094ff4", - "size": 3295 + "path": "apps/web/src/features/agent-pane/useCodexPopover.ts", + "sourceObjectId": "480dcf203dc0235bb8851ed401abc35644649394", + "sha256": "4e885db5ded83c8929e452df32a9f4ce999572ece2c43959e5b2e494891f4183", + "size": 3434 }, { - "path": "apps/web/src/features/agent-pane/agent-pane-draft.ts", - "sourceObjectId": "fd6720fa387019d665cd2d159e4c57c82af7d0d2", - "sha256": "0921b8274417a30506dd9a5a3c849fdb3e48efbef730699837edd9f91d51546c", - "size": 2387 + "path": "apps/web/src/features/agent-pane/useDotFeed.ts", + "sourceObjectId": "b8170170f252a11ded9803f6607919f35a51e0bc", + "sha256": "3d2e4c86f24cf818ed88b7b0cc3dfbd75129520da81b25ad76bfb6dddf96c105", + "size": 6812 }, { - "path": "apps/web/src/features/agent-pane/agent-pane-model-selection.ts", - "sourceObjectId": "7114d7c3c7058bf2ae6073b1e6354789899daab0", - "sha256": "7da3ebd0e7427e873bfc3bc2a05da7b42ab2066f89f7989b6644ca843a093b9c", - "size": 1958 + "path": "apps/web/src/features/agent-pane/useDotSession.ts", + "sourceObjectId": "86d96063d9f391cb1cbec26592f73ba5c739c1fd", + "sha256": "518295ca340b9944a378cc6f37c6eeb6c31d5053f765ce936cedec2bd0cff61e", + "size": 3082 }, { - "path": "apps/web/src/features/agent-pane/chat-submission.ts", - "sourceObjectId": "39c9c47b94c5d036585b5d7daaae57b78b693e8b", - "sha256": "645bac9acab43c30cbe0465cc8e6af45d3c0238cb3b5ac26709060835c7dc2b3", - "size": 2306 + "path": "apps/web/src/features/agent-pane/useTranscriptScroll.ts", + "sourceObjectId": "15899c03a6390c422edf84063f243e8685f5d32b", + "sha256": "733720496520b2a6b90e44b75273c64beec77cba439693626f7f4755d3ca97f0", + "size": 2126 }, { - "path": "apps/web/src/features/agent-pane/codex-chat-types.ts", - "sourceObjectId": "561b4fa1ebc1a2b7ce2e933818e3042e63333f7d", - "sha256": "c6f506af603d22ae2c9dd668cc514ad6ff7377bd1b2454ff132ee5b892e3be4b", - "size": 585 + "path": "apps/web/src/features/agent-sessions/agent-sessions-dock.css", + "sourceObjectId": "1e8c733d2473c3568a20ab2137791e5c7cf120f5", + "sha256": "8386301e62d457c546338d3a3e2f0f33ac6abffb59f78e8d5c0aeab7a29b484d", + "size": 3524 }, { - "path": "apps/web/src/features/agent-pane/codex-thread-readiness.ts", - "sourceObjectId": "7eb60b9eb0691b35a2fc31342936a31494a51bcf", - "sha256": "600b618bcfe35c45f41f2fb75fea1c73054918481907e6d5b9d4683836306686", - "size": 1278 + "path": "apps/web/src/features/agent-sessions/AgentSessionsDock.tsx", + "sourceObjectId": "3f8325d6557668ad17232b2b20ae63dd993342a1", + "sha256": "c88140356935fa8767be5216f8a380ae516d4fbbd30fd12c4ac9c586557daad3", + "size": 21972 }, { - "path": "apps/web/src/features/agent-pane/connector-result.ts", - "sourceObjectId": "977197a5ea099f46f9466998ecbeda7935cdc465", - "sha256": "338f203b0b0feb4b87c7e652334ca07127061b9bf31e16dbf510c33b7defa437", - "size": 4202 + "path": "apps/web/src/features/agent-tools/agent-capabilities.css", + "sourceObjectId": "cfc49ab277af8c4df6abe5b4e5ee46338e2b9afd", + "sha256": "a062556cb755148d83b6e374340dec8b299144143d43393a0372f2b7e704b18a", + "size": 4746 }, { - "path": "apps/web/src/features/agent-pane/dot-avatar-art.tsx", - "sourceObjectId": "83dda01c38cccf9f9e0850e5c772405c692d17c6", - "sha256": "aba745905c57de8da3677944335cd1a12a8ffc635e6b04b80b5fa3f66155ba7d", - "size": 30144 - }, - { - "path": "apps/web/src/features/agent-pane/dot-avatar.css", - "sourceObjectId": "2f1e99a4107d7a5055cfb97644804dbfe0d4d6ee", - "sha256": "f2baeec8e2fc07fbca854807ad5577d6c4a54cf781798cce7fce672567e19feb", - "size": 10565 - }, - { - "path": "apps/web/src/features/agent-pane/dot-drafts.ts", - "sourceObjectId": "bc313d2382ee098b7a913eb9b96c9df2babd4be3", - "sha256": "d927858b8abc30085ed8d83cedac33707a8d7cfc18f2408426abfc4c578bbc2b", - "size": 1479 - }, - { - "path": "apps/web/src/features/agent-pane/dot-home-events.ts", - "sourceObjectId": "4399200f1c83df7d453003c729bf8a1511e40c27", - "sha256": "bf1377b9422c897d63674759b81cb8fca3723f6bd8d684777b94d345b66c73e6", - "size": 2470 - }, - { - "path": "apps/web/src/features/agent-pane/dots-chat.css", - "sourceObjectId": "b3112fa8793d067480f8789c06328b5dfc20381c", - "sha256": "81c5626837deca8f5d1f6efd9fd85952d48854c58df4dc0a521f7c341ec9093c", - "size": 44483 - }, - { - "path": "apps/web/src/features/agent-pane/events.ts", - "sourceObjectId": "b8c7e5111fa731e45a48a671010a445b9ba55b66", - "sha256": "a750a365b533bda0839545ca4dcd0cf054e787c7e0603523fda2c18745cb5a17", - "size": 2710 - }, - { - "path": "apps/web/src/features/agent-pane/greek-layout-converter.ts", - "sourceObjectId": "9a4a41a95e20beda5e5ffe5a60333788168cfba9", - "sha256": "24960726342ed0f4b8084a5e8ea6790742d04228103876bc54f8b2fce598e381", - "size": 66869 - }, - { - "path": "apps/web/src/features/agent-pane/index.ts", - "sourceObjectId": "2709e41d8487d9bf216c0d7dda1d960a483fd327", - "sha256": "a578240a9bb6ef82ab4ec5f05f9a95bc3f1091b99f56f8788953bdc85d806009", - "size": 234 - }, - { - "path": "apps/web/src/features/agent-pane/useCodexPopover.ts", - "sourceObjectId": "480dcf203dc0235bb8851ed401abc35644649394", - "sha256": "4e885db5ded83c8929e452df32a9f4ce999572ece2c43959e5b2e494891f4183", - "size": 3434 - }, - { - "path": "apps/web/src/features/agent-pane/useDotFeed.ts", - "sourceObjectId": "b8170170f252a11ded9803f6607919f35a51e0bc", - "sha256": "3d2e4c86f24cf818ed88b7b0cc3dfbd75129520da81b25ad76bfb6dddf96c105", - "size": 6812 - }, - { - "path": "apps/web/src/features/agent-pane/useDotSession.ts", - "sourceObjectId": "86d96063d9f391cb1cbec26592f73ba5c739c1fd", - "sha256": "518295ca340b9944a378cc6f37c6eeb6c31d5053f765ce936cedec2bd0cff61e", - "size": 3082 - }, - { - "path": "apps/web/src/features/agent-pane/useTranscriptScroll.ts", - "sourceObjectId": "15899c03a6390c422edf84063f243e8685f5d32b", - "sha256": "733720496520b2a6b90e44b75273c64beec77cba439693626f7f4755d3ca97f0", - "size": 2126 - }, - { - "path": "apps/web/src/features/agent-sessions/AgentSessionsDock.tsx", - "sourceObjectId": "3f8325d6557668ad17232b2b20ae63dd993342a1", - "sha256": "c88140356935fa8767be5216f8a380ae516d4fbbd30fd12c4ac9c586557daad3", - "size": 21972 - }, - { - "path": "apps/web/src/features/agent-sessions/agent-sessions-dock.css", - "sourceObjectId": "1e8c733d2473c3568a20ab2137791e5c7cf120f5", - "sha256": "8386301e62d457c546338d3a3e2f0f33ac6abffb59f78e8d5c0aeab7a29b484d", - "size": 3524 + "path": "apps/web/src/features/agent-tools/agent-tools-usage.ts", + "sourceObjectId": "408c96e3ba0518ba92cc92f08c6946885441d31a", + "sha256": "b8a5bd0b446c4cb7fe0e53b44a6193862ac91bea8c0df5ead2648714d4290280", + "size": 727 }, { "path": "apps/web/src/features/agent-tools/AgentCapabilitiesCard.tsx", @@ -16284,16 +16224,10 @@ "size": 7223 }, { - "path": "apps/web/src/features/agent-tools/agent-capabilities.css", - "sourceObjectId": "cfc49ab277af8c4df6abe5b4e5ee46338e2b9afd", - "sha256": "a062556cb755148d83b6e374340dec8b299144143d43393a0372f2b7e704b18a", - "size": 4746 - }, - { - "path": "apps/web/src/features/agent-tools/agent-tools-usage.ts", - "sourceObjectId": "408c96e3ba0518ba92cc92f08c6946885441d31a", - "sha256": "b8a5bd0b446c4cb7fe0e53b44a6193862ac91bea8c0df5ead2648714d4290280", - "size": 727 + "path": "apps/web/src/features/agents-dashboard/agents-dashboard.css", + "sourceObjectId": "0a1e7614b6cad0b479db5cad4b262c9646f68316", + "sha256": "a8bf5fa2b943ff63c66032b8106fcce870f3182099a3e632914f788c6cbdea4b", + "size": 27088 }, { "path": "apps/web/src/features/agents-dashboard/AgentsDashboard.tsx", @@ -16301,18 +16235,18 @@ "sha256": "2dd2a8c9e37a01299207bd0862600fd012474cdf1901c400d9ff21fd8408549e", "size": 37983 }, - { - "path": "apps/web/src/features/agents-dashboard/agents-dashboard.css", - "sourceObjectId": "0a1e7614b6cad0b479db5cad4b262c9646f68316", - "sha256": "a8bf5fa2b943ff63c66032b8106fcce870f3182099a3e632914f788c6cbdea4b", - "size": 27088 - }, { "path": "apps/web/src/features/agents-dashboard/dashboard-model.ts", "sourceObjectId": "37bdabe1d9f4134666f086ee9947b1a0f3394f43", "sha256": "651fb4e3878acf5d23b3a7b3873b9057ef6ca3f82512ad6650de92682cb44ee7", "size": 5845 }, + { + "path": "apps/web/src/features/app-diagnostics/app-diagnostics-settings.css", + "sourceObjectId": "fc9d53ef04719e18db503c54b213d9f8b07de165", + "sha256": "812a8354f42a2c440b906da99d2032444d018e30c36a909c1cb71bb05b3f60fd", + "size": 3935 + }, { "path": "apps/web/src/features/app-diagnostics/AppDiagnosticsIndicators.tsx", "sourceObjectId": "238e38bb1cdfdbab804283386a39741ec9348f9c", @@ -16325,12 +16259,6 @@ "sha256": "e140e9fd7eec108663996937f01b7c7eb1b6f6599d2304c63ed6c8e8d6d4b9d0", "size": 8926 }, - { - "path": "apps/web/src/features/app-diagnostics/app-diagnostics-settings.css", - "sourceObjectId": "fc9d53ef04719e18db503c54b213d9f8b07de165", - "sha256": "812a8354f42a2c440b906da99d2032444d018e30c36a909c1cb71bb05b3f60fd", - "size": 3935 - }, { "path": "apps/web/src/features/app-notices/AppNoticeBanners.tsx", "sourceObjectId": "8d2bd3ebcbb1773123b0f974da1f7a762ab94b46", @@ -16349,6 +16277,12 @@ "sha256": "f417b837bcbdaa1130abc35883dd555f1938c21fb59c0701e274d43e09d722b8", "size": 5971 }, + { + "path": "apps/web/src/features/app-studio-pane/app-studio-pane.css", + "sourceObjectId": "3f4bc667ffe90efc8cc2b088160f7f878178c916", + "sha256": "f20fb983e6e295b192d6ae541241cc667e2daf0fa3150b32bbbac1382361f7c7", + "size": 2892 + }, { "path": "apps/web/src/features/app-studio-pane/AppStudioPane.tsx", "sourceObjectId": "9babcbebf55336c3289e66d0c2dd67609abb384f", @@ -16361,6 +16295,12 @@ "sha256": "59a913a648814b7110b4060084c82a84e011eb6b20821fa12d488de017df61d9", "size": 360 }, + { + "path": "apps/web/src/features/app-studio-pane/live-events.ts", + "sourceObjectId": "43e3b94f17e706f0a5f76df32de8a7874bd10500", + "sha256": "5c10cd69cb4a2edaa8bcfefae9dc92e6101a8009c6e073f7870627391a3e04a9", + "size": 425 + }, { "path": "apps/web/src/features/app-studio-pane/PreviewView.tsx", "sourceObjectId": "2e4a5373cd209c2372570970144e30118b13e70f", @@ -16373,18 +16313,6 @@ "sha256": "a0cf93c88a204fd3e332a28d8e1c98eb0bd8aa4a80925dfc6214ef2b9240a77e", "size": 8172 }, - { - "path": "apps/web/src/features/app-studio-pane/app-studio-pane.css", - "sourceObjectId": "3f4bc667ffe90efc8cc2b088160f7f878178c916", - "sha256": "f20fb983e6e295b192d6ae541241cc667e2daf0fa3150b32bbbac1382361f7c7", - "size": 2892 - }, - { - "path": "apps/web/src/features/app-studio-pane/live-events.ts", - "sourceObjectId": "43e3b94f17e706f0a5f76df32de8a7874bd10500", - "sha256": "5c10cd69cb4a2edaa8bcfefae9dc92e6101a8009c6e073f7870627391a3e04a9", - "size": 425 - }, { "path": "apps/web/src/features/app-studio-pane/useAppStudio.ts", "sourceObjectId": "d78b469f1608bb7ded663df388308e9bb18cc563", @@ -16421,30 +16349,6 @@ "sha256": "50d2d2731fd7e3ab63e17e81da4ad44286c6ce6adc5868b14322e83e3ace9a86", "size": 2568 }, - { - "path": "apps/web/src/features/asteroids/AsteroidsGate.tsx", - "sourceObjectId": "c8df0816cb2898cefa1b8742fda9dca24f269846", - "sha256": "6a35b8915a30e53285d7a50d9d84538eb6a5149e622af367262ee2a7d3002b5d", - "size": 1361 - }, - { - "path": "apps/web/src/features/asteroids/FlightDemo.tsx", - "sourceObjectId": "942de967f13552c8b02e2d45048beef04cac040b", - "sha256": "4882b2d9e7d4a75017771fa3b6e87c52520a4c8b65a54ae65ba9a650b6a7be55", - "size": 2215 - }, - { - "path": "apps/web/src/features/asteroids/SpaceappAsteroids.tsx", - "sourceObjectId": "6d7810945eb3366fee686006c97126b356366e77", - "sha256": "a36ea3f966deafbb1424518b6551b07981f73741d8f1f2650c43a857bbd6aea2", - "size": 31594 - }, - { - "path": "apps/web/src/features/asteroids/SpaceappMark.tsx", - "sourceObjectId": "20083ca0de1a59ada0ccbe00d0f8d9ae635c6d06", - "sha256": "5c62a051c7a14e70828fcd96bc42033010077eb768a4b522344ca2a05205c324", - "size": 676 - }, { "path": "apps/web/src/features/asteroids/ai-director.ts", "sourceObjectId": "502b7013b609e7d7ce9ff36ec95e35c79b8dcb24", @@ -16463,6 +16367,12 @@ "sha256": "193c60e0c1b510ad4a501b60fc8f15576106805bf155af99431be14670a626ef", "size": 19864 }, + { + "path": "apps/web/src/features/asteroids/AsteroidsGate.tsx", + "sourceObjectId": "c8df0816cb2898cefa1b8742fda9dca24f269846", + "sha256": "6a35b8915a30e53285d7a50d9d84538eb6a5149e622af367262ee2a7d3002b5d", + "size": 1361 + }, { "path": "apps/web/src/features/asteroids/audio.ts", "sourceObjectId": "a07c0101f860190e0b709a46d2631f512d44581e", @@ -16493,6 +16403,12 @@ "sha256": "fb9921555e9b40b88127cfea798bc31b5b49dd0cdb9f1943a759e2679d194b73", "size": 40080 }, + { + "path": "apps/web/src/features/asteroids/FlightDemo.tsx", + "sourceObjectId": "942de967f13552c8b02e2d45048beef04cac040b", + "sha256": "4882b2d9e7d4a75017771fa3b6e87c52520a4c8b65a54ae65ba9a650b6a7be55", + "size": 2215 + }, { "path": "apps/web/src/features/asteroids/render.ts", "sourceObjectId": "d78196a4e1af20a2235b79fd94a9a888e5ba931f", @@ -16505,6 +16421,18 @@ "sha256": "3182072df43924ce6239d0765d53521882a53d47e799b2bea80bbce087f1f5eb", "size": 3379 }, + { + "path": "apps/web/src/features/asteroids/SpaceappAsteroids.tsx", + "sourceObjectId": "6d7810945eb3366fee686006c97126b356366e77", + "sha256": "a36ea3f966deafbb1424518b6551b07981f73741d8f1f2650c43a857bbd6aea2", + "size": 31594 + }, + { + "path": "apps/web/src/features/asteroids/SpaceappMark.tsx", + "sourceObjectId": "20083ca0de1a59ada0ccbe00d0f8d9ae635c6d06", + "sha256": "5c62a051c7a14e70828fcd96bc42033010077eb768a4b522344ca2a05205c324", + "size": 676 + }, { "path": "apps/web/src/features/asteroids/theme.ts", "sourceObjectId": "41aa13a022173dda4cd2083fa6620111ed4fdabb", @@ -16553,30 +16481,6 @@ "sha256": "b61c3f6a8cfc9ee2b6ea0e2645cc1d3863dd9747be3d4f944b6b9351c315393e", "size": 7878 }, - { - "path": "apps/web/src/features/benchmark/AsteroidsArenaBenchmark.tsx", - "sourceObjectId": "d065260fa0c409a2f418b005b2f2481c573172ba", - "sha256": "c13451cf33e45b5a5857eee836be5e59fabfc654fd2c5511ea3ad1afa31670e4", - "size": 43115 - }, - { - "path": "apps/web/src/features/benchmark/BenchmarkPage.tsx", - "sourceObjectId": "3be0c4cb27042e57c1c1e7fa005ea2c4b4816e64", - "sha256": "072c69a89828e450c8f1a37d5bfeefd9436d9455e146389c3118db6de45f5e67", - "size": 13767 - }, - { - "path": "apps/web/src/features/benchmark/ChessBenchmark.tsx", - "sourceObjectId": "4f33d88bcfa2a29c58ab3ef8722708b75614af80", - "sha256": "9733d85135ac56c398f0cd693249570a17aa4743534b88362241b343aa877168", - "size": 37038 - }, - { - "path": "apps/web/src/features/benchmark/ChessBoard.tsx", - "sourceObjectId": "78569f333910fae60e1ca3687a03efb1a1fe5548", - "sha256": "9c5b98efe72c866eef7767cf53d0e3af6ab4f98bae39704141afd46da95c8d81", - "size": 2312 - }, { "path": "apps/web/src/features/benchmark/arena-renderer.ts", "sourceObjectId": "214d8488befe851ab70353059cb7d6561e22770f", @@ -16595,6 +16499,12 @@ "sha256": "3369c14c3205f29d23a4f1c35e16578dde12975f2ee830d8ed8ff70612a23e9d", "size": 8101 }, + { + "path": "apps/web/src/features/benchmark/AsteroidsArenaBenchmark.tsx", + "sourceObjectId": "d065260fa0c409a2f418b005b2f2481c573172ba", + "sha256": "c13451cf33e45b5a5857eee836be5e59fabfc654fd2c5511ea3ad1afa31670e4", + "size": 43115 + }, { "path": "apps/web/src/features/benchmark/benchmark-api.ts", "sourceObjectId": "4c3e596e334457a518763c55d64cbcc55b3deca0", @@ -16607,12 +16517,48 @@ "sha256": "0789543f625cfe58bae8fef5f356923b8ec765a4c0219728d6cf4bcde6a0e07c", "size": 11950 }, + { + "path": "apps/web/src/features/benchmark/BenchmarkPage.tsx", + "sourceObjectId": "3be0c4cb27042e57c1c1e7fa005ea2c4b4816e64", + "sha256": "072c69a89828e450c8f1a37d5bfeefd9436d9455e146389c3118db6de45f5e67", + "size": 13767 + }, { "path": "apps/web/src/features/benchmark/chess-benchmark.css", "sourceObjectId": "9e256c62f78abc72b3e482586d31e05359ad86b2", "sha256": "4ab05fc29d86e4b3e9d5e57894c522ec0ea7ad7fc5597d42b5595d38757856f1", "size": 8613 }, + { + "path": "apps/web/src/features/benchmark/ChessBenchmark.tsx", + "sourceObjectId": "4f33d88bcfa2a29c58ab3ef8722708b75614af80", + "sha256": "9733d85135ac56c398f0cd693249570a17aa4743534b88362241b343aa877168", + "size": 37038 + }, + { + "path": "apps/web/src/features/benchmark/ChessBoard.tsx", + "sourceObjectId": "78569f333910fae60e1ca3687a03efb1a1fe5548", + "sha256": "9c5b98efe72c866eef7767cf53d0e3af6ab4f98bae39704141afd46da95c8d81", + "size": 2312 + }, + { + "path": "apps/web/src/features/browser-pane/browser-address.ts", + "sourceObjectId": "e82445a9d50b8d84069614b66096ee3b879b52f1", + "sha256": "5dc83c6ccfea61f5874de1c750e33c837ac69c3ac36a105a617116d1d82d2b4e", + "size": 1204 + }, + { + "path": "apps/web/src/features/browser-pane/browser-reconnect.ts", + "sourceObjectId": "bee9bc49d710be8fe430b955ed37ff586a834c73", + "sha256": "b5b523940d5ae4cca3c647d82a252f231baa18a3cf5f5111eebe520d239e16f9", + "size": 502 + }, + { + "path": "apps/web/src/features/browser-pane/browser-status.ts", + "sourceObjectId": "67bdc34ae745e96e9c7fe4ffddefbcc089075120", + "sha256": "c238302663adaa8d7290d0cd6dec48528fbe1f0b6cec433c2fad019f993d69dc", + "size": 571 + }, { "path": "apps/web/src/features/browser-pane/BrowserCanvas.tsx", "sourceObjectId": "9f872810bd559e92c9f3f83bb4f6e974a414e4e7", @@ -16631,66 +16577,30 @@ "sha256": "70f3260d427765d5ebec212c58a0e01be2f27b062a961016207385c372ea53b8", "size": 129958 }, + { + "path": "apps/web/src/features/browser-pane/events.ts", + "sourceObjectId": "b3af27c52887e84d6373eb881984c870f94b1280", + "sha256": "eac3bd2bd5c9dc4e8fb39bf507641bc4eb58a28b49487239d2266ac621bd1aab", + "size": 4259 + }, { "path": "apps/web/src/features/browser-pane/GoogleAccountMenuItems.tsx", "sourceObjectId": "aca7376715c9bb08bba82835a29c65660c9b784e", "sha256": "15d2ef3c4dcdc4b9806ee1bc7c4b434d85593bc407d77b1d865da9f44a82231e", "size": 5008 }, - { - "path": "apps/web/src/features/browser-pane/ManagedYouTubeBrowser.tsx", - "sourceObjectId": "7b9b08ce30af476420d4d1fe8839eabdfdc3cea1", - "sha256": "b6cd1a22eac62b7cfe10d8d425c9f7ec54c44707df7a6a8913181245b9c4d154", - "size": 30792 - }, - { - "path": "apps/web/src/features/browser-pane/YouTubeNativePlayer.tsx", - "sourceObjectId": "8787f861afb482a7c49ab3ef7c89b607f927c134", - "sha256": "5bb273ac3b1582cf3cee9d312896ea338b7f33bbf0c7388d441b39d673fee1fd", - "size": 13500 - }, - { - "path": "apps/web/src/features/browser-pane/YouTubePane.tsx", - "sourceObjectId": "72e111d82a824cfdd93babb646785f8a53719f6a", - "sha256": "c839f49dcf66232c877a93453215a70c15cdfc09c0b7bc78b566146581e0f3be", - "size": 37375 - }, - { - "path": "apps/web/src/features/browser-pane/YouTubeSummarySettingsCard.tsx", - "sourceObjectId": "6b6c3a829736ce2ba8402bb1f40f24a80d6f2d5c", - "sha256": "ff94402edc75c0aef5b5cd0878f3f3e3ecacecea45f887970a0a0964601e7f2b", - "size": 4616 - }, - { - "path": "apps/web/src/features/browser-pane/browser-address.ts", - "sourceObjectId": "e82445a9d50b8d84069614b66096ee3b879b52f1", - "sha256": "5dc83c6ccfea61f5874de1c750e33c837ac69c3ac36a105a617116d1d82d2b4e", - "size": 1204 - }, - { - "path": "apps/web/src/features/browser-pane/browser-reconnect.ts", - "sourceObjectId": "bee9bc49d710be8fe430b955ed37ff586a834c73", - "sha256": "b5b523940d5ae4cca3c647d82a252f231baa18a3cf5f5111eebe520d239e16f9", - "size": 502 - }, - { - "path": "apps/web/src/features/browser-pane/browser-status.ts", - "sourceObjectId": "67bdc34ae745e96e9c7fe4ffddefbcc089075120", - "sha256": "c238302663adaa8d7290d0cd6dec48528fbe1f0b6cec433c2fad019f993d69dc", - "size": 571 - }, - { - "path": "apps/web/src/features/browser-pane/events.ts", - "sourceObjectId": "b3af27c52887e84d6373eb881984c870f94b1280", - "sha256": "eac3bd2bd5c9dc4e8fb39bf507641bc4eb58a28b49487239d2266ac621bd1aab", - "size": 4259 - }, { "path": "apps/web/src/features/browser-pane/index.ts", "sourceObjectId": "66e3e48825fe712209518d7ac812e78fa8c8a0f6", "sha256": "ec91cb2508eee2bd9f25b14bba4fe311d6996006fa09cacc472f124f06d3528f", "size": 286 }, + { + "path": "apps/web/src/features/browser-pane/ManagedYouTubeBrowser.tsx", + "sourceObjectId": "7b9b08ce30af476420d4d1fe8839eabdfdc3cea1", + "sha256": "b6cd1a22eac62b7cfe10d8d425c9f7ec54c44707df7a6a8913181245b9c4d154", + "size": 30792 + }, { "path": "apps/web/src/features/browser-pane/useBrowserAudio.ts", "sourceObjectId": "1977410e37e038008c9e826bd145953c79d11aa3", @@ -16722,34 +16632,28 @@ "size": 2628 }, { - "path": "apps/web/src/features/chat-launcher/ChatLauncherMenu.tsx", - "sourceObjectId": "6d7308674ee0c3ff6af53eb6af6d04da6c43b4d5", - "sha256": "a03cdae6aab0c8deaa2e84f2277faf0541fd6ac3b26b8fa1c5eeb02575ef2f0e", - "size": 8729 - }, - { - "path": "apps/web/src/features/cli-accounts/CliAccountPicker.tsx", - "sourceObjectId": "1622d31f2f9a26233284a6704d69d87a5562eced", - "sha256": "2e3e7b51acdd27f920ed2808c90da580367fb4416bbe9deaa062ecb2480fd8f9", - "size": 17012 + "path": "apps/web/src/features/browser-pane/YouTubeNativePlayer.tsx", + "sourceObjectId": "8787f861afb482a7c49ab3ef7c89b607f927c134", + "sha256": "5bb273ac3b1582cf3cee9d312896ea338b7f33bbf0c7388d441b39d673fee1fd", + "size": 13500 }, { - "path": "apps/web/src/features/cli-accounts/CliAccountVisuals.tsx", - "sourceObjectId": "81e3d7c6e64cab4c1c33e79747a653f97278e89a", - "sha256": "9c892337eb64876b5b7bd64aac2762184024222dbbcc5acf2b6b8fe20de224c8", - "size": 3034 + "path": "apps/web/src/features/browser-pane/YouTubePane.tsx", + "sourceObjectId": "72e111d82a824cfdd93babb646785f8a53719f6a", + "sha256": "c839f49dcf66232c877a93453215a70c15cdfc09c0b7bc78b566146581e0f3be", + "size": 37375 }, { - "path": "apps/web/src/features/cli-accounts/CliAccountsPanel.tsx", - "sourceObjectId": "305199102baae8635b2660f223b8022d6325ad82", - "sha256": "64024f60dff5ebfdee709d8999cf70efaa5d34c48c875b0372f497155285d586", - "size": 28487 + "path": "apps/web/src/features/browser-pane/YouTubeSummarySettingsCard.tsx", + "sourceObjectId": "6b6c3a829736ce2ba8402bb1f40f24a80d6f2d5c", + "sha256": "ff94402edc75c0aef5b5cd0878f3f3e3ecacecea45f887970a0a0964601e7f2b", + "size": 4616 }, { - "path": "apps/web/src/features/cli-accounts/CodexAccountPicker.tsx", - "sourceObjectId": "2b8e83d40167ebc901beef6cb1153bb42b3addac", - "sha256": "794db72c209219c8babfb0dc4c36c9baadee9fbaa0f489824b0f241faca82a47", - "size": 1329 + "path": "apps/web/src/features/chat-launcher/ChatLauncherMenu.tsx", + "sourceObjectId": "6d7308674ee0c3ff6af53eb6af6d04da6c43b4d5", + "sha256": "a03cdae6aab0c8deaa2e84f2277faf0541fd6ac3b26b8fa1c5eeb02575ef2f0e", + "size": 8729 }, { "path": "apps/web/src/features/cli-accounts/cli-account-availability.ts", @@ -16793,6 +16697,30 @@ "sha256": "1d220193aa7bddc11d5de19b0e65007c7325f8816cc1a6143ef4844f4df528d9", "size": 19710 }, + { + "path": "apps/web/src/features/cli-accounts/CliAccountPicker.tsx", + "sourceObjectId": "1622d31f2f9a26233284a6704d69d87a5562eced", + "sha256": "2e3e7b51acdd27f920ed2808c90da580367fb4416bbe9deaa062ecb2480fd8f9", + "size": 17012 + }, + { + "path": "apps/web/src/features/cli-accounts/CliAccountsPanel.tsx", + "sourceObjectId": "305199102baae8635b2660f223b8022d6325ad82", + "sha256": "64024f60dff5ebfdee709d8999cf70efaa5d34c48c875b0372f497155285d586", + "size": 28487 + }, + { + "path": "apps/web/src/features/cli-accounts/CliAccountVisuals.tsx", + "sourceObjectId": "81e3d7c6e64cab4c1c33e79747a653f97278e89a", + "sha256": "9c892337eb64876b5b7bd64aac2762184024222dbbcc5acf2b6b8fe20de224c8", + "size": 3034 + }, + { + "path": "apps/web/src/features/cli-accounts/CodexAccountPicker.tsx", + "sourceObjectId": "2b8e83d40167ebc901beef6cb1153bb42b3addac", + "sha256": "794db72c209219c8babfb0dc4c36c9baadee9fbaa0f489824b0f241faca82a47", + "size": 1329 + }, { "path": "apps/web/src/features/cli-accounts/use-cli-account-signals.ts", "sourceObjectId": "0ad379b0b597e10966d5d6f0e797bacf2ebe9506", @@ -16811,6 +16739,12 @@ "sha256": "f0764862053e2f20c758b8ae68e570580876bc2ac77c4eecdb57a380c3228ccb", "size": 27065 }, + { + "path": "apps/web/src/features/cli-providers-settings/cli-providers-settings.css", + "sourceObjectId": "80c824dd378d3f04805d52ce3c40e57f1efe89de", + "sha256": "ff62a6a86ac8f46c0212ecc341533448b57f3a52e0f43a96862c325847b80b03", + "size": 862 + }, { "path": "apps/web/src/features/cli-providers-settings/CliProvidersSettingsCard.tsx", "sourceObjectId": "ec8f9b5997f1eb2666f40798bf6346d59cd46918", @@ -16818,10 +16752,10 @@ "size": 7026 }, { - "path": "apps/web/src/features/cli-providers-settings/cli-providers-settings.css", - "sourceObjectId": "80c824dd378d3f04805d52ce3c40e57f1efe89de", - "sha256": "ff62a6a86ac8f46c0212ecc341533448b57f3a52e0f43a96862c325847b80b03", - "size": 862 + "path": "apps/web/src/features/cli-runtime-settings/cli-runtime-settings.css", + "sourceObjectId": "c595e46df1d89d736f393b9121876cea7198e78a", + "sha256": "20b2bf23489bbcafa56a510be5080a06eb8d9dc9a4b9fc627fe068c02b188135", + "size": 1652 }, { "path": "apps/web/src/features/cli-runtime-settings/CliRuntimeSettingsCard.tsx", @@ -16830,10 +16764,10 @@ "size": 55979 }, { - "path": "apps/web/src/features/cli-runtime-settings/cli-runtime-settings.css", - "sourceObjectId": "c595e46df1d89d736f393b9121876cea7198e78a", - "sha256": "20b2bf23489bbcafa56a510be5080a06eb8d9dc9a4b9fc627fe068c02b188135", - "size": 1652 + "path": "apps/web/src/features/clipboard-dock/clipboard-events.ts", + "sourceObjectId": "a0cc58115927ac00a317eb4653bb7ddca4b1720a", + "sha256": "3643c3bbe8ff6fb0019f9dbb61d840262e1d03bf1c0202774367e2ba73e80357", + "size": 6903 }, { "path": "apps/web/src/features/clipboard-dock/ClipboardDock.tsx", @@ -16841,6 +16775,12 @@ "sha256": "418c8c1930659167bbe892845134661f2d84e42c4bd92d7182bc071741afa219", "size": 27343 }, + { + "path": "apps/web/src/features/clipboard-dock/plan-assignee.ts", + "sourceObjectId": "b0588ec015aa1021954aaaab4b85d9cbffe45833", + "sha256": "29ba21776974ba96c6ee0f94357eee0cf97436a440b89af0911aace6d66fcd11", + "size": 2034 + }, { "path": "apps/web/src/features/clipboard-dock/PlanCompletionBar.tsx", "sourceObjectId": "29777715c977d64a44ba81b2b44d6610b176be43", @@ -16853,18 +16793,6 @@ "sha256": "61d5a3605ec185447e3b6c389112dd437ec03e8bad7c338842961c36de69958b", "size": 15580 }, - { - "path": "apps/web/src/features/clipboard-dock/clipboard-events.ts", - "sourceObjectId": "a0cc58115927ac00a317eb4653bb7ddca4b1720a", - "sha256": "3643c3bbe8ff6fb0019f9dbb61d840262e1d03bf1c0202774367e2ba73e80357", - "size": 6903 - }, - { - "path": "apps/web/src/features/clipboard-dock/plan-assignee.ts", - "sourceObjectId": "b0588ec015aa1021954aaaab4b85d9cbffe45833", - "sha256": "29ba21776974ba96c6ee0f94357eee0cf97436a440b89af0911aace6d66fcd11", - "size": 2034 - }, { "path": "apps/web/src/features/codex-model-picker/CodexModelPicker.tsx", "sourceObjectId": "692cbb729ae21efceea13cb9737d01a53e3c701b", @@ -16889,30 +16817,6 @@ "sha256": "22a2d5b25b96b401c4d00c00c3bc70cae7f732f170e60ccf662cf81a63e947b9", "size": 4236 }, - { - "path": "apps/web/src/features/copilot-kit/CopilotLaunchDialog.tsx", - "sourceObjectId": "bb1577233a165d06b374c60632b1be82e93722a8", - "sha256": "2bf743649debe95735c2659a7f709714ad96de24d7ea87eeb28c21a453021792", - "size": 7057 - }, - { - "path": "apps/web/src/features/copilot-kit/CopilotRail.tsx", - "sourceObjectId": "1cf9369367f67207a0ff717f8df15770ea6af6e6", - "sha256": "f01f06b47424d0b0d666796a72e272e19450075e1c0e4cd29640fe14f6b08ed9", - "size": 2049 - }, - { - "path": "apps/web/src/features/copilot-kit/CopilotSettingsCard.tsx", - "sourceObjectId": "d13e3e2664269ef9f6d568768fba63d69ec9e1ee", - "sha256": "3d14e8cf6af22c6c1293a7ca0c3166042d03b2d46c7ccd47d08db1f968a13892", - "size": 6783 - }, - { - "path": "apps/web/src/features/copilot-kit/HandoffOverlay.tsx", - "sourceObjectId": "a47dc026f7994b3a5a4b7244028959fb7311f0df", - "sha256": "d362cea5ce863311f51933307f5a08933167945915d1f79c345fba204f03f43d", - "size": 3226 - }, { "path": "apps/web/src/features/copilot-kit/copilot-kind.ts", "sourceObjectId": "c11bed1be568028dfb30d7ee743ec24cc0626063", @@ -16943,6 +16847,30 @@ "sha256": "cab26608e0d66d6a8a82007f81bd7d3f7dcb8f080fbc9d70e35341d4717b29e6", "size": 2395 }, + { + "path": "apps/web/src/features/copilot-kit/CopilotLaunchDialog.tsx", + "sourceObjectId": "bb1577233a165d06b374c60632b1be82e93722a8", + "sha256": "2bf743649debe95735c2659a7f709714ad96de24d7ea87eeb28c21a453021792", + "size": 7057 + }, + { + "path": "apps/web/src/features/copilot-kit/CopilotRail.tsx", + "sourceObjectId": "1cf9369367f67207a0ff717f8df15770ea6af6e6", + "sha256": "f01f06b47424d0b0d666796a72e272e19450075e1c0e4cd29640fe14f6b08ed9", + "size": 2049 + }, + { + "path": "apps/web/src/features/copilot-kit/CopilotSettingsCard.tsx", + "sourceObjectId": "d13e3e2664269ef9f6d568768fba63d69ec9e1ee", + "sha256": "3d14e8cf6af22c6c1293a7ca0c3166042d03b2d46c7ccd47d08db1f968a13892", + "size": 6783 + }, + { + "path": "apps/web/src/features/copilot-kit/HandoffOverlay.tsx", + "sourceObjectId": "a47dc026f7994b3a5a4b7244028959fb7311f0df", + "sha256": "d362cea5ce863311f51933307f5a08933167945915d1f79c345fba204f03f43d", + "size": 3226 + }, { "path": "apps/web/src/features/copilot-kit/live-handoff.ts", "sourceObjectId": "5dcbc598c5869d1850e0085cb5dc932408f5beeb", @@ -16973,18 +16901,18 @@ "sha256": "3cf380e9c03b134618498c19189e9dcf69b0ce487fb986a82eafc6c33fbd3ab2", "size": 3867 }, - { - "path": "apps/web/src/features/council/CouncilDock.tsx", - "sourceObjectId": "c9ed9a84a85faea624ad4cb642f4c1c6c52a9e9a", - "sha256": "98c83fc05dc38b0f43be3c2005e59c64eea6b453e26ecc403e60cbeb3417e747", - "size": 27922 - }, { "path": "apps/web/src/features/council/council.css", "sourceObjectId": "f0b2b0b62f354a04c2d5416bd6c7ef60da846d9c", "sha256": "ad4622237fdc489fdbe0d3d012161f478629e38f7cb9247cdf82d62a802abd2c", "size": 7677 }, + { + "path": "apps/web/src/features/council/CouncilDock.tsx", + "sourceObjectId": "c9ed9a84a85faea624ad4cb642f4c1c6c52a9e9a", + "sha256": "98c83fc05dc38b0f43be3c2005e59c64eea6b453e26ecc403e60cbeb3417e747", + "size": 27922 + }, { "path": "apps/web/src/features/databases-pane/ConnectionModal.tsx", "sourceObjectId": "30885dd802c387b792982fee172cc20b46407998", @@ -16997,12 +16925,6 @@ "sha256": "72ffd21e9a4039687a657e35fb6c9e25166820d082aa313157d4501dc11596e8", "size": 7715 }, - { - "path": "apps/web/src/features/databases-pane/DataTab.tsx", - "sourceObjectId": "496814c9589e21105bc4c81a6b2c88c1d5571776", - "sha256": "0f81cd30865270aad924766f1e81a34acbf7829a413878100fa97be29d17879e", - "size": 23811 - }, { "path": "apps/web/src/features/databases-pane/DatabaseConnectionsOverview.tsx", "sourceObjectId": "06dc285396096e84213f309fb87c2487a5bb0668", @@ -17015,6 +16937,12 @@ "sha256": "aa808450161e4d35570e87ecd32ba273da3acc071024f78609a5289eea9f01fe", "size": 5422 }, + { + "path": "apps/web/src/features/databases-pane/databases-pane.css", + "sourceObjectId": "8a795418a63e8c4292e676833aa29b467591f1c1", + "sha256": "6d130c0ac8c13fdbf7675e4a71c1776fa2c61c949b5fdca5055e7bc8ee5e8a39", + "size": 23334 + }, { "path": "apps/web/src/features/databases-pane/DatabasesPane.tsx", "sourceObjectId": "f677cd3fa81a6b7029bb7223c825f69b3bc1a49c", @@ -17033,6 +16961,12 @@ "sha256": "3d689bfbd72fcc1b2b4b4816ecab2452a256691955185b9f9c21828946770ff8", "size": 6101 }, + { + "path": "apps/web/src/features/databases-pane/DataTab.tsx", + "sourceObjectId": "496814c9589e21105bc4c81a6b2c88c1d5571776", + "sha256": "0f81cd30865270aad924766f1e81a34acbf7829a413878100fa97be29d17879e", + "size": 23811 + }, { "path": "apps/web/src/features/databases-pane/DiscoverModal.tsx", "sourceObjectId": "ce4eaa8f5879c20cff3d39f63566e4a9eb99bc17", @@ -17057,18 +16991,6 @@ "sha256": "930a3d4c441d0094efd3a1f11fb25ef013f63474983812e9cf4c6b3c88002a05", "size": 14594 }, - { - "path": "apps/web/src/features/databases-pane/databases-pane.css", - "sourceObjectId": "8a795418a63e8c4292e676833aa29b467591f1c1", - "sha256": "6d130c0ac8c13fdbf7675e4a71c1776fa2c61c949b5fdca5055e7bc8ee5e8a39", - "size": 23334 - }, - { - "path": "apps/web/src/features/date-time-settings/DateTimeSettingsCard.tsx", - "sourceObjectId": "98d42714c32f530fd85db63d118c9b228478d9da", - "sha256": "e628b9b0f0c5c8e353612fb55a2db69165d6d07555fa2a2704ccf2352b3052a5", - "size": 5130 - }, { "path": "apps/web/src/features/date-time-settings/date-time-settings.css", "sourceObjectId": "8b63797be2a1aeb40f1be30657eb6f5e68fe983c", @@ -17082,10 +17004,10 @@ "size": 19926 }, { - "path": "apps/web/src/features/demo-mode/DemoModeOverlay.tsx", - "sourceObjectId": "516f270de5f69756459f13141095fcb19109c74b", - "sha256": "4ccf4fbee5e64d9dbffe796f46c1faac6f6b2ed65743d08d20852681e101891c", - "size": 12292 + "path": "apps/web/src/features/date-time-settings/DateTimeSettingsCard.tsx", + "sourceObjectId": "98d42714c32f530fd85db63d118c9b228478d9da", + "sha256": "e628b9b0f0c5c8e353612fb55a2db69165d6d07555fa2a2704ccf2352b3052a5", + "size": 5130 }, { "path": "apps/web/src/features/demo-mode/demo-mode-steps.ts", @@ -17099,6 +17021,12 @@ "sha256": "1257287cdc906b31a0abb08f35bf08daa03c767a4f30cef61db16260046cb8ab", "size": 6538 }, + { + "path": "apps/web/src/features/demo-mode/DemoModeOverlay.tsx", + "sourceObjectId": "516f270de5f69756459f13141095fcb19109c74b", + "sha256": "4ccf4fbee5e64d9dbffe796f46c1faac6f6b2ed65743d08d20852681e101891c", + "size": 12292 + }, { "path": "apps/web/src/features/demos-pane/CodeTab.tsx", "sourceObjectId": "32a7b4ca6e166d377a2baee76e2c96df5e3700f4", @@ -17111,6 +17039,12 @@ "sha256": "7c5321b242ecea1fc3e2b8d7358f6f1f7cea87f4fe15538427533103f97e77d7", "size": 21368 }, + { + "path": "apps/web/src/features/demos-pane/demos-pane.css", + "sourceObjectId": "4fe28c7707cce21211f816c90f1f36abf8c3dc05", + "sha256": "2cf12c892e098a72fa099105984a22a918feb8ae3ce2ce2697d92971f3e0809a", + "size": 20546 + }, { "path": "apps/web/src/features/demos-pane/DemosPane.tsx", "sourceObjectId": "7c525e109f80dbe2c0378fe528f75e9c0b5ef3d7", @@ -17123,18 +17057,6 @@ "sha256": "cc0c85acf24e1a60ccc2ccd40fe7275f83da474b0136eb7cd2fd1b13f222714f", "size": 18960 }, - { - "path": "apps/web/src/features/demos-pane/demos-pane.css", - "sourceObjectId": "4fe28c7707cce21211f816c90f1f36abf8c3dc05", - "sha256": "2cf12c892e098a72fa099105984a22a918feb8ae3ce2ce2697d92971f3e0809a", - "size": 20546 - }, - { - "path": "apps/web/src/features/deploy-queue/DeployActivityPanel.tsx", - "sourceObjectId": "a9dae16bdce6327074baf63eaac639a938bee067", - "sha256": "f235ad82b31b81fbe1c01da63e2ee5f75d420c0bd62ad955f6a7988215a580e9", - "size": 11622 - }, { "path": "apps/web/src/features/deploy-queue/deploy-activity.css", "sourceObjectId": "96540dc1cd38cc33795e5ba609e925f199133cba", @@ -17153,12 +17075,24 @@ "sha256": "4a16c8c0e86b0e80f6811a3ebd3f12a05dc723f7c581248c6af28f3667ebb6ac", "size": 2178 }, + { + "path": "apps/web/src/features/deploy-queue/DeployActivityPanel.tsx", + "sourceObjectId": "a9dae16bdce6327074baf63eaac639a938bee067", + "sha256": "f235ad82b31b81fbe1c01da63e2ee5f75d420c0bd62ad955f6a7988215a580e9", + "size": 11622 + }, { "path": "apps/web/src/features/design-pane/BrandKitsTab.tsx", "sourceObjectId": "59370e71f4de8e658e489572517e1476dd261c4b", "sha256": "299c8f4a0958da082a50bd76b187fc7242659e7bfd095421320c0fbe11b94b3c", "size": 6642 }, + { + "path": "apps/web/src/features/design-pane/design-pane.css", + "sourceObjectId": "8a2ad73ccf689e56951e74178e6605961d263f28", + "sha256": "47ba5a0f5ed00f3d3cec3351e3905fc53bfd2914393272fd1b6b7d5af1ab60db", + "size": 3528 + }, { "path": "apps/web/src/features/design-pane/DesignPane.tsx", "sourceObjectId": "d30da5d9d033a51fb6e461f089d5bf61873eba32", @@ -17177,12 +17111,24 @@ "sha256": "920970335e9eda820c4db1a597446c7053906cbabac7c4133a3092071baf52c5", "size": 3920 }, + { + "path": "apps/web/src/features/design-pane/ico.ts", + "sourceObjectId": "4a905c26aaf351ae7d3dae9f19e5b9e496190340", + "sha256": "a4057c78f384fbd7f084087ac50147c2d9020e2302ecde6ecedb31a16b086ec4", + "size": 2493 + }, { "path": "apps/web/src/features/design-pane/LibraryTab.tsx", "sourceObjectId": "f9dd0e806146e4e0a72c0cef98dc70e9a3440955", "sha256": "080737629333753fb5a68c5adb9a0be8d0d8e25339fa2b8dd22dfe59aaacd371", "size": 5149 }, + { + "path": "apps/web/src/features/design-pane/live-events.ts", + "sourceObjectId": "bbc4de548c95c5ccd8f9523ef742b329beaf1b7c", + "sha256": "af209fc7093db85e116da9eac22f50a9d308f3b81d3797cbc5307e0640b306f6", + "size": 412 + }, { "path": "apps/web/src/features/design-pane/RequestsTab.tsx", "sourceObjectId": "d75141dc11970ee9f2ec957d8256b3856947581a", @@ -17201,36 +17147,12 @@ "sha256": "b1724372c5f63c073e6017ca74554f4d7fac5ad7f05bdadfb7bf2082b0e02043", "size": 26257 }, - { - "path": "apps/web/src/features/design-pane/design-pane.css", - "sourceObjectId": "8a2ad73ccf689e56951e74178e6605961d263f28", - "sha256": "47ba5a0f5ed00f3d3cec3351e3905fc53bfd2914393272fd1b6b7d5af1ab60db", - "size": 3528 - }, - { - "path": "apps/web/src/features/design-pane/ico.ts", - "sourceObjectId": "4a905c26aaf351ae7d3dae9f19e5b9e496190340", - "sha256": "a4057c78f384fbd7f084087ac50147c2d9020e2302ecde6ecedb31a16b086ec4", - "size": 2493 - }, - { - "path": "apps/web/src/features/design-pane/live-events.ts", - "sourceObjectId": "bbc4de548c95c5ccd8f9523ef742b329beaf1b7c", - "sha256": "af209fc7093db85e116da9eac22f50a9d308f3b81d3797cbc5307e0640b306f6", - "size": 412 - }, { "path": "apps/web/src/features/design-pane/useDesign.ts", "sourceObjectId": "a5341cda69aeca487ae9e4a7e6ffc60798b6d672", "sha256": "71b02d4f70abd6c692d2ef1da47601f75f703453605c0a6c17f5405ce252ee8f", "size": 3701 }, - { - "path": "apps/web/src/features/desktop-screens/DesktopDisplayControls.tsx", - "sourceObjectId": "0f0ac2a0546335a8ca426bc63ae70716f8c88c77", - "sha256": "4c409e8951d111810e3cced4ad52533997e57ad3f5ccbdfbb016a905f0016e96", - "size": 13042 - }, { "path": "apps/web/src/features/desktop-screens/desktop-display-controls.css", "sourceObjectId": "a4f7f4f8431fd6fe39cfeb472a9d2515952c93fa", @@ -17238,10 +17160,10 @@ "size": 6597 }, { - "path": "apps/web/src/features/desktop-titlebar/DesktopWindowTitlebar.tsx", - "sourceObjectId": "392410f08c72865b7c6db1d9890fb651fab1dd3b", - "sha256": "562187b868fff9d5136b9649dad721dfe9f909b8eb8d1765992c2e890978e3ae", - "size": 52858 + "path": "apps/web/src/features/desktop-screens/DesktopDisplayControls.tsx", + "sourceObjectId": "0f0ac2a0546335a8ca426bc63ae70716f8c88c77", + "sha256": "4c409e8951d111810e3cced4ad52533997e57ad3f5ccbdfbb016a905f0016e96", + "size": 13042 }, { "path": "apps/web/src/features/desktop-titlebar/desktop-release.ts", @@ -17255,6 +17177,12 @@ "sha256": "b1851a7379d2bbb9874b55e89c9309cd6640fe58872201e77d640b1a999f044a", "size": 28232 }, + { + "path": "apps/web/src/features/desktop-titlebar/DesktopWindowTitlebar.tsx", + "sourceObjectId": "392410f08c72865b7c6db1d9890fb651fab1dd3b", + "sha256": "562187b868fff9d5136b9649dad721dfe9f909b8eb8d1765992c2e890978e3ae", + "size": 52858 + }, { "path": "apps/web/src/features/desktop-titlebar/fullscreen.ts", "sourceObjectId": "a1ea38cfada2a350411f277b85020d165ade60f7", @@ -17267,18 +17195,36 @@ "sha256": "d10c38f5741ffe1604ccb536378fa724e0349a741b8011f0b62658ac5cf87365", "size": 2332 }, + { + "path": "apps/web/src/features/desktop-widgets/ai-quota-widget.css", + "sourceObjectId": "c80ff733e27ddaf25bb14dac84d143d5ad97415f", + "sha256": "605cd3feaa218a384bd5448402f05b42e999421d975ef9db146b5b638132b272", + "size": 13411 + }, { "path": "apps/web/src/features/desktop-widgets/AiQuotaWidget.tsx", "sourceObjectId": "abd1b70260ce96de65d1b966b17fd2a807de952e", "sha256": "c0e4bca8d5571944d55518a232c07c8c39b0a9eae7f90c17a7f30a0ba060bb49", "size": 24098 }, + { + "path": "apps/web/src/features/desktop-widgets/alarm-log-service.ts", + "sourceObjectId": "1ec23fe705ac8f690af525c636f40b42cf52147c", + "sha256": "cc4d04592dbc39080c4fa8cd4e13d5e3d968717fbb21c25cf4dba15803536432", + "size": 2109 + }, { "path": "apps/web/src/features/desktop-widgets/AlarmLogModal.tsx", "sourceObjectId": "7ca75469cbe50e8967c29208428e20a31166e07f", "sha256": "133b36b7b82eefd336edd5c1e1ea3de53cfc64bb352c63be74fea51b5db3174e", "size": 6226 }, + { + "path": "apps/web/src/features/desktop-widgets/audio-chime.ts", + "sourceObjectId": "5f1ff899c0d5d11c5b5cfe41867193630d7be723", + "sha256": "7b00e83c43be682ef479bf83f7a1a38d33505e7d64d062d0f38dba71d00456c4", + "size": 5264 + }, { "path": "apps/web/src/features/desktop-widgets/ClockWidget.tsx", "sourceObjectId": "ecdefc1acef2da9ef14f1dc9f6a877ce638c63e0", @@ -17291,6 +17237,12 @@ "sha256": "e2e48ec73ec35d40015328eeedf7c20c440fa18f30cbb6ead272877338b0fa6b", "size": 8878 }, + { + "path": "apps/web/src/features/desktop-widgets/desktop-widgets.css", + "sourceObjectId": "50896219d0b6f086492a8dd41978ca9cd9a2a782", + "sha256": "c0bc9030f96fb03e8a85e77c9e89882f7c6903a7086b416d125de718fa83f545", + "size": 36872 + }, { "path": "apps/web/src/features/desktop-widgets/DesktopWidgetContainer.tsx", "sourceObjectId": "3683d88aadd3c499cae436279a7d6662456cb588", @@ -17303,54 +17255,18 @@ "sha256": "8bdb7e7faaf98f839214951da6274aa54bcdbbce6cf3a8eff0646a3f10ffc2db", "size": 6840 }, - { - "path": "apps/web/src/features/desktop-widgets/PushupReminderWidget.tsx", - "sourceObjectId": "d8c4fd940075bc1ce0bdf46dcb66dde98bc44786", - "sha256": "12f7f90a1b68d3be1f0c3790f46931856743eb4b6f3a7c5e755157a6f9416a52", - "size": 18238 - }, - { - "path": "apps/web/src/features/desktop-widgets/SpaceAppPromoWidget.tsx", - "sourceObjectId": "42f289265a6668525993178596495bd81a1d6901", - "sha256": "9ed4698167fbeda83606789e9da0eb5024b607877b83bbc6795a267525770dcc", - "size": 3615 - }, - { - "path": "apps/web/src/features/desktop-widgets/StreamingMetricsWidget.tsx", - "sourceObjectId": "b670af5d91f30ca2a13ce95ac10626e827df3de5", - "sha256": "32a191bb84bf58590ab1147aa51408fce0326885fa1042a4b4616269fb1f57ab", - "size": 2951 - }, - { - "path": "apps/web/src/features/desktop-widgets/ai-quota-widget.css", - "sourceObjectId": "c80ff733e27ddaf25bb14dac84d143d5ad97415f", - "sha256": "605cd3feaa218a384bd5448402f05b42e999421d975ef9db146b5b638132b272", - "size": 13411 - }, - { - "path": "apps/web/src/features/desktop-widgets/alarm-log-service.ts", - "sourceObjectId": "1ec23fe705ac8f690af525c636f40b42cf52147c", - "sha256": "cc4d04592dbc39080c4fa8cd4e13d5e3d968717fbb21c25cf4dba15803536432", - "size": 2109 - }, - { - "path": "apps/web/src/features/desktop-widgets/audio-chime.ts", - "sourceObjectId": "5f1ff899c0d5d11c5b5cfe41867193630d7be723", - "sha256": "7b00e83c43be682ef479bf83f7a1a38d33505e7d64d062d0f38dba71d00456c4", - "size": 5264 - }, - { - "path": "apps/web/src/features/desktop-widgets/desktop-widgets.css", - "sourceObjectId": "50896219d0b6f086492a8dd41978ca9cd9a2a782", - "sha256": "c0bc9030f96fb03e8a85e77c9e89882f7c6903a7086b416d125de718fa83f545", - "size": 36872 - }, { "path": "apps/web/src/features/desktop-widgets/index.ts", "sourceObjectId": "ab4d31f1d28fbbcb0ca8c78bf098b8f4edab7569", "sha256": "b4e31167addf1d1d1d245b37587690fc19987373c78eb168248aab042eedde4c", "size": 429 }, + { + "path": "apps/web/src/features/desktop-widgets/PushupReminderWidget.tsx", + "sourceObjectId": "d8c4fd940075bc1ce0bdf46dcb66dde98bc44786", + "sha256": "12f7f90a1b68d3be1f0c3790f46931856743eb4b6f3a7c5e755157a6f9416a52", + "size": 18238 + }, { "path": "apps/web/src/features/desktop-widgets/quota-aggregates.ts", "sourceObjectId": "c2ac762a548187ce0818321477643bf3a17203e9", @@ -17369,6 +17285,18 @@ "sha256": "8a36016ba5ff26e064541f6e476085ef610c29c17f9e300869bd4681f13bf56f", "size": 2638 }, + { + "path": "apps/web/src/features/desktop-widgets/SpaceAppPromoWidget.tsx", + "sourceObjectId": "42f289265a6668525993178596495bd81a1d6901", + "sha256": "9ed4698167fbeda83606789e9da0eb5024b607877b83bbc6795a267525770dcc", + "size": 3615 + }, + { + "path": "apps/web/src/features/desktop-widgets/StreamingMetricsWidget.tsx", + "sourceObjectId": "b670af5d91f30ca2a13ce95ac10626e827df3de5", + "sha256": "32a191bb84bf58590ab1147aa51408fce0326885fa1042a4b4616269fb1f57ab", + "size": 2951 + }, { "path": "apps/web/src/features/desktop-widgets/types.ts", "sourceObjectId": "85cec95bc87bdaf00a61712f855a0c5b5784fba0", @@ -17393,12 +17321,6 @@ "sha256": "651eec9ea7cc38789e4dc09377a3502ca85bb687d7d50a01306c1557fbdeee99", "size": 32921 }, - { - "path": "apps/web/src/features/dock-kit/DockKit.tsx", - "sourceObjectId": "5c1b19ccc2163d288402998af44f75845014d84e", - "sha256": "3c2beec954e2a70ee5c65197ca96a178e992444611668cecca22bd6c053a630d", - "size": 10702 - }, { "path": "apps/web/src/features/dock-kit/dock-kit.css", "sourceObjectId": "713df178efd3111b0c9ca8db237ba443645793d2", @@ -17406,16 +17328,10 @@ "size": 18297 }, { - "path": "apps/web/src/features/docks/DockKeepAliveHost.tsx", - "sourceObjectId": "36706ff9457dc5c0c64a87b19a57460c570658d9", - "sha256": "6d633c4e01b0577ce70f9a35d94dee038271de3a8d956c30b98bd1d7e2a3aaab", - "size": 3555 - }, - { - "path": "apps/web/src/features/docks/SideSurfaceFrame.tsx", - "sourceObjectId": "95016867da23877d1d783aa9e027b0c90c97803a", - "sha256": "92a353e419a13d38eb82def2e75e069832035bdbb001fcf5e828b21b68f9af8a", - "size": 4271 + "path": "apps/web/src/features/dock-kit/DockKit.tsx", + "sourceObjectId": "5c1b19ccc2163d288402998af44f75845014d84e", + "sha256": "3c2beec954e2a70ee5c65197ca96a178e992444611668cecca22bd6c053a630d", + "size": 10702 }, { "path": "apps/web/src/features/docks/dock-active-context.ts", @@ -17435,6 +17351,12 @@ "sha256": "29ad708696daabcc44399588a3f249980994033e3788a020948f31806bbbb03a", "size": 542 }, + { + "path": "apps/web/src/features/docks/DockKeepAliveHost.tsx", + "sourceObjectId": "36706ff9457dc5c0c64a87b19a57460c570658d9", + "sha256": "6d633c4e01b0577ce70f9a35d94dee038271de3a8d956c30b98bd1d7e2a3aaab", + "size": 3555 + }, { "path": "apps/web/src/features/docks/lazy-docks.ts", "sourceObjectId": "45001a0ef0fd34b1a88d0e0d786eaecba9a9ba19", @@ -17447,6 +17369,12 @@ "sha256": "e3abb43986b0eb358b7815e52b639bbb565fbdd98af85ddc704c714e8b4cb516", "size": 1812 }, + { + "path": "apps/web/src/features/docks/SideSurfaceFrame.tsx", + "sourceObjectId": "95016867da23877d1d783aa9e027b0c90c97803a", + "sha256": "92a353e419a13d38eb82def2e75e069832035bdbb001fcf5e828b21b68f9af8a", + "size": 4271 + }, { "path": "apps/web/src/features/docks/use-docks-visibility.ts", "sourceObjectId": "b375b995369b18ed160ed44ad84c0b47bd73ced8", @@ -17465,18 +17393,18 @@ "sha256": "4bad335131d8aaa2657578529b50e35552575acdfe5c75279ecffebedf39afda", "size": 2936 }, - { - "path": "apps/web/src/features/file-info/FileInfoDialog.tsx", - "sourceObjectId": "c9c985de1f8c5a36070797036f90cdafb914904d", - "sha256": "443fd1a8cdcc86c16840868ec7533a950f5922bc306bd3cfb6e8a3bff9b5534b", - "size": 6042 - }, { "path": "apps/web/src/features/file-info/file-info.css", "sourceObjectId": "ab3b096e7f7ddfc85f479236d62fadae0e52a2d3", "sha256": "ff7202a27a7119ce01e89b8a4fe59bbd9afa6309d9136f99944b67092329f2d2", "size": 1375 }, + { + "path": "apps/web/src/features/file-info/FileInfoDialog.tsx", + "sourceObjectId": "c9c985de1f8c5a36070797036f90cdafb914904d", + "sha256": "443fd1a8cdcc86c16840868ec7533a950f5922bc306bd3cfb6e8a3bff9b5534b", + "size": 6042 + }, { "path": "apps/web/src/features/files-pane/FileEditorModal.tsx", "sourceObjectId": "f69ef8b56b3bbf8af6186fbf660d2996397ad5c9", @@ -17519,18 +17447,18 @@ "sha256": "933940d3a107de6cabcbdf56754bf49fb1658cc18449ed850b065bc9b3816536", "size": 20659 }, - { - "path": "apps/web/src/features/files-pane/FilesPane.tsx", - "sourceObjectId": "0987153d0ee76432ce993315a67cd38999c8596a", - "sha256": "760d854f62084a2fe56acdb05fc0f8eae5ac5474f70163a16f81a5cd2c92a6e9", - "size": 15383 - }, { "path": "apps/web/src/features/files-pane/files-pane.css", "sourceObjectId": "e6e6f96945ea416f920152f28d95cac2302c8968", "sha256": "e1c1c3f849ded30986b91bf39b190bbcfb538d75b1a04951280bc251c45cc77f", "size": 22331 }, + { + "path": "apps/web/src/features/files-pane/FilesPane.tsx", + "sourceObjectId": "0987153d0ee76432ce993315a67cd38999c8596a", + "sha256": "760d854f62084a2fe56acdb05fc0f8eae5ac5474f70163a16f81a5cd2c92a6e9", + "size": 15383 + }, { "path": "apps/web/src/features/freelance-copilot-pane/ActivityTab.tsx", "sourceObjectId": "cf4c358278fa5185d3c4de8c9f86736cec698dc8", @@ -17543,6 +17471,12 @@ "sha256": "1cb92e0d5060d89fffea85b34d31ec3d50a7f7452139bebe54ceb73824e4de6d", "size": 5278 }, + { + "path": "apps/web/src/features/freelance-copilot-pane/freelance-copilot-pane.css", + "sourceObjectId": "a56c4be493573c45a6649e96b0d67710c60108e3", + "sha256": "ff8d64cf382b4a5e52d440effb9ed6d90d762116a9d48e2df1d68b13071626f2", + "size": 891 + }, { "path": "apps/web/src/features/freelance-copilot-pane/FreelanceCopilotPane.tsx", "sourceObjectId": "82906da967fd348544caaa235c5069cef6881c37", @@ -17561,6 +17495,12 @@ "sha256": "50572d399cbef92aaf61ff337a5c7eaddf88226e67c1f9e0fc9fc7a40a4a9e3e", "size": 13851 }, + { + "path": "apps/web/src/features/freelance-copilot-pane/live-events.ts", + "sourceObjectId": "44c2bcbd73bf91b0a2de77a4cee0014cf6139147", + "sha256": "e79edd430bf9dbafd32a42b5b171f8a4a4ebb61794363e7e37f44f3958cdd34b", + "size": 460 + }, { "path": "apps/web/src/features/freelance-copilot-pane/MemoryTab.tsx", "sourceObjectId": "95ea8f6b93bffc59dbf6e79c8c4ab20c5dedcf18", @@ -17579,54 +17519,42 @@ "sha256": "1097672d0a189209e7bdf3b22feb06ad6658076f698606bae1bd4bf20ee5c4fe", "size": 21137 }, - { - "path": "apps/web/src/features/freelance-copilot-pane/freelance-copilot-pane.css", - "sourceObjectId": "a56c4be493573c45a6649e96b0d67710c60108e3", - "sha256": "ff8d64cf382b4a5e52d440effb9ed6d90d762116a9d48e2df1d68b13071626f2", - "size": 891 - }, - { - "path": "apps/web/src/features/freelance-copilot-pane/live-events.ts", - "sourceObjectId": "44c2bcbd73bf91b0a2de77a4cee0014cf6139147", - "sha256": "e79edd430bf9dbafd32a42b5b171f8a4a4ebb61794363e7e37f44f3958cdd34b", - "size": 460 - }, { "path": "apps/web/src/features/freelance-copilot-pane/useFreelanceCopilot.ts", "sourceObjectId": "7445bbf7905475ace6450c9a4a2abfe47e471a48", "sha256": "42ef74f798bbea59c9900a26f54df3df8f816d989c71c10f6f45a128a36bec98", "size": 4317 }, - { - "path": "apps/web/src/features/harness-pane/HarnessPane.tsx", - "sourceObjectId": "7a2823cdfe6aa81ede58cda789535eabf1e8a6c4", - "sha256": "ede6abe1173757c0f75d3a4b0876ebd39d1ad47fd23d1b65f686aaf06b42d17a", - "size": 6297 - }, { "path": "apps/web/src/features/harness-pane/harness-load-policy.ts", "sourceObjectId": "7daf823e3e239b055e61b240cf1a1e6b0886d524", "sha256": "8916158739aabb4c7edc76857f5488f01224a5836aca07a9d807d6f4b4545c94", "size": 293 }, + { + "path": "apps/web/src/features/harness-pane/HarnessPane.tsx", + "sourceObjectId": "7a2823cdfe6aa81ede58cda789535eabf1e8a6c4", + "sha256": "ede6abe1173757c0f75d3a4b0876ebd39d1ad47fd23d1b65f686aaf06b42d17a", + "size": 6297 + }, { "path": "apps/web/src/features/health/HealthDock.tsx", "sourceObjectId": "161cf371efec6c7a0725f65d6c684f7d18668531", "sha256": "d98e0997aca1fdd94701be7a89f3c282888468229c498fff37c0bb1d9ae0bf8c", "size": 7409 }, - { - "path": "apps/web/src/features/help/HelpPage.tsx", - "sourceObjectId": "b255e241b7a2af89b730e2f2faab54824395acd9", - "sha256": "cc6cff226780598a2982a28d36e8861c7fedf5c33bd221b6be9e8912cb41f484", - "size": 4374 - }, { "path": "apps/web/src/features/help/help-content.ts", "sourceObjectId": "f1026949abeafdbc4875673ac1b0dd6247200e86", "sha256": "d1ff5e22a37f9d41ddd100c6392580fd17b2f728eb0c4ccb653f35f9e510fa46", "size": 54062 }, + { + "path": "apps/web/src/features/help/HelpPage.tsx", + "sourceObjectId": "b255e241b7a2af89b730e2f2faab54824395acd9", + "sha256": "cc6cff226780598a2982a28d36e8861c7fedf5c33bd221b6be9e8912cb41f484", + "size": 4374 + }, { "path": "apps/web/src/features/help/useAppView.ts", "sourceObjectId": "1cbe7fe1d6f47dd99064673fae55a3942382eaf2", @@ -17645,6 +17573,12 @@ "sha256": "2085b7b90f510e0b1f64106565bc2a98e62e423100dadfb85d34b77d70e0106b", "size": 10568 }, + { + "path": "apps/web/src/features/job-apply-pane/agent-runtimes.ts", + "sourceObjectId": "a41bb053d06a58e08f8fc0c5792753b58b58eb4a", + "sha256": "927ab7bad115f27e956f9b5a6ab754635954421f5fa6df56f7de3ba8b6257fe9", + "size": 2708 + }, { "path": "apps/web/src/features/job-apply-pane/AgentAccountField.tsx", "sourceObjectId": "b504b7275fb51eb053c2b0e46bc847369811fa89", @@ -17675,6 +17609,12 @@ "sha256": "f1c3d385d46129f937e1979edb98a8a949fd54c08f966d15a86f564504af40c8", "size": 654 }, + { + "path": "apps/web/src/features/job-apply-pane/job-copilot-pane.css", + "sourceObjectId": "1fbe74b017f863e9f98eda708332efed958f0276", + "sha256": "02ede95c1e45599501414333f36e46fa53184bf4cec8aaa0b6a7d087d94e6e26", + "size": 177 + }, { "path": "apps/web/src/features/job-apply-pane/JobCopilotLaunchDialog.tsx", "sourceObjectId": "c8ca192bff2bb2500cacd35e679584e72aa4cd9a", @@ -17693,6 +17633,18 @@ "sha256": "85f0d795b440bd5f27818c6d5e7532ed068e95c4f46d1410fc7ea3db7ed0b54e", "size": 357 }, + { + "path": "apps/web/src/features/job-apply-pane/layout.ts", + "sourceObjectId": "c92b8d2a68ddace403454cda78eb954d22152177", + "sha256": "e05e97dfc08404c73d60420c015832ce7bf05af79d0c214ac2743bc68c512b05", + "size": 1484 + }, + { + "path": "apps/web/src/features/job-apply-pane/live-events.ts", + "sourceObjectId": "9940ac0f49ce116baa84e7fcd4c470612b265a1b", + "sha256": "5db8d80c718d8fe4e101961f0d2b6b379307e2f7abebb3f47083c1d5230f675c", + "size": 545 + }, { "path": "apps/web/src/features/job-apply-pane/MemoryTab.tsx", "sourceObjectId": "5eecea8eb6f35a71656a57cdbbf31e47065f433b", @@ -17717,42 +17669,12 @@ "sha256": "5f8daa8443cc2a1fbf7c88c807768b10dcea73366ed2e5ed7c0ec799cce68bb3", "size": 3309 }, - { - "path": "apps/web/src/features/job-apply-pane/agent-runtimes.ts", - "sourceObjectId": "a41bb053d06a58e08f8fc0c5792753b58b58eb4a", - "sha256": "927ab7bad115f27e956f9b5a6ab754635954421f5fa6df56f7de3ba8b6257fe9", - "size": 2708 - }, - { - "path": "apps/web/src/features/job-apply-pane/job-copilot-pane.css", - "sourceObjectId": "1fbe74b017f863e9f98eda708332efed958f0276", - "sha256": "02ede95c1e45599501414333f36e46fa53184bf4cec8aaa0b6a7d087d94e6e26", - "size": 177 - }, - { - "path": "apps/web/src/features/job-apply-pane/layout.ts", - "sourceObjectId": "c92b8d2a68ddace403454cda78eb954d22152177", - "sha256": "e05e97dfc08404c73d60420c015832ce7bf05af79d0c214ac2743bc68c512b05", - "size": 1484 - }, - { - "path": "apps/web/src/features/job-apply-pane/live-events.ts", - "sourceObjectId": "9940ac0f49ce116baa84e7fcd4c470612b265a1b", - "sha256": "5db8d80c718d8fe4e101961f0d2b6b379307e2f7abebb3f47083c1d5230f675c", - "size": 545 - }, { "path": "apps/web/src/features/job-apply-pane/useJobApply.ts", "sourceObjectId": "0bf169240acb70646970fde2183de4d2b8573547", "sha256": "de42d3f1c9024fc1846295057a1578da523a1c73904aa3725f9d5b346239ea2a", "size": 8975 }, - { - "path": "apps/web/src/features/keyboard-autocorrect/KeyboardAutocorrectSettingsCard.tsx", - "sourceObjectId": "ba58fd116fa3b213fe6bf068dbbc504a3359a513", - "sha256": "cf5698668308bb6f71b4d129ba825345d8ab6ee5a874c8ae2d71bdfb7801a7d4", - "size": 6430 - }, { "path": "apps/web/src/features/keyboard-autocorrect/keyboard-autocorrect-settings.css", "sourceObjectId": "78bead17932388b23b7fcbd8a7cba4d3f9cef43d", @@ -17765,48 +17687,18 @@ "sha256": "e73770dcdf468ebfe4506abc6c3c10f4940cf3887bec07716491afae04a5c19a", "size": 7664 }, + { + "path": "apps/web/src/features/keyboard-autocorrect/KeyboardAutocorrectSettingsCard.tsx", + "sourceObjectId": "ba58fd116fa3b213fe6bf068dbbc504a3359a513", + "sha256": "cf5698668308bb6f71b4d129ba825345d8ab6ee5a874c8ae2d71bdfb7801a7d4", + "size": 6430 + }, { "path": "apps/web/src/features/keyboard-autocorrect/send-layout.ts", "sourceObjectId": "a2f7f184fdff071ca7db07a21276a10378be9219", "sha256": "3fcab6aaf6eaead7ee07bb098211de5aeed3b984c2b12a4005b0bf030c10cace", "size": 1020 }, - { - "path": "apps/web/src/features/live-pane/LiveMissionCard.tsx", - "sourceObjectId": "1467cf0ea9f997eda6eff18eea66dccef40f3995", - "sha256": "2ba3d9aac3397dbce4052710faa8561dc6433fe9d78345f6d47d4d4b767f487e", - "size": 7095 - }, - { - "path": "apps/web/src/features/live-pane/LivePane.tsx", - "sourceObjectId": "62d173ba209bab14442ebac415e14b1aef12e2ed", - "sha256": "83717385b911a84fa89733ac43ae51ec0de2e54c17d363be9b94633940ca4469", - "size": 96604 - }, - { - "path": "apps/web/src/features/live-pane/LiveRailContextMenu.tsx", - "sourceObjectId": "f9892a1e51da8b9029e0b0f2e07aa1352aebe964", - "sha256": "947c289a00b0bf05e4a4ec1d49d396a500b632572374e72a4301d79232c86aa8", - "size": 3692 - }, - { - "path": "apps/web/src/features/live-pane/LiveRailSession.tsx", - "sourceObjectId": "e80af84eab0164fcff825f3e6c0ab297aa99c037", - "sha256": "b424c483ac1c4da215457d25db1fd20d0b4f09ffa1fa1ebd9a3f1727b75ba5a9", - "size": 10410 - }, - { - "path": "apps/web/src/features/live-pane/LiveSessionProvider.tsx", - "sourceObjectId": "b9fe03f6c1db0a65605f5eaf9d4a4e950480ff7d", - "sha256": "bdc2d6cac203c1a0286e092adfc1030b770475271886ffa24b6555daca0cb72b", - "size": 6810 - }, - { - "path": "apps/web/src/features/live-pane/LiveStatsWindow.tsx", - "sourceObjectId": "3052dfbbc40a0e81e237d86a01cc90eaa03faf62", - "sha256": "b1c7cfe1863314fc7a359f55caa73004172b69f3db929bdf9ea45c0650960c8a", - "size": 12882 - }, { "path": "apps/web/src/features/live-pane/gateway-realtime.ts", "sourceObjectId": "22d6dade883ee04cfb3a5cf20546c8cc7d14f55c", @@ -17921,6 +17813,42 @@ "sha256": "c1c9a3204d0dfac25c8603cf17ab7e3ed0c90c95a1a36374409a02a4f3117066", "size": 729 }, + { + "path": "apps/web/src/features/live-pane/LiveMissionCard.tsx", + "sourceObjectId": "1467cf0ea9f997eda6eff18eea66dccef40f3995", + "sha256": "2ba3d9aac3397dbce4052710faa8561dc6433fe9d78345f6d47d4d4b767f487e", + "size": 7095 + }, + { + "path": "apps/web/src/features/live-pane/LivePane.tsx", + "sourceObjectId": "62d173ba209bab14442ebac415e14b1aef12e2ed", + "sha256": "83717385b911a84fa89733ac43ae51ec0de2e54c17d363be9b94633940ca4469", + "size": 96604 + }, + { + "path": "apps/web/src/features/live-pane/LiveRailContextMenu.tsx", + "sourceObjectId": "f9892a1e51da8b9029e0b0f2e07aa1352aebe964", + "sha256": "947c289a00b0bf05e4a4ec1d49d396a500b632572374e72a4301d79232c86aa8", + "size": 3692 + }, + { + "path": "apps/web/src/features/live-pane/LiveRailSession.tsx", + "sourceObjectId": "e80af84eab0164fcff825f3e6c0ab297aa99c037", + "sha256": "b424c483ac1c4da215457d25db1fd20d0b4f09ffa1fa1ebd9a3f1727b75ba5a9", + "size": 10410 + }, + { + "path": "apps/web/src/features/live-pane/LiveSessionProvider.tsx", + "sourceObjectId": "b9fe03f6c1db0a65605f5eaf9d4a4e950480ff7d", + "sha256": "bdc2d6cac203c1a0286e092adfc1030b770475271886ffa24b6555daca0cb72b", + "size": 6810 + }, + { + "path": "apps/web/src/features/live-pane/LiveStatsWindow.tsx", + "sourceObjectId": "3052dfbbc40a0e81e237d86a01cc90eaa03faf62", + "sha256": "b1c7cfe1863314fc7a359f55caa73004172b69f3db929bdf9ea45c0650960c8a", + "size": 12882 + }, { "path": "apps/web/src/features/live-pane/useLiveRail.tsx", "sourceObjectId": "6f36024d64ad78660c38dff790eb9c5393fac169", @@ -17945,6 +17873,18 @@ "sha256": "0f5be1d98e20e3e05677fa913dae52c6e92a079439b65a300ea4ea60eb9066ff", "size": 5435 }, + { + "path": "apps/web/src/features/mail-copilot-pane/live-events.ts", + "sourceObjectId": "bb67310ea0d75f344cf38f9a00de3f77fef00509", + "sha256": "46c0157972525349acb438000d5d79e217aaf5af788415a4245448bdfadb5cbe", + "size": 570 + }, + { + "path": "apps/web/src/features/mail-copilot-pane/mail-copilot-pane.css", + "sourceObjectId": "d88e7a9e21dd8463e014422e245298ea33450d60", + "sha256": "e6928c96550aa74a09860c6ef7d3cb1630d35c1888c60d469fea297205f4e603", + "size": 28187 + }, { "path": "apps/web/src/features/mail-copilot-pane/MailClient.tsx", "sourceObjectId": "083db79e011cee6d2b70c939e4b2ff5b11c39c14", @@ -17982,16 +17922,10 @@ "size": 13934 }, { - "path": "apps/web/src/features/mail-copilot-pane/live-events.ts", - "sourceObjectId": "bb67310ea0d75f344cf38f9a00de3f77fef00509", - "sha256": "46c0157972525349acb438000d5d79e217aaf5af788415a4245448bdfadb5cbe", - "size": 570 - }, - { - "path": "apps/web/src/features/mail-copilot-pane/mail-copilot-pane.css", - "sourceObjectId": "d88e7a9e21dd8463e014422e245298ea33450d60", - "sha256": "e6928c96550aa74a09860c6ef7d3cb1630d35c1888c60d469fea297205f4e603", - "size": 28187 + "path": "apps/web/src/features/mail-copilot-pane/useMailbox.ts", + "sourceObjectId": "9871f70944d39e902449aff0bc89767eff9f3995", + "sha256": "25173f5aba0b7a208ed8eb9915d56e9cdfd6dbabcd8d1d4ce5086d889e5fabcf", + "size": 7902 }, { "path": "apps/web/src/features/mail-copilot-pane/useMailCopilot.ts", @@ -17999,12 +17933,6 @@ "sha256": "cc2707843ac637dc0d94773232bb7126be653e1fd63b14386abbb5e0d13f7d32", "size": 3703 }, - { - "path": "apps/web/src/features/mail-copilot-pane/useMailbox.ts", - "sourceObjectId": "9871f70944d39e902449aff0bc89767eff9f3995", - "sha256": "25173f5aba0b7a208ed8eb9915d56e9cdfd6dbabcd8d1d4ce5086d889e5fabcf", - "size": 7902 - }, { "path": "apps/web/src/features/marketing-copilot-pane/ActivityTab.tsx", "sourceObjectId": "58556d13b24d2cdc35d481aac38250dffba47a08", @@ -18029,6 +17957,18 @@ "sha256": "83dbad9c302373ee2590bb8bc218d2cbb541b3b92dd3795045f96d128a2cec68", "size": 5276 }, + { + "path": "apps/web/src/features/marketing-copilot-pane/live-events.ts", + "sourceObjectId": "09526dda0086c331e3a9dfd6cc47bc101f74b85d", + "sha256": "335c14d09530b126ca88aa1f58aa0f620f2380e18d1382b78263414366ee89aa", + "size": 460 + }, + { + "path": "apps/web/src/features/marketing-copilot-pane/marketing-copilot-pane.css", + "sourceObjectId": "d4d3f9e118388cf0431f158deb7a20cce50b87b6", + "sha256": "69be5c5b9c35dc8b090ae608632f9e4a317938b9395ba33532f5ef49579c019e", + "size": 9667 + }, { "path": "apps/web/src/features/marketing-copilot-pane/MarketingCopilotPane.tsx", "sourceObjectId": "54f33dc7d3962aff875fa0a81411a97e2546e458", @@ -18059,42 +17999,72 @@ "sha256": "078de2f0622ecdac8e04524b61b2797778c405697260c58039f74309cf6ad648", "size": 13158 }, - { - "path": "apps/web/src/features/marketing-copilot-pane/live-events.ts", - "sourceObjectId": "09526dda0086c331e3a9dfd6cc47bc101f74b85d", - "sha256": "335c14d09530b126ca88aa1f58aa0f620f2380e18d1382b78263414366ee89aa", - "size": 460 - }, - { - "path": "apps/web/src/features/marketing-copilot-pane/marketing-copilot-pane.css", - "sourceObjectId": "d4d3f9e118388cf0431f158deb7a20cce50b87b6", - "sha256": "69be5c5b9c35dc8b090ae608632f9e4a317938b9395ba33532f5ef49579c019e", - "size": 9667 - }, { "path": "apps/web/src/features/marketing-copilot-pane/useMarketingCopilot.ts", "sourceObjectId": "972c6d4ca8bb3952abb58a4049724455a8f4b16e", "sha256": "83a81aff2b0f6affd9a53eda56126858947ec21f6c24053adc45f3b00ccd9751", "size": 4338 }, - { - "path": "apps/web/src/features/media-dock/MediaDock.tsx", - "sourceObjectId": "1151bff39e5c267b9edaf6b8176a20e1e019197d", - "sha256": "1605238c92a35d26e05d2b9318929ca101847bb9fa94c032150652b61d7847b9", - "size": 19489 - }, { "path": "apps/web/src/features/media-dock/media-dock.css", "sourceObjectId": "65b829e104e1505cec6f54d59478067f2a770c16", "sha256": "c54599603c7ac2f9afa39fddd3b5966f05d5705d07429ad0b58841cd619022d3", "size": 2573 }, + { + "path": "apps/web/src/features/media-dock/MediaDock.tsx", + "sourceObjectId": "1151bff39e5c267b9edaf6b8176a20e1e019197d", + "sha256": "1605238c92a35d26e05d2b9318929ca101847bb9fa94c032150652b61d7847b9", + "size": 19489 + }, { "path": "apps/web/src/features/memory-workspace/DesktopMemoryGraph.tsx", "sourceObjectId": "1e81b74b10e7aea2688e52e8c234d0ebf0a93b8f", "sha256": "e147689f00f21075b6fd7b5521f0890b529253c661c12bb74e30940992926694", "size": 22726 }, + { + "path": "apps/web/src/features/memory-workspace/memory-3d.ts", + "sourceObjectId": "512bdb7a3df4869903447fff2a892fcf6838970c", + "sha256": "b13db6d17c4c74ea41bbd86e8e238877fe4ed7c8e914914a75c65bb446b2440e", + "size": 6213 + }, + { + "path": "apps/web/src/features/memory-workspace/memory-atlas.css", + "sourceObjectId": "51d5424bdf2c1dd17d585c3b72ddd916ddaa7f79", + "sha256": "3d7528cd27cd345b917131f42591d89dab8ee15edf4a503214d11951c66cd1bd", + "size": 16436 + }, + { + "path": "apps/web/src/features/memory-workspace/memory-atlas.ts", + "sourceObjectId": "a6c03adc154645bfe615ecbf7329512dbfd57830", + "sha256": "75e401ba88234c011619537fb1b9dfd78a841286a21a981addaae1bc8bf2c8f6", + "size": 6811 + }, + { + "path": "apps/web/src/features/memory-workspace/memory-calendar.css", + "sourceObjectId": "d8e8c0afc7d28b8147bb3b39fe5b7c2ff772e045", + "sha256": "1738de32974d17f09e0448161f7f7a523a4ef19681a6f5f40fd1a82f88804692", + "size": 15358 + }, + { + "path": "apps/web/src/features/memory-workspace/memory-graph-visuals.ts", + "sourceObjectId": "e89ad27044b802e88496d58c0bcc69cdcb9eddf8", + "sha256": "94cdb24dfa5421c65b7701cab34eba3d908d5c6de56b72f336cfb90f9de28a6f", + "size": 6360 + }, + { + "path": "apps/web/src/features/memory-workspace/memory-network-layout.ts", + "sourceObjectId": "5e84d5e95b44970973b80f8ef82ec657aeb943d4", + "sha256": "5533c246f3fc336999cc02378b39039eb4aaf27eeb30e9b5b4f678c7ce1a4670", + "size": 3888 + }, + { + "path": "apps/web/src/features/memory-workspace/memory-network-layout.worker.ts", + "sourceObjectId": "f46e5061271778e79f66c04f3fe31f3fe07fabf7", + "sha256": "fc54cf2d769930fd7dedca55afad0afc8c8abe0f85182e492679bf54d10f835b", + "size": 498 + }, { "path": "apps/web/src/features/memory-workspace/MemoryCalendarView.tsx", "sourceObjectId": "5edbd72efa205f04ba92bdec5e2bba3010634262", @@ -18161,66 +18131,6 @@ "sha256": "4509dc5e0a2f5d30c2c58efe56096337a85024c1d455e7c7165e9b370f4a2495", "size": 1933 }, - { - "path": "apps/web/src/features/memory-workspace/memory-3d.ts", - "sourceObjectId": "512bdb7a3df4869903447fff2a892fcf6838970c", - "sha256": "b13db6d17c4c74ea41bbd86e8e238877fe4ed7c8e914914a75c65bb446b2440e", - "size": 6213 - }, - { - "path": "apps/web/src/features/memory-workspace/memory-atlas.css", - "sourceObjectId": "51d5424bdf2c1dd17d585c3b72ddd916ddaa7f79", - "sha256": "3d7528cd27cd345b917131f42591d89dab8ee15edf4a503214d11951c66cd1bd", - "size": 16436 - }, - { - "path": "apps/web/src/features/memory-workspace/memory-atlas.ts", - "sourceObjectId": "a6c03adc154645bfe615ecbf7329512dbfd57830", - "sha256": "75e401ba88234c011619537fb1b9dfd78a841286a21a981addaae1bc8bf2c8f6", - "size": 6811 - }, - { - "path": "apps/web/src/features/memory-workspace/memory-calendar.css", - "sourceObjectId": "d8e8c0afc7d28b8147bb3b39fe5b7c2ff772e045", - "sha256": "1738de32974d17f09e0448161f7f7a523a4ef19681a6f5f40fd1a82f88804692", - "size": 15358 - }, - { - "path": "apps/web/src/features/memory-workspace/memory-graph-visuals.ts", - "sourceObjectId": "e89ad27044b802e88496d58c0bcc69cdcb9eddf8", - "sha256": "94cdb24dfa5421c65b7701cab34eba3d908d5c6de56b72f336cfb90f9de28a6f", - "size": 6360 - }, - { - "path": "apps/web/src/features/memory-workspace/memory-network-layout.ts", - "sourceObjectId": "5e84d5e95b44970973b80f8ef82ec657aeb943d4", - "sha256": "5533c246f3fc336999cc02378b39039eb4aaf27eeb30e9b5b4f678c7ce1a4670", - "size": 3888 - }, - { - "path": "apps/web/src/features/memory-workspace/memory-network-layout.worker.ts", - "sourceObjectId": "f46e5061271778e79f66c04f3fe31f3fe07fabf7", - "sha256": "fc54cf2d769930fd7dedca55afad0afc8c8abe0f85182e492679bf54d10f835b", - "size": 498 - }, - { - "path": "apps/web/src/features/notifications/NotificationCenterDock.tsx", - "sourceObjectId": "94d317f586aeadb019c206413c72cd7573daed26", - "sha256": "55c68cb9703ce7fca8057ff2b39f14b891b96f33b52600cbcb94d5dab6d920a6", - "size": 6888 - }, - { - "path": "apps/web/src/features/notifications/NotificationSettingsCard.tsx", - "sourceObjectId": "d6163ef5cce97422c6e67e6b7f951cabac699412", - "sha256": "c4392de4d59ddcec639fe645153b19a107b48f97a563e84eb779bdba2f70dd1e", - "size": 9906 - }, - { - "path": "apps/web/src/features/notifications/NotificationToastHost.tsx", - "sourceObjectId": "05ec4b943be8d86d1d76d273096349d12c9a24a4", - "sha256": "e66802731409315b3bd372ab14207b8175e6290fd7b1c0d4b645dd793376edc5", - "size": 2068 - }, { "path": "apps/web/src/features/notifications/desktop-notifications.ts", "sourceObjectId": "182fe0570579fa94e677ef686f48ec7d07886c49", @@ -18245,24 +18155,36 @@ "sha256": "af8d0b130ec715f37d0d9a07c49d6d8712141c3e673c82e8d2046acf7879751f", "size": 6632 }, + { + "path": "apps/web/src/features/notifications/NotificationCenterDock.tsx", + "sourceObjectId": "94d317f586aeadb019c206413c72cd7573daed26", + "sha256": "55c68cb9703ce7fca8057ff2b39f14b891b96f33b52600cbcb94d5dab6d920a6", + "size": 6888 + }, { "path": "apps/web/src/features/notifications/notifications.css", "sourceObjectId": "ba04afcc73e9fe4bc336c1f2f459471b92b6e846", "sha256": "5b3e03fdb3bd4108c19e97aebdfba727bf3ce98421962cde73c1b7858c54c3a6", "size": 6136 }, + { + "path": "apps/web/src/features/notifications/NotificationSettingsCard.tsx", + "sourceObjectId": "d6163ef5cce97422c6e67e6b7f951cabac699412", + "sha256": "c4392de4d59ddcec639fe645153b19a107b48f97a563e84eb779bdba2f70dd1e", + "size": 9906 + }, + { + "path": "apps/web/src/features/notifications/NotificationToastHost.tsx", + "sourceObjectId": "05ec4b943be8d86d1d76d273096349d12c9a24a4", + "sha256": "e66802731409315b3bd372ab14207b8175e6290fd7b1c0d4b645dd793376edc5", + "size": 2068 + }, { "path": "apps/web/src/features/notifications/useNotifications.ts", "sourceObjectId": "678bfa02db734b1e661345796480caf3c397adce", "sha256": "bfe7aadf1d5204995a958b2f4417f40a8a51e21eb03f2ab37f0f7299058e57da", "size": 3147 }, - { - "path": "apps/web/src/features/nous-focus/NousFocus.tsx", - "sourceObjectId": "3a29306bab31a16105e5f5b76e52a63918eff14b", - "sha256": "96138485fdf213eb96f0295b16770f3c719fdfe6a5f0bc004bf29566398d12ad", - "size": 17742 - }, { "path": "apps/web/src/features/nous-focus/nous-focus-events.ts", "sourceObjectId": "53dcbea62c40300f889ef16c2969c0fd6624fa85", @@ -18275,6 +18197,18 @@ "sha256": "24266f6770faed3735fb446d07c1ff1d884a22c1985f524d96732810e76792c8", "size": 2231 }, + { + "path": "apps/web/src/features/nous-focus/NousFocus.tsx", + "sourceObjectId": "3a29306bab31a16105e5f5b76e52a63918eff14b", + "sha256": "96138485fdf213eb96f0295b16770f3c719fdfe6a5f0bc004bf29566398d12ad", + "size": 17742 + }, + { + "path": "apps/web/src/features/nous/nous.css", + "sourceObjectId": "69641587f4828daedb29f752088d5e40757efd6a", + "sha256": "fa4159520fd8046de9e1ff75256fc501410ba169cd9c87ce2938bd0444e7ce71", + "size": 42216 + }, { "path": "apps/web/src/features/nous/NousBrain3D.tsx", "sourceObjectId": "c760b1e30f5e4f33d8b84ec16e10e31ff90aa18b", @@ -18318,10 +18252,10 @@ "size": 26993 }, { - "path": "apps/web/src/features/nous/nous.css", - "sourceObjectId": "69641587f4828daedb29f752088d5e40757efd6a", - "sha256": "fa4159520fd8046de9e1ff75256fc501410ba169cd9c87ce2938bd0444e7ce71", - "size": 42216 + "path": "apps/web/src/features/osk-keyboard/cli-shortcuts.ts", + "sourceObjectId": "20ecca31b980b44c82744fde546b6d12a901c264", + "sha256": "0bd2264352cfbbfe19db4f37ae7e3a84a77f15644ea3a0e84db3ef88756fc6bf", + "size": 8301 }, { "path": "apps/web/src/features/osk-keyboard/OnScreenKeyboard.tsx", @@ -18329,12 +18263,6 @@ "sha256": "7a1ac215ff6639ecfc4ea84d75fc19942483ca73d2c9a5588390435084a559e9", "size": 37268 }, - { - "path": "apps/web/src/features/osk-keyboard/cli-shortcuts.ts", - "sourceObjectId": "20ecca31b980b44c82744fde546b6d12a901c264", - "sha256": "0bd2264352cfbbfe19db4f37ae7e3a84a77f15644ea3a0e84db3ef88756fc6bf", - "size": 8301 - }, { "path": "apps/web/src/features/osk-keyboard/osk-autocomplete.ts", "sourceObjectId": "b759b7c9566af33c3fbb1ae299a7a9866e63c60d", @@ -18347,12 +18275,6 @@ "sha256": "b3fce84655eb0e56c13145d782a9ebb57e6e2a1562a994fd61d4b9959043c444", "size": 15167 }, - { - "path": "apps/web/src/features/pane-card/PaneCard.tsx", - "sourceObjectId": "1b75ef487fc9f33b2b5143529c77c715aacb3481", - "sha256": "fb6dad53d13315227664ee5fa44a85bb5c73f4b7b0ea5009ca5b10bde184167c", - "size": 133584 - }, { "path": "apps/web/src/features/pane-card/pane-mode-icons.ts", "sourceObjectId": "0b83ff4cde7b05600ccedfde163bfdabcaec04ce", @@ -18365,6 +18287,12 @@ "sha256": "b5092f7c956bf3ab2c3a514bea545054dce981c9c637461eb95aa2a652cabdaf", "size": 1683 }, + { + "path": "apps/web/src/features/pane-card/PaneCard.tsx", + "sourceObjectId": "1b75ef487fc9f33b2b5143529c77c715aacb3481", + "sha256": "fb6dad53d13315227664ee5fa44a85bb5c73f4b7b0ea5009ca5b10bde184167c", + "size": 133584 + }, { "path": "apps/web/src/features/pane-card/use-youtube-float-request.ts", "sourceObjectId": "a76571c0d05f66c8df25113822320dfeb80fe446", @@ -18461,12 +18389,6 @@ "sha256": "3482b8cf099f4ae31fc8b7818d0b835141b770f99fc362599c54fc9d4017cfdd", "size": 11195 }, - { - "path": "apps/web/src/features/pane-working-time/PaneWorkingTimeBadge.tsx", - "sourceObjectId": "0e0b2d03a3d43a14f3db6835227064df968a693d", - "sha256": "6c0daa1e2a5369ac9782242a1885d46d457ff5864313d75767331ae64816befe", - "size": 2107 - }, { "path": "apps/web/src/features/pane-working-time/index.ts", "sourceObjectId": "6191346af4a299bf6dd74fb1840b3e408d172576", @@ -18479,18 +18401,18 @@ "sha256": "f55759309b31756e41bf62e5941a8ec14b7a5f03843e0d34c8a91166e918c704", "size": 8652 }, + { + "path": "apps/web/src/features/pane-working-time/PaneWorkingTimeBadge.tsx", + "sourceObjectId": "0e0b2d03a3d43a14f3db6835227064df968a693d", + "sha256": "6c0daa1e2a5369ac9782242a1885d46d457ff5864313d75767331ae64816befe", + "size": 2107 + }, { "path": "apps/web/src/features/pane-working-time/usePaneWorkingTime.ts", "sourceObjectId": "0866d13a89b6594967af46b6c816c5805f2e51a9", "sha256": "68a78fbf533f0f49d4d8a86a7332effb1335d16013e5a04c9da5f325d7cc4d2f", "size": 8511 }, - { - "path": "apps/web/src/features/plugins/PluginsSettingsCard.tsx", - "sourceObjectId": "01954988ba9713c33787edac3fa034725582e817", - "sha256": "4ca9f18074b24257a1ab55487650404b854dd43abb9e25c5227e64c967fe5ba2", - "size": 21600 - }, { "path": "apps/web/src/features/plugins/plugins-settings.css", "sourceObjectId": "f8b679807715830753cabdc16a894cd32928c73c", @@ -18498,28 +18420,10 @@ "size": 22033 }, { - "path": "apps/web/src/features/prompt-variables/PromptVariableAutocomplete.tsx", - "sourceObjectId": "2811d1ca48a6631bb8a4b657c2ee0c13b92c5c88", - "sha256": "7f67a392fefb39ca917d75c76c87018d52d3ee88fa12ee6a6e947b3ecae1f6fa", - "size": 5218 - }, - { - "path": "apps/web/src/features/prompt-variables/PromptVariablesManagerModal.tsx", - "sourceObjectId": "5706c19fa57a87f9cccb9751a800f77f471223b1", - "sha256": "c56969beea1f21a1581ec3017d8b6cf97f1da71596a56ad4b0b7b7dac8973671", - "size": 14209 - }, - { - "path": "apps/web/src/features/prompt-variables/PromptVariablesMenu.tsx", - "sourceObjectId": "212e94608a39c7a25b2e737e68b71f0ef33dc3c4", - "sha256": "74347d72d9472bbb8bf2c8ec6f23acabf956d55bdb5b7df2ada5bed133c41138", - "size": 29311 - }, - { - "path": "apps/web/src/features/prompt-variables/PromptVariablesSettingsCard.tsx", - "sourceObjectId": "044e1afdf3b380cec3d1ae00c60d503010939988", - "sha256": "a961365c2b6e1fce4380ae92cd0445591fdf2358a563a9457ad0379168f9a9fa", - "size": 2488 + "path": "apps/web/src/features/plugins/PluginsSettingsCard.tsx", + "sourceObjectId": "01954988ba9713c33787edac3fa034725582e817", + "sha256": "4ca9f18074b24257a1ab55487650404b854dd43abb9e25c5227e64c967fe5ba2", + "size": 21600 }, { "path": "apps/web/src/features/prompt-variables/prompt-variables-manager.css", @@ -18545,12 +18449,42 @@ "sha256": "1c5dcd6191ef1a894c29523dbd86ee4cf1bf6cafaa7957d7943f952501917100", "size": 6311 }, + { + "path": "apps/web/src/features/prompt-variables/PromptVariableAutocomplete.tsx", + "sourceObjectId": "2811d1ca48a6631bb8a4b657c2ee0c13b92c5c88", + "sha256": "7f67a392fefb39ca917d75c76c87018d52d3ee88fa12ee6a6e947b3ecae1f6fa", + "size": 5218 + }, + { + "path": "apps/web/src/features/prompt-variables/PromptVariablesManagerModal.tsx", + "sourceObjectId": "5706c19fa57a87f9cccb9751a800f77f471223b1", + "sha256": "c56969beea1f21a1581ec3017d8b6cf97f1da71596a56ad4b0b7b7dac8973671", + "size": 14209 + }, + { + "path": "apps/web/src/features/prompt-variables/PromptVariablesMenu.tsx", + "sourceObjectId": "212e94608a39c7a25b2e737e68b71f0ef33dc3c4", + "sha256": "74347d72d9472bbb8bf2c8ec6f23acabf956d55bdb5b7df2ada5bed133c41138", + "size": 29311 + }, + { + "path": "apps/web/src/features/prompt-variables/PromptVariablesSettingsCard.tsx", + "sourceObjectId": "044e1afdf3b380cec3d1ae00c60d503010939988", + "sha256": "a961365c2b6e1fce4380ae92cd0445591fdf2358a563a9457ad0379168f9a9fa", + "size": 2488 + }, { "path": "apps/web/src/features/rail-popover.ts", "sourceObjectId": "ca1c64dbd9e067935eecfe50f5201b2f9ade43d8", "sha256": "789c4480aa1e12866dd0bb4dbd3c812b83cb56e51f5feb213dfd0d016177ddb8", "size": 12477 }, + { + "path": "apps/web/src/features/releases/releases.css", + "sourceObjectId": "8c19911cba9ee4b65420900db26f764b3d5281bf", + "sha256": "1260e3eb6f133b0e7b036ba863b5454d4f57320947ce9d198b27a579a93fb2d9", + "size": 3337 + }, { "path": "apps/web/src/features/releases/ReleasesSettingsCard.tsx", "sourceObjectId": "af4ce1f2e1396a8fc997177d736306b6db031766", @@ -18558,10 +18492,28 @@ "size": 8039 }, { - "path": "apps/web/src/features/releases/releases.css", - "sourceObjectId": "8c19911cba9ee4b65420900db26f764b3d5281bf", - "sha256": "1260e3eb6f133b0e7b036ba863b5454d4f57320947ce9d198b27a579a93fb2d9", - "size": 3337 + "path": "apps/web/src/features/room-agent/control-voice-preferences.ts", + "sourceObjectId": "996b2555673e94f5b1486e196c154614a0ccc04f", + "sha256": "82f0cc5b509e0b5f1c2f1b598099844883a2f578f747b4edf396d577786a38e1", + "size": 3208 + }, + { + "path": "apps/web/src/features/room-agent/room-agent-dock.css", + "sourceObjectId": "24ff33df46ed18eb30e80ee56547f06293b33ae1", + "sha256": "c583b15b690a2563250acf1c53fc75fdc02d067fa152fb7403d9540f958b44e2", + "size": 17044 + }, + { + "path": "apps/web/src/features/room-agent/room-agent-notifications.ts", + "sourceObjectId": "5c86b865eb7f556c511b63e87be34b12c303531d", + "sha256": "dd0e581d66a5555c3608141b895a387f8ad38ec132b1ffc452cc1da2cdbe39e0", + "size": 484 + }, + { + "path": "apps/web/src/features/room-agent/room-playback-control.ts", + "sourceObjectId": "d4c1353e0567132da02952c9c16aaa7288333e6f", + "sha256": "a04abca586d45d0bbe005b716c609fe6367621c08002870189a5e8a0ec6b108d", + "size": 4932 }, { "path": "apps/web/src/features/room-agent/RoomAgentComposer.tsx", @@ -18593,30 +18545,6 @@ "sha256": "8075f807a8a03d5289eec484c29e6c3cab9352a4452aeadf9ba5783ad443f261", "size": 13932 }, - { - "path": "apps/web/src/features/room-agent/control-voice-preferences.ts", - "sourceObjectId": "996b2555673e94f5b1486e196c154614a0ccc04f", - "sha256": "82f0cc5b509e0b5f1c2f1b598099844883a2f578f747b4edf396d577786a38e1", - "size": 3208 - }, - { - "path": "apps/web/src/features/room-agent/room-agent-dock.css", - "sourceObjectId": "24ff33df46ed18eb30e80ee56547f06293b33ae1", - "sha256": "c583b15b690a2563250acf1c53fc75fdc02d067fa152fb7403d9540f958b44e2", - "size": 17044 - }, - { - "path": "apps/web/src/features/room-agent/room-agent-notifications.ts", - "sourceObjectId": "5c86b865eb7f556c511b63e87be34b12c303531d", - "sha256": "dd0e581d66a5555c3608141b895a387f8ad38ec132b1ffc452cc1da2cdbe39e0", - "size": 484 - }, - { - "path": "apps/web/src/features/room-agent/room-playback-control.ts", - "sourceObjectId": "d4c1353e0567132da02952c9c16aaa7288333e6f", - "sha256": "a04abca586d45d0bbe005b716c609fe6367621c08002870189a5e8a0ec6b108d", - "size": 4932 - }, { "path": "apps/web/src/features/room-agent/space-control-client.ts", "sourceObjectId": "5239791791bd35358eb85039508c82d278940f44", @@ -18653,6 +18581,12 @@ "sha256": "5475551b9addc78447ffdf6804390a71c250b53c6ab319b227e567b48b4e8c96", "size": 17959 }, + { + "path": "apps/web/src/features/room-toolbar/room-toolbar-actions.ts", + "sourceObjectId": "2e940b835e27918a05acb75ee17dc8a4c0fb9cd8", + "sha256": "e91aea9b6ae39214dd6dc13c0085612b36ce9e3a34c4eb42dc0cd654def6fb0c", + "size": 33795 + }, { "path": "apps/web/src/features/room-toolbar/RoomTitleBar.tsx", "sourceObjectId": "656d6c57008a71fb5fc5547ec28da3c3774b86aa", @@ -18665,12 +18599,6 @@ "sha256": "11038a766a954694a168e673ddbf1133e3f6c45e984e396156d7dca455df2b8c", "size": 8522 }, - { - "path": "apps/web/src/features/room-toolbar/room-toolbar-actions.ts", - "sourceObjectId": "2e940b835e27918a05acb75ee17dc8a4c0fb9cd8", - "sha256": "e91aea9b6ae39214dd6dc13c0085612b36ce9e3a34c4eb42dc0cd654def6fb0c", - "size": 33795 - }, { "path": "apps/web/src/features/room-toolbar/useRoomRename.ts", "sourceObjectId": "85b8d79c28210d32bab48253607bc11c849bb334", @@ -18683,24 +18611,6 @@ "sha256": "050d97acdb47348d9c7a796c180deb94f79a410d6a34b9e99eb447d1c73285f6", "size": 6862 }, - { - "path": "apps/web/src/features/rooms-dock/RoomLimitSettingsCard.tsx", - "sourceObjectId": "e5e466af50c66d7c0ce9179c97f8322031ee2bad", - "sha256": "a7ef0752615431b5e9b03607cd82dc0e27431701d597524538ac1a7524f03bb8", - "size": 1878 - }, - { - "path": "apps/web/src/features/rooms-dock/RoomSharing.tsx", - "sourceObjectId": "97a6602f9b9fa9a10c2ff8344b67f375daa1c5f5", - "sha256": "06924d708bf6564ced2ca46a70e8dd3c581127cf779855a8ade127d3df92e0c2", - "size": 3356 - }, - { - "path": "apps/web/src/features/rooms-dock/RoomsDockPanel.tsx", - "sourceObjectId": "6f3e2e65cf99585de4d89160c6b593fb05c0b81c", - "sha256": "250eed4c5ebc75ec5222b84c4d5795a20aa93d208a770f3c00c8b1b7aa899f8f", - "size": 32555 - }, { "path": "apps/web/src/features/rooms-dock/room-catalog.ts", "sourceObjectId": "3e79a28bfd801f38a249df763f3a12cb65df4adf", @@ -18713,12 +18623,30 @@ "sha256": "d69af9a21600f6375ad23ed9ddd61dff0e022c8fb81ff9e11a1b4e0d9e31acb2", "size": 998 }, + { + "path": "apps/web/src/features/rooms-dock/RoomLimitSettingsCard.tsx", + "sourceObjectId": "e5e466af50c66d7c0ce9179c97f8322031ee2bad", + "sha256": "a7ef0752615431b5e9b03607cd82dc0e27431701d597524538ac1a7524f03bb8", + "size": 1878 + }, { "path": "apps/web/src/features/rooms-dock/rooms-dock.css", "sourceObjectId": "9f1326bc7363b69351e54fb3cae92ce224348f9a", "sha256": "735be5311c938b194ca82ba1523795a7e8ba20c500a39d37ee2e6a7c5128d3dc", "size": 23518 }, + { + "path": "apps/web/src/features/rooms-dock/RoomsDockPanel.tsx", + "sourceObjectId": "6f3e2e65cf99585de4d89160c6b593fb05c0b81c", + "sha256": "250eed4c5ebc75ec5222b84c4d5795a20aa93d208a770f3c00c8b1b7aa899f8f", + "size": 32555 + }, + { + "path": "apps/web/src/features/rooms-dock/RoomSharing.tsx", + "sourceObjectId": "97a6602f9b9fa9a10c2ff8344b67f375daa1c5f5", + "sha256": "06924d708bf6564ced2ca46a70e8dd3c581127cf779855a8ade127d3df92e0c2", + "size": 3356 + }, { "path": "apps/web/src/features/rooms-dock/useAdminUsers.ts", "sourceObjectId": "bbecd88a80e571ed1c6d1dbb10b0727661506559", @@ -18749,12 +18677,24 @@ "sha256": "7b202bab3520203b32e455823424d060d16f142cd5bd1d320c19b2584efc3c9f", "size": 2826 }, + { + "path": "apps/web/src/features/security-copilot-pane/live-events.ts", + "sourceObjectId": "4fc27d7889a4cb5b64822324a4c1eef3e83c30a3", + "sha256": "f55a664ca7663f0deb2c17ae181459311268db6afebed6cdf7021ce075fe3e4c", + "size": 455 + }, { "path": "apps/web/src/features/security-copilot-pane/MemoryTab.tsx", "sourceObjectId": "a1408f33331d25222be8fe769a6131e7407ffd04", "sha256": "2ce248ae8465166848a3497a6fad4920cb68180f887e15a2f5fc1fcf711d94e9", "size": 3542 }, + { + "path": "apps/web/src/features/security-copilot-pane/security-copilot-pane.css", + "sourceObjectId": "204333d31447496b99487b7b91b1684d912b3612", + "sha256": "d5ca26abda9ffab7a0a01b3bdc71ef2359f027dc4b7913bf311af7dca1f881a8", + "size": 3935 + }, { "path": "apps/web/src/features/security-copilot-pane/SecurityCopilotPane.tsx", "sourceObjectId": "2922286514528c4a1f45090bba75396493d0087d", @@ -18773,18 +18713,6 @@ "sha256": "20f3878e21cb9fb5dbe2038d2a78e2df53b3d11ef5590ff067cf3b61d20d8fa8", "size": 10597 }, - { - "path": "apps/web/src/features/security-copilot-pane/live-events.ts", - "sourceObjectId": "4fc27d7889a4cb5b64822324a4c1eef3e83c30a3", - "sha256": "f55a664ca7663f0deb2c17ae181459311268db6afebed6cdf7021ce075fe3e4c", - "size": 455 - }, - { - "path": "apps/web/src/features/security-copilot-pane/security-copilot-pane.css", - "sourceObjectId": "204333d31447496b99487b7b91b1684d912b3612", - "sha256": "d5ca26abda9ffab7a0a01b3bdc71ef2359f027dc4b7913bf311af7dca1f881a8", - "size": 3935 - }, { "path": "apps/web/src/features/security-copilot-pane/types.ts", "sourceObjectId": "2358f1110190a1916d2753f5b973116a5fad3334", @@ -18803,18 +18731,6 @@ "sha256": "ae2942f23637c97b256b44d89910b7e40824b221a9b2b5c98998a3f4eabb3044", "size": 4266 }, - { - "path": "apps/web/src/features/server-actions/RestartDialogs.tsx", - "sourceObjectId": "0debd2e3ca33eb0e8c0da7f814dd994a5ad1dca6", - "sha256": "c6ccf38ab488b49fb41ac2dd9d66529c8886a805c411c600cf4f3d035ca84555", - "size": 3528 - }, - { - "path": "apps/web/src/features/server-actions/ServerActionsMenu.tsx", - "sourceObjectId": "6ca54e1209ae1d1909cc947b3db8f4a0331c74aa", - "sha256": "2028a58da25327be3ff64c5bf7c26c3a95458616afaaf2ed30fa7c26c982d394", - "size": 6766 - }, { "path": "apps/web/src/features/server-actions/manage-navigation.ts", "sourceObjectId": "3a88ea551aec37b3c0ca182ca5c388cd3027bf35", @@ -18827,54 +18743,96 @@ "sha256": "5080046c491260b7b560bd51491c6f89dfdb62f113ba0f4947ebe6fbd8e9483e", "size": 4132 }, + { + "path": "apps/web/src/features/server-actions/RestartDialogs.tsx", + "sourceObjectId": "0debd2e3ca33eb0e8c0da7f814dd994a5ad1dca6", + "sha256": "c6ccf38ab488b49fb41ac2dd9d66529c8886a805c411c600cf4f3d035ca84555", + "size": 3528 + }, + { + "path": "apps/web/src/features/server-actions/ServerActionsMenu.tsx", + "sourceObjectId": "6ca54e1209ae1d1909cc947b3db8f4a0331c74aa", + "sha256": "2028a58da25327be3ff64c5bf7c26c3a95458616afaaf2ed30fa7c26c982d394", + "size": 6766 + }, { "path": "apps/web/src/features/server-actions/useManageController.ts", "sourceObjectId": "3e95822e942f5cf26d95d80accebae6eb6180f07", "sha256": "d5bb2896541bf788ceff45f57cac761c4bac70415733ffe9e249ea254a4e7748", "size": 18061 }, - { - "path": "apps/web/src/features/service-control/SystemServicesDialog.tsx", - "sourceObjectId": "b4df2f9c5d3713120b969a4a68b1b8420ac96cf7", - "sha256": "af2b6f7788804fe08c8b01d9a585ff646f16ae45e924bd88afca571bd6f66784", - "size": 34433 - }, { "path": "apps/web/src/features/service-control/service-control.css", "sourceObjectId": "f52a8ca788fbcd3f22951e1ee5e3991ef3f598ea", "sha256": "7cb9bc6633504ebdfbcc282272e6090d3687380e6574d1e7d7f7cd1d7e09220c", "size": 28449 }, + { + "path": "apps/web/src/features/service-control/SystemServicesDialog.tsx", + "sourceObjectId": "b4df2f9c5d3713120b969a4a68b1b8420ac96cf7", + "sha256": "af2b6f7788804fe08c8b01d9a585ff646f16ae45e924bd88afca571bd6f66784", + "size": 34433 + }, { "path": "apps/web/src/features/settings/AgentSettingsDock.tsx", "sourceObjectId": "5e37640ac19a85306f50758ab75d950b1dcd9ae3", "sha256": "bf0f2f606dcddc517a611c015686a6aceac3ef402e585eaa86eb5907c0eeb04c", "size": 35097 }, + { + "path": "apps/web/src/features/settings/configuration-migration.css", + "sourceObjectId": "4d96e664357af41c0b547dac87ae784d1abd938a", + "sha256": "f2e641b9663ed38d507976722d2a9b41fe677be34af27611de94018a59b0ddc3", + "size": 10770 + }, { "path": "apps/web/src/features/settings/ConfigurationMigrationCard.tsx", "sourceObjectId": "f80e9e6b8ff656c3c144695d0bdf35b5468ce77f", "sha256": "b6cca0d6d5a03af617ba577060f2c52f55ce83b6f7960995b01aa2d797a8d080", "size": 29641 }, + { + "path": "apps/web/src/features/settings/docks-settings.css", + "sourceObjectId": "9c8d88cf5797d23f9aeddc3cb84de84ea04fc8d2", + "sha256": "1e768d73c782e119f30bf777c31eb90571a4afff9a1d09fbfad73a08cb27a3f2", + "size": 3409 + }, { "path": "apps/web/src/features/settings/DocksSettingsCard.tsx", "sourceObjectId": "0b8181bb1e1b7b0e26cbcd8396efb1b118faed79", "sha256": "5eb4805de208abab44c3fdedff5175fc820662977d674dce7232f91bbec85588", "size": 10041 }, + { + "path": "apps/web/src/features/settings/environment-preset.css", + "sourceObjectId": "cdc2ee71c7699d9e1834627abf5dab47799d8b4b", + "sha256": "3af2526c2b3706b378c1f4fa64c662c3d8e588e2fbf00d1a7f72e310e9afcc1b", + "size": 8498 + }, { "path": "apps/web/src/features/settings/EnvironmentPresetCard.tsx", "sourceObjectId": "1da026321e86d3a68247eccc5a83fea1d0596c51", "sha256": "bbbe7b57b1e423cc452c952ecca4a02813e888481d38d46f22fd3d533f1e0b9c", "size": 5399 }, + { + "path": "apps/web/src/features/settings/flat-settings.css", + "sourceObjectId": "4241dff9adb93b5b5d61da52a248177b708ef24e", + "sha256": "0456d5d0e4b314bc360a92222e6e7ec91019714bde5c85cd7f3ec46f927a431f", + "size": 13240 + }, { "path": "apps/web/src/features/settings/PanesSettingsCard.tsx", "sourceObjectId": "fbb28665bedb031cd329f985e6594b4287ca84bd", "sha256": "d5e07f55aae4c8c4fe84eb9a570fd8fffbb8a0394a2c67979a93babf8ea036a0", "size": 3934 }, + { + "path": "apps/web/src/features/settings/settings-disclosure.css", + "sourceObjectId": "4b3cfabb9b66c0c6c1daaccb9b328fabec348df4", + "sha256": "ec0f0a874af32646e5eb7e5fcf2d514223af7a6e99d704e3740b6d7606c66247", + "size": 10002 + }, { "path": "apps/web/src/features/settings/SettingsActionMenu.tsx", "sourceObjectId": "7f9e8c717aaf4d45db7c1d643bf3d089112fbd16", @@ -18887,6 +18845,12 @@ "sha256": "51f42c6a5605f6739ac0c23dafa7d54ed1504e2a1a87f8767b29832c690162a7", "size": 6668 }, + { + "path": "apps/web/src/features/settings/use-environment-preset.ts", + "sourceObjectId": "4a9a39c43c41ce471fc631f66d8eec33a8402cc1", + "sha256": "b7ed5f6b404df2c6d68e751393299df795425296d739969476a7c65aa95b8782", + "size": 21386 + }, { "path": "apps/web/src/features/settings/WidgetsSettingsCard.tsx", "sourceObjectId": "6ab47b5673745385dc0413b615b19b91c45e25a7", @@ -18894,46 +18858,40 @@ "size": 4157 }, { - "path": "apps/web/src/features/settings/configuration-migration.css", - "sourceObjectId": "4d96e664357af41c0b547dac87ae784d1abd938a", - "sha256": "f2e641b9663ed38d507976722d2a9b41fe677be34af27611de94018a59b0ddc3", - "size": 10770 - }, - { - "path": "apps/web/src/features/settings/docks-settings.css", - "sourceObjectId": "9c8d88cf5797d23f9aeddc3cb84de84ea04fc8d2", - "sha256": "1e768d73c782e119f30bf777c31eb90571a4afff9a1d09fbfad73a08cb27a3f2", - "size": 3409 + "path": "apps/web/src/features/setup-connections/first-setup-wizard.css", + "sourceObjectId": "3f53a1511fcd0af546e3c85299c7ab43cf574e8e", + "sha256": "f551184ec635590a8811f8889f554b0a0e6290c4d4b89d1cc7a99d329e751448", + "size": 9426 }, { - "path": "apps/web/src/features/settings/environment-preset.css", - "sourceObjectId": "cdc2ee71c7699d9e1834627abf5dab47799d8b4b", - "sha256": "3af2526c2b3706b378c1f4fa64c662c3d8e588e2fbf00d1a7f72e310e9afcc1b", - "size": 8498 + "path": "apps/web/src/features/setup-connections/FirstSetupWizard.tsx", + "sourceObjectId": "e6505a3e2cbe0c7bd4ed903e6557de52c35935c3", + "sha256": "a174bbfd7f7e5e0e467cc8b9d5ad99f2b8d8e4ed395c627f86e978b51c6e9099", + "size": 41395 }, { - "path": "apps/web/src/features/settings/flat-settings.css", - "sourceObjectId": "4241dff9adb93b5b5d61da52a248177b708ef24e", - "sha256": "0456d5d0e4b314bc360a92222e6e7ec91019714bde5c85cd7f3ec46f927a431f", - "size": 13240 + "path": "apps/web/src/features/setup-connections/setup-capture-pixels.ts", + "sourceObjectId": "2c1c1fd864681890aaea7578c1e7f374543d93b0", + "sha256": "d1a1f03765562ffde0598ca611b174ae8d2f9bf5bf7d578bd20b2bc06758e867", + "size": 1093 }, { - "path": "apps/web/src/features/settings/settings-disclosure.css", - "sourceObjectId": "4b3cfabb9b66c0c6c1daaccb9b328fabec348df4", - "sha256": "ec0f0a874af32646e5eb7e5fcf2d514223af7a6e99d704e3740b6d7606c66247", - "size": 10002 + "path": "apps/web/src/features/setup-connections/setup-client-runtime-check.ts", + "sourceObjectId": "ac120ea166a38068ea7e280c74ebacaee1553909", + "sha256": "19d0401e03497011bbc5bc361a700d287a3918623093de913d70be25e533f65a", + "size": 6052 }, { - "path": "apps/web/src/features/settings/use-environment-preset.ts", - "sourceObjectId": "4a9a39c43c41ce471fc631f66d8eec33a8402cc1", - "sha256": "b7ed5f6b404df2c6d68e751393299df795425296d739969476a7c65aa95b8782", - "size": 21386 + "path": "apps/web/src/features/setup-connections/setup-connections.css", + "sourceObjectId": "703df00d5756fb8c865f57d82ec49f4126e3abf8", + "sha256": "e932e072a071b61b59e3034047c6f51bd906d247da708b385ad34f31e5ff3f8d", + "size": 17527 }, { - "path": "apps/web/src/features/setup-connections/FirstSetupWizard.tsx", - "sourceObjectId": "e6505a3e2cbe0c7bd4ed903e6557de52c35935c3", - "sha256": "a174bbfd7f7e5e0e467cc8b9d5ad99f2b8d8e4ed395c627f86e978b51c6e9099", - "size": 41395 + "path": "apps/web/src/features/setup-connections/setup-voice-audio.ts", + "sourceObjectId": "3de6ac7c709207443e03e5650fa27118837af597", + "sha256": "61f6caf5232f8472ef48e26c01b44ef4991af20b35d62282e85c1177cdac4e8d", + "size": 6191 }, { "path": "apps/web/src/features/setup-connections/SetupAssistantHelp.tsx", @@ -18971,36 +18929,6 @@ "sha256": "2e4f5e40ba8983eac0adf779e1d67fda4cf3400a8e918f92e83df71252ba924a", "size": 8350 }, - { - "path": "apps/web/src/features/setup-connections/first-setup-wizard.css", - "sourceObjectId": "3f53a1511fcd0af546e3c85299c7ab43cf574e8e", - "sha256": "f551184ec635590a8811f8889f554b0a0e6290c4d4b89d1cc7a99d329e751448", - "size": 9426 - }, - { - "path": "apps/web/src/features/setup-connections/setup-capture-pixels.ts", - "sourceObjectId": "2c1c1fd864681890aaea7578c1e7f374543d93b0", - "sha256": "d1a1f03765562ffde0598ca611b174ae8d2f9bf5bf7d578bd20b2bc06758e867", - "size": 1093 - }, - { - "path": "apps/web/src/features/setup-connections/setup-client-runtime-check.ts", - "sourceObjectId": "ac120ea166a38068ea7e280c74ebacaee1553909", - "sha256": "19d0401e03497011bbc5bc361a700d287a3918623093de913d70be25e533f65a", - "size": 6052 - }, - { - "path": "apps/web/src/features/setup-connections/setup-connections.css", - "sourceObjectId": "703df00d5756fb8c865f57d82ec49f4126e3abf8", - "sha256": "e932e072a071b61b59e3034047c6f51bd906d247da708b385ad34f31e5ff3f8d", - "size": 17527 - }, - { - "path": "apps/web/src/features/setup-connections/setup-voice-audio.ts", - "sourceObjectId": "3de6ac7c709207443e03e5650fa27118837af597", - "sha256": "61f6caf5232f8472ef48e26c01b44ef4991af20b35d62282e85c1177cdac4e8d", - "size": 6191 - }, { "path": "apps/web/src/features/setup-connections/useSetupConnectionsWizard.ts", "sourceObjectId": "17815c8d6b1e2d1d113b67380f18b10ab9cd6251", @@ -19013,18 +18941,6 @@ "sha256": "56f43649be1469e1fea34feefb34a638c5582a7529f9d6c92018765a9f7580d7", "size": 274 }, - { - "path": "apps/web/src/features/snip-tool/SnipEditor.tsx", - "sourceObjectId": "8146134dcb7f94359c14074f6901c54589beed79", - "sha256": "33fbb455db0f5f1d859c18b56926c3a4a9f1a6d867c4243e07662695c68a7c85", - "size": 26616 - }, - { - "path": "apps/web/src/features/snip-tool/SnipToolOverlay.tsx", - "sourceObjectId": "7e17619cbd400e71d05e1e082821cd832ff29ad0", - "sha256": "b91266f90e337d880514070ebd3feada4cf2e52947d9f5550bda96353fcd54b3", - "size": 49441 - }, { "path": "apps/web/src/features/snip-tool/snip-capture.ts", "sourceObjectId": "b77c07d1018daec37dd6fc717538873a203709d8", @@ -19055,12 +18971,30 @@ "sha256": "6d3c11227b07f2751bffd4d5057e2bf795e4a38b5df11c44671a2151f33f3914", "size": 21604 }, + { + "path": "apps/web/src/features/snip-tool/SnipEditor.tsx", + "sourceObjectId": "8146134dcb7f94359c14074f6901c54589beed79", + "sha256": "33fbb455db0f5f1d859c18b56926c3a4a9f1a6d867c4243e07662695c68a7c85", + "size": 26616 + }, + { + "path": "apps/web/src/features/snip-tool/SnipToolOverlay.tsx", + "sourceObjectId": "7e17619cbd400e71d05e1e082821cd832ff29ad0", + "sha256": "b91266f90e337d880514070ebd3feada4cf2e52947d9f5550bda96353fcd54b3", + "size": 49441 + }, { "path": "apps/web/src/features/snip-tool/useSnipTool.ts", "sourceObjectId": "233a484d678b9df8bad0e37a1673e3804bf26605", "sha256": "3a6470cdb782b4cd9d719cb3a99bb0f1748ecca0d120498337c6790bb7f87fab", "size": 3950 }, + { + "path": "apps/web/src/features/source-control-publishing/source-control-publishing.css", + "sourceObjectId": "21adc6fd834a828a596ad3be449862d5bb77cbeb", + "sha256": "6483c5df983b06f0b6a5a423770532b0fea686a43f250e0276e8fcbe17fa2eb6", + "size": 3296 + }, { "path": "apps/web/src/features/source-control-publishing/SourceControlPublishingCard.tsx", "sourceObjectId": "c4cb8fe0a3a520588402ba143bb3d5777a7a4c95", @@ -19068,10 +19002,10 @@ "size": 12040 }, { - "path": "apps/web/src/features/source-control-publishing/source-control-publishing.css", - "sourceObjectId": "21adc6fd834a828a596ad3be449862d5bb77cbeb", - "sha256": "6483c5df983b06f0b6a5a423770532b0fea686a43f250e0276e8fcbe17fa2eb6", - "size": 3296 + "path": "apps/web/src/features/source-control/client.ts", + "sourceObjectId": "9cdb6f10b19790bdfdf638135162c4c7eec9219a", + "sha256": "daa0c2c50cd2798303273f04e07e59c21f2891cb78dd85bf34aec4fd4d4ab341", + "size": 9658 }, { "path": "apps/web/src/features/source-control/DiffViewer.tsx", @@ -19079,6 +19013,12 @@ "sha256": "f34c5b5784ae1aea80fa9b0de446719ca0a148efd48cc9fd890e96c43879ff0d", "size": 13400 }, + { + "path": "apps/web/src/features/source-control/project-source-picker.css", + "sourceObjectId": "34343508a1d19b7ff143fd3d748c14e26ef781b3", + "sha256": "1c4b431f2113d009cc56fac376fd2a0bd46a1da68c2452ede36cdf1a6130ef78", + "size": 6767 + }, { "path": "apps/web/src/features/source-control/ProjectSourcePicker.tsx", "sourceObjectId": "c2216c81476f826308bc515517cc6da187139adb", @@ -19103,6 +19043,12 @@ "sha256": "6e65db3fe2e50013361eec696cc95495fde0693729a3ccb4b0f16c996acd7ee8", "size": 14763 }, + { + "path": "apps/web/src/features/source-control/repository-providers.css", + "sourceObjectId": "88b661088d21f9952ad253f6015342f52bff914e", + "sha256": "82cf5ca78d65278f24e9dbbf17a6c93f96997dbeb5e143a880c7e02085a24d93", + "size": 4106 + }, { "path": "apps/web/src/features/source-control/RepositoryProvidersSection.tsx", "sourceObjectId": "f91a013677d1171da3e6362350039b29e3f1a614", @@ -19115,6 +19061,12 @@ "sha256": "186ed9e687f00c4934eb0354f4a5d1eecc8099f52912255bdc6be42c43bfb01c", "size": 2703 }, + { + "path": "apps/web/src/features/source-control/source-control.css", + "sourceObjectId": "ba5ce61453886293b208ae713c8a46afda4495ba", + "sha256": "3850ad037a4ccd05e7a01e5fba92d8e3b987dcbe31ccd67117cf1abcd4f12554", + "size": 27601 + }, { "path": "apps/web/src/features/source-control/SourceControlDiffModal.tsx", "sourceObjectId": "b6e9897b1d7425c3720a2283ae0a94ddc3108d58", @@ -19128,28 +19080,34 @@ "size": 69293 }, { - "path": "apps/web/src/features/source-control/client.ts", - "sourceObjectId": "9cdb6f10b19790bdfdf638135162c4c7eec9219a", - "sha256": "daa0c2c50cd2798303273f04e07e59c21f2891cb78dd85bf34aec4fd4d4ab341", - "size": 9658 + "path": "apps/web/src/features/space-gateway/gateway-add-account.tsx", + "sourceObjectId": "b3139990938213e3311dfbd5585d1682a8d19538", + "sha256": "1cee284fa86f9554ab8c1e047a9e45db4011af5b757b02fcbfcee6805f650684", + "size": 21209 }, { - "path": "apps/web/src/features/source-control/project-source-picker.css", - "sourceObjectId": "34343508a1d19b7ff143fd3d748c14e26ef781b3", - "sha256": "1c4b431f2113d009cc56fac376fd2a0bd46a1da68c2452ede36cdf1a6130ef78", - "size": 6767 + "path": "apps/web/src/features/space-gateway/gateway-charts.tsx", + "sourceObjectId": "efc0fb7002f361c25314963454c1c86795c29c40", + "sha256": "8dec4c94a2894dfe3973ff4c8e47759fb2293af2ad33b9da76f674997c1707ac", + "size": 12299 }, { - "path": "apps/web/src/features/source-control/repository-providers.css", - "sourceObjectId": "88b661088d21f9952ad253f6015342f52bff914e", - "sha256": "82cf5ca78d65278f24e9dbbf17a6c93f96997dbeb5e143a880c7e02085a24d93", - "size": 4106 + "path": "apps/web/src/features/space-gateway/gateway-client.ts", + "sourceObjectId": "9868a18f7da7d4ce851c725a3c9f0140dd1ee312", + "sha256": "08be923de88a296443e94f5fdd1fc00a8123ea555910d5b50d6ababe45154511", + "size": 7782 }, { - "path": "apps/web/src/features/source-control/source-control.css", - "sourceObjectId": "ba5ce61453886293b208ae713c8a46afda4495ba", - "sha256": "3850ad037a4ccd05e7a01e5fba92d8e3b987dcbe31ccd67117cf1abcd4f12554", - "size": 27601 + "path": "apps/web/src/features/space-gateway/gateway-log-query.ts", + "sourceObjectId": "d303c058bff0f4af98b6ee6aac1acc06965346e1", + "sha256": "77468e2b60d8c7724d8e5e185715e24e87b28c0f20248bbba93fe0e1b44e1daa", + "size": 1246 + }, + { + "path": "apps/web/src/features/space-gateway/gateway-settings-events.ts", + "sourceObjectId": "4ddb633a66762557c5a9ce12735c5f53752f5568", + "sha256": "c52a595400cf158bf9c0ddb7a901c394b881a7b67dc538e71acfe4da806498e5", + "size": 481 }, { "path": "apps/web/src/features/space-gateway/GatewayAccountsTab.tsx", @@ -19193,42 +19151,6 @@ "sha256": "ee230039b37da9b5058a831cbd3c2520165d95908a88a233161a5b102f11e52b", "size": 21308 }, - { - "path": "apps/web/src/features/space-gateway/SpaceGatewayDialog.tsx", - "sourceObjectId": "04741b943fb91d6c56b290d622fc75ab9feb11e9", - "sha256": "fdcdd27812afb710a5181a76670f58f5435fb65dda6156588b2211f598bf2f37", - "size": 11938 - }, - { - "path": "apps/web/src/features/space-gateway/gateway-add-account.tsx", - "sourceObjectId": "b3139990938213e3311dfbd5585d1682a8d19538", - "sha256": "1cee284fa86f9554ab8c1e047a9e45db4011af5b757b02fcbfcee6805f650684", - "size": 21209 - }, - { - "path": "apps/web/src/features/space-gateway/gateway-charts.tsx", - "sourceObjectId": "efc0fb7002f361c25314963454c1c86795c29c40", - "sha256": "8dec4c94a2894dfe3973ff4c8e47759fb2293af2ad33b9da76f674997c1707ac", - "size": 12299 - }, - { - "path": "apps/web/src/features/space-gateway/gateway-client.ts", - "sourceObjectId": "9868a18f7da7d4ce851c725a3c9f0140dd1ee312", - "sha256": "08be923de88a296443e94f5fdd1fc00a8123ea555910d5b50d6ababe45154511", - "size": 7782 - }, - { - "path": "apps/web/src/features/space-gateway/gateway-log-query.ts", - "sourceObjectId": "d303c058bff0f4af98b6ee6aac1acc06965346e1", - "sha256": "77468e2b60d8c7724d8e5e185715e24e87b28c0f20248bbba93fe0e1b44e1daa", - "size": 1246 - }, - { - "path": "apps/web/src/features/space-gateway/gateway-settings-events.ts", - "sourceObjectId": "4ddb633a66762557c5a9ce12735c5f53752f5568", - "sha256": "c52a595400cf158bf9c0ddb7a901c394b881a7b67dc538e71acfe4da806498e5", - "size": 481 - }, { "path": "apps/web/src/features/space-gateway/space-gateway-model.ts", "sourceObjectId": "33d4002c0344bc4b57a676db97701cea5d946f66", @@ -19241,6 +19163,12 @@ "sha256": "cd9406b23cf123cd46780c971350b1afb90ac7642dfe0ebc7d33b2dfd9efa6c8", "size": 27443 }, + { + "path": "apps/web/src/features/space-gateway/SpaceGatewayDialog.tsx", + "sourceObjectId": "04741b943fb91d6c56b290d622fc75ab9feb11e9", + "sha256": "fdcdd27812afb710a5181a76670f58f5435fb65dda6156588b2211f598bf2f37", + "size": 11938 + }, { "path": "apps/web/src/features/space-gateway/useGatewayCompressionToggle.tsx", "sourceObjectId": "5e961a9fb18082d9a227bcbc86c7ac91cb532144", @@ -19253,6 +19181,30 @@ "sha256": "297c72d53eb631f8d9ebdef83edad6b068ba335406be8b83e52c16f50e0d0b37", "size": 479 }, + { + "path": "apps/web/src/features/streaming/streaming-capabilities.ts", + "sourceObjectId": "496dd280883ddeedd36ae492aa805e1940e76c78", + "sha256": "1a24a0db1dc90650938312f51ad47340caebbc51280355cf89eaf8519021092e", + "size": 1806 + }, + { + "path": "apps/web/src/features/streaming/streaming-labels.ts", + "sourceObjectId": "6e7daadd5c7f754d30c0309db0c0ea66e0f09a10", + "sha256": "64b51dbd05db8c6df4b1a4398dc85d7ddb5f73dcc185b3312b064fdcc364fbf7", + "size": 4069 + }, + { + "path": "apps/web/src/features/streaming/streaming-snapshot-store.ts", + "sourceObjectId": "83fd3e0d0e7c1fbf9aab3a3853c40139cbd59e1a", + "sha256": "f6d104411932744c4423cb9806281456784dc61a68816514c86a781a3a81b77e", + "size": 567 + }, + { + "path": "apps/web/src/features/streaming/streaming.css", + "sourceObjectId": "2939eb0a0c7f9563533fc4a0809536694071b452", + "sha256": "e54adad32b0470d15e4d9bc300544624180fe58d401c2b7072d3bb34c678aa2f", + "size": 25469 + }, { "path": "apps/web/src/features/streaming/StreamingActivityTab.tsx", "sourceObjectId": "1a5c560affd413b310573545c55aac4b7bc93921", @@ -19290,28 +19242,10 @@ "size": 7631 }, { - "path": "apps/web/src/features/streaming/streaming-capabilities.ts", - "sourceObjectId": "496dd280883ddeedd36ae492aa805e1940e76c78", - "sha256": "1a24a0db1dc90650938312f51ad47340caebbc51280355cf89eaf8519021092e", - "size": 1806 - }, - { - "path": "apps/web/src/features/streaming/streaming-labels.ts", - "sourceObjectId": "6e7daadd5c7f754d30c0309db0c0ea66e0f09a10", - "sha256": "64b51dbd05db8c6df4b1a4398dc85d7ddb5f73dcc185b3312b064fdcc364fbf7", - "size": 4069 - }, - { - "path": "apps/web/src/features/streaming/streaming-snapshot-store.ts", - "sourceObjectId": "83fd3e0d0e7c1fbf9aab3a3853c40139cbd59e1a", - "sha256": "f6d104411932744c4423cb9806281456784dc61a68816514c86a781a3a81b77e", - "size": 567 - }, - { - "path": "apps/web/src/features/streaming/streaming.css", - "sourceObjectId": "2939eb0a0c7f9563533fc4a0809536694071b452", - "sha256": "e54adad32b0470d15e4d9bc300544624180fe58d401c2b7072d3bb34c678aa2f", - "size": 25469 + "path": "apps/web/src/features/SurfaceErrorBoundary.tsx", + "sourceObjectId": "bc89d7dd46fe91b4ad88a590e40a2f11ec394888", + "sha256": "624786dfc078e16819dea2fa5d6484bcd8c890077d5b314b0fc28a0f77f0cfc7", + "size": 2156 }, { "path": "apps/web/src/features/system-analytics/AnthropicBillingPanel.tsx", @@ -19319,6 +19253,18 @@ "sha256": "9d5f1b89a3d90a634c5c465bff9c01a2fba37abd63431cbe662a72da59633308", "size": 4960 }, + { + "path": "apps/web/src/features/system-analytics/model-sort.ts", + "sourceObjectId": "5dccaf3911dbae931af027773566766e193255e5", + "sha256": "9899d3a41c9869703de2186f4b5805c4ed6069e3a9ebd6c9747b7be13b90eaaa", + "size": 1954 + }, + { + "path": "apps/web/src/features/system-analytics/system-analytics.css", + "sourceObjectId": "c1cf530626b69544d75899def0f100fe6d54bdc5", + "sha256": "abb0032c1aaa7be7a64965fd7c0d9c4ee169149678d05fad1fa7c97b37644175", + "size": 35148 + }, { "path": "apps/web/src/features/system-analytics/SystemAnalyticsErrorBoundary.tsx", "sourceObjectId": "24a49dd071c1e8af52d57bc987c0e7f9b114114c", @@ -19331,6 +19277,12 @@ "sha256": "415d95f64e306a8f80615d60a954b47161ea323db3cc53362ecaeb71d229cbac", "size": 56859 }, + { + "path": "apps/web/src/features/system-analytics/token-totals.ts", + "sourceObjectId": "5c8d47c75316e979ce7dee945e27461222252da7", + "sha256": "daf4baf5af83cac34a38ce2ac1e4cdd26855a90e47d89b87f5e51ca3eee647f6", + "size": 2052 + }, { "path": "apps/web/src/features/system-analytics/TokenUsageCharts.tsx", "sourceObjectId": "feefa49402fa7d76540b27ae02b909eef41153af", @@ -19338,22 +19290,10 @@ "size": 9837 }, { - "path": "apps/web/src/features/system-analytics/model-sort.ts", - "sourceObjectId": "5dccaf3911dbae931af027773566766e193255e5", - "sha256": "9899d3a41c9869703de2186f4b5805c4ed6069e3a9ebd6c9747b7be13b90eaaa", - "size": 1954 - }, - { - "path": "apps/web/src/features/system-analytics/system-analytics.css", - "sourceObjectId": "c1cf530626b69544d75899def0f100fe6d54bdc5", - "sha256": "abb0032c1aaa7be7a64965fd7c0d9c4ee169149678d05fad1fa7c97b37644175", - "size": 35148 - }, - { - "path": "apps/web/src/features/system-analytics/token-totals.ts", - "sourceObjectId": "5c8d47c75316e979ce7dee945e27461222252da7", - "sha256": "daf4baf5af83cac34a38ce2ac1e4cdd26855a90e47d89b87f5e51ca3eee647f6", - "size": 2052 + "path": "apps/web/src/features/system-health/health-model.ts", + "sourceObjectId": "692b8ab4bac42977ed12708b3a0aefba4257ba53", + "sha256": "15c7fc9c48d0524fa529e154360e26b895ba3e9d05eb133d3616cac42860a965", + "size": 11558 }, { "path": "apps/web/src/features/system-health/HealthChart.tsx", @@ -19367,24 +19307,6 @@ "sha256": "3ab2f3a29ebcac7027b886d68d90a4d2405e73457b78dee7641b5e54efb8402c", "size": 34238 }, - { - "path": "apps/web/src/features/system-health/SystemHealth.tsx", - "sourceObjectId": "411e387ce4572bdb00180bcf175ed87fc65e3f46", - "sha256": "24f5a6d186586283bc9f834f0a0c4451fc24d13b7f293b74c3ec3fc24687749e", - "size": 98747 - }, - { - "path": "apps/web/src/features/system-health/SystemTopologyMap.tsx", - "sourceObjectId": "ca600996d4f0851f050ebfa8101ba41c6210ea3a", - "sha256": "d6c81dc0fe543a6416e319accef2a113c841362fcb67e8bc778be1837e22acdf", - "size": 64094 - }, - { - "path": "apps/web/src/features/system-health/health-model.ts", - "sourceObjectId": "692b8ab4bac42977ed12708b3a0aefba4257ba53", - "sha256": "15c7fc9c48d0524fa529e154360e26b895ba3e9d05eb133d3616cac42860a965", - "size": 11558 - }, { "path": "apps/web/src/features/system-health/measure-health-rtt.ts", "sourceObjectId": "5c5e370c3df87402a80ccf9e559499699fdd2dcf", @@ -19397,18 +19319,24 @@ "sha256": "8be6b99940ec8c945bce2f58f0c58db73e50b6a843e2b5f5942e0584e9319547", "size": 82097 }, + { + "path": "apps/web/src/features/system-health/SystemHealth.tsx", + "sourceObjectId": "411e387ce4572bdb00180bcf175ed87fc65e3f46", + "sha256": "24f5a6d186586283bc9f834f0a0c4451fc24d13b7f293b74c3ec3fc24687749e", + "size": 98747 + }, + { + "path": "apps/web/src/features/system-health/SystemTopologyMap.tsx", + "sourceObjectId": "ca600996d4f0851f050ebfa8101ba41c6210ea3a", + "sha256": "d6c81dc0fe543a6416e319accef2a113c841362fcb67e8bc778be1837e22acdf", + "size": 64094 + }, { "path": "apps/web/src/features/system-health/use-health-telemetry.ts", "sourceObjectId": "4b0e91aae2b9d19f155ee15799967c0be39ac67b", "sha256": "41da899c01ea0b946fb81327937105ec9ea0d0423c0d7b91068f3afcbea4429b", "size": 8886 }, - { - "path": "apps/web/src/features/t3code-pane/T3CodePane.tsx", - "sourceObjectId": "7770586e9f252b4444cb35c55b74bb95c27cfd09", - "sha256": "0e79bf1bf37ad2f885683dd17bccbd22c52814e450e6283a0771ba9c99d8592c", - "size": 8743 - }, { "path": "apps/web/src/features/t3code-pane/t3code-pane.css", "sourceObjectId": "aa6fbe71a560bfe9f4b00cc3851bf7885438c172", @@ -19428,10 +19356,10 @@ "size": 3224 }, { - "path": "apps/web/src/features/t3code-settings/T3CodeServiceSettingsCard.tsx", - "sourceObjectId": "07a1fd21a86ae40507cac98c8c6f63a85b3a6aab", - "sha256": "f64d9150ffc0b28b9022630d0cfa5cb81a1c12739f1598b8be3c3c6f481d8f51", - "size": 6989 + "path": "apps/web/src/features/t3code-pane/T3CodePane.tsx", + "sourceObjectId": "7770586e9f252b4444cb35c55b74bb95c27cfd09", + "sha256": "0e79bf1bf37ad2f885683dd17bccbd22c52814e450e6283a0771ba9c99d8592c", + "size": 8743 }, { "path": "apps/web/src/features/t3code-settings/t3code-settings.css", @@ -19440,10 +19368,10 @@ "size": 138 }, { - "path": "apps/web/src/features/task-dock/TaskDock.tsx", - "sourceObjectId": "ec438d1f7195039914460583d0262dfeff016f5b", - "sha256": "166a41d6a6aee5329de800de918a62b43a8d8c36c65241635dec8ed75c8fb3de", - "size": 31455 + "path": "apps/web/src/features/t3code-settings/T3CodeServiceSettingsCard.tsx", + "sourceObjectId": "07a1fd21a86ae40507cac98c8c6f63a85b3a6aab", + "sha256": "f64d9150ffc0b28b9022630d0cfa5cb81a1c12739f1598b8be3c3c6f481d8f51", + "size": 6989 }, { "path": "apps/web/src/features/task-dock/task-events.ts", @@ -19451,6 +19379,12 @@ "sha256": "6199c570236d7c2791567cdea730818b190c8b5a1c5835a19ce011f067a3a959", "size": 243 }, + { + "path": "apps/web/src/features/task-dock/TaskDock.tsx", + "sourceObjectId": "ec438d1f7195039914460583d0262dfeff016f5b", + "sha256": "166a41d6a6aee5329de800de918a62b43a8d8c36c65241635dec8ed75c8fb3de", + "size": 31455 + }, { "path": "apps/web/src/features/task-titles/TaskTitleDetails.tsx", "sourceObjectId": "b8304c7ca1889e8c9b65833f19893214bc3c4e6e", @@ -19475,54 +19409,18 @@ "sha256": "487c0b6f7a60761fcc2c4a0efc5f58d8db1dd1b6114821e57b01c3058acc0918", "size": 6375 }, - { - "path": "apps/web/src/features/terminal-pane/AgentFileLinks.tsx", - "sourceObjectId": "ff995d082009452aef7697428bb3d02d174b0894", - "sha256": "7a0b048a490c5c9238f2ebfd69faf8d483033ce7562a635f5761e20d88eb0e74", - "size": 13781 - }, - { - "path": "apps/web/src/features/terminal-pane/CliPlansMenu.tsx", - "sourceObjectId": "501fac45fbf2cfc7b0bf601aa74adffee3521428", - "sha256": "8c2ce234f0de2f68cd54f87870e14d9761cd70a910f557e5acbe8cb781c95453", - "size": 83095 - }, - { - "path": "apps/web/src/features/terminal-pane/CliShortcutVisibilitySettings.tsx", - "sourceObjectId": "5b16b95b05786946edef41652517f1aacf7db3cc", - "sha256": "be494c7c0af18bcabe3ef3360972be180e70029361eeb83036d8bc0f8c88246e", - "size": 2434 - }, - { - "path": "apps/web/src/features/terminal-pane/CliShortcutsMenu.tsx", - "sourceObjectId": "1e70f5d41b193c61032009e45308eda6e3361401", - "sha256": "1b2210693d627af06ea09d437f905c7337777530d2d58ea5b7cda45e81ae81eb", - "size": 13698 - }, - { - "path": "apps/web/src/features/terminal-pane/LocalCliComposer.tsx", - "sourceObjectId": "97145f381c2c62fed6617036c9d634c2e481ca27", - "sha256": "af907166e1777adcbefc5effb96f85fd7527d2e9e1d7a774788ab1993d03ee2c", - "size": 22233 - }, - { - "path": "apps/web/src/features/terminal-pane/ManagedPlanProgress.tsx", - "sourceObjectId": "55e9d075b45b825d5b1df6c489ab85b3b15de499", - "sha256": "69215c293bc2a704701e8b6a89b5e5d3db44445cb15592206445501b4e68dd1b", - "size": 9535 - }, - { - "path": "apps/web/src/features/terminal-pane/TerminalPane.tsx", - "sourceObjectId": "01ba38eb30cc7427af22a5609dccd3448397f8ea", - "sha256": "7d0281c265cdd9b7f4bda7f32aaefb476505bdf4512f74906b0818fd9621b44f", - "size": 415791 - }, { "path": "apps/web/src/features/terminal-pane/agent-file-links.css", "sourceObjectId": "ee66cdc1f171f18a2e1c0b8843965aefc94c4952", "sha256": "355dbab1fb9c46284c65c6d39c796ca0ca7d30cbf649a0eb3de8e17acf5c138e", "size": 761 }, + { + "path": "apps/web/src/features/terminal-pane/AgentFileLinks.tsx", + "sourceObjectId": "ff995d082009452aef7697428bb3d02d174b0894", + "sha256": "7a0b048a490c5c9238f2ebfd69faf8d483033ce7562a635f5761e20d88eb0e74", + "size": 13781 + }, { "path": "apps/web/src/features/terminal-pane/claude-agent-panel.ts", "sourceObjectId": "9f1d700717e44f33a3fe8178588ae40b4e413bf2", @@ -19553,6 +19451,24 @@ "sha256": "26cc0042640209a79c63d828f608e9be729b768172bc0ce96c1f16bb65191119", "size": 1770 }, + { + "path": "apps/web/src/features/terminal-pane/CliPlansMenu.tsx", + "sourceObjectId": "501fac45fbf2cfc7b0bf601aa74adffee3521428", + "sha256": "8c2ce234f0de2f68cd54f87870e14d9761cd70a910f557e5acbe8cb781c95453", + "size": 83095 + }, + { + "path": "apps/web/src/features/terminal-pane/CliShortcutsMenu.tsx", + "sourceObjectId": "1e70f5d41b193c61032009e45308eda6e3361401", + "sha256": "1b2210693d627af06ea09d437f905c7337777530d2d58ea5b7cda45e81ae81eb", + "size": 13698 + }, + { + "path": "apps/web/src/features/terminal-pane/CliShortcutVisibilitySettings.tsx", + "sourceObjectId": "5b16b95b05786946edef41652517f1aacf7db3cc", + "sha256": "be494c7c0af18bcabe3ef3360972be180e70029361eeb83036d8bc0f8c88246e", + "size": 2434 + }, { "path": "apps/web/src/features/terminal-pane/fullscreen-geometry.ts", "sourceObjectId": "dc0786c601b39eddd592806d8708748219e89110", @@ -19583,6 +19499,12 @@ "sha256": "b6e556492bd487f335c7516a7d4380bc267a07572895e56134163502ed6ca150", "size": 13160 }, + { + "path": "apps/web/src/features/terminal-pane/LocalCliComposer.tsx", + "sourceObjectId": "97145f381c2c62fed6617036c9d634c2e481ca27", + "sha256": "af907166e1777adcbefc5effb96f85fd7527d2e9e1d7a774788ab1993d03ee2c", + "size": 22233 + }, { "path": "apps/web/src/features/terminal-pane/managed-plan-client.ts", "sourceObjectId": "0e57c5e30c5322e6bb0b43e2c05f8e3ca3fe9a66", @@ -19595,6 +19517,12 @@ "sha256": "82b0267add7a25e137e8cb12ab67a4387d02bb0dad190d1689f7b03afb4ad0c2", "size": 1865 }, + { + "path": "apps/web/src/features/terminal-pane/ManagedPlanProgress.tsx", + "sourceObjectId": "55e9d075b45b825d5b1df6c489ab85b3b15de499", + "sha256": "69215c293bc2a704701e8b6a89b5e5d3db44445cb15592206445501b4e68dd1b", + "size": 9535 + }, { "path": "apps/web/src/features/terminal-pane/plan-attachment.ts", "sourceObjectId": "b594f2ee8806ae4d96eae590099aa3136f922633", @@ -19697,6 +19625,12 @@ "sha256": "7363ba14a1caf1194bf1012c66a56a7d29d852cdae6a6924dbebeb2494f9d2be", "size": 10249 }, + { + "path": "apps/web/src/features/terminal-pane/TerminalPane.tsx", + "sourceObjectId": "01ba38eb30cc7427af22a5609dccd3448397f8ea", + "sha256": "7d0281c265cdd9b7f4bda7f32aaefb476505bdf4512f74906b0818fd9621b44f", + "size": 415791 + }, { "path": "apps/web/src/features/terminal-pane/use-managed-plan-execution.ts", "sourceObjectId": "5eaa91a7c0c20a09bc3d92dc89440a3f7d0367b5", @@ -19721,30 +19655,6 @@ "sha256": "61a0ab0c75d5cb1fad65006e4648759efaf5489fa06fb6dc190e0924c0c580e1", "size": 299 }, - { - "path": "apps/web/src/features/toolbar-metrics/AccountQuotaCards.tsx", - "sourceObjectId": "c97b94045850040778459bd4b0ccbd0334ccec39", - "sha256": "5b519adc37e1176fff1bed680576adfe3998c8e107da3ec084e21c39cf8fe0f3", - "size": 9632 - }, - { - "path": "apps/web/src/features/toolbar-metrics/MetricLayers.tsx", - "sourceObjectId": "4cfbc5381244df8f000f9b6f3deafa2051d3994e", - "sha256": "8b44a524f0640ba52325f1ec8724eea6e9285ab0c4ae180f86fb5486baab65e1", - "size": 4851 - }, - { - "path": "apps/web/src/features/toolbar-metrics/ResourcesDrawer.tsx", - "sourceObjectId": "1275a3a5f1cc03803986f4d8e704c40129148a55", - "sha256": "adb2c67bc6a15f9fed8d5f6d575e19a53be53665331a88310c378d5126a20da6", - "size": 2926 - }, - { - "path": "apps/web/src/features/toolbar-metrics/ToolbarMetrics.tsx", - "sourceObjectId": "8ca49fb4f72b08d40c7905dbed28a4fe26204e6e", - "sha256": "bce391698cdec270ed15aac25d0ea968923f35537017a90e0dd176933d762342", - "size": 69220 - }, { "path": "apps/web/src/features/toolbar-metrics/account-availability.ts", "sourceObjectId": "a58badf5af696a4e8fe8969242e8b3f8f2e83ec1", @@ -19763,24 +19673,48 @@ "sha256": "526275f2f5c53eb2641ae95b754786239be8d9d1037dfef8f21a9f1727e097f5", "size": 14658 }, + { + "path": "apps/web/src/features/toolbar-metrics/AccountQuotaCards.tsx", + "sourceObjectId": "c97b94045850040778459bd4b0ccbd0334ccec39", + "sha256": "5b519adc37e1176fff1bed680576adfe3998c8e107da3ec084e21c39cf8fe0f3", + "size": 9632 + }, { "path": "apps/web/src/features/toolbar-metrics/claude-api-key-alert.ts", "sourceObjectId": "8a9dce020e5e3c0c79df4c31474079a6026d5f8c", "sha256": "375cf65f4a3819ad5e835d0820c22c0e6bd8cb4281dba27d3b8728460a5fc8ca", "size": 7507 }, + { + "path": "apps/web/src/features/toolbar-metrics/MetricLayers.tsx", + "sourceObjectId": "4cfbc5381244df8f000f9b6f3deafa2051d3994e", + "sha256": "8b44a524f0640ba52325f1ec8724eea6e9285ab0c4ae180f86fb5486baab65e1", + "size": 4851 + }, { "path": "apps/web/src/features/toolbar-metrics/resources-drawer.css", "sourceObjectId": "dce1f166febf943edd57f1382425f04630a5f62b", "sha256": "5a75e775c454d7da8d813adc444c0d5f71bcc607e3e720acb38d7ab4fabe1c95", "size": 5223 }, + { + "path": "apps/web/src/features/toolbar-metrics/ResourcesDrawer.tsx", + "sourceObjectId": "1275a3a5f1cc03803986f4d8e704c40129148a55", + "sha256": "adb2c67bc6a15f9fed8d5f6d575e19a53be53665331a88310c378d5126a20da6", + "size": 2926 + }, { "path": "apps/web/src/features/toolbar-metrics/toolbar-metrics.css", "sourceObjectId": "7cb4f77edba9520569a81ac0382e38dc85dd0fad", "sha256": "fcf7ba66896e2f2d3ff889aec6bf8c19ed4ac57ee78d27f70893079f84256226", "size": 32737 }, + { + "path": "apps/web/src/features/toolbar-metrics/ToolbarMetrics.tsx", + "sourceObjectId": "8ca49fb4f72b08d40c7905dbed28a4fe26204e6e", + "sha256": "bce391698cdec270ed15aac25d0ea968923f35537017a90e0dd176933d762342", + "size": 69220 + }, { "path": "apps/web/src/features/toolbar-vpn/useToolbarVpn.ts", "sourceObjectId": "e10f1c24757aeb3d78aebb6d22e076bcf6cb5aa1", @@ -19793,12 +19727,6 @@ "sha256": "f20dbdfaec87da5b4f1fea5a081ba41319fb501efeff9e3cf9dbbb8c95579db5", "size": 1652 }, - { - "path": "apps/web/src/features/ui-controls/SpaceToggle.tsx", - "sourceObjectId": "aa12ff213526c679889283570f21f4b4716aff34", - "sha256": "41ce9940e850b853e7658db3862000980309b1952734ce261d39e6ef270487a5", - "size": 1748 - }, { "path": "apps/web/src/features/ui-controls/space-toggle.css", "sourceObjectId": "1d971eefbb5f286dd2673b6150f46b71d00765cc", @@ -19806,64 +19734,10 @@ "size": 5132 }, { - "path": "apps/web/src/features/ui-theme/ClaudeIcon.tsx", - "sourceObjectId": "51f77a509ba9d53d7cddc5dcca47bd6ff3766ddd", - "sha256": "4a972c448e1a36fb7648c0767ea5e1aa9e666528f54e1fd32425e70ac1561f52", - "size": 1927 - }, - { - "path": "apps/web/src/features/ui-theme/DesktopNavigation.tsx", - "sourceObjectId": "5f7fca56825c5f978dc22927a29a91f9738843e5", - "sha256": "805216685236ea4406186ff066230e245ff5232ebb8224f52bcb5120e92d785c", - "size": 56024 - }, - { - "path": "apps/web/src/features/ui-theme/GoogleGIcon.tsx", - "sourceObjectId": "16dcb29f8de4df0315cff28ae03aa8557cecf882", - "sha256": "5dad4215d04e54cf86802e45cc5d12b317f29cbb506f66d9b7a47cb7387bd70f", - "size": 1081 - }, - { - "path": "apps/web/src/features/ui-theme/LiquidGlassLens.tsx", - "sourceObjectId": "0615541d48f3534f25303799d2b20e58961f6a2a", - "sha256": "0ad9ba5233c502f12403015c7657fb29404845b43df9a4b33b60be1165fdc6aa", - "size": 1685 - }, - { - "path": "apps/web/src/features/ui-theme/MobilePaneSwitcher.tsx", - "sourceObjectId": "80734edfe6d1d087a987ba398ae7c48c15b61a82", - "sha256": "c00bf912664c0a5de3c4e8dba5ae07f391ca8afa75062036fd8a4e9304c17737", - "size": 1220 - }, - { - "path": "apps/web/src/features/ui-theme/OpenAiIcon.tsx", - "sourceObjectId": "fb24ef7b1c2d58155b54122910a0312907600057", - "sha256": "910bc1b85680548e1038fe5e26fd111909528f9d9be987e3a56ebb828ba586e2", - "size": 2097 - }, - { - "path": "apps/web/src/features/ui-theme/RailVisibilityMenu.tsx", - "sourceObjectId": "dc880af1502a940fd713c58a4d9ce8f691875562", - "sha256": "97bff9e597d5ed9606197a493a300088ff9aec8f4e420fb0dda1fd2d3db9e75a", - "size": 7611 - }, - { - "path": "apps/web/src/features/ui-theme/UiThemeSettingsCard.tsx", - "sourceObjectId": "4b12e28ce31ffa6b26f9601f62a06b83adf28a96", - "sha256": "001b6bef3606b2dce0b1982a933fd7c19dda74fa83940f3a81187a5726c63898", - "size": 8411 - }, - { - "path": "apps/web/src/features/ui-theme/WorkspaceRoomSettings.tsx", - "sourceObjectId": "ee45491ede8703313c6acc3a5fdccc8c3a52ace2", - "sha256": "c684662077060f1d00729680db1ae67010c1bf19b9416bbe711a2a5a101a1c3a", - "size": 1563 - }, - { - "path": "apps/web/src/features/ui-theme/WorkspaceSurface.tsx", - "sourceObjectId": "8ba60d3bb3b8b47762f63b0d91b2e4fce5791836", - "sha256": "f6ac79f329353c639d908520d566a0b021728ee2a739772007c2805882858b7a", - "size": 1029 + "path": "apps/web/src/features/ui-controls/SpaceToggle.tsx", + "sourceObjectId": "aa12ff213526c679889283570f21f4b4716aff34", + "sha256": "41ce9940e850b853e7658db3862000980309b1952734ce261d39e6ef270487a5", + "size": 1748 }, { "path": "apps/web/src/features/ui-theme/aira-theme.css", @@ -19883,6 +19757,12 @@ "sha256": "276f4ecc783a45376bd82d2ee385f952da443d0ed5b4a75fee2de36f0ceb713a", "size": 5478 }, + { + "path": "apps/web/src/features/ui-theme/ClaudeIcon.tsx", + "sourceObjectId": "51f77a509ba9d53d7cddc5dcca47bd6ff3766ddd", + "sha256": "4a972c448e1a36fb7648c0767ea5e1aa9e666528f54e1fd32425e70ac1561f52", + "size": 1927 + }, { "path": "apps/web/src/features/ui-theme/codex-theme.css", "sourceObjectId": "e273cfc20169a48c03247b2394c3c1fa5c120c51", @@ -19901,6 +19781,18 @@ "sha256": "e433ef5b7e57c584e0c50ab4ffe3eeff0c64e80d7c784b72408c1e6c35e7cb5a", "size": 6614 }, + { + "path": "apps/web/src/features/ui-theme/DesktopNavigation.tsx", + "sourceObjectId": "5f7fca56825c5f978dc22927a29a91f9738843e5", + "sha256": "805216685236ea4406186ff066230e245ff5232ebb8224f52bcb5120e92d785c", + "size": 56024 + }, + { + "path": "apps/web/src/features/ui-theme/GoogleGIcon.tsx", + "sourceObjectId": "16dcb29f8de4df0315cff28ae03aa8557cecf882", + "sha256": "5dad4215d04e54cf86802e45cc5d12b317f29cbb506f66d9b7a47cb7387bd70f", + "size": 1081 + }, { "path": "apps/web/src/features/ui-theme/jarvis-theme.css", "sourceObjectId": "4ab8d10c89b558c990369e7639ddf7b7a37957ca", @@ -19913,6 +19805,18 @@ "sha256": "554f9fce641dc3c08e9fcca6091f1db11b8e588da84cc807d56793da19cc2338", "size": 16615 }, + { + "path": "apps/web/src/features/ui-theme/LiquidGlassLens.tsx", + "sourceObjectId": "0615541d48f3534f25303799d2b20e58961f6a2a", + "sha256": "0ad9ba5233c502f12403015c7657fb29404845b43df9a4b33b60be1165fdc6aa", + "size": 1685 + }, + { + "path": "apps/web/src/features/ui-theme/MobilePaneSwitcher.tsx", + "sourceObjectId": "80734edfe6d1d087a987ba398ae7c48c15b61a82", + "sha256": "c00bf912664c0a5de3c4e8dba5ae07f391ca8afa75062036fd8a4e9304c17737", + "size": 1220 + }, { "path": "apps/web/src/features/ui-theme/modern-theme.css", "sourceObjectId": "937973ed9e7eead34dba3a2b79b06c44ac633398", @@ -19931,18 +19835,36 @@ "sha256": "8b5c434cc4e862011fa1f5d4675cba8a817f7ded3e10f96abbfd9e854e6e19b5", "size": 20646 }, + { + "path": "apps/web/src/features/ui-theme/OpenAiIcon.tsx", + "sourceObjectId": "fb24ef7b1c2d58155b54122910a0312907600057", + "sha256": "910bc1b85680548e1038fe5e26fd111909528f9d9be987e3a56ebb828ba586e2", + "size": 2097 + }, { "path": "apps/web/src/features/ui-theme/rail-dynamic-scaling.ts", "sourceObjectId": "1302e3a307e8245354ccc9dc0710e191b4eebd63", "sha256": "08289cbc13e86492770409e56690b605cc04c68d60934df9e95b65464d3cac73", "size": 9577 }, + { + "path": "apps/web/src/features/ui-theme/RailVisibilityMenu.tsx", + "sourceObjectId": "dc880af1502a940fd713c58a4d9ce8f691875562", + "sha256": "97bff9e597d5ed9606197a493a300088ff9aec8f4e420fb0dda1fd2d3db9e75a", + "size": 7611 + }, { "path": "apps/web/src/features/ui-theme/ui-theme-settings-card.css", "sourceObjectId": "af23a1ec97f6e14f6f420e917c4b4d156b7990fb", "sha256": "1e1d486ac8315f63541d26c70998eb596dc6ec707322d5b17c8c2b6816be814c", "size": 4911 }, + { + "path": "apps/web/src/features/ui-theme/UiThemeSettingsCard.tsx", + "sourceObjectId": "4b12e28ce31ffa6b26f9601f62a06b83adf28a96", + "sha256": "001b6bef3606b2dce0b1982a933fd7c19dda74fa83940f3a81187a5726c63898", + "size": 8411 + }, { "path": "apps/web/src/features/ui-theme/use-liquid-glass-tint.ts", "sourceObjectId": "b448f8427f3d9aa5f17d634c3ed1e4602a9c0b2d", @@ -19992,10 +19914,16 @@ "size": 8958 }, { - "path": "apps/web/src/features/user-links/UserLinks.tsx", - "sourceObjectId": "8ac0a4a8df7a263f318fb3fcc1ebb317ba3ef01f", - "sha256": "a22d8554fa06af909a1c408f7b344b3d3602f9955df04b67b641359a1aeb05c7", - "size": 30971 + "path": "apps/web/src/features/ui-theme/WorkspaceRoomSettings.tsx", + "sourceObjectId": "ee45491ede8703313c6acc3a5fdccc8c3a52ace2", + "sha256": "c684662077060f1d00729680db1ae67010c1bf19b9416bbe711a2a5a101a1c3a", + "size": 1563 + }, + { + "path": "apps/web/src/features/ui-theme/WorkspaceSurface.tsx", + "sourceObjectId": "8ba60d3bb3b8b47762f63b0d91b2e4fce5791836", + "sha256": "f6ac79f329353c639d908520d566a0b021728ee2a739772007c2805882858b7a", + "size": 1029 }, { "path": "apps/web/src/features/user-links/user-links.css", @@ -20004,10 +19932,10 @@ "size": 3269 }, { - "path": "apps/web/src/features/user-management/UserManagementDialog.tsx", - "sourceObjectId": "077bde4b6cf2040de251c79a0696987a06a5182b", - "sha256": "6a1e9ce5e0f6585f6a61f7895cb256c1b4ad595f8aaad055171099e5ea52f1e0", - "size": 15641 + "path": "apps/web/src/features/user-links/UserLinks.tsx", + "sourceObjectId": "8ac0a4a8df7a263f318fb3fcc1ebb317ba3ef01f", + "sha256": "a22d8554fa06af909a1c408f7b344b3d3602f9955df04b67b641359a1aeb05c7", + "size": 30971 }, { "path": "apps/web/src/features/user-management/user-management.css", @@ -20016,10 +19944,10 @@ "size": 7413 }, { - "path": "apps/web/src/features/user-settings/useUserPreferences.ts", - "sourceObjectId": "a34b9f581b3671fd54663dfa370b8c3a055f2a1f", - "sha256": "7bfcabe0eb273a3b35173017dffde3d0ef3fa75f58294426fae3a8d007c00c2e", - "size": 21870 + "path": "apps/web/src/features/user-management/UserManagementDialog.tsx", + "sourceObjectId": "077bde4b6cf2040de251c79a0696987a06a5182b", + "sha256": "6a1e9ce5e0f6585f6a61f7895cb256c1b4ad595f8aaad055171099e5ea52f1e0", + "size": 15641 }, { "path": "apps/web/src/features/user-settings/user-settings-manager.ts", @@ -20034,10 +19962,10 @@ "size": 1576 }, { - "path": "apps/web/src/features/vault/VaultDock.tsx", - "sourceObjectId": "d91aa84adba2033ea34d80bf21536bfd7f4785b0", - "sha256": "fccd7a228bc1675708f3cee7e1e98dec0a4a9c37fd87fb60419dcafdeeb86afe", - "size": 51038 + "path": "apps/web/src/features/user-settings/useUserPreferences.ts", + "sourceObjectId": "a34b9f581b3671fd54663dfa370b8c3a055f2a1f", + "sha256": "7bfcabe0eb273a3b35173017dffde3d0ef3fa75f58294426fae3a8d007c00c2e", + "size": 21870 }, { "path": "apps/web/src/features/vault/chrome-import.ts", @@ -20076,10 +20004,10 @@ "size": 4510 }, { - "path": "apps/web/src/features/vibe-music/VibeMusicPlayer.tsx", - "sourceObjectId": "d78b57651652d503534e41b3d3c468b88971e115", - "sha256": "7f273dd9b4fc5d25222a5b58f07f970477f058e1ba9cdb5b2a7bfab35bb5b87a", - "size": 79328 + "path": "apps/web/src/features/vault/VaultDock.tsx", + "sourceObjectId": "d91aa84adba2033ea34d80bf21536bfd7f4785b0", + "sha256": "fccd7a228bc1675708f3cee7e1e98dec0a4a9c37fd87fb60419dcafdeeb86afe", + "size": 51038 }, { "path": "apps/web/src/features/vibe-music/vibe-music-session.ts", @@ -20093,6 +20021,12 @@ "sha256": "ccd69e9efee5e1f26d748ee19c976cd844029930032913fd852659745ff17e37", "size": 18282 }, + { + "path": "apps/web/src/features/vibe-music/VibeMusicPlayer.tsx", + "sourceObjectId": "d78b57651652d503534e41b3d3c468b88971e115", + "sha256": "7f273dd9b4fc5d25222a5b58f07f970477f058e1ba9cdb5b2a7bfab35bb5b87a", + "size": 79328 + }, { "path": "apps/web/src/features/vibe-music/youtubePlaylistPlayer.ts", "sourceObjectId": "1886f6296e081ff977830014f2a226776c72a452", @@ -20105,6 +20039,12 @@ "sha256": "4f30b117848896da0377d99e5b4fea08eb7db1110a7955e91d0887f60be39f4e", "size": 4921 }, + { + "path": "apps/web/src/features/video-pane/live-events.ts", + "sourceObjectId": "ee5bdcf66ee94a60897cd2829f991c50d38ccd15", + "sha256": "df3c2769debec8561a3a3380360e312212801ef690cf141d6015425463be9ede", + "size": 407 + }, { "path": "apps/web/src/features/video-pane/MusicTab.tsx", "sourceObjectId": "69e3c0f42efde948a77a7fd4952f3fcf8297e3d1", @@ -20129,24 +20069,6 @@ "sha256": "681b52ebc723c97d763c021ab17369960c8bffed32ebf121c4c4462eb6a49423", "size": 29742 }, - { - "path": "apps/web/src/features/video-pane/VideoPane.tsx", - "sourceObjectId": "08c77e907a558e5cd2f48ebaf8b4218d6c03106a", - "sha256": "1f167236ebfce0418145089bdde1e4f6ca2c12a492a3b50a269eb76c761a0c92", - "size": 11388 - }, - { - "path": "apps/web/src/features/video-pane/VideoSettingsCard.tsx", - "sourceObjectId": "62b23d1ac258d159c8db4737ec54759eaf45dc87", - "sha256": "454bd2eb5112fdd41fada3fc9dbd37a1eb0d568d5a7be504cc2c4fdfc415831c", - "size": 332 - }, - { - "path": "apps/web/src/features/video-pane/live-events.ts", - "sourceObjectId": "ee5bdcf66ee94a60897cd2829f991c50d38ccd15", - "sha256": "df3c2769debec8561a3a3380360e312212801ef690cf141d6015425463be9ede", - "size": 407 - }, { "path": "apps/web/src/features/video-pane/useVideo.ts", "sourceObjectId": "8e79f8e214e8ba33f7035a1e93f42275b95ae405", @@ -20160,10 +20082,16 @@ "size": 12150 }, { - "path": "apps/web/src/features/vnc-pane/VncPane.tsx", - "sourceObjectId": "7135a3bbca57801131b192c5bdae98e713f28781", - "sha256": "195b4d1d11a9600a1ce48bbf231da21d1e588f6d7222dddb4df81bddcd7b90e9", - "size": 10070 + "path": "apps/web/src/features/video-pane/VideoPane.tsx", + "sourceObjectId": "08c77e907a558e5cd2f48ebaf8b4218d6c03106a", + "sha256": "1f167236ebfce0418145089bdde1e4f6ca2c12a492a3b50a269eb76c761a0c92", + "size": 11388 + }, + { + "path": "apps/web/src/features/video-pane/VideoSettingsCard.tsx", + "sourceObjectId": "62b23d1ac258d159c8db4737ec54759eaf45dc87", + "sha256": "454bd2eb5112fdd41fada3fc9dbd37a1eb0d568d5a7be504cc2c4fdfc415831c", + "size": 332 }, { "path": "apps/web/src/features/vnc-pane/index.ts", @@ -20171,12 +20099,24 @@ "sha256": "74a1276ed6610dce9fd62f3fe84367db2101f5579699ba2d03d12024d9579f08", "size": 39 }, + { + "path": "apps/web/src/features/vnc-pane/VncPane.tsx", + "sourceObjectId": "7135a3bbca57801131b192c5bdae98e713f28781", + "sha256": "195b4d1d11a9600a1ce48bbf231da21d1e588f6d7222dddb4df81bddcd7b90e9", + "size": 10070 + }, { "path": "apps/web/src/features/voice-input/CliPaneControlsSettingsCard.tsx", "sourceObjectId": "308184bb5b5d4a62ee3e3eb810d7bd0939a7792c", "sha256": "36aad93f10ea0e0e7da4479d91808ac818f269b7beeb68e98fee2fc0f3139688", "size": 3863 }, + { + "path": "apps/web/src/features/voice-input/recording-clock.ts", + "sourceObjectId": "abc39b6ceee470a5052d89653d29180490a04070", + "sha256": "a7f147f931af696729cb1fa90e5727e4446c503d28daecc48318924a2805bafb", + "size": 1290 + }, { "path": "apps/web/src/features/voice-input/VoiceInputButton.tsx", "sourceObjectId": "8e84e2d015f500c73b3ffdfb08d6e18ace65b53b", @@ -20195,12 +20135,6 @@ "sha256": "357ba25d42c35bfe3241e520e0367bbf0508a8efbcd1469a816ec1017145bcfb", "size": 10916 }, - { - "path": "apps/web/src/features/voice-input/recording-clock.ts", - "sourceObjectId": "abc39b6ceee470a5052d89653d29180490a04070", - "sha256": "a7f147f931af696729cb1fa90e5727e4446c503d28daecc48318924a2805bafb", - "size": 1290 - }, { "path": "apps/web/src/features/workspace-session.ts", "sourceObjectId": "20a34b2f6cb80592fe55b4c074dbee8f0ec07de5", @@ -20213,12 +20147,6 @@ "sha256": "07c9db370983e3e4a420d20b9be2e7d7ab7cf24f5b3ffb817fbc2641bf38dbc2", "size": 8360 }, - { - "path": "apps/web/src/features/worktrees/WorktreeBadge.tsx", - "sourceObjectId": "1e6e1452f36654625384398fdf89f76d8d2f0556", - "sha256": "dfa57d26ee586196e2dafe21fc63290a21ae261943fc1f04ea54c5f366bf5781", - "size": 8888 - }, { "path": "apps/web/src/features/worktrees/worktree-client.ts", "sourceObjectId": "b5147d8a91dcfdaf833101d0a04c9631b8067bda", @@ -20231,6 +20159,12 @@ "sha256": "d2c274bd0b01aad6aed8245e08fac95cc9d6008d22894eec7d41ab4c32034b3f", "size": 4328 }, + { + "path": "apps/web/src/features/worktrees/WorktreeBadge.tsx", + "sourceObjectId": "1e6e1452f36654625384398fdf89f76d8d2f0556", + "sha256": "dfa57d26ee586196e2dafe21fc63290a21ae261943fc1f04ea54c5f366bf5781", + "size": 8888 + }, { "path": "apps/web/src/icon-toolbar.ts", "sourceObjectId": "90757be1c7a589817c1d6532c546b301e0ab06f6", @@ -20255,18 +20189,18 @@ "sha256": "59ede6d5517ef7579ee7e5bd988690840ab31e0dba16891d5fd07b695f989919", "size": 249324 }, - { - "path": "apps/web/src/live/LiveSpaceApp.tsx", - "sourceObjectId": "a8a983bc54cd63c83d69a1eb416e1910cd7c2324", - "sha256": "f611441f31e60fecad4d9fb9f9ea999ae877cabf42226964c984c178fecc27d7", - "size": 395 - }, { "path": "apps/web/src/live/live-runtime.ts", "sourceObjectId": "9d384080872190162fcb1729cfb16e0a5ab623c8", "sha256": "4b9d36097af8231732626192cc7332bc4353deebd9f30559a817c9f0c68d171e", "size": 2242 }, + { + "path": "apps/web/src/live/LiveSpaceApp.tsx", + "sourceObjectId": "a8a983bc54cd63c83d69a1eb416e1910cd7c2324", + "sha256": "f611441f31e60fecad4d9fb9f9ea999ae877cabf42226964c984c178fecc27d7", + "size": 395 + }, { "path": "apps/web/src/main.tsx", "sourceObjectId": "8fb47cf841f47f05692a658c2cef6d28bab1fd3b", @@ -20345,6 +20279,12 @@ "sha256": "6758f429bf1f6313d5aae98f8f5a26ce2108d1f196df028d2e62c18f909df9f3", "size": 2714 }, + { + "path": "apps/web/src/SpaceBrand.tsx", + "sourceObjectId": "425047d28d1698facd8e23f044c66be38a9c004d", + "sha256": "46a88dbd86beddf675cdadead7679d024907c690a7f4998a3d676f2d3a7ff2f7", + "size": 4213 + }, { "path": "apps/web/src/startup-background.ts", "sourceObjectId": "f3afe7b1f29724947e37e457cbb8c8ca655d9448", @@ -22705,9 +22645,9 @@ }, { "path": "apps/worker/package.json", - "sourceObjectId": "ec58125fa31d0eccef3b2d7a69bd8e9ac02b7f95", - "sha256": "64ab761683c7030e7bc114dcf729be9740aac07f7933856ba685b2ddf359cd2c", - "size": 869 + "sourceObjectId": "db05b016400a24949bb81f48fdf5964e59dc454c", + "sha256": "7a3bb875767c70ecf55562cfa81622a582a36fbace5a0ee4f862e3d5462dc355", + "size": 906 }, { "path": "apps/worker/src/activities.ts", @@ -22717,9 +22657,9 @@ }, { "path": "apps/worker/src/activity-observability.ts", - "sourceObjectId": "ea4d021d146c3b4f47ed562059b46599a10a22cc", - "sha256": "0acc1182c34352967649dfe981f9b494f04197a9701cdec4a4d6c0f67c8ebb6e", - "size": 9912 + "sourceObjectId": "a1a08c5ba958a40987fa78aa5f172dd6b17f839c", + "sha256": "795feea075fac04adc68a09a74ae2514d56fec2ab90b5d10a893f8be1f41d4c3", + "size": 11509 }, { "path": "apps/worker/src/browser-action-bridge.ts", @@ -22825,9 +22765,9 @@ }, { "path": "apps/worker/src/memory-maintenance-worker.ts", - "sourceObjectId": "e1204603380890564b6f9735425fe94e5e1efa6a", - "sha256": "31425b782c91050c39ca7a1b93d9e2511043f2f0c944b2454d236bc7023d4c95", - "size": 2228 + "sourceObjectId": "9c071deed38a3467f749ca0272f65137d1f6bd4b", + "sha256": "d6033572c689ba7459b9076a8331da234c13f29915103cbe2bbf3180acbb2925", + "size": 2543 }, { "path": "apps/worker/src/memory-maintenance-workflows.ts", @@ -22849,9 +22789,9 @@ }, { "path": "apps/worker/src/memory-mutation-worker.ts", - "sourceObjectId": "c2eadf65757cfe9070c1543c57c9e6e102c5c770", - "sha256": "581d177fb52b62a50ac0df8937ccbca3b457637128a68aedd07fce3048fa7881", - "size": 1859 + "sourceObjectId": "8469d832d638cd1da9439a488a2ebb85ccbd2a64", + "sha256": "58f67dc89787ea02922ccd9f929fcba11fe3c21e72068264a01ca10814f991ef", + "size": 2160 }, { "path": "apps/worker/src/memory-mutation-workflows.ts", @@ -22891,9 +22831,9 @@ }, { "path": "apps/worker/src/room-background-continuation.ts", - "sourceObjectId": "e15c29a216a22ee882c946d85431a2aa83ea0375", - "sha256": "ee450848d1b37d24d935440e56b9c9e34b442567b7f2e448be5c0570589cd6a6", - "size": 12970 + "sourceObjectId": "c169d27636130569b7917f5018476f41d61bc4ba", + "sha256": "486d32d62ce222a3305f05b7978b205cf17612c0e29b4eabc44a2ef60bf6c43a", + "size": 14199 }, { "path": "apps/worker/src/room-supervisor-state.ts", @@ -22958,8 +22898,26 @@ { "path": "apps/worker/src/worker.ts", "sourceObjectId": "21eda04d04aac9ccc0833cbb1633bee8f7836adf", - "sha256": "68373ca1bdbf7cb2eaf712186fb9051868c8ffc26b1bd72d1e6e77d5b91ff35e", - "size": 8853 + "sha256": "d553d30a596aefeb2fb2badb85a6d049fdd6c985c116bca6d5bf8e26e53b82bf", + "size": 9377 + }, + { + "path": "apps/worker/src/workflow-observability-interceptors.ts", + "sourceObjectId": "0ef5d77c876c9760376f95f32a91adff0d1ad67a", + "sha256": "3320a73a99dbd125690c868c5267d47aa70ae8eceb14f38fb41b1260c5fcced9", + "size": 7207 + }, + { + "path": "apps/worker/src/workflow-span-context.ts", + "sourceObjectId": "66e9cb909e31b5214c2ea3397988be1c8705ecc3", + "sha256": "176a73890f399e5c385d624b862b91043dd87a67500a6fe42e14fac4e0bc3e4f", + "size": 8766 + }, + { + "path": "apps/worker/src/workflow-spans-sink.ts", + "sourceObjectId": "d75d23e5bebd6034e4e0dc9f4ed16fa96d112fa0", + "sha256": "044ffe4b9f1c1b2fc821bdd4b4d818d6af7e8e42b358e3b04b2f80b7aea84a29", + "size": 5035 }, { "path": "apps/worker/src/workflows.ts", @@ -22969,9 +22927,9 @@ }, { "path": "apps/worker/tests/activity-observability.test.ts", - "sourceObjectId": "654bf7962ec575ff6a0197177c8a15d2e3798272", - "sha256": "dc55d02187f929e2a608aec4cc174083b65ae4fde1c6f3dafffc7d222ae5da0f", - "size": 12002 + "sourceObjectId": "6492f0f27f6001c688210e8d700d823f40f0224e", + "sha256": "bbcc100b635ea6364884ccbd1e2a7288413479094d46c698b89b4911d410e5a4", + "size": 14053 }, { "path": "apps/worker/tests/chat-task-run.test.ts", @@ -23089,9 +23047,9 @@ }, { "path": "apps/worker/tests/room-background-continuation.test.ts", - "sourceObjectId": "127ccb6493e3a9065bcecc6106f09e7198ed20c0", - "sha256": "e328fc51c0e377265521373ee1c71ad1fb8bff37a3938669d707344965ecf72b", - "size": 12700 + "sourceObjectId": "45b4ce45db843a9f8c5ad2ef1c57dc22b63e5c9c", + "sha256": "9fc65ce2db13aa876cfc5229772ba3cc6aee1f34f35973a97df0f5c6c8694e38", + "size": 13558 }, { "path": "apps/worker/tests/room-background-transport.test.ts", @@ -23141,6 +23099,12 @@ "sha256": "356a2bca02b085f8148bc0745db03b3cb73cdbb03320438be002e32d7ad2c854", "size": 8192 }, + { + "path": "apps/worker/tests/support/traced-workflows.ts", + "sourceObjectId": "1fac80718aa0d7c9efd0f4c4c6c14bf60ba1e875", + "sha256": "d69e205a8717b9cfae37e3bf400a2322500ec8012afbdb642d39e58f14cd1350", + "size": 3229 + }, { "path": "apps/worker/tests/support/worktree-temporal-worker-hooks.mjs", "sourceObjectId": "29cb4d8d409cff4d83b87673063affb7994e223d", @@ -23183,6 +23147,24 @@ "sha256": "92cd7f1fb789a8ee5367def75a48921aa15914269903d495e8dbee6e620fde13", "size": 166099 }, + { + "path": "apps/worker/tests/workflow-span-context.test.ts", + "sourceObjectId": "bb5875976d02911c66cd67eddcfc4ec7c27453f8", + "sha256": "27692131acb3f4ab6cbded1ddc7d141115148889eea2bcde3465b4d303f09712", + "size": 7246 + }, + { + "path": "apps/worker/tests/workflow-span-integration.test.ts", + "sourceObjectId": "310929d1f3fe801ee16ea1f02e199a210d7b9f6f", + "sha256": "8cf5b02aef952aa55df983563d02ede9357ea23f7bc5d22d381658d7849b2d25", + "size": 13982 + }, + { + "path": "apps/worker/tests/workflow-spans-sink.test.ts", + "sourceObjectId": "684562c31010abbbb05998e0d8a98ad65635a044", + "sha256": "edd6c99b190c99b895b43892a30f5a5f19daa33a8bbb6b76a0009267fc9a2699", + "size": 4646 + }, { "path": "apps/worker/tsconfig.json", "sourceObjectId": "63e5f27e5bd394637f55dbee101976e1a534feb2", @@ -23196,10 +23178,10 @@ "size": 862 }, { - "path": "demos/README.md", - "sourceObjectId": "7002feeea5e5249f067c94be730cef546df38f66", - "sha256": "ce051dff952aacc4d6df7583dd87aa5e9cadb010146d869dc2a180d2e4b891eb", - "size": 2829 + "path": "CONTRIBUTING.md", + "sourceObjectId": "078772388754304e33d238fefaad2f04e9120107", + "sha256": "14f559c40ed46089c3fb74339d1b225cdd817fc61ef5a39bf1dce8ea28a83216", + "size": 5143 }, { "path": "demos/project-1-salesforce-crm/javascript-react-node/server/index.mjs", @@ -23261,18 +23243,18 @@ "sha256": "c0b46b7344017a5a920098fc360087c4375181d195b7581524f51d0cb5d404d8", "size": 324 }, - { - "path": "demos/project-1-salesforce-crm/typescript-react-node/web/src/App.tsx", - "sourceObjectId": "1be53f266c06f3705f049ab1fa0dc6200de3a7e0", - "sha256": "1424ccf72d9889331061d69cfb7cebc8c0b6523390867f4005451697c1bf9115", - "size": 8842 - }, { "path": "demos/project-1-salesforce-crm/typescript-react-node/web/src/api.ts", "sourceObjectId": "cf58e1a680bf0c2e0dc648f6d7607792be9f7bcc", "sha256": "d0b97dc7da1ba2fede9b62322b5c6e037870e5e3e5d91dd46987392906fa27b7", "size": 6816 }, + { + "path": "demos/project-1-salesforce-crm/typescript-react-node/web/src/App.tsx", + "sourceObjectId": "1be53f266c06f3705f049ab1fa0dc6200de3a7e0", + "sha256": "1424ccf72d9889331061d69cfb7cebc8c0b6523390867f4005451697c1bf9115", + "size": 8842 + }, { "path": "demos/project-1-salesforce-crm/typescript-react-node/web/src/main.tsx", "sourceObjectId": "e7feee2015b613713dd5fd0d634cdcb7fe82c58a", @@ -23387,6 +23369,12 @@ "sha256": "1e34c19f2bfe3089092a72f3a402ea37b34e862b4a48acaa66fce52129eebcdc", "size": 432 }, + { + "path": "demos/README.md", + "sourceObjectId": "7002feeea5e5249f067c94be730cef546df38f66", + "sha256": "ce051dff952aacc4d6df7583dd87aa5e9cadb010146d869dc2a180d2e4b891eb", + "size": 2829 + }, { "path": "docs/architecture.md", "sourceObjectId": "3db25997c30c86527a8d2d506f52fee2b91351b5", @@ -23395,21 +23383,9 @@ }, { "path": "docs/configuration-reference.md", - "sourceObjectId": "e432af4c60c2773b6522fcb207cbda1b6bb85faa", - "sha256": "6a058d4a9d836fb0cf5e69e6743ca5db993284e52ff3795eac2bc115cfb29b6d", - "size": 3122 - }, - { - "path": "docs/quality/KNOWN_LIMITATIONS.md", - "sourceObjectId": "db60f8c20666e002705c85eceef120b903738ee9", - "sha256": "85857f51ae6724a7d456bc51e419d290caf9f7e80bc8dd780547e156bc7fed33", - "size": 48240 - }, - { - "path": "docs/quality/README.md", - "sourceObjectId": "fbffd3d10f2a7b0d928ed4952c6987c88635ad33", - "sha256": "5403942f7a52176a1f5f0a503cb919acc436fb801103709d106387487c970ab1", - "size": 29459 + "sourceObjectId": "ecfcdffd8e12edc3ac9193ca8f86062efbea2d40", + "sha256": "dc35853746e8550d2cbff59f6e5b377961d57ede01a44d62dda2965ac8cfe86c", + "size": 3981 }, { "path": "docs/quality/baseline.json", @@ -23459,6 +23435,12 @@ "sha256": "35a9fc1bea9d6a8c9b80c487dd6e1b7777ce8413c34c607b944afd1758edbe3e", "size": 37649 }, + { + "path": "docs/quality/KNOWN_LIMITATIONS.md", + "sourceObjectId": "db60f8c20666e002705c85eceef120b903738ee9", + "sha256": "dddbc36df3419d5b430e40a36587b6f5a3dd107f86dbc3fb59aa7306c8434a4e", + "size": 48645 + }, { "path": "docs/quality/native-resume-matrix.md", "sourceObjectId": "416e32e190f48fbd0a93b458b68e4d385c6887c5", @@ -23468,8 +23450,8 @@ { "path": "docs/quality/observability.md", "sourceObjectId": "05fa2802c2c2b73ff11e4995f0f8f33118045e6a", - "sha256": "61e948180dcf0df50ace5f2b56b2da2664e638c355d615e695efc7001dc84559", - "size": 20398 + "sha256": "77fec949ffd536be1a9639e6048c36adba2d446aeca1a1f276bb972304e3447f", + "size": 22582 }, { "path": "docs/quality/pause-checkpoint-2026-10-03.md", @@ -23489,6 +23471,12 @@ "sha256": "fa73ada7683f63b1db68113004cae2e4d3ea95c28bb1ba5f2829c145459b8016", "size": 7049 }, + { + "path": "docs/quality/README.md", + "sourceObjectId": "fbffd3d10f2a7b0d928ed4952c6987c88635ad33", + "sha256": "5403942f7a52176a1f5f0a503cb919acc436fb801103709d106387487c970ab1", + "size": 29459 + }, { "path": "docs/quality/restore-and-migrations.md", "sourceObjectId": "e3a1136f70b593dd5299672b914e4d3a6dadbfda", @@ -23498,8 +23486,8 @@ { "path": "docs/quality/review-findings.json", "sourceObjectId": "75bf789a8a1d3e08e0bf0419010a90e22f792c34", - "sha256": "14de472a8cd72b4b942237a6fcbcb833c1b80d62e964a3188baa721ee9b89f40", - "size": 210583 + "sha256": "2dab36656d0f64bf7eff93b772afe8317da001b7ac65ad2e979ee9ff78e767cf", + "size": 210988 }, { "path": "docs/quality/review-pack.md", @@ -23537,11 +23525,17 @@ "sha256": "183016d47442908bd2faf4e5f29680ab77f748aa63f0abb6bc02c7348e78bef7", "size": 1954 }, + { + "path": "LICENSE", + "sourceObjectId": "1eebfc1c4a99df80734f1c1418744ab1311027f1", + "sha256": "820058d133bb9e7dca206f310256375e2751ee23697489337a5337530458ac29", + "size": 1086 + }, { "path": "package-lock.json", "sourceObjectId": "bebd5dbb1bc020651af5b6b60e61823bae5fad6b", - "sha256": "2bc219913dd6fe9003169bdc3881b33f25f939510b47f58e7c26c2af85124617", - "size": 419142 + "sha256": "74bfcd2dfae07d1ac34439a550b885435fc866dedf3b5e1dc7355af112a541de", + "size": 419884 }, { "path": "package.json", @@ -24061,9 +24055,9 @@ }, { "path": "packages/contracts/src/observability.ts", - "sourceObjectId": "dd8e53b41b78894a2d51819b4398b8865c0103ad", - "sha256": "d2b0675226c904d51af5112e20e600df6fb085e254ceddd82606850f3b351a50", - "size": 8013 + "sourceObjectId": "25902119c9ad32131d85b80b6a62375418a1bcb2", + "sha256": "d2a03cd88b945fc746cba62d2e9924efe3f5e427237a5a7892a4858b22b1e7e4", + "size": 9255 }, { "path": "packages/contracts/src/pane-catalog.ts", @@ -24121,9 +24115,9 @@ }, { "path": "packages/contracts/src/schemas.ts", - "sourceObjectId": "2a3c7a8dc938ab10370fb88fc6c5d5b78b95e84b", - "sha256": "ddfa323d1bc89e38acdf24afead68b4ad7b8f23f17d4b6544e99f5e7ae6af3de", - "size": 454939 + "sourceObjectId": "59a4b408aba7ff4b6c1640f075db0a12c8285b38", + "sha256": "36e0cb52f41fe344a7aa50e20f050ec86bfb415c8e79ae5c7abefea597a752de", + "size": 456461 }, { "path": "packages/contracts/src/security-copilot.ts", @@ -24475,9 +24469,9 @@ }, { "path": "packages/contracts/tests/observability.test.ts", - "sourceObjectId": "c7717396d653b66cd623efdcf24965ebc688083f", - "sha256": "e5d3cec9acb570e559375b888088d5b1bc59541c12fd3324e9d151779078ab55", - "size": 4790 + "sourceObjectId": "e03cad731ff150ddbf7126e69efb3568e1c10204", + "sha256": "11eab017c790aa66562c73161d8d6a640433b61ca1793a1f7dd438b42b583161", + "size": 5427 }, { "path": "packages/contracts/tests/pane-catalog.test.ts", @@ -29107,9 +29101,9 @@ }, { "path": "packages/runtime/src/otlp-span-exporter.ts", - "sourceObjectId": "86a0edf055e4ec7b12e3a6d03edb6013f5c0f284", - "sha256": "13736a1d326eb65bc8192ce71060066f4b2c9516b7d1277a62cbac4815877ffc", - "size": 5524 + "sourceObjectId": "385a0f24a7717e97ddb4ee89915b456a04ce95d6", + "sha256": "5aff4dd30728d32693ad8a3699187e8ecbb28d537b7869840dd9e88876933aa1", + "size": 7208 }, { "path": "packages/runtime/src/plan-execution-projection.ts", @@ -29309,6 +29303,18 @@ "sha256": "5d050975b5c5ff083e7751bed7c93973712e0622645c74780692cc7727eb7520", "size": 4098 }, + { + "path": "packages/runtime/tests/otlp-span-exporter-flush.test.ts", + "sourceObjectId": "31e93aa8e844e9d773df5e592a46a6f6721863c1", + "sha256": "97bfcca7ca3a3da053d8d9e3ecc7addcc0eeae8c79b60f74b041880c93dc5b71", + "size": 3079 + }, + { + "path": "packages/runtime/tests/otlp-span-links.test.ts", + "sourceObjectId": "1db2c790a701113bda722fdf3e48d2d5e0ab33f1", + "sha256": "40be985491662208b4e84266baa68d6cc974618d48b1dd2a8b00baf240f64a9a", + "size": 2971 + }, { "path": "packages/runtime/tests/owner-setup.test.ts", "sourceObjectId": "560f6fdc1e23a8cf8d124282b6e8768bc7758bc8", @@ -29615,6 +29621,12 @@ "sha256": "7e4d3575dd85640a0951f0baf69813cb264d75a3435fd72e62960968e6de8b3f", "size": 197 }, + { + "path": "README.md", + "sourceObjectId": "fd303d486def36df68ab63e24b7d17b27e49299d", + "sha256": "386b6387952b4f05aae1f18cb5ca97d7c48296c5e552c7b5c267dff27396418f", + "size": 25012 + }, { "path": "scripts/build-demo-projects.mjs", "sourceObjectId": "3d1498906e1ee83732aa612f885636afc838e014", @@ -29687,6 +29699,48 @@ "sha256": "e4e6973774a35f393c62a1970922683ccb17ec9a2babf688cdbc7c7f6bab31f8", "size": 873 }, + { + "path": "THIRD_PARTY_LICENSES/caveman.txt", + "sourceObjectId": "1b482f11a13fdb89b4c5dc532dafe07bfc94d4eb", + "sha256": "011a77e083092af8774c74c8351d629e0b111c3255fb308c6a9cd46bdade7823", + "size": 14347 + }, + { + "path": "THIRD_PARTY_LICENSES/codex-lb.txt", + "sourceObjectId": "5c04dbd787f805212e38f0b498a663d01c8b040b", + "sha256": "4b5776e1f0fc8e87ae06b207b29d5c1d495694a7785f02a75ed5d8029ff2b09a", + "size": 1454 + }, + { + "path": "THIRD_PARTY_LICENSES/google-material-symbols.txt", + "sourceObjectId": "93d0008cc44359aebbc310d80bd5f548586cea81", + "sha256": "917c3e72b3f54147beb4912bbab7b4bbef4287b78a89b0c0c062a12c623a4675", + "size": 11640 + }, + { + "path": "THIRD_PARTY_LICENSES/headroom.txt", + "sourceObjectId": "210152d7b238c3f7884a28d11134d7ae74a6ad0e", + "sha256": "db2b817ecc04c139a7a62ba2d2ebdf82596b96a39ab156a226bbe32f7cff7049", + "size": 13513 + }, + { + "path": "THIRD_PARTY_LICENSES/ponytail.txt", + "sourceObjectId": "79ee101909076f21c51fb04438858db080a779c8", + "sha256": "916e5f3af739f03ff7ebf5a276d8d24b978b32d201e96568100988e0d97bb6fc", + "size": 1449 + }, + { + "path": "THIRD_PARTY_LICENSES/tree-sitter-grammars.txt", + "sourceObjectId": "654414787d876290d2111e1f00d537e17ef45c91", + "sha256": "09f262f08426edddfe08525956c44fbfd871ae6db362a16642c3f9f1916318b7", + "size": 2802 + }, + { + "path": "THIRD_PARTY_LICENSES/unidiff-rs.txt", + "sourceObjectId": "5658fc4cd77e8766417c639796370f6bc5b452c7", + "sha256": "e60c783cac3401b6b51870135027e660c3e91bb85fca02ab0fcb78b7741e0f7c", + "size": 1379 + }, { "path": "tsconfig.base.json", "sourceObjectId": "624915a2c584ab7d92937690a36158c318e692b4", diff --git a/apps/worker/package.json b/apps/worker/package.json index ec58125fa..db05b0164 100644 --- a/apps/worker/package.json +++ b/apps/worker/package.json @@ -26,6 +26,7 @@ "undici": "8.12.3" }, "devDependencies": { + "@temporalio/testing": "1.24.0", "typescript": "^5.9.3", "vitest": "^4.1.12" }, diff --git a/apps/worker/src/activity-observability.ts b/apps/worker/src/activity-observability.ts index ea4d021d1..a1a08c5ba 100644 --- a/apps/worker/src/activity-observability.ts +++ b/apps/worker/src/activity-observability.ts @@ -11,6 +11,7 @@ import { type FailureCategory } from "@space/contracts"; import type { SpanExporter } from "@space/runtime"; +import { SPAN_CONTEXT_HEADER, decodeSpanContextHeader, type WorkflowSpanContextHeader } from "./workflow-span-context.js"; import { logIdentifier, workerLog, type WorkerLogValue } from "./worker-log.js"; import { workerMetrics, type WorkerMetrics } from "./worker-metrics.js"; @@ -86,6 +87,7 @@ const nestedKeys = ["turn", "item", "bridge", "input", "turnInput"] as const; type CorrelationKey = (typeof correlationKeys)[number]; +/** Recursively collects safe correlation identifiers from activity arguments. */ function readCorrelation(value: unknown, into: Partial>, depth: number): void { if (!value || typeof value !== "object" || Array.isArray(value)) return; const record = value as Record; @@ -115,6 +117,7 @@ export function activityCorrelation(args: readonly unknown[]): Record boolean; /** OTLP export (SPACE_OTEL_EXPORTER_OTLP_ENDPOINT): one span per activity whose input carries a traceparent. */ spans?: SpanExporter | null; + /** The workflow run's span context from the space.span-context header, when the scheduler observed the call. */ + workflowSpan?: WorkflowSpanContextHeader | null; } +/** Extracts the first valid W3C traceparent found in activity arguments. */ function activityTraceparent(args: readonly unknown[]) { const found: Partial> = {}; for (const arg of args) readCorrelation(arg, found, 2); return parseTraceparent(found.traceparent); } +/** Wraps a single Temporal activity execution with structured logging, metrics, and OTLP span export. */ export async function observeActivityExecution( info: ActivityInfo, args: readonly unknown[], @@ -194,16 +202,33 @@ export async function observeActivityExecution( queueMs, rssBytes: process.memoryUsage().rss }); - const parent = dependencies.spans ? activityTraceparent(args) : null; - if (parent) { - dependencies.spans!.record({ + // Prefer the workflow span the interceptor injected into the Temporal + // header (activities nest under their workflow); fall back to the + // traceparent the API propagated in the activity input. + const workflowSpan = dependencies.workflowSpan ?? null; + const parent = + workflowSpan && workflowSpan.kind === "parent" + ? { traceId: workflowSpan.traceId, parentId: workflowSpan.spanId } + : dependencies.spans + ? activityTraceparent(args) + : null; + if (parent && dependencies.spans) { + const spanAttributes: Record = { + "space.activity_type": activityType, + "space.outcome": outcome, + "space.attempt": info.attempt + }; + if (info.workflowType) spanAttributes["space.workflow_type"] = info.workflowType; + if (reasonCode) spanAttributes["space.reason_code"] = reasonCode; + if (category) spanAttributes["space.category"] = category; + dependencies.spans.record({ traceId: parent.traceId, spanId: randomBytes(8).toString("hex"), parentSpanId: parent.parentId, name: `activity ${activityType}`, startTimeUnixNano: BigInt(startedAt) * 1_000_000n, endTimeUnixNano: BigInt(startedAt + durationMs) * 1_000_000n, - attributes: { "space.activity_type": activityType, "space.outcome": outcome, "space.attempt": info.attempt }, + attributes: spanAttributes, error: outcome === "FAILED" || outcome === "FAILED_RESULT", kind: 1 }); @@ -227,10 +252,12 @@ export async function observeActivityExecution( export function createActivityObservabilityInterceptors(dependencies: Omit = {}): ActivityInterceptorsFactory { return (context) => ({ inbound: { - execute: (input, next) => observeActivityExecution(context.info, input.args, () => next(input), { - ...dependencies, - cancelled: () => context.cancellationSignal.aborted - }) + execute: (input, next) => + observeActivityExecution(context.info, input.args, () => next(input), { + ...dependencies, + cancelled: () => context.cancellationSignal.aborted, + workflowSpan: decodeSpanContextHeader(input.headers?.[SPAN_CONTEXT_HEADER]) + }) } }); } diff --git a/apps/worker/src/memory-maintenance-worker.ts b/apps/worker/src/memory-maintenance-worker.ts index e12046033..9c071deed 100644 --- a/apps/worker/src/memory-maintenance-worker.ts +++ b/apps/worker/src/memory-maintenance-worker.ts @@ -9,6 +9,7 @@ import { import { DEFAULT_TEMPORAL_ADDRESS, DEFAULT_TEMPORAL_NAMESPACE } from "./constants.js"; import { otlpSpanExporterFromEnv } from "@space/runtime"; import { createActivityObservabilityInterceptors } from "./activity-observability.js"; +import { workerSpanSinks } from "./workflow-spans-sink.js"; import { reloadWhenServicesCommitChanges } from "./deployed-code-reload.js"; const service = "space-memory-maintenance-worker"; @@ -23,6 +24,9 @@ if (!memoryMaintenanceEnabled(process.env)) { try { const connection = await NativeConnection.connect({ address }); const spans = otlpSpanExporterFromEnv(process.env, service); + const workflowInterceptorModules = spans + ? [fileURLToPath(new URL("./workflow-observability-interceptors.js", import.meta.url))] + : []; const worker = await Worker.create({ connection, namespace, @@ -30,7 +34,11 @@ if (!memoryMaintenanceEnabled(process.env)) { workflowsPath, activities, ...memoryMaintenanceWorkerOptions, - interceptors: { activity: [createActivityObservabilityInterceptors({ spans })] } + interceptors: { + activity: [createActivityObservabilityInterceptors({ spans })], + workflowModules: workflowInterceptorModules + }, + sinks: workerSpanSinks(spans) }); console.log(JSON.stringify({ service, diff --git a/apps/worker/src/memory-mutation-worker.ts b/apps/worker/src/memory-mutation-worker.ts index c2eadf657..8469d832d 100644 --- a/apps/worker/src/memory-mutation-worker.ts +++ b/apps/worker/src/memory-mutation-worker.ts @@ -5,6 +5,7 @@ import { MEMORY_MUTATION_TASK_QUEUE, memoryMutationsEnabled, memoryMutationWorke import { DEFAULT_TEMPORAL_ADDRESS, DEFAULT_TEMPORAL_NAMESPACE } from "./constants.js"; import { otlpSpanExporterFromEnv } from "@space/runtime"; import { createActivityObservabilityInterceptors } from "./activity-observability.js"; +import { workerSpanSinks } from "./workflow-spans-sink.js"; import { reloadWhenServicesCommitChanges } from "./deployed-code-reload.js"; const service = "space-memory-mutation-worker"; @@ -16,6 +17,9 @@ if (!memoryMutationsEnabled(process.env)) { const namespace = process.env.SPACE_TEMPORAL_NAMESPACE ?? DEFAULT_TEMPORAL_NAMESPACE; const connection = await NativeConnection.connect({ address }); const spans = otlpSpanExporterFromEnv(process.env, service); + const workflowInterceptorModules = spans + ? [fileURLToPath(new URL("./workflow-observability-interceptors.js", import.meta.url))] + : []; const worker = await Worker.create({ connection, namespace, @@ -23,7 +27,11 @@ if (!memoryMutationsEnabled(process.env)) { workflowsPath: fileURLToPath(new URL("./memory-mutation-workflows.js", import.meta.url)), activities: { executePersistedMemoryChangeSet }, ...memoryMutationWorkerOptions, - interceptors: { activity: [createActivityObservabilityInterceptors({ spans })] } + interceptors: { + activity: [createActivityObservabilityInterceptors({ spans })], + workflowModules: workflowInterceptorModules + }, + sinks: workerSpanSinks(spans) }); console.log(JSON.stringify({ service, status: "running", address, namespace, taskQueue: MEMORY_MUTATION_TASK_QUEUE })); const stopReloadWatch = reloadWhenServicesCommitChanges(worker, { log: (message) => console.log(JSON.stringify({ service, status: "reloading", message })) }); diff --git a/apps/worker/src/room-background-continuation.ts b/apps/worker/src/room-background-continuation.ts index e15c29a21..c169d2763 100644 --- a/apps/worker/src/room-background-continuation.ts +++ b/apps/worker/src/room-background-continuation.ts @@ -1,8 +1,10 @@ import { buildCodexAppServerTurnWorkflowId, buildRoomAgentSupervisorWorkflowId, + parseTraceparent, roomAgentSupervisorQueueItemSchema, spaceAgentRoomActionRequestSchema, + traceparentForTraceId, type RoomAgentActionRecord, type RoomAgentSupervisorQueueItem } from "@space/contracts"; @@ -10,6 +12,7 @@ import { SpaceConflictError, redactMemoryText, type SpaceStore } from "@space/ru import { roomActionSummary } from "./room-action-summary.js"; import { DEFAULT_ROOM_AGENT_MAX_CONTINUATIONS, DEFAULT_ROOM_AGENT_MAX_MISSION_TOKENS, ROOM_AGENT_CONTINUATION_LIMIT, ROOM_AGENT_TOKEN_LIMIT } from "./room-agent-limits.js"; +/** Summarizes completed action records within the given character budget for background continuation. */ export function continuationEvidence(actions: RoomAgentActionRecord[], budget: number): string { // Count the entire mission, including synchronous actions. Background roots // are only a scheduling distinction, not the record of completed work. @@ -45,6 +48,7 @@ export type BackgroundContinuationResult = interface MissionTokenUsage { usedTokens: number; countedThroughRunId: string } +/** Reads normalized token usage totals from a persisted turn execution state, if present. */ function recordedTokenUsage(executionState: Record): MissionTokenUsage | null { const value = executionState.tokenUsage as Partial | undefined; return value && Number.isSafeInteger(value.usedTokens) && (value.usedTokens as number) >= 0 && typeof value.countedThroughRunId === "string" @@ -52,6 +56,7 @@ function recordedTokenUsage(executionState: Record): MissionTok : null; } +/** Evaluates and schedules a bounded background continuation turn when an agent turn hits its budget. */ export async function prepareBackgroundContinuation(input: { roomId: string; missionId: string; continuationId: string; }, store: SpaceStore, maxContinuations = DEFAULT_ROOM_AGENT_MAX_CONTINUATIONS, @@ -122,6 +127,10 @@ maxMissionTokens: number | null = DEFAULT_ROOM_AGENT_MAX_MISSION_TOKENS): Promis ].join("\n"); const prefix = `${instructions}\n\nOperator request:\n${request}\n\nSettled action results (bounded; inspect for details):\n`; const prompt = prefix + continuationEvidence(actions, Math.max(0, 8000 - prefix.length)); + const continuationTraceId = `trace:bg-${input.continuationId}`; + const sourceTraceparent = parseTraceparent(source.queueItem.turn.traceparent) + ? source.queueItem.turn.traceparent + : traceparentForTraceId(source.queueItem.turn.traceId); const item = roomAgentSupervisorQueueItemSchema.parse({ missionId: input.missionId, turn: { ...source.queueItem.turn, prompt, roomAgentOperatorRequest: request, @@ -130,7 +139,12 @@ maxMissionTokens: number | null = DEFAULT_ROOM_AGENT_MAX_MISSION_TOKENS): Promis agentUserMessageId: `agent_msg:bg-context-${input.continuationId}`, agentAssistantMessageId: `agent_msg:bg-response-${input.continuationId}`, // Resolve the current native thread from the durable session when executing. - agentThreadId: null, traceId: `trace:bg-${input.continuationId}` + agentThreadId: null, traceId: continuationTraceId, + // A continuation always starts its own deterministic W3C trace and links + // to the run it continues (the source turn's traceparent, or one derived + // from its Space trace id when the source had no inbound header). + traceparent: traceparentForTraceId(continuationTraceId), + ...(sourceTraceparent ? { sourceTraceparent } : {}) } }); try { const enqueued = await store.enqueueRoomAgentMission({ @@ -150,6 +164,7 @@ maxMissionTokens: number | null = DEFAULT_ROOM_AGENT_MAX_MISSION_TOKENS): Promis } // Without an errorCode the turn was superseded or stopped; with one it failed and keeps that cause. +/** Marks a queued supervisor turn and its mission as discarded when it cannot be executed. */ export async function discardSupervisorTurn(item: RoomAgentSupervisorQueueItem, reason: string, store: SpaceStore, errorCode?: string) { const record = await store.getRoomAgentTurn(item.missionId, item.turn.agentRunId); if (!record || !["QUEUED", "RUNNING"].includes(record.run.status)) return; @@ -161,6 +176,7 @@ export async function discardSupervisorTurn(item: RoomAgentSupervisorQueueItem, await store.updateSpaceAgentMessage(record.run.responseMessageId, { status, content: reason }); } +/** Resolves whether a queued supervisor turn is ready to run, paused on mission state, or should be skipped. */ export async function supervisorTurnState(item: RoomAgentSupervisorQueueItem, store: SpaceStore): Promise<"READY" | "PAUSED" | "SKIP"> { const mission = await store.getRoomAgentMission(item.turn.roomId, item.missionId); const record = await store.getRoomAgentTurn(item.missionId, item.turn.agentRunId); @@ -181,6 +197,7 @@ export async function supervisorTurnState(item: RoomAgentSupervisorQueueItem, st return "READY"; } +/** Finalizes a supervisor turn and decides whether to schedule a background continuation. */ export async function finishSupervisorTurn(input: { item: RoomAgentSupervisorQueueItem; status: "COMPLETED" | "FAILED" | "INTERRUPTED"; statusReason: string; errorCode?: string; }, store: SpaceStore) { diff --git a/apps/worker/src/worker.ts b/apps/worker/src/worker.ts index 83d23cbc6..67d6838ca 100644 --- a/apps/worker/src/worker.ts +++ b/apps/worker/src/worker.ts @@ -7,6 +7,7 @@ import { TelegramDeliveryWorker, TelegramSecretStore, otlpSpanExporterFromEnv } import { NativeConnection, Runtime, Worker } from "@temporalio/worker"; import * as activities from "./activities.js"; import { createActivityObservabilityInterceptors } from "./activity-observability.js"; +import { workerSpanSinks } from "./workflow-spans-sink.js"; import { resolveTemporalCoreMetricsBind, resolveWorkerMetricsListen, startWorkerMetricsServer } from "./worker-metrics.js"; import { workerLog } from "./worker-log.js"; import { sweepCodexCliCompletions } from "./codex-cli-completion.js"; @@ -22,6 +23,7 @@ const namespace = process.env.SPACE_TEMPORAL_NAMESPACE ?? DEFAULT_TEMPORAL_NAMES const taskQueue = process.env.SPACE_TEMPORAL_TASK_QUEUE ?? DEFAULT_TASK_QUEUE; const workflowsPath = fileURLToPath(new URL("./workflows.js", import.meta.url)); +/** Parses a polling interval in milliseconds and clamps it between 1s and 60s. */ function boundedInterval(value: string | undefined): number { const parsed = Number.parseInt(value ?? "2000", 10); return Number.isFinite(parsed) ? Math.max(1_000, Math.min(parsed, 60_000)) : 2_000; @@ -37,15 +39,24 @@ if (temporalCoreMetricsBind) { const connection = await NativeConnection.connect({ address }); const spans = otlpSpanExporterFromEnv(process.env, "space-worker"); +// Structured, correlated activity records and worker metrics, plus workflow +// spans: the interceptor module runs inside the workflow sandbox but exports +// only through the workerSpans sink (callDuringReplay: false), so replay +// behaviour and determinism are unchanged. Off unless the endpoint is set. +const workflowInterceptorModules = spans + ? [fileURLToPath(new URL("./workflow-observability-interceptors.js", import.meta.url))] + : []; const worker = await Worker.create({ connection, namespace, taskQueue, workflowsPath, activities, - // Structured, correlated activity records and worker metrics. Activity-side - // only: the workflow sandbox and its replay behaviour are unchanged. - interceptors: { activity: [createActivityObservabilityInterceptors({ spans })] } + interceptors: { + activity: [createActivityObservabilityInterceptors({ spans })], + workflowModules: workflowInterceptorModules + }, + sinks: workerSpanSinks(spans) }); // Optional loopback-only Prometheus endpoint for worker metrics. diff --git a/apps/worker/src/workflow-observability-interceptors.ts b/apps/worker/src/workflow-observability-interceptors.ts new file mode 100644 index 000000000..0ef5d77c8 --- /dev/null +++ b/apps/worker/src/workflow-observability-interceptors.ts @@ -0,0 +1,170 @@ +/** + * Workflow-side span observability. This module runs INSIDE the deterministic + * workflow sandbox: it does no I/O. Spans leave the sandbox only through the + * workerSpans sink (registered with callDuringReplay: false, so replay emits + * nothing), and parent context travels through Temporal headers: + * + * - activities and child workflows get the workflow span as their parent + * (header kind "parent"); + * - a continue-as-new run links to the run it continues (header kind "link"). + * + * Registered from the worker entrypoints through + * WorkerOptions.interceptors.workflowModules; the module must export an + * interceptors() factory. + */ + +import { + ContinueAsNew, + isCancellation, + proxySinks, + workflowInfo, + type ActivityInput, + type ContinueAsNewInput, + type Headers, + type LocalActivityInput, + type SignalInput, + type StartChildWorkflowExecutionInput, + type Sinks, + type WorkflowExecuteInput, + type WorkflowInterceptors, + type WorkflowOutboundCallsInterceptor +} from "@temporalio/workflow"; +import { + SPAN_CONTEXT_HEADER, + decodeSpanContextHeader, + encodeSpanContextHeader, + workflowSpanCorrelation, + workflowSpanId, + workflowTraceId, + type WorkerSpanSinkDefinitions, + type WorkflowSpanContextHeader, + type WorkflowSpanEvent, + type WorkflowSpanLink +} from "./workflow-span-context.js"; + +type WorkerSpanSinks = Sinks & WorkerSpanSinkDefinitions; + +const { workerSpans } = proxySinks(); + +/** Temporal workflow interceptor factory that propagates span context and emits workflow spans. */ +export function interceptors(): WorkflowInterceptors { + // Resolved by inbound execute (and later handleSignal), which always runs + // before any outbound call of the same activation. Pure function of the + // workflow input, memo, and signal args, so replay reproduces identical headers. + let current: { traceId: string; spanId: string } | null = null; + let startedWithoutInputTraceparent = false; + let spanParentId: string | null = null; + let spanAttributes: Record = {}; + + const withParentHeader = (headers: Headers): Headers => + current + ? { ...headers, [SPAN_CONTEXT_HEADER]: encodeSpanContextHeader({ ...current, kind: "parent" }) } + : headers; + + const outbound: WorkflowOutboundCallsInterceptor = { + scheduleActivity: (input: ActivityInput, next) => next({ ...input, headers: withParentHeader(input.headers) }), + scheduleLocalActivity: (input: LocalActivityInput, next) => next({ ...input, headers: withParentHeader(input.headers) }), + startChildWorkflowExecution: (input: StartChildWorkflowExecutionInput, next) => next({ ...input, headers: withParentHeader(input.headers) }), + continueAsNew: (input: ContinueAsNewInput, next) => + next({ + ...input, + headers: current + ? { ...input.headers, [SPAN_CONTEXT_HEADER]: encodeSpanContextHeader({ ...current, kind: "link" }) } + : input.headers + }) + }; + + const adoptSignalCorrelation = (args: readonly unknown[]): void => { + if (!startedWithoutInputTraceparent) return; + const correlation = workflowSpanCorrelation(args); + if (correlation.traceparent && current) { + current = { traceId: correlation.traceparent.traceId, spanId: current.spanId }; + spanParentId = correlation.traceparent.parentId; + } + for (const [key, value] of Object.entries(correlation.attributes)) spanAttributes[key] = value; + }; + + return { + inbound: [ + { + execute: async (input: WorkflowExecuteInput, next) => { + const info = workflowInfo(); + const correlation = workflowSpanCorrelation(input.args, info.memo); + const header: WorkflowSpanContextHeader | null = decodeSpanContextHeader(input.headers?.[SPAN_CONTEXT_HEADER]); + const inputTrace = correlation.traceparent; + const links: WorkflowSpanLink[] = []; + let traceId: string; + let parentSpanId: string | null; + if (header && header.kind === "parent" && (!inputTrace || inputTrace.traceId === header.traceId)) { + // Scheduled by an observed workflow of the same trace: nest + // under its span. When the input carries a different trace (a + // turn signalled into a long-running supervisor), the input's + // traceparent is the truer origin and wins below. + traceId = header.traceId; + parentSpanId = header.spanId; + } else { + // API-started: parent to the propagated traceparent span id. + // Otherwise: a fresh deterministic trace for worker-internal runs. + traceId = inputTrace ? inputTrace.traceId : workflowTraceId(info.workflowId, info.runId); + parentSpanId = inputTrace ? inputTrace.parentId : null; + } + if (header && header.kind === "link") { + // A continue-as-new run links to the run it continues. + links.push({ traceId: header.traceId, spanId: header.spanId }); + } + if (correlation.sourceTraceparent) { + // A background continuation links to the trace of the run it continues. + links.push({ traceId: correlation.sourceTraceparent.traceId, spanId: correlation.sourceTraceparent.parentId }); + } + const span = { traceId, spanId: workflowSpanId(info.workflowId, info.runId) }; + current = span; + startedWithoutInputTraceparent = !inputTrace; + spanParentId = parentSpanId; + spanAttributes = { ...correlation.attributes }; + const startedAtMs = Date.now(); + const emit = (outcome: WorkflowSpanEvent["outcome"]) => { + workerSpans.workflowSpan({ + traceId: current!.traceId, + spanId: current!.spanId, + parentSpanId: spanParentId, + name: "workflow " + info.workflowType, + workflowType: info.workflowType, + workflowId: info.workflowId, + runId: info.runId, + attempt: info.attempt, + startedAtMs, + endedAtMs: Date.now(), + outcome, + attributes: { + ...spanAttributes, + "space.workflow_type": info.workflowType, + "space.attempt": info.attempt, + "space.outcome": outcome + }, + links + }); + }; + try { + const result = await next(input); + emit("COMPLETED"); + return result; + } catch (error) { + if (error instanceof ContinueAsNew) emit("CONTINUED"); + else emit(isCancellation(error) ? "CANCELLED" : "FAILED"); + throw error; + } + }, + handleSignal: async (input: SignalInput, next) => { + // A long-running supervisor (roomAgentSupervisorWorkflow) starts + // without a traceparent; enqueueRoomAgentTurn-style signals carry + // the request's correlation. Adopt it for outbound work after the + // signal. Replay re-delivers signals in order, so headers stay + // deterministic. + adoptSignalCorrelation(input.args); + await next(input); + } + } + ], + outbound: [outbound] + }; +} diff --git a/apps/worker/src/workflow-span-context.ts b/apps/worker/src/workflow-span-context.ts new file mode 100644 index 000000000..66e9cb909 --- /dev/null +++ b/apps/worker/src/workflow-span-context.ts @@ -0,0 +1,199 @@ +/** + * Pure helpers for workflow span context: deterministic span ids, the Temporal + * header payload that parents activities and child workflows to the workflow + * span, and the attribute allowlist for exported spans. + * + * Importable from inside the deterministic workflow sandbox (no node: imports, + * no I/O) and from worker code and tests alike. + */ + +import { parseTraceparent, type ParsedTraceparent } from "@space/contracts"; + +/** Temporal header that carries the workflow run's span context to activities and child workflows. */ +export const SPAN_CONTEXT_HEADER = "space.span-context"; + +/** The span context of the workflow run that scheduled the call. */ +export interface WorkflowSpanContextHeader { + traceId: string; + spanId: string; + /** parent: the caller's span becomes a child of this span; link: the caller links to it (continue-as-new). */ + kind: "parent" | "link"; +} + +/** An OTLP span link to the trace or run this workflow continues. */ +export interface WorkflowSpanLink { + traceId: string; + spanId: string; + attributes?: Readonly>; +} + +export type WorkflowOutcome = "COMPLETED" | "FAILED" | "CANCELLED" | "CONTINUED"; + +/** What the workflow sandbox emits through the workerSpans sink. Primitives only: the value is copied out of the sandbox. */ +export interface WorkflowSpanEvent { + traceId: string; + spanId: string; + parentSpanId: string | null; + name: string; + workflowType: string; + workflowId: string; + runId: string; + attempt: number; + startedAtMs: number; + endedAtMs: number; + outcome: WorkflowOutcome; + attributes: Record; + links: readonly WorkflowSpanLink[]; +} + +/** Sink shape shared by the sandbox (proxySinks) and the worker (InjectedSinks). */ +export type WorkerSpanSinkDefinitions = { + workerSpans: { + workflowSpan: (event: WorkflowSpanEvent) => void; + }; +}; + +/** Attribute keys that may ever leave the worker. Anything else is dropped, in the sink and in tests. */ +export const WORKFLOW_SPAN_ATTRIBUTE_ALLOWLIST = [ + "space.workflow_type", + "space.activity_type", + "space.outcome", + "space.attempt", + "space.reason_code", + "space.category", + "space.room_id", + "space.pane_id", + "space.mission_id", + "space.goal_id", + "space.dot_id", + "space.space_trace_id", + "space.continuation_generation" +] as const; + +export type WorkflowSpanAttributeKey = (typeof WORKFLOW_SPAN_ATTRIBUTE_ALLOWLIST)[number]; + +const FNV1A_OFFSET = 0xcbf29ce484222325n; +const FNV1A_PRIME = 0x100000001b3n; + +/** Deterministic FNV-1a 64-bit hash as 16 lowercase hex digits. */ +export function fnv1a64Hex(value: string): string { + let hash = FNV1A_OFFSET; + for (let index = 0; index < value.length; index++) { + hash ^= BigInt(value.charCodeAt(index) & 0xff); + hash = BigInt.asUintN(64, hash * FNV1A_PRIME); + } + return hash.toString(16).padStart(16, "0"); +} + +/** Deterministic span id for one workflow run; stable across replays of the same history. */ +export function workflowSpanId(workflowId: string, runId: string): string { + return fnv1a64Hex(workflowId + "|" + runId + "|span"); +} + +/** Deterministic 32-hex trace id for workflow runs that no traceparent parented. */ +export function workflowTraceId(workflowId: string, runId: string): string { + return fnv1a64Hex(workflowId + "|" + runId + "|trace-a") + fnv1a64Hex(workflowId + "|" + runId + "|trace-b"); +} + +// Identifier keys scanned from workflow input. Prompts, model output and other +// user text are never read, only these keys and only as short identifiers. +const idKeys = ["traceparent", "sourceTraceparent", "traceId", "spaceTraceId", "roomId", "paneId", "missionId", "roomAgentMissionId", "goalId", "dotId"] as const; +const nestedKeys = ["turn", "item", "bridge", "input", "turnInput"] as const; + +export interface WorkflowSpanCorrelation { + /** W3C trace context propagated in the workflow input, when present. */ + traceparent: ParsedTraceparent | null; + /** W3C trace context of the run a background continuation continues. */ + sourceTraceparent: ParsedTraceparent | null; + /** The internal Space trace id (not a W3C id) when the input carries one. */ + spaceTraceId: string | null; + /** Allowlisted attributes only. */ + attributes: Record; +} + +/** Returns a bounded identifier when it matches the safe attribute format, or null. */ +function safeIdentifier(value: unknown): string | null { + return typeof value === "string" && /^[A-Za-z0-9:._-]{1,128}$/.test(value) ? value : null; +} + +/** Recursively extracts correlation identifiers from workflow arguments up to a bounded depth. */ +function readSpanCorrelation(value: unknown, found: Record, depth: number): void { + if (!value || typeof value !== "object" || Array.isArray(value) || depth < 0) return; + const record = value as Record; + for (const key of idKeys) { + if (found[key] !== undefined) continue; + const identifier = safeIdentifier(record[key]); + if (identifier !== null) found[key] = identifier; + } + const continuation = record.roomAgentContinuation; + if (continuation && typeof continuation === "object" && !Array.isArray(continuation)) { + const generation = (continuation as Record).generation; + if (Number.isInteger(generation) && (generation as number) >= 0 && (generation as number) <= 100) { + found.continuationGeneration = generation; + } + } + if (depth <= 0) return; + for (const key of nestedKeys) readSpanCorrelation(record[key], found, depth - 1); +} + +/** Allowlisted correlation (trace context and ids) from workflow input arguments, then Temporal memo. */ +export function workflowSpanCorrelation(args: readonly unknown[], memo?: Record): WorkflowSpanCorrelation { + const found: Record = {}; + for (const arg of args) readSpanCorrelation(arg, found, 2); + if (memo) readSpanCorrelation(memo, found, 2); + const attributes: Record = {}; + const traceId = typeof found.traceId === "string" ? found.traceId : (typeof found.spaceTraceId === "string" ? found.spaceTraceId : null); + const roomId = typeof found.roomId === "string" ? found.roomId : null; + const paneId = typeof found.paneId === "string" ? found.paneId : null; + const missionId = typeof found.missionId === "string" ? found.missionId : (typeof found.roomAgentMissionId === "string" ? found.roomAgentMissionId : null); + const goalId = typeof found.goalId === "string" ? found.goalId : null; + const dotId = typeof found.dotId === "string" ? found.dotId : null; + if (roomId) attributes["space.room_id"] = roomId; + if (paneId) attributes["space.pane_id"] = paneId; + if (missionId) attributes["space.mission_id"] = missionId; + if (goalId) attributes["space.goal_id"] = goalId; + if (dotId) attributes["space.dot_id"] = dotId; + if (traceId) attributes["space.space_trace_id"] = traceId; + if (typeof found.continuationGeneration === "number") attributes["space.continuation_generation"] = found.continuationGeneration; + return { + traceparent: parseTraceparent(found.traceparent ?? null), + sourceTraceparent: parseTraceparent(found.sourceTraceparent ?? null), + spaceTraceId: traceId, + attributes + }; +} + +/** Encode a span-context header as a default JSON payload (json/plain metadata, JSON data). */ +export function encodeSpanContextHeader(header: WorkflowSpanContextHeader): { metadata: Record; data: Uint8Array } { + const encoder = new TextEncoder(); + return { + metadata: { encoding: encoder.encode("json/plain") }, + data: encoder.encode(JSON.stringify(header)) + }; +} + +const traceIdPattern = /^[0-9a-f]{32}$/; +const spanIdPattern = /^[0-9a-f]{16}$/; + +/** Decode a span-context header payload; null unless it is exactly the expected shape. */ +export function decodeSpanContextHeader(payload: unknown): WorkflowSpanContextHeader | null { + if (!payload || typeof payload !== "object" || Array.isArray(payload)) return null; + const record = payload as { data?: unknown }; + let text: string; + try { + const data = record.data; + if (!data || typeof data !== "object" || typeof (data as Uint8Array).length !== "number" || (data as Uint8Array).length === 0) return null; + text = new TextDecoder().decode(data as Uint8Array); + const parsed = JSON.parse(text) as Record; + if (!parsed || typeof parsed !== "object") return null; + const traceId = parsed.traceId; + const spanId = parsed.spanId; + const kind = parsed.kind; + if (typeof traceId !== "string" || !traceIdPattern.test(traceId)) return null; + if (typeof spanId !== "string" || !spanIdPattern.test(spanId)) return null; + if (kind !== "parent" && kind !== "link") return null; + return { traceId, spanId, kind }; + } catch { + return null; + } +} diff --git a/apps/worker/src/workflow-spans-sink.ts b/apps/worker/src/workflow-spans-sink.ts new file mode 100644 index 000000000..d75d23e5b --- /dev/null +++ b/apps/worker/src/workflow-spans-sink.ts @@ -0,0 +1,111 @@ +/** + * Worker-side end of the workerSpans sink. Workflow spans recorded by the + * sandbox interceptor arrive here (never during replay: the sink is registered + * with callDuringReplay: false). This module validates and prunes everything + * before handing a span to the shared OTLP exporter: unknown attribute keys + * are dropped, ids must be exactly hex, and string values are bounded so a + * malformed sandbox event can never export unexpected data. + */ + +import type { InjectedSinks } from "@temporalio/worker"; +import type { SpanExporter } from "@space/runtime"; +import { + WORKFLOW_SPAN_ATTRIBUTE_ALLOWLIST, + type WorkerSpanSinkDefinitions, + type WorkflowSpanEvent +} from "./workflow-span-context.js"; + +const traceIdPattern = /^[0-9a-f]{32}$/; +const spanIdPattern = /^[0-9a-f]{16}$/; +const MAX_LINKS = 8; + +/** Validates that a span attribute value is a safe, bounded string or finite integer. */ +function attributeValue(value: unknown): string | number | null { + if (typeof value === "number") { + return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER ? value : null; + } + return typeof value === "string" && value.length <= 128 ? value : null; +} + +/** Filter an event down to exactly what may be exported; null when its ids are invalid. */ +export function sanitizeWorkflowSpanEvent(event: WorkflowSpanEvent): WorkflowSpanEvent | null { + if (!event || typeof event !== "object") return null; + if (typeof event.traceId !== "string" || !traceIdPattern.test(event.traceId)) return null; + if (typeof event.spanId !== "string" || !spanIdPattern.test(event.spanId)) return null; + const parentSpanId = typeof event.parentSpanId === "string" && spanIdPattern.test(event.parentSpanId) + ? event.parentSpanId + : null; + const workflowType = typeof event.workflowType === "string" && event.workflowType.length <= 200 ? event.workflowType : "unknown"; + const attributes: Record = {}; + const source = event.attributes && typeof event.attributes === "object" ? event.attributes : {}; + for (const key of WORKFLOW_SPAN_ATTRIBUTE_ALLOWLIST) { + const value = attributeValue((source as Record)[key]); + if (value !== null) attributes[key] = value; + } + const links = Array.isArray(event.links) + ? event.links + .filter((link): link is { traceId: string; spanId: string } => + Boolean(link) && typeof link === "object" && typeof (link as Record).traceId === "string" && + traceIdPattern.test((link as Record).traceId as string) && + typeof (link as Record).spanId === "string" && + spanIdPattern.test((link as Record).spanId as string)) + .slice(0, MAX_LINKS) + .map((link) => ({ traceId: link.traceId, spanId: link.spanId })) + : []; + const startedAtMs = Number.isFinite(event.startedAtMs) && event.startedAtMs >= 0 ? Math.floor(event.startedAtMs) : 0; + const endedAtMs = Number.isFinite(event.endedAtMs) && event.endedAtMs >= startedAtMs ? Math.floor(event.endedAtMs) : startedAtMs; + const outcome = event.outcome === "COMPLETED" || event.outcome === "FAILED" || event.outcome === "CANCELLED" || event.outcome === "CONTINUED" + ? event.outcome + : "COMPLETED"; + return { + traceId: event.traceId, + spanId: event.spanId, + parentSpanId, + name: "workflow " + workflowType, + workflowType, + workflowId: typeof event.workflowId === "string" && event.workflowId.length <= 256 ? event.workflowId : "", + runId: typeof event.runId === "string" && event.runId.length <= 256 ? event.runId : "", + attempt: Number.isInteger(event.attempt) && (event.attempt as number) >= 0 ? (event.attempt as number) : 1, + startedAtMs, + endedAtMs, + outcome, + attributes, + links + }; +} + +/** Record one sanitized workflow span on the shared exporter. */ +export function recordWorkflowSpan(spans: SpanExporter, raw: WorkflowSpanEvent): void { + const event = sanitizeWorkflowSpanEvent(raw); + if (!event) return; + spans.record({ + traceId: event.traceId, + spanId: event.spanId, + parentSpanId: event.parentSpanId, + name: event.name, + startTimeUnixNano: BigInt(event.startedAtMs) * 1000000n, + endTimeUnixNano: BigInt(event.endedAtMs) * 1000000n, + attributes: event.attributes, + error: event.outcome === "FAILED", + kind: 1, + ...(event.links.length ? { links: event.links } : {}) + }); +} + +/** + * The workerSpans sink for WorkerOptions.sinks: exports finished workflow + * spans through the shared exporter, never during replay. Undefined when the + * exporter is off, so nothing is registered at all. + */ +export function workerSpanSinks(spans: SpanExporter | null): InjectedSinks | undefined { + if (!spans) return undefined; + return { + workerSpans: { + workflowSpan: { + // callDuringReplay defaults to false: replay emits no duplicate spans. + fn: (_info, event) => recordWorkflowSpan(spans, event), + callDuringReplay: false + } + } + }; +} diff --git a/apps/worker/tests/activity-observability.test.ts b/apps/worker/tests/activity-observability.test.ts index 654bf7962..6492f0f27 100644 --- a/apps/worker/tests/activity-observability.test.ts +++ b/apps/worker/tests/activity-observability.test.ts @@ -30,6 +30,7 @@ const info = (overrides: Partial[0]> ...overrides }); +/** Captures structured log entries, metrics, and exported spans for activity observability assertions. */ function capture() { const records: Array> = []; const lines: string[] = []; @@ -182,11 +183,13 @@ describe("worker metrics endpoint", () => { }); }); -it("registers the activity interceptor on every Temporal worker, including both memory workers", async () => { +it("registers the activity interceptor, workflow interceptor modules and the workflow span sink on every Temporal worker, including both memory workers", async () => { const { readFile } = await import("node:fs/promises"); for (const entry of ["worker.ts", "memory-maintenance-worker.ts", "memory-mutation-worker.ts"]) { const source = await readFile(new URL(`../src/${entry}`, import.meta.url), "utf8"); - expect(source, entry).toMatch(/interceptors: \{ activity: \[createActivityObservabilityInterceptors\(\{ spans \}\)\] \}/); + expect(source, entry).toMatch(/createActivityObservabilityInterceptors\(\{ spans \}\)/); + expect(source, entry).toMatch(/workflow-observability-interceptors\.js/); + expect(source, entry).toMatch(/sinks: workerSpanSinks\(spans\)/); } }); @@ -203,3 +206,35 @@ it("exports one INTERNAL span per activity under the caller's traceparent", asyn expect(recorded[0]).toMatchObject({ traceId: "4bf92f3577b34da6a3ce929d0e0e4736", parentSpanId: "00f067aa0ba902b7", name: "activity runTurn", kind: 1, error: false, startTimeUnixNano: 1_000_000_000n, endTimeUnixNano: 1_250_000_000n }); }); + +it("nests the activity span under the workflow span header and exports the reason code and category", async () => { + const recorded: Array> = []; + const spans = { record: (span: Record) => recorded.push(span), flush: async () => undefined, close: async () => undefined, stats: () => ({ exported: 0, dropped: 0, failed: 0 }) }; + const metrics = createWorkerMetrics(new MetricsRegistry()); + const info = { + activityType: "runTurn", activityId: "1", attempt: 2, currentAttemptScheduledTimestampMs: 0, + workflowType: "codexAppServerTurnWorkflow", workflowExecution: { workflowId: "w", runId: "r" } + } as never; + const workflowSpan = { traceId: "cd1f4bf57516094773a6a3ce929d0e0e4736", spanId: "abcdef0123456789", kind: "parent" }; + await observeActivityExecution(info, [{ traceparent: "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01" }], async () => { + noteActivityFailureReason("CODEX_APP_SERVER_TURN_TIMEOUT"); + return { status: "FAILED" }; + }, { metrics, spans: spans as never, workflowSpan }); + expect(recorded).toHaveLength(1); + expect(recorded[0]).toMatchObject({ + traceId: "cd1f4bf57516094773a6a3ce929d0e0e4736", + parentSpanId: "abcdef0123456789", + attributes: { + "space.activity_type": "runTurn", + "space.outcome": "FAILED_RESULT", + "space.attempt": 2, + "space.workflow_type": "codexAppServerTurnWorkflow", + "space.reason_code": "CODEX_APP_SERVER_TURN_TIMEOUT", + "space.category": "TIMEOUT" + }, + error: true + }); + // A link-kind header never parents an activity. + await observeActivityExecution(info, [], async () => "ok", { metrics, spans: spans as never, workflowSpan: { ...workflowSpan, kind: "link" } }); + expect(recorded).toHaveLength(1); +}); diff --git a/apps/worker/tests/room-background-continuation.test.ts b/apps/worker/tests/room-background-continuation.test.ts index 127ccb649..45b4ce45d 100644 --- a/apps/worker/tests/room-background-continuation.test.ts +++ b/apps/worker/tests/room-background-continuation.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from "vitest"; -import { roomAgentSupervisorInputSchema } from "@space/contracts"; +import { parseTraceparent, roomAgentSupervisorInputSchema, traceparentForTraceId } from "@space/contracts"; import { continuationEvidence, discardSupervisorTurn, finishSupervisorTurn, prepareBackgroundContinuation, supervisorTurnState } from "../src/room-background-continuation.js"; import { continuationFixture } from "./room-continuation-fixture.js"; @@ -86,6 +86,18 @@ describe("durable background continuation", () => { expect(executor).not.toHaveBeenCalled(); expect(await supervisorTurnState(item, c.store)).toBe("READY"); }); + it("starts a continuation on its own W3C trace and links sourceTraceparent to the source turn", async () => { + const c = continuationFixture(); + const prepared = await prepareBackgroundContinuation(c.input, c.store); + if (prepared.state !== "READY") throw Error("Missing continuation"); + expect(prepared.item.turn.traceId).toBe("trace:bg-test-1"); + expect(prepared.item.turn.traceparent).toBe(traceparentForTraceId("trace:bg-test-1")); + expect(parseTraceparent(prepared.item.turn.traceparent)).toMatchObject({ flags: "01" }); + expect(prepared.item.turn.sourceTraceparent).toBe(traceparentForTraceId(c.initial.queueItem.turn.traceId)); + expect(parseTraceparent(prepared.item.turn.sourceTraceparent)?.traceId) + .not.toBe(parseTraceparent(prepared.item.turn.traceparent)?.traceId); + }); + it.each(["OPEN_TYPES", "CONFIGURE_PANE"] as const)("continues %s with the entire request and real results", async (type) => { const c = continuationFixture(type); const result = await prepareBackgroundContinuation(c.input, c.store); diff --git a/apps/worker/tests/support/traced-workflows.ts b/apps/worker/tests/support/traced-workflows.ts new file mode 100644 index 000000000..1fac80718 --- /dev/null +++ b/apps/worker/tests/support/traced-workflows.ts @@ -0,0 +1,75 @@ +/** + * Workflows for the workflow-span integration and replay tests. Started by + * name (string) from the test so the client never imports workflow code; the + * worker bundles this file with the same workflow interceptor module as + * production. + */ + +import { condition, continueAsNew, defineSignal, executeChild, proxyActivities, setHandler } from "@temporalio/workflow"; + +interface EchoInput { + value: string; + roomId: string; + traceparent?: string; + sourceTraceparent?: string; + /** Never allowlisted: proves prompts cannot leak into spans. */ + prompt?: string; +} + +const { echo } = proxyActivities<{ + echo(input: EchoInput): Promise; +}>({ startToCloseTimeout: "10 seconds", retry: { maximumAttempts: 1 } }); + +export interface TracedTurnInput extends EchoInput { + fail?: boolean; + /** A traceparent of a different trace, as a signalled turn carries. */ + childTraceparent?: string; +} + +/** Root workflow fixture that invokes an activity and a child workflow under one trace. */ +export async function tracedRootWorkflow(input: TracedTurnInput): Promise { + await echo({ value: "root", roomId: input.roomId, traceparent: input.traceparent, prompt: input.prompt }); + await executeChild(tracedChildWorkflow, { args: [input] }); + return "done"; +} + +/** Child workflow fixture that executes a single traced echo activity. */ +export async function tracedChildWorkflow(input: TracedTurnInput): Promise { + await echo({ value: "child", roomId: input.roomId, traceparent: input.traceparent, prompt: input.prompt }); + return "child-done"; +} + +/** + * A turn signalled into an observed long-running supervisor: the child run + * carries a traceparent of a different (newer) request than this workflow's + * own trace, like a Room Agent turn started through a signal. + */ +export async function tracedMixedWorkflow(input: TracedTurnInput): Promise { + await echo({ value: "mixed", roomId: input.roomId, prompt: input.prompt }); + await executeChild(tracedChildWorkflow, { args: [{ ...input, traceparent: input.childTraceparent }] }); + return "mixed-done"; +} + +/** Workflow fixture that continues-as-new once to verify span linking across runs. */ +export async function tracedContinueWorkflow(input: TracedTurnInput & { pass: number }): Promise { + await echo({ value: "continue-" + input.pass, roomId: input.roomId, traceparent: input.traceparent, prompt: input.prompt }); + if (input.pass < 1) return continueAsNew({ ...input, pass: input.pass + 1 }); + return "continued"; +} + +export const enqueueRoomAgentTurn = defineSignal<[{ turn: TracedTurnInput }]>("enqueueRoomAgentTurn"); + +/** + * Long-running supervisor analogue: starts without a traceparent, then a + * signalled turn (enqueueRoomAgentTurn) carries one. Outbound work after the + * signal should join that trace. + */ +export async function tracedSupervisorWorkflow(input: TracedTurnInput): Promise { + let turn: TracedTurnInput | null = null; + setHandler(enqueueRoomAgentTurn, (item) => { + turn = item.turn; + }); + await condition(() => turn !== null); + await echo({ value: "after-signal", roomId: turn!.roomId, traceparent: turn!.traceparent, prompt: input.prompt }); + return "signaled"; +} diff --git a/apps/worker/tests/workflow-span-context.test.ts b/apps/worker/tests/workflow-span-context.test.ts new file mode 100644 index 000000000..bb5875976 --- /dev/null +++ b/apps/worker/tests/workflow-span-context.test.ts @@ -0,0 +1,152 @@ +import { describe, expect, it } from "vitest"; +import { + SPAN_CONTEXT_HEADER, + decodeSpanContextHeader, + encodeSpanContextHeader, + fnv1a64Hex, + workflowSpanCorrelation, + workflowSpanId, + workflowTraceId, + WORKFLOW_SPAN_ATTRIBUTE_ALLOWLIST +} from "../src/workflow-span-context.js"; + +const traceparent = "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"; +const secretPrompt = "PRIVATE PROMPT: deploy with token sk-live-worker-secret-123"; + +describe("deterministic workflow span ids", () => { + it("hashes FNV-1a 64-bit into 16 lowercase hex digits, matching reference vectors", () => { + expect(fnv1a64Hex("")).toBe("cbf29ce484222325"); + expect(fnv1a64Hex("a")).toBe("af63dc4c8601ec8c"); + expect(fnv1a64Hex("foobar")).toBe("85944171f73967e8"); + }); + + it("derives stable 32-hex trace ids and 16-hex span ids per run", () => { + const trace = workflowTraceId("workflow:codex-app-server:room:a", "run-uuid-1"); + expect(trace).toMatch(/^[0-9a-f]{32}$/); + expect(workflowTraceId("workflow:codex-app-server:room:a", "run-uuid-1")).toBe(trace); + expect(workflowTraceId("workflow:codex-app-server:room:a", "run-uuid-2")).not.toBe(trace); + expect(workflowSpanId("workflow:codex-app-server:room:a", "run-uuid-1")).toMatch(/^[0-9a-f]{16}$/); + expect(workflowSpanId("workflow:codex-app-server:room:a", "run-uuid-1")).toBe(workflowSpanId("workflow:codex-app-server:room:a", "run-uuid-1")); + expect(workflowSpanId("workflow:codex-app-server:room:a", "run-uuid-2")).not.toBe(workflowSpanId("workflow:codex-app-server:room:a", "run-uuid-1")); + }); +}); + +describe("workflow span correlation", () => { + it("reads allowlisted ids and trace context from workflow input, never prompts or free text", () => { + const turn = { + roomId: "room:alpha01", + paneId: "pane:alpha01", + prompt: secretPrompt, + traceId: "req:abcdefghijkl", + traceparent, + missionId: "mission:1", + roomAgentContinuation: { sourceRunId: "agent_run:1", generation: 3 } + }; + const correlation = workflowSpanCorrelation([{ turn }]); + expect(correlation.traceparent).toEqual({ traceId: "4bf92f3577b34da6a3ce929d0e0e4736", parentId: "00f067aa0ba902b7", flags: "01" }); + expect(correlation.sourceTraceparent).toBeNull(); + expect(correlation.attributes).toEqual({ + "space.room_id": "room:alpha01", + "space.pane_id": "pane:alpha01", + "space.mission_id": "mission:1", + "space.space_trace_id": "req:abcdefghijkl", + "space.continuation_generation": 3 + }); + const serialized = JSON.stringify(correlation); + expect(serialized).not.toContain("sk-live-worker-secret-123"); + expect(serialized).not.toContain("PRIVATE PROMPT"); + }); + + it("keeps the source trace context of a background continuation and prefers a supervisor queue item mission", () => { + const sourceTraceparent = "00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01"; + const correlation = workflowSpanCorrelation([ + { item: { missionId: "mission:2", turn: { roomId: "room:beta02", traceparent, sourceTraceparent, roomAgentContinuation: { sourceRunId: "agent_run:2", generation: 2 } } } } + ]); + expect(correlation.traceparent?.parentId).toBe("00f067aa0ba902b7"); + expect(correlation.sourceTraceparent).toEqual({ traceId: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", parentId: "bbbbbbbbbbbbbbbb", flags: "01" }); + expect(correlation.attributes["space.mission_id"]).toBe("mission:2"); + expect(correlation.attributes["space.room_id"]).toBe("room:beta02"); + expect(correlation.attributes["space.continuation_generation"]).toBe(2); + }); + + it("exports nothing from unknown shapes", () => { + expect(workflowSpanCorrelation([{ prompt: secretPrompt }, "goal:positional", { roomId: "has spaces in it" }])).toEqual({ + traceparent: null, + sourceTraceparent: null, + spaceTraceId: null, + attributes: {} + }); + }); + + it("reads traceparent, missionId and spaceTraceId from Temporal memo after args, as roomAgentActionWorkflow's workflowCorrelationMemo does", () => { + const memo = { + spaceTraceId: "req:abcdefghijkl", + traceparent, + w3cTraceId: "4bf92f3577b34da6a3ce929d0e0e4736", + parentSpaceTraceId: "req:parent000000", + missionId: "mission:1" + }; + const correlation = workflowSpanCorrelation( + [{ actionId: "room_agent_action:1", bridge: { roomId: "room:alpha01", backgroundExecution: true } }], + memo + ); + expect(correlation.traceparent).toEqual({ traceId: "4bf92f3577b34da6a3ce929d0e0e4736", parentId: "00f067aa0ba902b7", flags: "01" }); + expect(correlation.spaceTraceId).toBe("req:abcdefghijkl"); + expect(correlation.attributes).toEqual({ + "space.room_id": "room:alpha01", + "space.mission_id": "mission:1", + "space.space_trace_id": "req:abcdefghijkl" + }); + const argsWin = workflowSpanCorrelation( + [{ roomId: "room:from-args", traceparent, missionId: "mission:from-args" }], + { roomId: "room:from-memo", missionId: "mission:from-memo", spaceTraceId: "req:from-memo" } + ); + expect(argsWin.attributes["space.room_id"]).toBe("room:from-args"); + expect(argsWin.attributes["space.mission_id"]).toBe("mission:from-args"); + expect(argsWin.spaceTraceId).toBe("req:from-memo"); + }); +}); + +describe("span-context header payload", () => { + it("names the Temporal header space.span-context", () => { + expect(SPAN_CONTEXT_HEADER).toBe("space.span-context"); + }); + + it("round-trips a parent header and a link header as json/plain payloads", () => { + for (const kind of ["parent", "link"] as const) { + const header = { traceId: "4bf92f3577b34da6a3ce929d0e0e4736", spanId: "00f067aa0ba902b7", kind }; + const payload = encodeSpanContextHeader(header); + expect(new TextDecoder().decode(payload.metadata.encoding)).toBe("json/plain"); + expect(decodeSpanContextHeader(payload)).toEqual(header); + } + }); + + it("rejects malformed payloads instead of guessing", () => { + expect(decodeSpanContextHeader(null)).toBeNull(); + expect(decodeSpanContextHeader({})).toBeNull(); + expect(decodeSpanContextHeader({ data: new TextEncoder().encode("not json") })).toBeNull(); + expect(decodeSpanContextHeader({ data: new TextEncoder().encode(JSON.stringify({ traceId: "x", spanId: "y", kind: "parent" })) })).toBeNull(); + expect(decodeSpanContextHeader({ data: new TextEncoder().encode(JSON.stringify({ traceId: "4bf92f3577b34da6a3ce929d0e0e4736", spanId: "00f067aa0ba902b7", kind: "other" })) })).toBeNull(); + expect(decodeSpanContextHeader(encodeSpanContextHeader({ traceId: "00000000000000000000000000000000", spanId: "0000000000000000", kind: "parent" }))).toEqual({ + traceId: "00000000000000000000000000000000", spanId: "0000000000000000", kind: "parent" + }); + }); + + it("keeps the exported attribute allowlist closed", () => { + expect(WORKFLOW_SPAN_ATTRIBUTE_ALLOWLIST).toEqual([ + "space.workflow_type", + "space.activity_type", + "space.outcome", + "space.attempt", + "space.reason_code", + "space.category", + "space.room_id", + "space.pane_id", + "space.mission_id", + "space.goal_id", + "space.dot_id", + "space.space_trace_id", + "space.continuation_generation" + ]); + }); +}); diff --git a/apps/worker/tests/workflow-span-integration.test.ts b/apps/worker/tests/workflow-span-integration.test.ts new file mode 100644 index 000000000..310929d1f --- /dev/null +++ b/apps/worker/tests/workflow-span-integration.test.ts @@ -0,0 +1,298 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest"; +import { createServer, type Server } from "node:http"; +import { fileURLToPath } from "node:url"; +import { Worker } from "@temporalio/worker"; +import { TestWorkflowEnvironment } from "@temporalio/testing"; +import { formatTraceparent } from "@space/contracts"; +import { createOtlpSpanExporter } from "@space/runtime"; +import { createActivityObservabilityInterceptors } from "../src/activity-observability.js"; +import { workerSpanSinks } from "../src/workflow-spans-sink.js"; +import { WORKFLOW_SPAN_ATTRIBUTE_ALLOWLIST, type WorkflowSpanEvent } from "../src/workflow-span-context.js"; + +const taskQueue = "worker-span-test"; +const workflowsPath = fileURLToPath(new URL("./support/traced-workflows.ts", import.meta.url)); +const workflowInterceptorModules = [fileURLToPath(new URL("../src/workflow-observability-interceptors.ts", import.meta.url))]; +const secretPrompt = "PRIVATE PROMPT: deploy with token sk-live-worker-secret-123"; +const apiTraceId = "4bf92f3577b34da6a3ce929d0e0e4736"; +const apiSpanId = "1111111111111111"; + +interface CollectorSpan { + traceId: string; + spanId: string; + parentSpanId?: string; + name: string; + attributes?: Array<{ key: string; value: { stringValue?: string; intValue?: string } }>; + links?: Array<{ traceId: string; spanId: string }>; +} + +/** A fake OTLP/HTTP JSON collector on loopback: records every posted body. */ +async function startCollector() { + const bodies: string[] = []; + const server: Server = createServer((request, response) => { + const chunks: Buffer[] = []; + request.on("data", (chunk) => chunks.push(chunk)); + request.on("end", () => { + bodies.push(Buffer.concat(chunks).toString("utf8")); + response.statusCode = 200; + response.end("{}"); + }); + }); + await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + const endpoint = "http://127.0.0.1:" + (server.address() as { port: number }).port; + return { + endpoint, + bodies, + close: () => new Promise((resolve) => server.close(() => resolve())), + spans: (): CollectorSpan[] => { + const spans: CollectorSpan[] = []; + for (const body of bodies) { + const parsed = JSON.parse(body) as { resourceSpans?: Array<{ scopeSpans?: Array<{ spans?: CollectorSpan[] }> }> }; + for (const resource of parsed.resourceSpans ?? []) { + for (const scope of resource.scopeSpans ?? []) spans.push(...(scope.spans ?? [])); + } + } + return spans; + } + }; +} + +/** Records a synthetic API SERVER root span into the exporter before running workflow fixtures. */ +function recordApiSpan(exporter: ReturnType) { + // The API SERVER span that starts the trace, as apps/api would export it. + exporter.record({ + traceId: apiTraceId, + spanId: apiSpanId, + parentSpanId: null, + name: "POST /api/rooms/:roomId/turns", + startTimeUnixNano: 1_000_000_000n, + endTimeUnixNano: 9_000_000_000n, + attributes: { "http.request.method": "POST", "http.route": "/api/rooms/:roomId/turns", "space.request_id": "req:abcdefghijkl" }, + error: false, + kind: 2 + }); +} + +let env: TestWorkflowEnvironment; +beforeAll(async () => { + env = await TestWorkflowEnvironment.createLocal(); +}, 300_000); +afterAll(async () => { + await env.teardown(); +}); + +/** Runs a Temporal worker wired with OTLP activity and workflow span interceptors against the test collector. */ +async function withWorker(collector: Awaited>, run: () => Promise) { + const exporter = createOtlpSpanExporter({ endpoint: collector.endpoint, serviceName: "space-worker", batchSize: 4, flushIntervalMs: 50 }); + recordApiSpan(exporter); + const worker = await Worker.create({ + connection: env.nativeConnection, + namespace: "default", + taskQueue, + workflowsPath, + activities: { echo: async (input: { value: string }) => input.value }, + interceptors: { + activity: [createActivityObservabilityInterceptors({ spans: exporter })], + workflowModules: workflowInterceptorModules + }, + sinks: workerSpanSinks(exporter) + }); + const running = worker.run(); + try { + await run(); + } finally { + await worker.shutdown(); + await running; + await exporter.close(); + await collector.close(); + } +} + +describe("worker OTLP span export", () => { + it("connects the API span, the workflow, its activities and a child workflow in one trace", { timeout: 120_000 }, async () => { + const collector = await startCollector(); + await withWorker(collector, async () => { + const handle = await env.client.workflow.start("tracedRootWorkflow", { + args: [{ roomId: "room:alpha01", traceparent: formatTraceparent(apiTraceId, apiSpanId), prompt: secretPrompt }], + taskQueue, + workflowId: "worker-span-trace-1" + }); + await handle.result(); + }); + const spans = collector.spans(); + // Attribute allowlist: every worker span key must be allowlisted (the API + // span keeps its own allowlist, tested in apps/api). + for (const span of spans.filter((span) => span.spanId !== apiSpanId)) { + for (const attribute of span.attributes ?? []) expect(WORKFLOW_SPAN_ATTRIBUTE_ALLOWLIST).toContain(attribute.key); + } + // No prompt or secret ever reaches the collector. + expect(collector.bodies.join("")).not.toContain("sk-live-worker-secret-123"); + expect(collector.bodies.join("")).not.toContain("PRIVATE PROMPT"); + const root = spans.find((span) => span.name === "workflow tracedRootWorkflow"); + expect(root).toMatchObject({ traceId: apiTraceId, parentSpanId: apiSpanId }); + expect(root?.attributes).toEqual(expect.arrayContaining([{ key: "space.workflow_type", value: { stringValue: "tracedRootWorkflow" } }])); + const echo = spans.find((span) => span.name === "activity echo"); + expect(echo).toMatchObject({ traceId: apiTraceId, parentSpanId: root?.spanId }); + expect(echo?.attributes).toEqual(expect.arrayContaining([ + { key: "space.activity_type", value: { stringValue: "echo" } }, + { key: "space.outcome", value: { stringValue: "COMPLETED" } }, + { key: "space.attempt", value: { intValue: "1" } }, + { key: "space.workflow_type", value: { stringValue: "tracedRootWorkflow" } } + ])); + const child = spans.find((span) => span.name === "workflow tracedChildWorkflow"); + expect(child).toMatchObject({ traceId: apiTraceId, parentSpanId: root?.spanId }); + }); + + it("links a continue-as-new run and a background continuation to what they continue", { timeout: 120_000 }, async () => { + const collector = await startCollector(); + await withWorker(collector, async () => { + const handle = await env.client.workflow.start("tracedContinueWorkflow", { + args: [{ + roomId: "room:beta02", + traceparent: formatTraceparent(apiTraceId, apiSpanId), + sourceTraceparent: formatTraceparent("dddddddddddddddddddddddddddddddd", "2222222222222222"), + prompt: secretPrompt, + pass: 0 + }], + taskQueue, + workflowId: "worker-span-continue-1" + }); + await handle.result(); + }); + const spans = collector.spans(); + const runs = spans.filter((span) => span.name === "workflow tracedContinueWorkflow"); + expect(runs).toHaveLength(2); + const continued = runs.find((span) => (span.links ?? []).some((link) => link.spanId !== "2222222222222222")); + expect(continued).toBeDefined(); + // The continued run stays in the propagated trace, parents to the API span + // and links to the previous run's span. + expect(continued).toMatchObject({ traceId: apiTraceId, parentSpanId: apiSpanId }); + const previous = runs.find((span) => span !== continued); + expect(previous).toBeDefined(); + expect(continued?.links).toEqual(expect.arrayContaining([{ traceId: apiTraceId, spanId: previous?.spanId ?? "" }])); + // The background-continuation link points at the continued run's trace. + expect(continued?.links).toEqual(expect.arrayContaining([{ traceId: "dddddddddddddddddddddddddddddddd", spanId: "2222222222222222" }])); + }); + + it("prefers the input traceparent when a signalled turn differs from the scheduling workflow's trace", { timeout: 120_000 }, async () => { + const collector = await startCollector(); + const turnTraceId = "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; + const turnSpanId = "3333333333333333"; + await withWorker(collector, async () => { + const handle = await env.client.workflow.start("tracedMixedWorkflow", { + args: [{ + roomId: "room:delta04", + traceparent: formatTraceparent(apiTraceId, apiSpanId), + childTraceparent: formatTraceparent(turnTraceId, turnSpanId), + prompt: secretPrompt + }], + taskQueue, + workflowId: "worker-span-mixed-1" + }); + await handle.result(); + }); + const spans = collector.spans(); + const mixed = spans.find((span) => span.name === "workflow tracedMixedWorkflow"); + expect(mixed).toMatchObject({ traceId: apiTraceId, parentSpanId: apiSpanId }); + const child = spans.find((span) => span.name === "workflow tracedChildWorkflow"); + // The signalled turn's own request trace wins over the scheduling + // workflow's trace, so the turn stays connected to its API request. + expect(child).toMatchObject({ traceId: turnTraceId, parentSpanId: turnSpanId }); + const childEcho = spans.find((span) => span.name === "activity echo" && span.traceId === turnTraceId); + expect(childEcho).toMatchObject({ parentSpanId: child?.spanId }); + expect(collector.bodies.join("")).not.toContain("sk-live-worker-secret-123"); + expect(collector.bodies.join("")).not.toContain("PRIVATE PROMPT"); + }); + + it("parents a workflow to the traceparent in its Temporal memo when args have none", { timeout: 120_000 }, async () => { + const collector = await startCollector(); + await withWorker(collector, async () => { + const handle = await env.client.workflow.start("tracedChildWorkflow", { + args: [{ roomId: "room:epsilon05", prompt: secretPrompt }], + memo: { + spaceTraceId: "req:abcdefghijkl", + traceparent: formatTraceparent(apiTraceId, apiSpanId), + missionId: "mission:1" + }, + taskQueue, + workflowId: "worker-span-memo-1" + }); + await handle.result(); + }); + const spans = collector.spans(); + const child = spans.find((span) => span.name === "workflow tracedChildWorkflow"); + expect(child).toMatchObject({ traceId: apiTraceId, parentSpanId: apiSpanId }); + expect(child?.attributes).toEqual(expect.arrayContaining([ + { key: "space.mission_id", value: { stringValue: "mission:1" } }, + { key: "space.space_trace_id", value: { stringValue: "req:abcdefghijkl" } } + ])); + const echo = spans.find((span) => span.name === "activity echo"); + expect(echo).toMatchObject({ traceId: apiTraceId, parentSpanId: child?.spanId }); + expect(collector.bodies.join("")).not.toContain("sk-live-worker-secret-123"); + expect(collector.bodies.join("")).not.toContain("PRIVATE PROMPT"); + }); + + it("adopts a signalled turn's traceparent for outbound work when the workflow started without one", { timeout: 120_000 }, async () => { + const collector = await startCollector(); + await withWorker(collector, async () => { + const handle = await env.client.workflow.start("tracedSupervisorWorkflow", { + args: [{ roomId: "room:zeta06", prompt: secretPrompt }], + taskQueue, + workflowId: "worker-span-signal-1" + }); + await handle.signal("enqueueRoomAgentTurn", { + turn: { roomId: "room:zeta06", traceparent: formatTraceparent(apiTraceId, apiSpanId), prompt: secretPrompt, missionId: "mission:2" } + }); + await handle.result(); + }); + const spans = collector.spans(); + const supervisor = spans.find((span) => span.name === "workflow tracedSupervisorWorkflow"); + expect(supervisor).toMatchObject({ traceId: apiTraceId, parentSpanId: apiSpanId }); + const echo = spans.find((span) => span.name === "activity echo"); + expect(echo).toMatchObject({ traceId: apiTraceId, parentSpanId: supervisor?.spanId }); + expect(collector.bodies.join("")).not.toContain("sk-live-worker-secret-123"); + expect(collector.bodies.join("")).not.toContain("PRIVATE PROMPT"); + }); + + it("gives worker-internal runs a deterministic trace and emits no spans on replay", { timeout: 120_000 }, async () => { + const collector = await startCollector(); + const workflowId = "worker-span-replay-1"; + await withWorker(collector, async () => { + const handle = await env.client.workflow.start("tracedChildWorkflow", { + args: [{ roomId: "room:gamma03", prompt: secretPrompt }], + taskQueue, + workflowId + }); + await handle.result(); + }); + const spans = collector.spans(); + const child = spans.find((span) => span.name === "workflow tracedChildWorkflow"); + expect(child?.traceId).toMatch(/^[0-9a-f]{32}$/); + expect(child?.parentSpanId).toBeUndefined(); + const echo = spans.find((span) => span.name === "activity echo"); + expect(echo).toMatchObject({ traceId: child?.traceId, parentSpanId: child?.spanId }); + // Replaying the recorded history must emit no duplicate spans: the sink is + // registered with callDuringReplay: false. + const handle = env.client.workflow.getHandle(workflowId); + const history = await handle.fetchHistory(); + const emitted: WorkflowSpanEvent[] = []; + await Worker.runReplayHistory( + { + workflowsPath, + interceptors: { workflowModules: workflowInterceptorModules }, + sinks: { + workerSpans: { + workflowSpan: { + fn: (_info, event) => { + emitted.push(event); + }, + callDuringReplay: false + } + } + } + }, + history, + workflowId + ); + expect(emitted).toEqual([]); + }); +}); diff --git a/apps/worker/tests/workflow-spans-sink.test.ts b/apps/worker/tests/workflow-spans-sink.test.ts new file mode 100644 index 000000000..684562c31 --- /dev/null +++ b/apps/worker/tests/workflow-spans-sink.test.ts @@ -0,0 +1,114 @@ +import { describe, expect, it } from "vitest"; +import type { ServerSpan, SpanExporter } from "@space/runtime"; +import { recordWorkflowSpan, sanitizeWorkflowSpanEvent, workerSpanSinks } from "../src/workflow-spans-sink.js"; +import type { WorkflowSpanEvent } from "../src/workflow-span-context.js"; + +const secretPrompt = "PRIVATE PROMPT: deploy with token sk-live-worker-secret-123"; +const traceId = "4bf92f3577b34da6a3ce929d0e0e4736"; + +/** Creates an in-memory SpanExporter test double that captures recorded spans. */ +function fakeExporter() { + const recorded: ServerSpan[] = []; + const spans: SpanExporter = { + record: (span) => recorded.push(span), + flush: async () => undefined, + close: async () => undefined, + stats: () => ({ exported: 0, dropped: 0, failed: 0 }) + }; + return { recorded, spans }; +} + +/** Builds a valid default WorkflowSpanEvent with optional test overrides. */ +function event(overrides: Partial = {}): WorkflowSpanEvent { + return { + traceId, + spanId: "00f067aa0ba902b7", + parentSpanId: "1111111111111111", + name: "workflow tracedRootWorkflow", + workflowType: "tracedRootWorkflow", + workflowId: "workflow:trace-test", + runId: "run-uuid-1", + attempt: 1, + startedAtMs: 1_000, + endedAtMs: 2_500, + outcome: "COMPLETED", + attributes: { "space.outcome": "COMPLETED", "space.room_id": "room:alpha01" }, + links: [], + ...overrides + }; +} + +describe("sanitizeWorkflowSpanEvent", () => { + it("drops every attribute outside the allowlist", () => { + const sanitized = sanitizeWorkflowSpanEvent(event({ + attributes: { "space.outcome": "COMPLETED", "space.room_id": "room:alpha01", "space.prompt": secretPrompt, prompt: secretPrompt, "space.free_text": "leak" } as Record + })); + expect(sanitized?.attributes).toEqual({ "space.outcome": "COMPLETED", "space.room_id": "room:alpha01" }); + }); + + it("rejects events whose ids are not exactly hex", () => { + expect(sanitizeWorkflowSpanEvent(event({ traceId: "req:abcdefghijkl" }))).toBeNull(); + expect(sanitizeWorkflowSpanEvent(event({ spanId: "nothex" }))).toBeNull(); + expect(sanitizeWorkflowSpanEvent(event({ parentSpanId: "bad parent" }))).toMatchObject({ parentSpanId: null }); + }); + + it("caps, validates and normalizes links and timings", () => { + const sanitized = sanitizeWorkflowSpanEvent(event({ + links: [ + { traceId, spanId: "00f067aa0ba902b7" }, + { traceId: "junk", spanId: "junk" }, + { traceId, spanId: "1111111111111111" }, + { traceId, spanId: "2222222222222222" } + ] as never, + startedAtMs: Number.NaN, + endedAtMs: Number.NaN, + outcome: "WEIRD" as never + })); + expect(sanitized?.links).toEqual([{ traceId, spanId: "00f067aa0ba902b7" }, { traceId, spanId: "1111111111111111" }, { traceId, spanId: "2222222222222222" }]); + expect(sanitized?.startedAtMs).toBe(0); + expect(sanitized?.endedAtMs).toBe(0); + expect(sanitized?.outcome).toBe("COMPLETED"); + }); +}); + +describe("recordWorkflowSpan", () => { + it("exports a valid workflow span with INTERNAL kind and links", () => { + const { recorded, spans } = fakeExporter(); + recordWorkflowSpan(spans, event({ + outcome: "CONTINUED", + links: [{ traceId, spanId: "1111111111111111" }] + })); + expect(recorded).toHaveLength(1); + expect(recorded[0]).toMatchObject({ + traceId, + spanId: "00f067aa0ba902b7", + parentSpanId: "1111111111111111", + name: "workflow tracedRootWorkflow", + kind: 1, + error: false, + startTimeUnixNano: 1_000_000_000n, + endTimeUnixNano: 2_500_000_000n, + links: [{ traceId, spanId: "1111111111111111" }] + }); + }); + + it("marks FAILED outcomes as errors and drops invalid events entirely", () => { + const { recorded, spans } = fakeExporter(); + recordWorkflowSpan(spans, event({ outcome: "FAILED" })); + recordWorkflowSpan(spans, event({ traceId: "invalid" })); + expect(recorded).toHaveLength(1); + expect(recorded[0].error).toBe(true); + }); +}); + +describe("workerSpanSinks", () => { + it("registers nothing when the exporter is off, and never during replay when it is on", () => { + expect(workerSpanSinks(null)).toBeUndefined(); + const { recorded, spans } = fakeExporter(); + const sinks = workerSpanSinks(spans); + expect(sinks?.workerSpans.workflowSpan.callDuringReplay).toBe(false); + sinks?.workerSpans.workflowSpan.fn({ workflowId: "workflow:trace-test" }, event()); + sinks?.workerSpans.workflowSpan.fn({ workflowId: "workflow:trace-test" }, event({ traceId: "junk" })); + expect(recorded).toHaveLength(1); + }); +}); diff --git a/docs/configuration-reference.md b/docs/configuration-reference.md index e432af4c6..ecfcdffd8 100644 --- a/docs/configuration-reference.md +++ b/docs/configuration-reference.md @@ -39,6 +39,20 @@ capabilities or cross-service compatibility. Authentication/server bootstrap, worker, web build and installer environment fields outside `SpaceApiConfig` are outside this registry. Full cross-service configuration coverage remains open. +## Optional OTLP span export + +`SPACE_OTEL_EXPORTER_OTLP_ENDPOINT` (off by default) names the OTLP/HTTP JSON +collector base URL (`/v1/traces`) for optional span export. Since +2026-10-18 the same endpoint enables the worker's workflow spans too: every +workflow run exports one INTERNAL span (`workflow `) beside the activity +spans, with API-started runs nested under the propagated `traceparent`, +deterministic traces for worker-internal runs, and OTLP span links from +continue-as-new and background continuation runs to what they continue. +Attributes pass the worker allowlist (ids, types, attempt, outcome, error +code/category, durations; never prompts or user text). The exporter is +dependency-free and best effort: a bounded queue drops (and counts) spans and a +failing collector never affects requests (docs/quality/observability.md, Traces). + ## Optional modules `SPACE_OPTIONAL_MODULES` turns on modules beyond the coding workspace: diff --git a/docs/quality/KNOWN_LIMITATIONS.md b/docs/quality/KNOWN_LIMITATIONS.md index e08aaf65b..db7f5ee78 100644 --- a/docs/quality/KNOWN_LIMITATIONS.md +++ b/docs/quality/KNOWN_LIMITATIONS.md @@ -28,7 +28,7 @@ The code change is in; the evidence named in the disposition is still missing. - **FS-002** (P0) Active content served with app-origin privileges. Active raw/generic artifacts now download with sandbox CSP, nosniff, no-store. DOCX sanitized sandbox stays; browser proof remains. - **FS-003** (P0) Uploads buffered in memory. All app.ts multipart routes now use shared disk staging/admission, hard per-route and aggregate limits, backpressure and cleanup. Ordinary files persist with streaming hash verification and no-follow ancestors. DOCX, bookmark JSON (2 MiB) and voice-provider input (10 MiB) use bounded buffers under admission. 96 MiB staging RSS regression passes; authenticated localhost HTTP concurrency now verified: four64MiB streams, fifth429, abort cleanup/slot reuse, exact hashes, RSS growth<128MiB. Actual live browser/proxy proof remains. JSON Control media/files publishing now shares bounded staging and admission (282487abe1). Ambiguous record errors preserve complete files and a private reconciliation journal (8658316629). - **CORE-001** (P0) Worker/DB/CLI/browser failure evidence insufficient. 2026-10-11: all nine failure classes in docs/quality/failure-matrix.md have status, test or evidence citations and a not-guaranteed column. PostgreSQL restart (graceful/crash, inside a transaction and after an unacknowledged COMMIT) is proven with a disposable database (execution-intent-postgres-restart.test.ts 6/6). Live Temporal: 64 graceful worker restarts, 28 executions resumed on a new worker process, 0 failed because of a restart. Four defects fixed (CORE-009..012). 2026-10-12: real SIGKILL/SIGTERM of the unchanged worker against a disposable Temporal+PostgreSQL (Codex turn re-enters the same run and thread, original prompt sent once; single-attempt OpenCode turn settled exactly once as unknown by the API sweep) and a real google-chrome 150 SIGKILL under the unchanged Browser Host (replacement in about 1 s with both tabs reloaded, in-flight CDP call fails within 0.5 s); two browser defects fixed (CORE-014, CORE-015). Still open: authenticated CLI exit/resume, browser WebSocket recovery, Browser Host process crash, a stalled-but-alive Chrome. 2026-10-12 (75ff5fe68f): browser-chrome-crash.integration.test.ts adds a SIGSTOPped (stalled but alive) Chrome: no call hangs past the 30 s client timeout and the same Chrome serves again 37 ms after SIGCONT; and a Browser Host process crash with its whole process group SIGKILLed (as KillMode=control-group does) and a new host on the same socket (fresh PrivateTmp emulated): listening in 1.4 s, restore 655 ms, active /a and background /b reloaded, one Chrome. It found a defect, fixed in the same commit: after Chrome died during a navigation, the next start or getActive reloaded the uncommitted target (a never-answering page hung the restore 30 s). The host code takes effect at its guarded restart. Still open: an authenticated CLI exit/resume run on live (PROVE_CODEX_RESUME passed 2026-10-12) and the browser-to-API WebSocket path under a host restart. -- **OBS-001** (P1) Tracing, metrics and causal errors need improvement. 2026-10-11: one id (the request id, traceId) now reaches the turn input, a Temporal memo (spaceTraceId, traceparent, w3cTraceId), worker activity records with reasonCode and category, and TURN_FAILED events; GET /api/admin/traces/:traceId returns the causal error with ids, codes and statuses only. Injected faults map to categories (TOOL_UNAVAILABLE, TIMEOUT, PROTOCOL, STATE_MISSING, TEMPORAL_UNAVAILABLE). Local metrics without external telemetry: API /metrics (CPU, event-loop delay, errors by code/category, Temporal backlog and age, workflow starts, retries, CLI disconnect/reconnect), restricted to loopback/private clients and admins; opt-in loopback worker and Temporal SDK metrics; W3C traceparent continued without OpenTelemetry. Open: supervisor child failures carry generic text (needs patched()), mission/task rows lack trace columns, background continuations start new traces, memory workers and CLI/browser hosts have no metrics; span export exists since 2026-10-12 as optional OTLP/HTTP JSON for API request spans (SPACE_OTEL_EXPORTER_OTLP_ENDPOINT, off by default, fd377fdb83), still without worker/host spans. 2026-10-12 (c68d980079): the CLI and Browser Hosts are covered by metrics the API observes (space_host_up, start time, resident memory and CPU from /proc after a command-line check, CLI sessions by status and attachments, browser sessions and live workloads against their limits), so the hosts need no endpoint of their own and no restart. Still open: memory-worker metrics, worker/host spans, trace columns on mission/task rows. 2026-10-12 (8ad3e77858): the memory-maintenance and memory-mutation workers are in /metrics too (space_host_up, start time, resident memory, CPU), found in /proc by command line at most every 15 s, with no worker change or restart. +- **OBS-001** (P1) Tracing, metrics and causal errors need improvement. 2026-10-11: one id (the request id, traceId) now reaches the turn input, a Temporal memo (spaceTraceId, traceparent, w3cTraceId), worker activity records with reasonCode and category, and TURN_FAILED events; GET /api/admin/traces/:traceId returns the causal error with ids, codes and statuses only. Injected faults map to categories (TOOL_UNAVAILABLE, TIMEOUT, PROTOCOL, STATE_MISSING, TEMPORAL_UNAVAILABLE). Local metrics without external telemetry: API /metrics (CPU, event-loop delay, errors by code/category, Temporal backlog and age, workflow starts, retries, CLI disconnect/reconnect), restricted to loopback/private clients and admins; opt-in loopback worker and Temporal SDK metrics; W3C traceparent continued without OpenTelemetry. Open: supervisor child failures carry generic text (needs patched()), mission/task rows lack trace columns, background continuations start new traces, memory workers and CLI/browser hosts have no metrics; span export exists since 2026-10-12 as optional OTLP/HTTP JSON for API request spans (SPACE_OTEL_EXPORTER_OTLP_ENDPOINT, off by default, fd377fdb83), still without worker/host spans. 2026-10-12 (c68d980079): the CLI and Browser Hosts are covered by metrics the API observes (space_host_up, start time, resident memory and CPU from /proc after a command-line check, CLI sessions by status and attachments, browser sessions and live workloads against their limits), so the hosts need no endpoint of their own and no restart. Still open: memory-worker metrics, worker/host spans, trace columns on mission/task rows. 2026-10-12 (8ad3e77858): the memory-maintenance and memory-mutation workers are in /metrics too (space_host_up, start time, resident memory, CPU), found in /proc by command line at most every 15 s, with no worker change or restart. 2026-10-18: worker workflow spans export too - every run emits workflow beside the activity spans, nested under the propagated traceparent or a deterministic trace, with span links from continue-as-new and background continuation runs; an idle-flush exporter defect that silently stopped all further exports after the first empty-queue flush was fixed and regression-tested. Hosts remain log-only. - **CTX-001** (P1) Context ownership/budgets/cost unclear. Existing ownership/budgets/ledger inventoried; byte overflow and pre-dispatch cancellation fixed and tested. Native compaction/long continuation and per-provider accounting proof remain open. 2026-10-11: docs/quality/context-and-budgets.md now has a per-runtime table (context owner, token/cost data, native compaction, continuation) and every limit with its default and enforcement point. A simulated long-session proof (dot-goal-long-session.test.ts 3/3) shows Goal steps keep every criterion and the owner's decisions; no live provider compaction was observed, so the status stays needs-runtime-proof. 2026-10-12: OpenCode chat turns now record MEASURED ledger usage from the assistant message counters (eb2cefd96e, opencode-turn-usage/opencode-turn-activity tests); Room Agent operator requests have a measured-token budget (SPACE_ROOM_AGENT_MAX_MISSION_TOKENS, default 10,000,000, ROOM_AGENT_TOKEN_LIMIT, e86a0248cb, room-agent-limits.test.ts 8/8 new+updated); Codex Goals can carry an operator token budget (SPACE_CODEX_GOAL_TOKEN_BUDGET, 2fb58f3987). Live Codex compaction proven 2026-10-12 on an ephemeral thread (thread/compact/start, then the code word is recalled; scripts/codex-compaction-proof.mjs). Still open: automatic compaction at the context limit and other providers, a per-turn or cost budget, usage for broker CLI chat and PTY panes. - **DATA-001** (P1) State ownership/consistency unclear. Authoritative and derived-state map documented. Real PostgreSQL artifact lost-ACK reconciliation and quiescent DB restore now have isolated evidence; distributed worker/runtime recovery remains open. 2026-10-12: the real weekly VM archive (vzdump of 2026-10-07, 132 GB) was restored and verified without a VM boot (restore-and-migrations.md, VM archive restore drill): every extent checksum and every cluster of both disks accounted for, both filesystems whole, PostgreSQL recovered its WAL in 0.37 s, and restore-drill.mjs verified all three databases (0 mismatches, 0 orphans), applied the 29 newer migrations to the archived data with history kept, and opened the store (RTO 10.3 s). Still unmeasured: a full qmrestore VM boot with Space services restarted on restored data. - **DATA-003** (P1) Reproducible restore/RPO/RTO evidence missing. Resolved 2026-10-11. Restore drill of live PostgreSQL into a separate container: 148/148 tables with matching counts and checksums, 217 foreign keys with 0 orphans, identical migration history, store opens with 0 pending migrations; temporal and temporal_visibility match. RTO measured 28.1/13.5/18.4 s (median 18.4 s, declared conditions in the doc). RPO was up to 7 days (weekly VM snapshot; 21 days observed after two failed runs). A daily validated logical backup (pg_dump custom format, TOC + full-decompress validation, SHA-256 manifest, 7 daily + 4 weekly) now runs from a user systemd timer, giving RPO <= 1 day for the database; a fresh backup restored into a disposable container matched live (158/158 tables, 155/155 migrations). Limits: both copies live on public-host; the 132-142 GB VM backup restore was never drilled. 2026-10-16: daily dumps copied off public-host to the StorageBox and read back (b4bf5c90ae). A full qmrestore boot needs storage no production guest uses (local-zfs 74% used); it stays an operator step. Also internal review 1.1.5 Codex #8. External review 2026-10-16 #3: the portable backup runs while writers continue and leaves out the Temporal databases; the installer change (pause, Temporal dumps, staged restore) is planned for the next run-spaceapp release. Public overlay 56ceb06 (did not ship in 1.1.6: the 1.1.6 re-cut from f8803d5d96 did not take it; ships in run-spaceapp 1.1.7): spaceapp backup pauses core, CLI, browser and Temporal and also dumps the Temporal databases; restore stages the files and restores each database in its own transaction before swapping them in; run-spaceapp 1.1.7 (rc3) first copies the current databases aside and, when a later database or the file swap fails, puts every database and the files back, or prints the command per database when that fails too (internal review 1.1.7, Codex #2: separate transactions are not one restore). Drill 2026-10-16 with spaceapp-core 1.1.6, PostgreSQL 17 with pgvector and Temporal 1.29: backup and restore exact; a restore that fails in the database leaves database, Temporal and files untouched, where the 1.1.6 restore had already replaced the files. A schemaVersion 2 backup cannot be restored by an older SpaceApp. diff --git a/docs/quality/observability.md b/docs/quality/observability.md index f58323438..ae0042c97 100644 --- a/docs/quality/observability.md +++ b/docs/quality/observability.md @@ -221,7 +221,15 @@ OpenTelemetry dependency; `packages/runtime/src/otlp-span-exporter.ts`). Since 2026-10-16 the worker and both memory workers use the same exporter (services `space-worker`, `space-memory-maintenance-worker`, `space-memory-mutation-worker`): one INTERNAL span per activity whose input carries a `traceparent`, as a child of -that span, with the activity type, outcome and attempt only. +that span, with the activity type, outcome and attempt only. Since 2026-10-18 the +same exporter also sends one INTERNAL span per workflow run (`workflow `), +through a sandbox interceptor that adds the `space.span-context` Temporal header to +scheduled activities, child workflows and continue-as-new calls, and a +`workerSpans` sink (`callDuringReplay: false`) that exports the finished span: +API-started runs nest under the propagated `traceparent`, worker-internal runs get +a deterministic trace derived from their workflow/run ids, and a continue-as-new or +background continuation run carries an OTLP span link to the run or trace it +continues. The interceptor does no I/O inside the sandbox. - **API:** a valid inbound `traceparent` is continued (same trace ID, new span). An invalid or missing header gets a new trace ID. Every API log line carries `w3cTraceId` (Fastify `childLoggerFactory`). @@ -234,8 +242,10 @@ that span, with the activity type, outcome and attempt only. room-action calls from the worker send a child `traceparent`, so the internal API request joins the same trace. - **Workflow code is unchanged.** Correlation is done in the API starter - (input/memo) and in an activity interceptor. The workflow bundle only gains the - optional contract field. + (input/memo) and in activity and workflow interceptors. The workflow bundle gains + the optional contract fields and the workflow interceptor module, which performs + no I/O: workflow spans leave the sandbox only through the `workerSpans` sink, + and replay emits nothing (`callDuringReplay: false`). ### Replay compatibility @@ -291,6 +301,10 @@ No credential or transcript export was added. | `apps/api/src/__tests__/files-search-errors.test.ts` | `EMPTY_RESULT`/`OK` and each failure code | | `apps/api/tests/files-search-routes.test.ts` | The HTTP error envelope | | `apps/worker/tests/activity-observability.test.ts` | Interceptor records, outcomes, categories, metrics, loopback endpoint | +| `apps/worker/tests/workflow-span-context.test.ts` | Deterministic workflow span/trace ids, attribute allowlist closure, header round-trip | +| `apps/worker/tests/workflow-spans-sink.test.ts` | The workerSpans sink sanitizes events: allowlist, hex ids, link cap, bounded strings | +| `apps/worker/tests/workflow-span-integration.test.ts` | Fake loopback OTLP collector + `@temporalio/testing`: one trace from the API span through workflow, activities and child workflows; continue-as-new and background-continuation links; replay emits no spans | +| `packages/runtime/tests/otlp-span-exporter-flush.test.ts` | An idle flush does not block later exports; a drain re-checks the queue | | `apps/api/tests/observability-fault-injection.test.ts` | Four injected executor faults and one Temporal start failure, end to end | ## Not covered @@ -315,7 +329,10 @@ No credential or transcript export was added. continuation from the run it continues (`roomAgentContinuation.sourceRunId`, indexed by migration 0206, at most 50 generations and the row limit) and marks it with `continuationOf`. Its events and logs remain under its own - trace ID. Chat-pane sends from room actions use `:chat`. + trace ID. Chat-pane sends from room actions use `:chat`. Since + 2026-10-18 a continuation run's workflow span carries an OTLP span link to the + trace of the run it continues, so a collector shows the relation between the + two traces. - **CLI terminal task IDs are not linked.** `cliTaskId` and `revisionId` are not tied to request IDs. - **Hosts are observed from the API, not instrumented.** Since 2026-10-12 the @@ -337,10 +354,17 @@ No credential or transcript export was added. trace's workflows, joined by workflow id, with their status and error code, and names a failed run's code as the cause when no event carries one. - **Hosts emit no spans.** Since 2026-10-16 the OTLP exporter sends API SERVER - spans and worker activity spans (the worker and both memory workers); the CLI - and Browser Hosts still join traces through log lines only. + spans and worker activity spans (the worker and both memory workers), and since + 2026-10-18 also worker workflow spans (see Traces above); the CLI and Browser + Hosts still join traces through log lines only. - **Recovery counters are partial.** Recovery counters exist for plan model retries, CLI terminal reconnects and worker activity retries only. +- **Workflow span lifecycle edges (since 2026-10-18).** The workflow span is + emitted from inside the run, so a terminated or timed-out run (which resumes + no workflow code) exports no workflow span while its already-exported + activity spans keep pointing at it, and a retried failed workflow task can + re-emit the span with the same deterministic span id. The activity span + carries the run's outcome either way. - **Worker endpoints are not scraped yet.** Stable's `deploy/space-worker.service` enables `127.0.0.1:9469/metrics` (worker activities) and `127.0.0.1:9464` (Temporal SDK); on 2026-10-16 both answered on stable (`space_process_*` series, diff --git a/docs/quality/review-findings.json b/docs/quality/review-findings.json index 0c1582b09..cb597d337 100644 --- a/docs/quality/review-findings.json +++ b/docs/quality/review-findings.json @@ -263,7 +263,7 @@ "status": "confirmed", "reproduction": "apps/api/src/app.ts", "evidence": "docs/quality/observability.md; apps/api/tests/trace-correlation.test.ts 8/8; apps/api/tests/observability-fault-injection.test.ts 6/6; apps/worker/tests/activity-observability.test.ts 9/9; packages/contracts/tests/observability.test.ts 31/31; packages/runtime/tests/metrics-registry.test.ts 4/4", - "disposition": "2026-10-11: one id (the request id, traceId) now reaches the turn input, a Temporal memo (spaceTraceId, traceparent, w3cTraceId), worker activity records with reasonCode and category, and TURN_FAILED events; GET /api/admin/traces/:traceId returns the causal error with ids, codes and statuses only. Injected faults map to categories (TOOL_UNAVAILABLE, TIMEOUT, PROTOCOL, STATE_MISSING, TEMPORAL_UNAVAILABLE). Local metrics without external telemetry: API /metrics (CPU, event-loop delay, errors by code/category, Temporal backlog and age, workflow starts, retries, CLI disconnect/reconnect), restricted to loopback/private clients and admins; opt-in loopback worker and Temporal SDK metrics; W3C traceparent continued without OpenTelemetry. Open: supervisor child failures carry generic text (needs patched()), mission/task rows lack trace columns, background continuations start new traces, memory workers and CLI/browser hosts have no metrics; span export exists since 2026-10-12 as optional OTLP/HTTP JSON for API request spans (SPACE_OTEL_EXPORTER_OTLP_ENDPOINT, off by default, fd377fdb83), still without worker/host spans. 2026-10-12 (c68d980079): the CLI and Browser Hosts are covered by metrics the API observes (space_host_up, start time, resident memory and CPU from /proc after a command-line check, CLI sessions by status and attachments, browser sessions and live workloads against their limits), so the hosts need no endpoint of their own and no restart. Still open: memory-worker metrics, worker/host spans, trace columns on mission/task rows. 2026-10-12 (8ad3e77858): the memory-maintenance and memory-mutation workers are in /metrics too (space_host_up, start time, resident memory, CPU), found in /proc by command line at most every 15 s, with no worker change or restart.", + "disposition": "2026-10-11: one id (the request id, traceId) now reaches the turn input, a Temporal memo (spaceTraceId, traceparent, w3cTraceId), worker activity records with reasonCode and category, and TURN_FAILED events; GET /api/admin/traces/:traceId returns the causal error with ids, codes and statuses only. Injected faults map to categories (TOOL_UNAVAILABLE, TIMEOUT, PROTOCOL, STATE_MISSING, TEMPORAL_UNAVAILABLE). Local metrics without external telemetry: API /metrics (CPU, event-loop delay, errors by code/category, Temporal backlog and age, workflow starts, retries, CLI disconnect/reconnect), restricted to loopback/private clients and admins; opt-in loopback worker and Temporal SDK metrics; W3C traceparent continued without OpenTelemetry. Open: supervisor child failures carry generic text (needs patched()), mission/task rows lack trace columns, background continuations start new traces, memory workers and CLI/browser hosts have no metrics; span export exists since 2026-10-12 as optional OTLP/HTTP JSON for API request spans (SPACE_OTEL_EXPORTER_OTLP_ENDPOINT, off by default, fd377fdb83), still without worker/host spans. 2026-10-12 (c68d980079): the CLI and Browser Hosts are covered by metrics the API observes (space_host_up, start time, resident memory and CPU from /proc after a command-line check, CLI sessions by status and attachments, browser sessions and live workloads against their limits), so the hosts need no endpoint of their own and no restart. Still open: memory-worker metrics, worker/host spans, trace columns on mission/task rows. 2026-10-12 (8ad3e77858): the memory-maintenance and memory-mutation workers are in /metrics too (space_host_up, start time, resident memory, CPU), found in /proc by command line at most every 15 s, with no worker change or restart. 2026-10-18: worker workflow spans export too - every run emits workflow beside the activity spans, nested under the propagated traceparent or a deterministic trace, with span links from continue-as-new and background continuation runs; an idle-flush exporter defect that silently stopped all further exports after the first empty-queue flush was fixed and regression-tested. Hosts remain log-only.", "resolution": "partial" }, { diff --git a/package-lock.json b/package-lock.json index 04bf09e25..70663466e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -192,6 +192,7 @@ "undici": "8.12.3" }, "devDependencies": { + "@temporalio/testing": "1.24.0", "typescript": "^5.9.3", "vitest": "^4.1.12" } @@ -3674,6 +3675,25 @@ "node": ">=12.0.0" } }, + "node_modules/@temporalio/testing": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@temporalio/testing/-/testing-1.24.0.tgz", + "integrity": "sha512-XKCuvgb7smKR3oXy5nDgwYSFX/hmg9zTJ2rZQQsVwJzFkga1TbnWDiuT5YMU0INKjoLhnM6c5YA/uLKlp8sdfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@temporalio/activity": "1.24.0", + "@temporalio/client": "1.24.0", + "@temporalio/common": "1.24.0", + "@temporalio/core-bridge": "1.24.0", + "@temporalio/proto": "1.24.0", + "@temporalio/worker": "1.24.0", + "@temporalio/workflow": "1.24.0" + }, + "engines": { + "node": ">= 20.3.0" + } + }, "node_modules/@temporalio/worker": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/@temporalio/worker/-/worker-1.24.0.tgz", diff --git a/packages/contracts/src/observability.ts b/packages/contracts/src/observability.ts index dd8e53b41..25902119c 100644 --- a/packages/contracts/src/observability.ts +++ b/packages/contracts/src/observability.ts @@ -111,6 +111,7 @@ export function parseTraceparent(value: unknown): ParsedTraceparent | null { return { traceId, parentId, flags }; } +/** Formats a W3C traceparent header (`00---`). */ export function formatTraceparent(traceId: string, spanId: string, flags = "01"): string { return `00-${traceId}-${spanId}-${flags}`; } @@ -120,6 +121,33 @@ export function traceIdFromTraceparent(value: unknown): string | null { return parseTraceparent(value)?.traceId ?? null; } +const FNV1A_OFFSET = 0xcbf29ce484222325n; +const FNV1A_PRIME = 0x100000001b3n; +const spaceTraceIdPattern = /^[A-Za-z0-9:._-]{1,128}$/; + +/** Computes a deterministic 64-bit FNV-1a digest as 16 lowercase hex chars. */ +function fnv1a64Hex(value: string): string { + let hash = FNV1A_OFFSET; + for (let index = 0; index < value.length; index++) { + hash ^= BigInt(value.charCodeAt(index) & 0xff); + hash = BigInt.asUintN(64, hash * FNV1A_PRIME); + } + return hash.toString(16).padStart(16, "0"); +} + +/** + * Deterministic W3C traceparent derived from a Space trace id (`trace:...`, + * `req:...`). Worker-internal runs (background continuations) use this when + * there is no inbound header, so the run still has a joinable W3C trace. + */ +export function traceparentForTraceId(traceId: string | null | undefined): string | null { + if (typeof traceId !== "string" || !spaceTraceIdPattern.test(traceId)) return null; + const w3cTraceId = fnv1a64Hex(traceId + "|trace-a") + fnv1a64Hex(traceId + "|trace-b"); + const spanId = fnv1a64Hex(traceId + "|span"); + if (/^0+$/.test(w3cTraceId) || /^0+$/.test(spanId)) return null; + return formatTraceparent(w3cTraceId, spanId); +} + /** * Admin trace lookup (GET /api/admin/traces/:traceId). Identifiers, codes, * statuses and timestamps only: event messages, payload metadata, prompts and diff --git a/packages/contracts/src/schemas.ts b/packages/contracts/src/schemas.ts index 2a3c7a8dc..59a4b408a 100644 --- a/packages/contracts/src/schemas.ts +++ b/packages/contracts/src/schemas.ts @@ -733,6 +733,7 @@ const persistedTranscriptLabeledSecretPattern = // \b before "token", so the labeled pattern above misses it). Codex, Claude Code and Oh My Pi all carry this token. const persistedTranscriptControlTokenPattern = /\bspacecontrol\.v\d+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g; +/** Redacts sensitive credentials and secrets before persisting transcript text. */ export function redactPersistedTranscriptContent(value: string): string { return value .replaceAll("\0", "") @@ -1387,6 +1388,7 @@ export const roomAgentPreparedPaneSchema = z.object({ reasoningEffort: reasoningEffortSchema.optional() }); +/** Validates that a room agent orchestration graph has valid nodes, edges, and entry points. */ function validateRoomAgentOrchestrationGraph( steps: Array>, context: z.RefinementCtx @@ -2386,12 +2388,14 @@ export const cliRuntimeRestartAllResultSchema = z }) .strict(); +/** Checks whether an agent runtime session is authenticated and ready to serve turns. */ export function isAgentRuntimeReady( runtime: Pick ): boolean { return runtime.adapterStatus === "ENABLED" && runtime.authState === "READY" && runtime.status === "ENABLED"; } +/** Checks whether an agent runtime status permits starting a new interactive login flow. */ export function canStartAgentRuntimeLogin( runtime: Pick ): boolean { @@ -3799,6 +3803,7 @@ export const spaceBrowserToolIdSchema = z.enum([ "browser:record" ]); +/** Maps a browser tool action type to its required canonical browser tool identifier. */ function expectedBrowserToolIdForAction(type: z.infer): z.infer { switch (type) { case "navigate": @@ -6742,12 +6747,14 @@ export const artifactCollectionSchema = z.enum(["ROOM_MEDIA", "AGENT_FILES"]); const roomMediaBrowserKinds = new Set>(["IMAGE", "SCREENSHOT", "VIDEO"]); +/** Checks whether an artifact record represents a room media attachment. */ export function isRoomMediaArtifact(artifact: z.infer): boolean { if (artifact.storageUri.startsWith("space-artifact://user-uploads/")) return true; if (artifact.storageUri.startsWith("space-artifact://cli-uploads/")) return true; return artifact.storageUri.startsWith("space-artifact://browser-evidence/") && roomMediaBrowserKinds.has(artifact.kind); } +/** Checks whether an artifact record represents an agent workspace file artifact. */ export function isAgentFileArtifact(artifact: z.infer): boolean { return artifact.storageUri.startsWith("space-artifact://agent-files/"); } @@ -6870,6 +6877,9 @@ export const dummyTurnInputSchema = z.object({ // Optional W3C trace context of the originating request (additive; see // docs/quality/observability.md). Never part of a workflow id. traceparent: traceparentSchema.optional(), + // Optional W3C trace context of the run a background continuation continues + // (additive): exported as an OTLP span link on the continuation's span. + sourceTraceparent: traceparentSchema.optional(), // Space Dots Stage 3 (additive): a gateway-enabled native Chat turn. dotId: dotIdSchema.optional(), toolGateway: z.literal("space-dot-tools-v1").optional(), @@ -7770,6 +7780,7 @@ const memoryChangeSetSummaryShape = { rolledBackAt: isoDateTimeSchema.nullable() }; +/** Enforces status and timestamp invariants on a memory change-set schema payload. */ function validateMemoryChangeSetState( changeSet: z.infer>, ctx: z.RefinementCtx @@ -7998,6 +8009,7 @@ export const agentClipboardNoteMaxCharacters = 10_000; export const clipboardPlanTitleMaxCharacters = 160; export const clipboardPlanMinimumModelMaxCharacters = 160; +/** Resolves the effective clipboard source descriptor from a clipboard action payload. */ export function resolveClipboardSource( existingSource: z.infer | undefined, incomingSource: z.infer @@ -8055,6 +8067,7 @@ export const spaceAgentClipboardActionInputSchema = z.discriminatedUnion("type", spaceAgentClipboardSavePlanActionSchema ]); +/** Maps a clipboard tool action type to its required canonical clipboard tool identifier. */ function expectedClipboardToolIdForAction( type: z.infer["type"] ): z.infer { @@ -8134,6 +8147,7 @@ export const spaceAgentTaskActionInputSchema = z.discriminatedUnion("type", [ spaceAgentTaskUpdateActionSchema ]); +/** Maps a task tool action type to its required canonical task tool identifier. */ function expectedTaskToolIdForAction( type: z.infer["type"] ): z.infer { @@ -8193,6 +8207,7 @@ export const spaceAgentMemoryActionInputSchema = z.discriminatedUnion("type", [ spaceAgentMemorySaveActionSchema ]); +/** Maps a memory tool action type to its required canonical memory tool identifier. */ function expectedMemoryToolIdForAction(type: z.infer["type"]): z.infer { switch (type) { case "search": @@ -8258,6 +8273,7 @@ export const spaceAgentSkillActionInputSchema = z.discriminatedUnion("type", [ spaceAgentSkillReadActionSchema ]); +/** Maps a skill tool action type to its required canonical skill tool identifier. */ function expectedSkillToolIdForAction(type: z.infer["type"]): z.infer { switch (type) { case "list": @@ -9248,6 +9264,7 @@ export const setupStarterRoomResponseSchema = z.object({ onboarding: setupOnboardingSchema }); +/** Normalizes and validates a user profile link URL for safe storage and display. */ export function canonicalizeUserLinkUrl(value: string): string { let parsed: URL; try { @@ -10610,6 +10627,7 @@ export const spaceAgentChatActionInputSchema = z.discriminatedUnion("type", [ spaceAgentChatReactActionSchema ]); +/** Maps a chat tool action type to its required canonical chat tool identifier. */ function expectedChatToolIdForAction( type: z.infer["type"] ): z.infer { diff --git a/packages/contracts/tests/observability.test.ts b/packages/contracts/tests/observability.test.ts index c7717396d..e03cad731 100644 --- a/packages/contracts/tests/observability.test.ts +++ b/packages/contracts/tests/observability.test.ts @@ -8,6 +8,7 @@ import { isSafeErrorCode, parseTraceparent, traceIdFromTraceparent, + traceparentForTraceId, workerReadinessSchema } from "../src/index.js"; @@ -80,6 +81,19 @@ describe("W3C traceparent", () => { it("accepts a future version by its version-00 prefix", () => { expect(parseTraceparent(`01-${traceId}-${spanId}-01-future`)?.traceId).toBe(traceId); }); + + it("derives a stable W3C traceparent from a Space trace id", () => { + const header = traceparentForTraceId("trace:bg-test-1"); + expect(parseTraceparent(header)).toEqual({ + traceId: expect.stringMatching(/^[0-9a-f]{32}$/), + parentId: expect.stringMatching(/^[0-9a-f]{16}$/), + flags: "01" + }); + expect(traceparentForTraceId("trace:bg-test-1")).toBe(header); + expect(traceparentForTraceId("trace:continuation-initial")).not.toBe(header); + expect(traceparentForTraceId("please summarize my secret plan")).toBeNull(); + expect(traceparentForTraceId(undefined)).toBeNull(); + }); }); describe("additive observability contract fields", () => { diff --git a/packages/runtime/src/otlp-span-exporter.ts b/packages/runtime/src/otlp-span-exporter.ts index 86a0edf05..385a0f24a 100644 --- a/packages/runtime/src/otlp-span-exporter.ts +++ b/packages/runtime/src/otlp-span-exporter.ts @@ -11,6 +11,13 @@ * request. */ +/** An OTLP span link, e.g. a continue-as-new run linked to the run it continues. */ +export interface SpanLink { + traceId: string; + spanId: string; + attributes?: Readonly>; +} + export interface ServerSpan { traceId: string; spanId: string; @@ -22,6 +29,8 @@ export interface ServerSpan { error: boolean; /** OTLP span kind; SERVER (2) unless given. Worker activities use INTERNAL (1). */ kind?: number; + /** Optional OTLP span links to other traces or runs. */ + links?: readonly SpanLink[]; } export interface SpanExporterStats { @@ -66,10 +75,12 @@ export function otlpTracesUrl(value: string | undefined): string | null { return `${url.origin}${url.pathname.replace(/\/+$/, "")}/v1/traces`; } +/** Formats a primitive attribute value in OTLP/HTTP JSON AnyValue shape. */ function attributeValue(value: string | number) { return typeof value === "number" && Number.isInteger(value) ? { intValue: String(value) } : { stringValue: String(value) }; } +/** Builds an OTLP/HTTP JSON ExportTraceServiceRequest payload for a batch of spans. */ export function otlpTraceRequest(spans: readonly ServerSpan[], serviceName: string) { return { resourceSpans: [{ @@ -85,6 +96,17 @@ export function otlpTraceRequest(spans: readonly ServerSpan[], serviceName: stri startTimeUnixNano: span.startTimeUnixNano.toString(), endTimeUnixNano: span.endTimeUnixNano.toString(), attributes: Object.entries(span.attributes).map(([key, value]) => ({ key, value: attributeValue(value) })), + ...(span.links?.length + ? { + links: span.links.map(link => ({ + traceId: link.traceId, + spanId: link.spanId, + ...(link.attributes + ? { attributes: Object.entries(link.attributes).map(([key, value]) => ({ key, value: attributeValue(value) })) } + : {}) + })) + } + : {}), // STATUS_CODE_ERROR or STATUS_CODE_UNSET status: { code: span.error ? 2 : 0 } })) @@ -93,6 +115,7 @@ export function otlpTraceRequest(spans: readonly ServerSpan[], serviceName: stri }; } +/** Creates a bounded, non-blocking OTLP/HTTP JSON span exporter for the given service. */ export function createOtlpSpanExporter(options: OtlpSpanExporterOptions): SpanExporter { const url = otlpTracesUrl(options.endpoint); if (!url) throw new Error("Invalid OTLP endpoint."); @@ -122,13 +145,27 @@ export function createOtlpSpanExporter(options: OtlpSpanExporterOptions): SpanEx }; const flush = (): Promise => { if (!inFlight) { - inFlight = (async () => { + // Assign inFlight before the drain starts. With an empty queue the + // drain body below would otherwise finish synchronously and clear + // inFlight before the assignment stores the promise, leaving a + // stale resolved promise that blocks every later flush and silently + // stops all further exports. The local `pending` keeps the returned + // promise independent of the mutable inFlight field, so an idle + // flush still returns a real Promise rather than null. + let release: () => void = () => {}; + const pending = new Promise((resolve) => { + release = resolve; + }); + inFlight = pending; + void (async () => { try { while (queue.length) await flushOnce(); } finally { inFlight = null; + release(); } })(); + return pending; } return inFlight; }; diff --git a/packages/runtime/tests/otlp-span-exporter-flush.test.ts b/packages/runtime/tests/otlp-span-exporter-flush.test.ts new file mode 100644 index 000000000..31e93aa8e --- /dev/null +++ b/packages/runtime/tests/otlp-span-exporter-flush.test.ts @@ -0,0 +1,94 @@ +import { describe, expect, it } from "vitest"; +import { createOtlpSpanExporter, type ServerSpan } from "../src/otlp-span-exporter.js"; + +const traceId = "0123456789abcdef0123456789abcdef"; + +const span = (spanId: string): ServerSpan => ({ + traceId, + spanId, + parentSpanId: null, + name: "activity runCodexAppServerTurn", + startTimeUnixNano: 1_000_000_000n, + endTimeUnixNano: 2_000_000_000n, + attributes: { "space.activity_type": "runCodexAppServerTurn" }, + error: false, + kind: 1 +}); + +describe("OTLP span exporter flush lifecycle", () => { + it("keeps exporting after an idle flush finds an empty queue", async () => { + const bodies: string[] = []; + const exporter = createOtlpSpanExporter({ + endpoint: "http://127.0.0.1:4318", + serviceName: "space-worker", + fetch: async (_url, init) => { + bodies.push(init.body); + return { ok: true }; + } + }); + // An idle flush resolves immediately; it must not leave the exporter in a + // state where later flushes become no-ops. + await exporter.flush(); + exporter.record(span("1111111111111111")); + await exporter.flush(); + expect(bodies).toHaveLength(1); + await exporter.close(); + }); + + it("returns a real thenable promise even when an idle flush clears inFlight synchronously", async () => { + const exporter = createOtlpSpanExporter({ + endpoint: "http://127.0.0.1:4318", + serviceName: "space-worker", + fetch: async () => ({ ok: true }) + }); + const returned = exporter.flush(); + expect(returned).toBeInstanceOf(Promise); + let thenResolved = false; + await returned.then(() => { + thenResolved = true; + }); + expect(thenResolved).toBe(true); + await exporter.close(); + }); + + it("drains spans recorded while a flush is already in flight", async () => { + let releaseFetch: (response: { ok: boolean }) => void = () => {}; + const gate = new Promise<{ ok: boolean }>((resolve) => { + releaseFetch = resolve; + }); + const bodies: string[] = []; + const exporter = createOtlpSpanExporter({ + endpoint: "http://127.0.0.1:4318", + serviceName: "space-worker", + fetch: async (_url, init) => { + bodies.push(init.body); + return gate; + } + }); + exporter.record(span("1111111111111111")); + const first = exporter.flush(); + exporter.record(span("2222222222222222")); + releaseFetch({ ok: true }); + await first; + expect(bodies).toHaveLength(2); + await exporter.close(); + }); + + it("exports spans recorded after a closed batch without an intervening idle flush", async () => { + const bodies: string[] = []; + const exporter = createOtlpSpanExporter({ + endpoint: "http://127.0.0.1:4318", + serviceName: "space-worker", + fetch: async (_url, init) => { + bodies.push(init.body); + return { ok: true }; + } + }); + exporter.record(span("1111111111111111")); + await exporter.flush(); + exporter.record(span("2222222222222222")); + await exporter.flush(); + await exporter.close(); + expect(bodies).toHaveLength(2); + }); +}); diff --git a/packages/runtime/tests/otlp-span-links.test.ts b/packages/runtime/tests/otlp-span-links.test.ts new file mode 100644 index 000000000..1db2c790a --- /dev/null +++ b/packages/runtime/tests/otlp-span-links.test.ts @@ -0,0 +1,73 @@ +import { describe, expect, it } from "vitest"; +import { createOtlpSpanExporter, otlpTraceRequest, type ServerSpan } from "../src/otlp-span-exporter.js"; + +const traceId = "0123456789abcdef0123456789abcdef"; +const spanId = "0123456789abcdef"; +const link = { traceId, spanId: "fedcba9876543210", attributes: { "space.link_type": "continue_as_new", "space.attempt": 1 } }; + +const span = (over: Partial = {}): ServerSpan => ({ + traceId, + spanId, + parentSpanId: null, + name: "activity runCodexAppServerTurn", + startTimeUnixNano: 1_000_000_000n, + endTimeUnixNano: 2_000_000_000n, + attributes: { "space.activity_type": "runCodexAppServerTurn" }, + error: false, + kind: 1, + ...over +}); + +describe("OTLP span links", () => { + it("maps span links with attributes into the OTLP JSON request", () => { + const request = otlpTraceRequest([span({ links: [link] })], "space-worker"); + const spans = request.resourceSpans[0].scopeSpans[0].spans; + expect(spans).toHaveLength(1); + expect(spans[0].links).toEqual([{ + traceId, + spanId: link.spanId, + attributes: [ + { key: "space.link_type", value: { stringValue: "continue_as_new" } }, + { key: "space.attempt", value: { intValue: "1" } } + ] + }]); + }); + + it("omits the links field when a span has no links or an empty list", () => { + const bare = otlpTraceRequest([span()], "space-worker"); + expect(bare.resourceSpans[0].scopeSpans[0].spans[0]).not.toHaveProperty("links"); + const empty = otlpTraceRequest([span({ links: [] })], "space-worker"); + expect(empty.resourceSpans[0].scopeSpans[0].spans[0]).not.toHaveProperty("links"); + }); + + it("exports links without attributes and multiple links from other traces", () => { + const otherTrace = "ffffffffffffffffffffffffffffffff"; + const request = otlpTraceRequest([ + span({ links: [{ traceId: otherTrace, spanId: "aaaaaaaaaaaaaaaa" }, { traceId, spanId: "bbbbbbbbbbbbbbbb" } ] }) + ], "space-worker"); + const links = request.resourceSpans[0].scopeSpans[0].spans[0].links; + expect(links).toHaveLength(2); + expect(links[0]).toEqual({ traceId: otherTrace, spanId: "aaaaaaaaaaaaaaaa" }); + expect(links[1]).toEqual({ traceId, spanId: "bbbbbbbbbbbbbbbb" }); + }); + + it("exports recorded links end to end through the exporter queue", async () => { + const bodies: string[] = []; + const exporter = createOtlpSpanExporter({ + endpoint: "http://127.0.0.1:4318", + serviceName: "space-worker", + fetch: async (_url, init) => { + bodies.push(init.body); + return { ok: true }; + } + }); + exporter.record(span({ links: [link] })); + await exporter.flush(); + await exporter.close(); + expect(bodies).toHaveLength(1); + const parsed = JSON.parse(bodies[0]); + const exported = parsed.resourceSpans[0].scopeSpans[0].spans[0]; + expect(exported.links[0].traceId).toBe(traceId); + expect(exported.links[0].spanId).toBe("fedcba9876543210"); + }); +}); From 5b21b9edd6095065c4523ee188e93ff96b91b664 Mon Sep 17 00:00:00 2001 From: FaustusutsuaF <145342909+FaustusutsuaF@users.noreply.github.com> Date: Thu, 29 Oct 2026 11:09:18 +0800 Subject: [PATCH 2/2] refactor(worker): reuse fnv1a64Hex from @space/contracts in workflow span context Signed-off-by: FaustusutsuaF <145342909+FaustusutsuaF@users.noreply.github.com> --- PUBLIC_EXPORT_MANIFEST.json | 24 +++++++++---------- apps/worker/src/workflow-span-context.ts | 16 +++---------- .../tests/workflow-span-context.test.ts | 7 ++++++ packages/contracts/src/observability.ts | 8 +++++-- .../contracts/tests/observability.test.ts | 9 +++++++ 5 files changed, 37 insertions(+), 27 deletions(-) diff --git a/PUBLIC_EXPORT_MANIFEST.json b/PUBLIC_EXPORT_MANIFEST.json index 282747c4c..f67491867 100644 --- a/PUBLIC_EXPORT_MANIFEST.json +++ b/PUBLIC_EXPORT_MANIFEST.json @@ -22909,9 +22909,9 @@ }, { "path": "apps/worker/src/workflow-span-context.ts", - "sourceObjectId": "66e9cb909e31b5214c2ea3397988be1c8705ecc3", - "sha256": "176a73890f399e5c385d624b862b91043dd87a67500a6fe42e14fac4e0bc3e4f", - "size": 8766 + "sourceObjectId": "54f31ceb1c4fb93c94a7e7845f87e2b6e34bd200", + "sha256": "079a1655d5707268d67f04f04c8dc34f704f6636a6ecefd5eaee2a76a7414275", + "size": 8461 }, { "path": "apps/worker/src/workflow-spans-sink.ts", @@ -23149,9 +23149,9 @@ }, { "path": "apps/worker/tests/workflow-span-context.test.ts", - "sourceObjectId": "bb5875976d02911c66cd67eddcfc4ec7c27453f8", - "sha256": "27692131acb3f4ab6cbded1ddc7d141115148889eea2bcde3465b4d303f09712", - "size": 7246 + "sourceObjectId": "6048bf17eec40318fb374217a56311d992e27068", + "sha256": "9d7f12f3724fd004a5aa4755cd20adb58af6593b9cca54ade9e4c23d2c251a00", + "size": 7488 }, { "path": "apps/worker/tests/workflow-span-integration.test.ts", @@ -24055,9 +24055,9 @@ }, { "path": "packages/contracts/src/observability.ts", - "sourceObjectId": "25902119c9ad32131d85b80b6a62375418a1bcb2", - "sha256": "d2a03cd88b945fc746cba62d2e9924efe3f5e427237a5a7892a4858b22b1e7e4", - "size": 9255 + "sourceObjectId": "103748800ab9300f2f82b93f8c7a9b01989c8acf", + "sha256": "aa401663e135404ee01445740346217ef040bf6f1baac04a182ba3ef07b134cf", + "size": 9411 }, { "path": "packages/contracts/src/pane-catalog.ts", @@ -24469,9 +24469,9 @@ }, { "path": "packages/contracts/tests/observability.test.ts", - "sourceObjectId": "e03cad731ff150ddbf7126e69efb3568e1c10204", - "sha256": "11eab017c790aa66562c73161d8d6a640433b61ca1793a1f7dd438b42b583161", - "size": 5427 + "sourceObjectId": "bf29665b557ad4e98caf82d34d7d7949768ded01", + "sha256": "da3790c7d0d5e1f59f8e7249604be8552d9d7c4fff3d9e81a0cdde74f000f261", + "size": 5731 }, { "path": "packages/contracts/tests/pane-catalog.test.ts", diff --git a/apps/worker/src/workflow-span-context.ts b/apps/worker/src/workflow-span-context.ts index 66e9cb909..54f31ceb1 100644 --- a/apps/worker/src/workflow-span-context.ts +++ b/apps/worker/src/workflow-span-context.ts @@ -7,7 +7,7 @@ * no I/O) and from worker code and tests alike. */ -import { parseTraceparent, type ParsedTraceparent } from "@space/contracts"; +import { fnv1a64Hex, parseTraceparent, type ParsedTraceparent } from "@space/contracts"; /** Temporal header that carries the workflow run's span context to activities and child workflows. */ export const SPAN_CONTEXT_HEADER = "space.span-context"; @@ -72,18 +72,8 @@ export const WORKFLOW_SPAN_ATTRIBUTE_ALLOWLIST = [ export type WorkflowSpanAttributeKey = (typeof WORKFLOW_SPAN_ATTRIBUTE_ALLOWLIST)[number]; -const FNV1A_OFFSET = 0xcbf29ce484222325n; -const FNV1A_PRIME = 0x100000001b3n; - -/** Deterministic FNV-1a 64-bit hash as 16 lowercase hex digits. */ -export function fnv1a64Hex(value: string): string { - let hash = FNV1A_OFFSET; - for (let index = 0; index < value.length; index++) { - hash ^= BigInt(value.charCodeAt(index) & 0xff); - hash = BigInt.asUintN(64, hash * FNV1A_PRIME); - } - return hash.toString(16).padStart(16, "0"); -} +/** Re-exported shared FNV-1a 64-bit helper from `@space/contracts` (single implementation). */ +export { fnv1a64Hex }; /** Deterministic span id for one workflow run; stable across replays of the same history. */ export function workflowSpanId(workflowId: string, runId: string): string { diff --git a/apps/worker/tests/workflow-span-context.test.ts b/apps/worker/tests/workflow-span-context.test.ts index bb5875976..6048bf17e 100644 --- a/apps/worker/tests/workflow-span-context.test.ts +++ b/apps/worker/tests/workflow-span-context.test.ts @@ -9,6 +9,7 @@ import { workflowTraceId, WORKFLOW_SPAN_ATTRIBUTE_ALLOWLIST } from "../src/workflow-span-context.js"; +import { fnv1a64Hex as contractsFnv1a64Hex } from "@space/contracts"; const traceparent = "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"; const secretPrompt = "PRIVATE PROMPT: deploy with token sk-live-worker-secret-123"; @@ -150,3 +151,9 @@ describe("span-context header payload", () => { ]); }); }); + +describe("shared FNV-1a helper", () => { + it("re-exports the single @space/contracts implementation", () => { + expect(fnv1a64Hex).toBe(contractsFnv1a64Hex); + }); +}); diff --git a/packages/contracts/src/observability.ts b/packages/contracts/src/observability.ts index 25902119c..103748800 100644 --- a/packages/contracts/src/observability.ts +++ b/packages/contracts/src/observability.ts @@ -125,8 +125,12 @@ const FNV1A_OFFSET = 0xcbf29ce484222325n; const FNV1A_PRIME = 0x100000001b3n; const spaceTraceIdPattern = /^[A-Za-z0-9:._-]{1,128}$/; -/** Computes a deterministic 64-bit FNV-1a digest as 16 lowercase hex chars. */ -function fnv1a64Hex(value: string): string { +/** + * Computes a deterministic 64-bit FNV-1a digest as 16 lowercase hex chars. + * Pure and sandbox-safe (no I/O, clocks, or randomness), so Temporal workflow + * code may import it to derive replay-stable trace and span ids. + */ +export function fnv1a64Hex(value: string): string { let hash = FNV1A_OFFSET; for (let index = 0; index < value.length; index++) { hash ^= BigInt(value.charCodeAt(index) & 0xff); diff --git a/packages/contracts/tests/observability.test.ts b/packages/contracts/tests/observability.test.ts index e03cad731..bf29665b5 100644 --- a/packages/contracts/tests/observability.test.ts +++ b/packages/contracts/tests/observability.test.ts @@ -3,6 +3,7 @@ import { categorizeFailureCode, dummyTurnInputSchema, failureCategorySchema, + fnv1a64Hex, fileSearchResponseSchema, formatTraceparent, isSafeErrorCode, @@ -123,3 +124,11 @@ describe("additive observability contract fields", () => { expect(workerReadinessSchema.parse({ ...readiness, workflowBacklogAgeSeconds: 2.5 }).workflowBacklogAgeSeconds).toBe(2.5); }); }); + +describe("fnv1a64Hex", () => { + it("matches FNV-1a 64-bit reference vectors as 16 lowercase hex chars", () => { + expect(fnv1a64Hex("")).toBe("cbf29ce484222325"); + expect(fnv1a64Hex("a")).toBe("af63dc4c8601ec8c"); + expect(fnv1a64Hex("foobar")).toBe("85944171f73967e8"); + }); +});