@ours.network/cowork 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/cli.js +35 -6
- package/dist/daemon.js +39 -2
- package/dist/mufl_code/BBAE58CF78DEE59692F456EAFFA9A6109835B66846FC3989F6D201B8F4523A55.muflo +0 -0
- package/dist/web/assets/app.css +1 -1
- package/dist/web/assets/app.js +9 -9
- package/docs/05-room-workflow.md +3 -3
- package/docs/11-web-console.md +8 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,9 @@ ours-cowork web
|
|
|
7
7
|
ours-cowork docs
|
|
8
8
|
```
|
|
9
9
|
|
|
10
|
-
`ours-cowork web` starts the daemon if it is absent, waits for the console, and opens `http://127.0.0.1:3052/`. Create a room first, then add each invitation requirement from its Invite panel. The Communication view contains the human-readable room chat; operational records remain in Events and the complete ordered stream remains in Archive.
|
|
10
|
+
`ours-cowork web` starts the daemon if it is absent, waits for the console, and opens `http://127.0.0.1:3052/`. Create a room with a friendly display name first, then add each invitation requirement from its Invite panel. Names are trimmed, normalized to Unicode NFC, and may contain 1–64 Unicode characters excluding control and format characters. Duplicate names are allowed. The Communication view contains the human-readable room chat; operational records remain in Events and the complete ordered stream remains in Archive.
|
|
11
|
+
|
|
12
|
+
The friendly `room_name` is presentation metadata. The opaque `room_id` remains the stable key for routing, URLs, storage, and identity correlation, and the underlying technical room identity is never renamed. Rooms created before friendly names existed migrate deterministically to `Room <first 8 room_id characters>`.
|
|
11
13
|
|
|
12
14
|
The localhost HTTP console has no authentication. Keep it bound to `127.0.0.1`; do not proxy, forward, or expose the port to other hosts. Room state is refreshed by periodic polling, not pushed to the browser.
|
|
13
15
|
|
package/dist/cli.js
CHANGED
|
@@ -4280,6 +4280,7 @@ var MAX_MANAGEMENT_RESPONSE_BYTES = MAX_HISTORY_PAGE_BYTES + 1024 * 1024;
|
|
|
4280
4280
|
var MAX_FILE_NAME_BYTES = 255;
|
|
4281
4281
|
var MAX_MIME_BYTES = 255;
|
|
4282
4282
|
var MAX_ROLE_BYTES = 256;
|
|
4283
|
+
var MAX_ROOM_NAME_CHARACTERS = 64;
|
|
4283
4284
|
function utf8Bounded(label, maximumBytes) {
|
|
4284
4285
|
return external_exports.string().refine((value) => Buffer.byteLength(value, "utf8") >= 1, `${label} must be at least 1 UTF-8 byte`).refine(
|
|
4285
4286
|
(value) => Buffer.byteLength(value, "utf8") <= maximumBytes,
|
|
@@ -4311,6 +4312,21 @@ function isStrictRfc3339(value) {
|
|
|
4311
4312
|
return day >= 1 && day <= days[month - 1];
|
|
4312
4313
|
}
|
|
4313
4314
|
var Rfc3339Schema = external_exports.string().refine(isStrictRfc3339, "must be a valid RFC3339 timestamp");
|
|
4315
|
+
function normalizeRoomName(value) {
|
|
4316
|
+
return value.trim().normalize("NFC");
|
|
4317
|
+
}
|
|
4318
|
+
var RoomNameSchema = external_exports.string().refine(
|
|
4319
|
+
(value) => !/[\p{Cc}\p{Cf}]/u.test(value),
|
|
4320
|
+
"room name must not contain Unicode control or format characters"
|
|
4321
|
+
).transform(normalizeRoomName).superRefine((value, context) => {
|
|
4322
|
+
const length = Array.from(value).length;
|
|
4323
|
+
if (length < 1 || length > MAX_ROOM_NAME_CHARACTERS) {
|
|
4324
|
+
context.addIssue({
|
|
4325
|
+
code: external_exports.ZodIssueCode.custom,
|
|
4326
|
+
message: `room name must contain 1-${MAX_ROOM_NAME_CHARACTERS} Unicode characters after normalization`
|
|
4327
|
+
});
|
|
4328
|
+
}
|
|
4329
|
+
});
|
|
4314
4330
|
var RoleSchema = utf8Bounded("role", MAX_ROLE_BYTES);
|
|
4315
4331
|
var MissionTextSchema = utf8Bounded("mission text", MAX_TEXT_BYTES);
|
|
4316
4332
|
var MessageTextSchema = utf8Bounded("message text", MAX_TEXT_BYTES);
|
|
@@ -4520,8 +4536,9 @@ var RoomV1Schema = external_exports.object({
|
|
|
4520
4536
|
mission: MissionV1Schema,
|
|
4521
4537
|
seats: external_exports.array(SeatV1Schema)
|
|
4522
4538
|
}).strict().superRefine(refineRoomLineage);
|
|
4523
|
-
var
|
|
4539
|
+
var CurrentRoomSchema = external_exports.object({
|
|
4524
4540
|
...RoomCommonShape,
|
|
4541
|
+
room_name: RoomNameSchema,
|
|
4525
4542
|
version: external_exports.literal(2),
|
|
4526
4543
|
mission: MissionSchema,
|
|
4527
4544
|
role_briefings: external_exports.record(RoleSchema, RoleBriefingSchema),
|
|
@@ -4601,13 +4618,24 @@ var RoomSchema = external_exports.object({
|
|
|
4601
4618
|
}
|
|
4602
4619
|
}
|
|
4603
4620
|
});
|
|
4621
|
+
function defaultRoomName(roomId) {
|
|
4622
|
+
return `Room ${LowerCrockfordUlidSchema.parse(roomId).slice(0, 8)}`;
|
|
4623
|
+
}
|
|
4624
|
+
var RoomSchema = external_exports.preprocess((value) => {
|
|
4625
|
+
if (typeof value !== "object" || value === null || Object.hasOwn(value, "room_name")) return value;
|
|
4626
|
+
const roomId = value.room_id;
|
|
4627
|
+
if (typeof roomId !== "string" || !LowerCrockfordUlidSchema.safeParse(roomId).success) return value;
|
|
4628
|
+
return { ...value, room_name: defaultRoomName(roomId) };
|
|
4629
|
+
}, CurrentRoomSchema);
|
|
4604
4630
|
var CreateRoomInputSchema = external_exports.object({
|
|
4631
|
+
name: RoomNameSchema.optional(),
|
|
4605
4632
|
goal: MissionTextSchema,
|
|
4606
4633
|
briefing: MissionTextSchema,
|
|
4607
4634
|
anonymous: external_exports.boolean().optional(),
|
|
4608
4635
|
quiet_membership: external_exports.boolean().optional()
|
|
4609
4636
|
}).strict();
|
|
4610
4637
|
var UpdateRoomInputSchema = external_exports.object({
|
|
4638
|
+
name: RoomNameSchema.optional(),
|
|
4611
4639
|
goal: MissionTextSchema.optional(),
|
|
4612
4640
|
briefing: MissionTextSchema.optional(),
|
|
4613
4641
|
status: NonEmptyStringSchema.optional(),
|
|
@@ -4935,8 +4963,8 @@ Usage:
|
|
|
4935
4963
|
ours-cowork [--json] docs [topic]
|
|
4936
4964
|
|
|
4937
4965
|
Room commands:
|
|
4938
|
-
create --goal <text> --briefing <text> [--anonymous] [--quiet-membership]
|
|
4939
|
-
settings <room-id> [--goal <text>] [--briefing <text>] [--status <text>] [--quiet-membership true|false]
|
|
4966
|
+
create [--name <display-name>] --goal <text> --briefing <text> [--anonymous] [--quiet-membership]
|
|
4967
|
+
settings <room-id> [--name <display-name>] [--goal <text>] [--briefing <text>] [--status <text>] [--quiet-membership true|false]
|
|
4940
4968
|
role-briefing <room-id> --role <label> (--text <text> | --delete)
|
|
4941
4969
|
invite <room-id> [--role <label>] [--mode one_time|public] [--min-accepts <n>]
|
|
4942
4970
|
revoke <room-id> <invite-id>
|
|
@@ -5025,9 +5053,10 @@ function roomRequest(command, args) {
|
|
|
5025
5053
|
if (!command) usageError("room requires a command");
|
|
5026
5054
|
switch (command) {
|
|
5027
5055
|
case "create": {
|
|
5028
|
-
const parsed = parseOptions(args, ["--goal", "--briefing"], ["--anonymous", "--quiet-membership"]);
|
|
5056
|
+
const parsed = parseOptions(args, ["--name", "--goal", "--briefing"], ["--anonymous", "--quiet-membership"]);
|
|
5029
5057
|
exactPositionals(parsed, 0, "room create");
|
|
5030
5058
|
return { method: "room.create", params: {
|
|
5059
|
+
...parsed.values["--name"] === void 0 ? {} : { name: parsed.values["--name"] },
|
|
5031
5060
|
goal: requiredFlag(parsed, "--goal", "room create"),
|
|
5032
5061
|
briefing: requiredFlag(parsed, "--briefing", "room create"),
|
|
5033
5062
|
...parsed.booleans.has("--anonymous") ? { anonymous: true } : {},
|
|
@@ -5035,10 +5064,10 @@ function roomRequest(command, args) {
|
|
|
5035
5064
|
} };
|
|
5036
5065
|
}
|
|
5037
5066
|
case "settings": {
|
|
5038
|
-
const parsed = parseOptions(args, ["--goal", "--briefing", "--status", "--quiet-membership"]);
|
|
5067
|
+
const parsed = parseOptions(args, ["--name", "--goal", "--briefing", "--status", "--quiet-membership"]);
|
|
5039
5068
|
const [roomId] = exactPositionals(parsed, 1, "room settings");
|
|
5040
5069
|
const params = { room_id: roomId };
|
|
5041
|
-
for (const [flag, key] of [["--goal", "goal"], ["--briefing", "briefing"], ["--status", "status"]]) {
|
|
5070
|
+
for (const [flag, key] of [["--name", "name"], ["--goal", "goal"], ["--briefing", "briefing"], ["--status", "status"]]) {
|
|
5042
5071
|
if (parsed.values[flag] !== void 0) params[key] = parsed.values[flag];
|
|
5043
5072
|
}
|
|
5044
5073
|
const quiet = parsed.values["--quiet-membership"];
|
package/dist/daemon.js
CHANGED
|
@@ -4793,6 +4793,9 @@ function isStrictRfc3339(value) {
|
|
|
4793
4793
|
const days = [31, leapYear ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
4794
4794
|
return day >= 1 && day <= days[month - 1];
|
|
4795
4795
|
}
|
|
4796
|
+
function normalizeRoomName(value) {
|
|
4797
|
+
return value.trim().normalize("NFC");
|
|
4798
|
+
}
|
|
4796
4799
|
function refineRoomLineage(room, context) {
|
|
4797
4800
|
const pendingIdentityName = `cowork-room-${room.room_id}`;
|
|
4798
4801
|
const exactPacketPending = room.state === "provisioning" && room.status === "packet_pending" && room.identity_name === pendingIdentityName && room.invites.length === 0 && room.seats.length === 0 && room.activated_at === void 0 && room.closed_at === void 0;
|
|
@@ -4842,6 +4845,9 @@ function refineRoomLineage(room, context) {
|
|
|
4842
4845
|
}
|
|
4843
4846
|
}
|
|
4844
4847
|
}
|
|
4848
|
+
function defaultRoomName(roomId) {
|
|
4849
|
+
return `Room ${LowerCrockfordUlidSchema.parse(roomId).slice(0, 8)}`;
|
|
4850
|
+
}
|
|
4845
4851
|
function migrateRoomV1(room, mintParticipantId) {
|
|
4846
4852
|
return RoomSchema.parse({
|
|
4847
4853
|
...room,
|
|
@@ -4918,7 +4924,7 @@ function refineMessageCategory(message, context) {
|
|
|
4918
4924
|
}
|
|
4919
4925
|
}
|
|
4920
4926
|
}
|
|
4921
|
-
var MAX_TEXT_BYTES, MAX_FILE_BYTES, MAX_HISTORY_PAGE_BYTES, MAX_MANAGEMENT_RESPONSE_BYTES, MAX_FILE_NAME_BYTES, MAX_MIME_BYTES, MAX_ROLE_BYTES, NonEmptyStringSchema, PositiveSafeIntegerSchema, LowerCrockfordUlidSchema, Rfc3339Schema, RoleSchema, MissionTextSchema, MessageTextSchema, FileNameSchema, FileMimeSchema, RoomStateSchema, SeatStateSchema, InviteModeSchema, DEFAULT_ROLE, InviteStateSchema, RelayStatusSchema, SeatV1Schema, SeatSchema, RoomInviteSchema, MissionV1Schema, MissionSchema, RoleBriefingSchema, RoomCommonShape, RoomV1Schema, RoomSchema, CreateRoomInputSchema, UpdateRoomInputSchema, RoleBriefingSetInputSchema, RoleBriefingDeleteInputSchema, PostMessageInputSchema, AuthorSnapshotSchema, RecordCommonShape, AppendCommonShape, MembershipNoticeSchema, AuthorAliasSchema, MessageShape, RelayIntentShape, RelayResultStatusSchema, RelayResultShape, FileShape, MembershipIntentShape, MembershipResultShape, CloseNoticeIntentShape, CloseNoticeResultShape, MessageRecordSchema, FileRecordSchema, RelayIntentRecordSchema, RelayResultRecordSchema, MembershipIntentRecordSchema, MembershipResultRecordSchema, CloseNoticeIntentRecordSchema, CloseNoticeResultRecordSchema, RawCommunicationRecordSchema, CommunicationRecordSchema, AppendRecordSchema;
|
|
4927
|
+
var MAX_TEXT_BYTES, MAX_FILE_BYTES, MAX_HISTORY_PAGE_BYTES, MAX_MANAGEMENT_RESPONSE_BYTES, MAX_FILE_NAME_BYTES, MAX_MIME_BYTES, MAX_ROLE_BYTES, MAX_ROOM_NAME_CHARACTERS, NonEmptyStringSchema, PositiveSafeIntegerSchema, LowerCrockfordUlidSchema, Rfc3339Schema, RoomNameSchema, RoleSchema, MissionTextSchema, MessageTextSchema, FileNameSchema, FileMimeSchema, RoomStateSchema, SeatStateSchema, InviteModeSchema, DEFAULT_ROLE, InviteStateSchema, RelayStatusSchema, SeatV1Schema, SeatSchema, RoomInviteSchema, MissionV1Schema, MissionSchema, RoleBriefingSchema, RoomCommonShape, RoomV1Schema, CurrentRoomSchema, RoomSchema, CreateRoomInputSchema, UpdateRoomInputSchema, RoleBriefingSetInputSchema, RoleBriefingDeleteInputSchema, PostMessageInputSchema, AuthorSnapshotSchema, RecordCommonShape, AppendCommonShape, MembershipNoticeSchema, AuthorAliasSchema, MessageShape, RelayIntentShape, RelayResultStatusSchema, RelayResultShape, FileShape, MembershipIntentShape, MembershipResultShape, CloseNoticeIntentShape, CloseNoticeResultShape, MessageRecordSchema, FileRecordSchema, RelayIntentRecordSchema, RelayResultRecordSchema, MembershipIntentRecordSchema, MembershipResultRecordSchema, CloseNoticeIntentRecordSchema, CloseNoticeResultRecordSchema, RawCommunicationRecordSchema, CommunicationRecordSchema, AppendRecordSchema;
|
|
4922
4928
|
var init_contracts = __esm({
|
|
4923
4929
|
"src/contracts.ts"() {
|
|
4924
4930
|
"use strict";
|
|
@@ -4930,6 +4936,7 @@ var init_contracts = __esm({
|
|
|
4930
4936
|
MAX_FILE_NAME_BYTES = 255;
|
|
4931
4937
|
MAX_MIME_BYTES = 255;
|
|
4932
4938
|
MAX_ROLE_BYTES = 256;
|
|
4939
|
+
MAX_ROOM_NAME_CHARACTERS = 64;
|
|
4933
4940
|
NonEmptyStringSchema = external_exports.string().min(1);
|
|
4934
4941
|
PositiveSafeIntegerSchema = external_exports.number().int().positive().safe();
|
|
4935
4942
|
LowerCrockfordUlidSchema = external_exports.string().regex(
|
|
@@ -4937,6 +4944,18 @@ var init_contracts = __esm({
|
|
|
4937
4944
|
"must be a 26-character lowercase Crockford ULID"
|
|
4938
4945
|
);
|
|
4939
4946
|
Rfc3339Schema = external_exports.string().refine(isStrictRfc3339, "must be a valid RFC3339 timestamp");
|
|
4947
|
+
RoomNameSchema = external_exports.string().refine(
|
|
4948
|
+
(value) => !/[\p{Cc}\p{Cf}]/u.test(value),
|
|
4949
|
+
"room name must not contain Unicode control or format characters"
|
|
4950
|
+
).transform(normalizeRoomName).superRefine((value, context) => {
|
|
4951
|
+
const length = Array.from(value).length;
|
|
4952
|
+
if (length < 1 || length > MAX_ROOM_NAME_CHARACTERS) {
|
|
4953
|
+
context.addIssue({
|
|
4954
|
+
code: external_exports.ZodIssueCode.custom,
|
|
4955
|
+
message: `room name must contain 1-${MAX_ROOM_NAME_CHARACTERS} Unicode characters after normalization`
|
|
4956
|
+
});
|
|
4957
|
+
}
|
|
4958
|
+
});
|
|
4940
4959
|
RoleSchema = utf8Bounded("role", MAX_ROLE_BYTES);
|
|
4941
4960
|
MissionTextSchema = utf8Bounded("mission text", MAX_TEXT_BYTES);
|
|
4942
4961
|
MessageTextSchema = utf8Bounded("message text", MAX_TEXT_BYTES);
|
|
@@ -5098,8 +5117,9 @@ var init_contracts = __esm({
|
|
|
5098
5117
|
mission: MissionV1Schema,
|
|
5099
5118
|
seats: external_exports.array(SeatV1Schema)
|
|
5100
5119
|
}).strict().superRefine(refineRoomLineage);
|
|
5101
|
-
|
|
5120
|
+
CurrentRoomSchema = external_exports.object({
|
|
5102
5121
|
...RoomCommonShape,
|
|
5122
|
+
room_name: RoomNameSchema,
|
|
5103
5123
|
version: external_exports.literal(2),
|
|
5104
5124
|
mission: MissionSchema,
|
|
5105
5125
|
role_briefings: external_exports.record(RoleSchema, RoleBriefingSchema),
|
|
@@ -5179,13 +5199,21 @@ var init_contracts = __esm({
|
|
|
5179
5199
|
}
|
|
5180
5200
|
}
|
|
5181
5201
|
});
|
|
5202
|
+
RoomSchema = external_exports.preprocess((value) => {
|
|
5203
|
+
if (typeof value !== "object" || value === null || Object.hasOwn(value, "room_name")) return value;
|
|
5204
|
+
const roomId = value.room_id;
|
|
5205
|
+
if (typeof roomId !== "string" || !LowerCrockfordUlidSchema.safeParse(roomId).success) return value;
|
|
5206
|
+
return { ...value, room_name: defaultRoomName(roomId) };
|
|
5207
|
+
}, CurrentRoomSchema);
|
|
5182
5208
|
CreateRoomInputSchema = external_exports.object({
|
|
5209
|
+
name: RoomNameSchema.optional(),
|
|
5183
5210
|
goal: MissionTextSchema,
|
|
5184
5211
|
briefing: MissionTextSchema,
|
|
5185
5212
|
anonymous: external_exports.boolean().optional(),
|
|
5186
5213
|
quiet_membership: external_exports.boolean().optional()
|
|
5187
5214
|
}).strict();
|
|
5188
5215
|
UpdateRoomInputSchema = external_exports.object({
|
|
5216
|
+
name: RoomNameSchema.optional(),
|
|
5189
5217
|
goal: MissionTextSchema.optional(),
|
|
5190
5218
|
briefing: MissionTextSchema.optional(),
|
|
5191
5219
|
status: NonEmptyStringSchema.optional(),
|
|
@@ -6707,6 +6735,7 @@ var init_service = __esm({
|
|
|
6707
6735
|
const provisional = RoomSchema.parse({
|
|
6708
6736
|
version: 2,
|
|
6709
6737
|
room_id: roomId,
|
|
6738
|
+
room_name: settings.name ?? defaultRoomName(roomId),
|
|
6710
6739
|
identity_name: identityName,
|
|
6711
6740
|
// PacketRegistry needs the durable room directory to exist first. A
|
|
6712
6741
|
// valid, explicitly provisional value lets startup resume this exact
|
|
@@ -6818,6 +6847,7 @@ var init_service = __esm({
|
|
|
6818
6847
|
};
|
|
6819
6848
|
const next = await this.store.save(RoomSchema.parse({
|
|
6820
6849
|
...room,
|
|
6850
|
+
room_name: settings.name ?? room.room_name,
|
|
6821
6851
|
mission,
|
|
6822
6852
|
...settings.quiet_membership === void 0 ? {} : { quiet_membership: settings.quiet_membership },
|
|
6823
6853
|
...settings.status === void 0 ? {} : { status: settings.status }
|
|
@@ -7987,12 +8017,18 @@ var init_storage = __esm({
|
|
|
7987
8017
|
throw this.wrap(`malformed metadata for room "${roomId}"`, error);
|
|
7988
8018
|
}
|
|
7989
8019
|
const room = this.isVersion1(decoded) ? this.migrateUnlocked(roomId, decoded, bytes) : RoomSchema.parse(decoded);
|
|
8020
|
+
if (!this.isVersion1(decoded) && this.persistedRoomName(decoded) !== room.room_name) {
|
|
8021
|
+
this.atomicMetadataWrite(this.metadataPath(roomId), room);
|
|
8022
|
+
}
|
|
7990
8023
|
if (room.room_id !== roomId) throw new CoworkStorageError(`metadata room_id does not match room "${roomId}"`);
|
|
7991
8024
|
return room;
|
|
7992
8025
|
}
|
|
7993
8026
|
isVersion1(decoded) {
|
|
7994
8027
|
return typeof decoded === "object" && decoded !== null && decoded.version === 1;
|
|
7995
8028
|
}
|
|
8029
|
+
persistedRoomName(decoded) {
|
|
8030
|
+
return typeof decoded === "object" && decoded !== null ? decoded.room_name : void 0;
|
|
8031
|
+
}
|
|
7996
8032
|
/**
|
|
7997
8033
|
* Lazy additive v1 → v2 migration (spec §7): preserve the exact pre-migration
|
|
7998
8034
|
* bytes once as room.json.v1.bak, then atomically persist the v2 metadata.
|
|
@@ -8501,6 +8537,7 @@ function createServiceRoutes(service) {
|
|
|
8501
8537
|
"room.settings": { auth: true, run: (params) => {
|
|
8502
8538
|
const { room_id, ...input } = external_exports.object({
|
|
8503
8539
|
room_id: external_exports.string(),
|
|
8540
|
+
name: external_exports.unknown().optional(),
|
|
8504
8541
|
goal: external_exports.unknown().optional(),
|
|
8505
8542
|
briefing: external_exports.unknown().optional(),
|
|
8506
8543
|
status: external_exports.unknown().optional(),
|
package/dist/mufl_code/BBAE58CF78DEE59692F456EAFFA9A6109835B66846FC3989F6D201B8F4523A55.muflo
CHANGED
|
Binary file
|
package/dist/web/assets/app.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{color-scheme:dark;--bg: #080b0c;--panel: #111617;--panel-raised: #171d1f;--panel-soft: #0d1112;--line: #222a2c;--line-strong: #354043;--mint: #7ce7b0;--mint-dim: #429a70;--warning: #f0c66c;--danger: #ff827c;--text: #e9efed;--text-muted: #8d9a97;--text-faint: #64706e;--radius-sm: 5px;--radius: 8px;--shadow-mint: 0 0 20px rgb(124 231 176 / 10%);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-synthesis:none;color:var(--text);background:var(--bg)}*{box-sizing:border-box}html,body,#root{min-width:320px;min-height:100%}body{margin:0;background:var(--bg)}button,input,textarea{font:inherit}button{color:inherit}button:focus-visible,input:focus-visible,textarea:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--mint);outline-offset:2px}::selection{color:var(--bg);background:var(--mint)}.mono{font-family:SFMono-Regular,Consolas,Liberation Mono,monospace}@media (prefers-reduced-motion: reduce){*,*:before,*:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.cowork-app{min-height:100vh;display:grid;grid-template-columns:280px minmax(420px,1fr) 320px;overflow:hidden;background:radial-gradient(circle at 48% 0,rgb(124 231 176 / 3%),transparent 28%),var(--bg)}.room-rail,.room-context{height:100vh;overflow-y:auto;background:var(--panel);z-index:5}.room-rail[hidden],.room-context[hidden]{display:none;visibility:hidden;pointer-events:none}.room-rail{display:flex;flex-direction:column;border-right:1px solid var(--line);padding:18px 14px 14px}.rail-brand{display:flex;align-items:center;gap:10px;min-height:42px;padding:0 5px 16px}.brand-mark{display:grid;place-items:center;width:32px;height:32px;border:1px solid var(--mint-dim);border-radius:50%;color:var(--mint);font:700 15px/1 Georgia,serif;box-shadow:var(--shadow-mint)}.rail-brand strong,.rail-brand span{display:block}.rail-brand strong{font-size:14px;letter-spacing:.02em}.rail-brand span{margin-top:2px;color:var(--text-faint);font-size:10px;letter-spacing:.1em;text-transform:uppercase}.rail-close,.context-close,.mobile-rooms,.context-toggle{display:none!important}.primary-button,.secondary-button,.quiet-button,.icon-button{border-radius:var(--radius-sm);cursor:pointer;transition:border-color .14s ease,background .14s ease,color .14s ease,transform .14s ease}.primary-button{min-height:38px;border:1px solid var(--mint);background:var(--mint);color:#07100c;font-weight:700;box-shadow:var(--shadow-mint)}.primary-button:hover:not(:disabled){background:#95f1c2;transform:translateY(-1px)}.primary-button:disabled,.secondary-button:disabled,.quiet-button:disabled{cursor:not-allowed;opacity:.42}.secondary-button{min-height:36px;padding:0 14px;border:1px solid var(--line-strong);background:var(--panel-raised)}.quiet-button{padding:7px 10px;border:1px solid var(--line);background:transparent;color:var(--text-muted)}.quiet-button:hover:not(:disabled),.secondary-button:hover:not(:disabled){border-color:var(--mint-dim);color:var(--mint)}.icon-button{display:grid;place-items:center;width:34px;height:34px;padding:0;border:1px solid transparent;background:transparent;color:var(--text-muted);font-size:20px}.create-button{width:100%;margin-bottom:14px}.connection-state{display:flex;align-items:center;gap:7px;margin:0 5px 17px;color:var(--text-muted);font-size:11px;text-transform:uppercase;letter-spacing:.08em}.state-dot,.lifecycle-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--text-faint)}.connection-state--online .state-dot,.lifecycle-dot--active{background:var(--mint);box-shadow:0 0 8px #7ce7b073}.connection-state--offline .state-dot,.lifecycle-dot--closed{background:var(--danger)}.lifecycle-dot--provisioning,.lifecycle-dot--closing{background:var(--warning)}.room-group{margin-bottom:12px}.room-group__heading{display:flex;align-items:center;justify-content:space-between;padding:0 5px}.room-group__heading h2{color:var(--text-faint);font-size:10px;text-transform:uppercase;letter-spacing:.12em}.room-group__heading span{color:var(--text-faint);font-size:11px}.room-list{display:grid;gap:4px;padding:0;margin:4px 0 0;list-style:none}.room-card{position:relative;width:100%;display:grid;grid-template-columns:1fr auto;gap:7px 8px;padding:11px 10px 10px 13px;text-align:left;border:1px solid transparent;border-radius:var(--radius);background:transparent;cursor:pointer}.room-card:hover{background:#ffffff05;border-color:var(--line)}.room-card[aria-current=page]{background:var(--panel-raised);border-color:var(--line-strong);box-shadow:inset 2px 0 var(--mint)}.room-card__title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:650}.room-card__state{display:flex;align-items:center;gap:5px;color:var(--text-muted);font-size:10px}.room-card__summary{grid-column:1 / -1;color:var(--text-faint);font-size:11px}.empty-group{margin:8px 5px 14px;color:var(--text-faint);font-size:12px}.local-boundary{margin:auto 5px 0;padding-top:16px;border-top:1px solid var(--line);color:var(--text-faint);font:10px/1.4 SFMono-Regular,Consolas,monospace}.workspace{height:100vh;min-width:0;display:flex;flex-direction:column;overflow:hidden}.workspace--empty{position:relative;display:grid;place-items:center}.empty-workspace{max-width:390px;padding:30px;text-align:center;color:var(--text-muted)}.empty-workspace__glyph{color:var(--mint);font-size:42px}.empty-workspace h1{margin:5px 0 8px;color:var(--text);font-size:26px}.empty-workspace p:last-child{font-size:14px;line-height:1.55}.workspace-header{min-height:88px;display:flex;align-items:center;gap:18px;padding:16px 24px;border-bottom:1px solid var(--line);background:#080b0cd1}.workspace-identity{min-width:0}.eyebrow{margin:0 0 5px;color:var(--text-faint);font-size:10px;font-weight:700;letter-spacing:.13em;text-transform:uppercase}.workspace-header h1{overflow:hidden;margin:0;text-overflow:ellipsis;white-space:nowrap;font-size:19px}.identity-name{margin:4px 0 0;color:var(--text-faint);font-size:10px}.lifecycle-badge{margin-left:auto;padding:5px 8px;border:1px solid var(--line-strong);border-radius:999px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.lifecycle-badge--active{color:var(--mint);border-color:var(--mint-dim)}.lifecycle-badge--provisioning,.lifecycle-badge--closing{color:var(--warning)}.lifecycle-badge--closed{color:var(--danger)}.mission-strip{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:12px;padding:11px 24px;border-bottom:1px solid var(--line);background:var(--panel-soft)}.mission-strip>span{color:var(--mint);font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase}.mission-strip p{overflow:hidden;margin:0;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.workspace-tabs,.context-tabs{display:flex;gap:2px;padding:0 22px;border-bottom:1px solid var(--line)}.workspace-tabs button,.context-tabs button{position:relative;padding:13px 10px 11px;border:0;background:transparent;color:var(--text-muted);cursor:pointer;font-size:12px}.workspace-tabs button[aria-selected=true],.context-tabs button[aria-selected=true]{color:var(--text)}.workspace-tabs button[aria-selected=true]:after,.context-tabs button[aria-selected=true]:after{position:absolute;right:8px;bottom:-1px;left:8px;height:2px;background:var(--mint);content:""}.workspace-content{flex:1;overflow-y:auto;padding:28px clamp(20px,5vw,70px)}.communication-shell{max-width:760px;margin:0 auto}.briefing-card{padding:18px 20px;border:1px solid var(--line);border-left:2px solid var(--mint-dim);border-radius:var(--radius);background:var(--panel)}.briefing-card>p:last-child{margin:0;color:#cad3d0;font-size:14px;line-height:1.6;white-space:pre-wrap}.panel-placeholder{padding:60px 20px;text-align:center;color:var(--text-muted)}.panel-placeholder>span{color:var(--mint-dim);font:22px/1 monospace;letter-spacing:.15em}.panel-placeholder h2{margin:14px 0 7px;color:var(--text);font-size:15px}.panel-placeholder p{max-width:430px;margin:0 auto;font-size:12px;line-height:1.55}.room-context{border-left:1px solid var(--line)}.context-header{display:flex;justify-content:space-between;min-height:88px;padding:21px 20px 15px;border-bottom:1px solid var(--line)}.context-header h2{margin:0;font-size:15px}.context-tabs{padding:0 12px}.context-body{padding:18px}.state-grid{display:grid;grid-template-columns:1fr 1fr;gap:1px;margin-bottom:18px;overflow:hidden;border:1px solid var(--line);border-radius:var(--radius);background:var(--line)}.state-grid div{padding:12px;background:var(--panel-soft)}.state-grid dt{color:var(--text-faint);font-size:9px;letter-spacing:.08em;text-transform:uppercase}.state-grid dd{margin:6px 0 0;font-size:13px;font-weight:650}.state-grid--compact{margin-top:15px}.state-text{text-transform:capitalize}.state-text--active{color:var(--mint)}.state-text--provisioning,.state-text--closing{color:var(--warning)}.state-text--closed{color:var(--danger)}.detail-row{padding:11px 2px;border-bottom:1px solid var(--line)}.detail-row span,.detail-row strong{display:block}.detail-row span{margin-bottom:5px;color:var(--text-faint);font-size:10px;text-transform:uppercase;letter-spacing:.08em}.detail-row strong{overflow-wrap:anywhere;font-size:11px;font-weight:500}.setup-callout{display:flex;gap:12px;padding:15px;border:1px solid rgb(240 198 108 / 30%);border-radius:var(--radius);background:#f0c66c0d}.setup-callout>span{color:var(--warning)}.setup-callout h3{margin:0 0 6px;font-size:13px}.setup-callout p,.context-note{margin:0;color:var(--text-muted);font-size:11px;line-height:1.55}.context-note{padding:12px 2px}.disconnect-banner,.error-banner,.notice-banner{position:fixed;right:338px;left:298px;z-index:20;display:flex;align-items:center;gap:12px;min-height:38px;padding:8px 12px;border:1px solid;border-radius:var(--radius);background:var(--panel-raised);font-size:11px}.disconnect-banner{top:10px;border-color:#f0c66c73;color:var(--warning)}.disconnect-banner span{color:var(--text-muted)}.error-banner,.notice-banner{bottom:12px}.error-banner{border-color:#ff827c73}.notice-banner{border-color:var(--line-strong)}.error-banner button,.notice-banner button{margin-left:auto;border:0;background:transparent;cursor:pointer;color:var(--text-muted)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;display:grid;place-items:center;padding:18px;background:#000000b8;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.modal{width:min(590px,100%);max-height:calc(100vh - 36px);overflow-y:auto;border:1px solid var(--line-strong);border-radius:10px;background:var(--panel);box-shadow:0 26px 80px #0000008c}.modal>header{display:flex;align-items:center;justify-content:space-between;padding:17px 19px;border-bottom:1px solid var(--line)}.modal h2{margin:0;font-size:16px}.dialog-form{display:grid;gap:16px;padding:19px}.dialog-intro{margin:0 0 2px;color:var(--text-muted);font-size:12px;line-height:1.5}.field{display:grid;gap:7px}.field>label{font-size:11px;font-weight:650}.field textarea,.field input{width:100%;resize:vertical;padding:10px 11px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--bg);color:var(--text);line-height:1.45}.field textarea:hover,.field input:hover{border-color:#465255}.field [aria-invalid=true]{border-color:var(--danger)}.field small{color:var(--text-faint);font-size:10px}.field .field-error,.form-error{color:var(--danger)}.form-error{margin:0;padding:10px;border:1px solid rgb(255 130 124 / 30%);border-radius:var(--radius-sm);background:#ff827c0d;font-size:11px;line-height:1.45}.dialog-actions{display:flex;justify-content:flex-end;gap:9px;padding-top:3px}.dialog-actions .primary-button{padding:0 15px}.responsive-scrim{display:none}@media (max-width: 999px){.cowork-app{grid-template-columns:260px minmax(0,1fr)}.room-context{position:fixed;top:0;right:0;width:min(360px,90vw);transform:translate(102%);box-shadow:-18px 0 50px #0006;transition:transform .18s ease;z-index:31}.room-context--open{transform:translate(0)}.context-close,.context-toggle{display:grid!important}.context-toggle{display:block!important}.responsive-scrim{position:fixed;top:0;right:0;bottom:0;left:0;z-index:30;display:block;border:0;background:#0000008c}.disconnect-banner,.error-banner,.notice-banner{right:18px;left:278px}}@media (max-width: 759px){.cowork-app{display:block}.room-rail{position:fixed;top:0;left:0;width:min(340px,92vw);transform:translate(-102%);box-shadow:18px 0 50px #00000073;transition:transform .18s ease;z-index:32}.room-rail--open{transform:translate(0)}.rail-close,.mobile-rooms{display:grid!important}.rail-close{margin-left:auto}.mobile-rooms{flex:0 0 auto}.workspace-header{min-height:76px;gap:10px;padding:12px}.workspace-header .identity-name{display:none}.workspace-header h1{font-size:16px}.lifecycle-badge{padding:4px 6px;font-size:8px}.mission-strip{padding:9px 12px}.mission-strip .quiet-button{font-size:10px}.workspace-tabs{padding:0 8px}.workspace-content{padding:18px 12px}.disconnect-banner,.error-banner,.notice-banner{right:10px;left:10px}.disconnect-banner{top:auto;bottom:10px}.error-banner,.notice-banner{bottom:58px}.room-context{z-index:32}}.invite-form{display:grid;gap:11px;padding:13px 0 17px;border-bottom:1px solid var(--line)}.field select{width:100%;padding:10px 11px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--bg);color:var(--text)}.invite-list,.participant-list{display:grid;gap:9px;margin-top:14px}.invite-card,.participant-card,.receipt{display:grid;gap:7px;padding:12px;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-soft)}.invite-card header{display:flex;justify-content:space-between;gap:8px}.invite-card p,.participant-card span,.participant-card small,.recovery-callout p,.receipt p{margin:0;color:var(--text-muted);font-size:10px;line-height:1.45}.invite-card code,.participant-card code,.receipt code{overflow-wrap:anywhere;font-size:10px}.recovery-callout{display:grid;gap:10px;margin-top:14px;padding:12px;border:1px solid rgb(240 198 108 / 30%);border-radius:var(--radius);background:#f0c66c0d}.receipt pre{overflow-wrap:anywhere;white-space:pre-wrap;-webkit-user-select:all;user-select:all;padding:10px;border:1px solid var(--line-strong);background:var(--bg);color:var(--mint);font-size:11px}.danger-button{min-height:36px;padding:0 14px;border:1px solid var(--danger);border-radius:var(--radius-sm);background:#ff827c14;color:var(--danger);cursor:pointer}.danger-button:disabled{cursor:not-allowed;opacity:.42}.lifecycle-separator{margin:14px 0;padding:8px 12px;border:1px solid var(--line);border-radius:999px;color:var(--text-muted);text-align:center;font-size:10px;letter-spacing:.03em}.lifecycle-separator--provisioning,.lifecycle-separator--closing{border-color:#f0c66c40;color:var(--warning)}.lifecycle-separator--closed{border-color:#ff827c38;color:var(--danger)}.chat-timeline{display:grid;gap:12px;margin-top:16px}.chat-list,.record-list{display:grid;gap:10px;margin:0;padding:0;list-style:none}.chat-row{width:min(82%,610px);padding:12px 14px;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel)}.chat-row--room{justify-self:end;border-color:var(--mint-dim);background:#7ce7b00d}.chat-row--briefing{width:100%;border-left:2px solid var(--mint);background:var(--panel-soft)}.chat-row__meta{display:flex;align-items:baseline;gap:8px;color:var(--text-faint);font-size:9px}.chat-row__meta strong{color:var(--text);font-size:11px}.chat-row--room .chat-row__meta strong,.chat-row--briefing .chat-row__meta strong{color:var(--mint)}.chat-row__meta code{margin-left:auto}.chat-row__text{margin:8px 0 0;color:#d2d9d7;font-size:13px;line-height:1.55;overflow-wrap:anywhere;white-space:pre-wrap}.timeline-empty{margin:20px 0;color:var(--text-faint);text-align:center;font-size:11px}.show-earlier{justify-self:center}.room-composer{position:sticky;bottom:-28px;display:grid;gap:8px;margin:18px -4px -28px;padding:14px 4px 28px;border-top:1px solid var(--line);background:linear-gradient(to bottom,rgb(8 11 12 / 92%),var(--bg) 35%)}.room-composer textarea{width:100%;resize:vertical;padding:11px 12px;border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel);color:var(--text);line-height:1.45}.room-composer textarea:focus{border-color:var(--mint-dim)}.room-composer textarea:disabled{cursor:not-allowed;opacity:.55}.composer-footer{display:flex;align-items:center;justify-content:space-between;gap:12px}.composer-footer small{color:var(--text-faint);font-size:10px}.composer-footer .primary-button{min-width:112px;padding:0 13px}.record-list{max-width:900px;margin:0 auto}.record-row{overflow:hidden;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel)}.record-row header{display:flex;align-items:center;gap:9px;padding:10px 12px;border-bottom:1px solid var(--line);font-size:10px}.record-row header code{color:var(--mint)}.record-row header strong{text-transform:capitalize}.record-row header time{margin-left:auto;color:var(--text-faint)}.record-status{padding:2px 5px;border:1px solid var(--line-strong);border-radius:999px;color:var(--text-muted)}.record-status--send_failed{border-color:#ff827c4d;color:var(--danger)}.record-row>p{margin:0;padding:11px 12px 0;font-size:12px;white-space:pre-wrap}.record-row pre{max-height:240px;overflow:auto;margin:0;padding:11px 12px;color:var(--text-muted);font-size:10px;line-height:1.5;white-space:pre-wrap}.management-actions{display:grid;gap:8px;margin-top:18px;padding-top:16px;border-top:1px solid var(--line)}.destructive-target{margin:0;color:var(--text-muted);font-size:11px;line-height:1.55}.destructive-target code{overflow-wrap:anywhere;color:var(--danger)}.visually-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}
|
|
1
|
+
:root{color-scheme:dark;--bg: #080b0c;--panel: #111617;--panel-raised: #171d1f;--panel-soft: #0d1112;--line: #222a2c;--line-strong: #354043;--mint: #7ce7b0;--mint-dim: #429a70;--warning: #f0c66c;--danger: #ff827c;--text: #e9efed;--text-muted: #8d9a97;--text-faint: #64706e;--radius-sm: 5px;--radius: 8px;--shadow-mint: 0 0 20px rgb(124 231 176 / 10%);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-synthesis:none;color:var(--text);background:var(--bg)}*{box-sizing:border-box}html,body,#root{min-width:320px;min-height:100%}body{margin:0;background:var(--bg)}button,input,textarea{font:inherit}button{color:inherit}button:focus-visible,input:focus-visible,textarea:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--mint);outline-offset:2px}::selection{color:var(--bg);background:var(--mint)}.mono{font-family:SFMono-Regular,Consolas,Liberation Mono,monospace}@media (prefers-reduced-motion: reduce){*,*:before,*:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.cowork-app{min-height:100vh;display:grid;grid-template-columns:280px minmax(420px,1fr) 320px;overflow:hidden;background:radial-gradient(circle at 48% 0,rgb(124 231 176 / 3%),transparent 28%),var(--bg)}.room-rail,.room-context{height:100vh;overflow-y:auto;background:var(--panel);z-index:5}.room-rail[hidden],.room-context[hidden]{display:none;visibility:hidden;pointer-events:none}.room-rail{display:flex;flex-direction:column;border-right:1px solid var(--line);padding:18px 14px 14px}.rail-brand{display:flex;align-items:center;gap:10px;min-height:42px;padding:0 5px 16px}.brand-mark{display:grid;place-items:center;width:32px;height:32px;border:1px solid var(--mint-dim);border-radius:50%;color:var(--mint);font:700 15px/1 Georgia,serif;box-shadow:var(--shadow-mint)}.rail-brand strong,.rail-brand span{display:block}.rail-brand strong{font-size:14px;letter-spacing:.02em}.rail-brand span{margin-top:2px;color:var(--text-faint);font-size:10px;letter-spacing:.1em;text-transform:uppercase}.rail-close,.context-close,.mobile-rooms,.context-toggle{display:none!important}.primary-button,.secondary-button,.quiet-button,.icon-button{border-radius:var(--radius-sm);cursor:pointer;transition:border-color .14s ease,background .14s ease,color .14s ease,transform .14s ease}.primary-button{min-height:38px;border:1px solid var(--mint);background:var(--mint);color:#07100c;font-weight:700;box-shadow:var(--shadow-mint)}.primary-button:hover:not(:disabled){background:#95f1c2;transform:translateY(-1px)}.primary-button:disabled,.secondary-button:disabled,.quiet-button:disabled{cursor:not-allowed;opacity:.42}.secondary-button{min-height:36px;padding:0 14px;border:1px solid var(--line-strong);background:var(--panel-raised)}.quiet-button{padding:7px 10px;border:1px solid var(--line);background:transparent;color:var(--text-muted)}.quiet-button:hover:not(:disabled),.secondary-button:hover:not(:disabled){border-color:var(--mint-dim);color:var(--mint)}.icon-button{display:grid;place-items:center;width:34px;height:34px;padding:0;border:1px solid transparent;background:transparent;color:var(--text-muted);font-size:20px}.create-button{width:100%;margin-bottom:14px}.connection-state{display:flex;align-items:center;gap:7px;margin:0 5px 17px;color:var(--text-muted);font-size:11px;text-transform:uppercase;letter-spacing:.08em}.state-dot,.lifecycle-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--text-faint)}.connection-state--online .state-dot,.lifecycle-dot--active{background:var(--mint);box-shadow:0 0 8px #7ce7b073}.connection-state--offline .state-dot,.lifecycle-dot--closed{background:var(--danger)}.lifecycle-dot--provisioning,.lifecycle-dot--closing{background:var(--warning)}.room-group{margin-bottom:12px}.room-group__heading{display:flex;align-items:center;justify-content:space-between;padding:0 5px}.room-group__heading h2{color:var(--text-faint);font-size:10px;text-transform:uppercase;letter-spacing:.12em}.room-group__heading span{color:var(--text-faint);font-size:11px}.room-list{display:grid;gap:4px;padding:0;margin:4px 0 0;list-style:none}.room-card{position:relative;width:100%;display:grid;grid-template-columns:1fr auto;gap:7px 8px;padding:11px 10px 10px 13px;text-align:left;border:1px solid transparent;border-radius:var(--radius);background:transparent;cursor:pointer}.room-card:hover{background:#ffffff05;border-color:var(--line)}.room-card[aria-current=page]{background:var(--panel-raised);border-color:var(--line-strong);box-shadow:inset 2px 0 var(--mint)}.room-card__title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:650}.room-card__state{display:flex;align-items:center;gap:5px;color:var(--text-muted);font-size:10px}.room-card__summary{grid-column:1 / -1;color:var(--text-faint);font-size:11px}.empty-group{margin:8px 5px 14px;color:var(--text-faint);font-size:12px}.local-boundary{margin:auto 5px 0;padding-top:16px;border-top:1px solid var(--line);color:var(--text-faint);font:10px/1.4 SFMono-Regular,Consolas,monospace}.workspace{height:100vh;min-width:0;display:flex;flex-direction:column;overflow:hidden}.workspace--empty{position:relative;display:grid;place-items:center}.empty-workspace{max-width:390px;padding:30px;text-align:center;color:var(--text-muted)}.empty-workspace__glyph{color:var(--mint);font-size:42px}.empty-workspace h1{margin:5px 0 8px;color:var(--text);font-size:26px}.empty-workspace p:last-child{font-size:14px;line-height:1.55}.workspace-header{min-height:88px;display:flex;align-items:center;gap:18px;padding:16px 24px;border-bottom:1px solid var(--line);background:#080b0cd1}.workspace-identity{min-width:0}.eyebrow{margin:0 0 5px;color:var(--text-faint);font-size:10px;font-weight:700;letter-spacing:.13em;text-transform:uppercase}.workspace-header h1{overflow:hidden;margin:0;text-overflow:ellipsis;white-space:nowrap;font-size:19px}.identity-name{margin:4px 0 0;color:var(--text-faint);font-size:10px}.lifecycle-badge{margin-left:auto;padding:5px 8px;border:1px solid var(--line-strong);border-radius:999px;color:var(--text-muted);font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.lifecycle-badge--active{color:var(--mint);border-color:var(--mint-dim)}.lifecycle-badge--provisioning,.lifecycle-badge--closing{color:var(--warning)}.lifecycle-badge--closed{color:var(--danger)}.mission-strip{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:12px;padding:11px 24px;border-bottom:1px solid var(--line);background:var(--panel-soft)}.mission-strip>span{color:var(--mint);font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase}.mission-strip p{overflow:hidden;margin:0;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.workspace-tabs,.context-tabs{display:flex;gap:2px;padding:0 22px;border-bottom:1px solid var(--line)}.workspace-tabs button,.context-tabs button{position:relative;padding:13px 10px 11px;border:0;background:transparent;color:var(--text-muted);cursor:pointer;font-size:12px}.workspace-tabs button[aria-selected=true],.context-tabs button[aria-selected=true]{color:var(--text)}.workspace-tabs button[aria-selected=true]:after,.context-tabs button[aria-selected=true]:after{position:absolute;right:8px;bottom:-1px;left:8px;height:2px;background:var(--mint);content:""}.workspace-content{flex:1;overflow-y:auto;padding:28px clamp(20px,5vw,70px)}.communication-shell{max-width:760px;margin:0 auto}.briefing-card{padding:18px 20px;border:1px solid var(--line);border-left:2px solid var(--mint-dim);border-radius:var(--radius);background:var(--panel)}.briefing-card>p:last-child{margin:0;color:#cad3d0;font-size:14px;line-height:1.6;white-space:pre-wrap}.panel-placeholder{padding:60px 20px;text-align:center;color:var(--text-muted)}.panel-placeholder>span{color:var(--mint-dim);font:22px/1 monospace;letter-spacing:.15em}.panel-placeholder h2{margin:14px 0 7px;color:var(--text);font-size:15px}.panel-placeholder p{max-width:430px;margin:0 auto;font-size:12px;line-height:1.55}.room-context{border-left:1px solid var(--line)}.context-header{display:flex;justify-content:space-between;min-height:88px;padding:21px 20px 15px;border-bottom:1px solid var(--line)}.context-header h2{margin:0;font-size:15px}.context-tabs{padding:0 12px}.context-body{padding:18px}.state-grid{display:grid;grid-template-columns:1fr 1fr;gap:1px;margin-bottom:18px;overflow:hidden;border:1px solid var(--line);border-radius:var(--radius);background:var(--line)}.state-grid div{padding:12px;background:var(--panel-soft)}.state-grid dt{color:var(--text-faint);font-size:9px;letter-spacing:.08em;text-transform:uppercase}.state-grid dd{margin:6px 0 0;font-size:13px;font-weight:650}.state-grid--compact{margin-top:15px}.state-text{text-transform:capitalize}.state-text--active{color:var(--mint)}.state-text--provisioning,.state-text--closing{color:var(--warning)}.state-text--closed{color:var(--danger)}.detail-row{padding:11px 2px;border-bottom:1px solid var(--line)}.detail-row span,.detail-row strong{display:block}.detail-row span{margin-bottom:5px;color:var(--text-faint);font-size:10px;text-transform:uppercase;letter-spacing:.08em}.detail-row strong{overflow-wrap:anywhere;font-size:11px;font-weight:500}.setup-callout{display:flex;gap:12px;padding:15px;border:1px solid rgb(240 198 108 / 30%);border-radius:var(--radius);background:#f0c66c0d}.setup-callout>span{color:var(--warning)}.setup-callout h3{margin:0 0 6px;font-size:13px}.setup-callout p,.context-note{margin:0;color:var(--text-muted);font-size:11px;line-height:1.55}.context-note{padding:12px 2px}.disconnect-banner,.error-banner,.notice-banner{position:fixed;right:338px;left:298px;z-index:20;display:flex;align-items:center;gap:12px;min-height:38px;padding:8px 12px;border:1px solid;border-radius:var(--radius);background:var(--panel-raised);font-size:11px}.disconnect-banner{top:10px;border-color:#f0c66c73;color:var(--warning)}.disconnect-banner span{color:var(--text-muted)}.error-banner,.notice-banner{bottom:12px}.error-banner{border-color:#ff827c73}.notice-banner{border-color:var(--line-strong)}.error-banner button,.notice-banner button{margin-left:auto;border:0;background:transparent;cursor:pointer;color:var(--text-muted)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;display:grid;place-items:center;padding:18px;background:#000000b8;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.modal{width:min(590px,100%);max-height:calc(100vh - 36px);overflow-y:auto;border:1px solid var(--line-strong);border-radius:10px;background:var(--panel);box-shadow:0 26px 80px #0000008c}.modal>header{display:flex;align-items:center;justify-content:space-between;padding:17px 19px;border-bottom:1px solid var(--line)}.modal h2{margin:0;font-size:16px}.dialog-form{display:grid;gap:16px;padding:19px}.dialog-intro{margin:0 0 2px;color:var(--text-muted);font-size:12px;line-height:1.5}.field{display:grid;gap:7px}.field>label{font-size:11px;font-weight:650}.field textarea,.field input{width:100%;resize:vertical;padding:10px 11px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--bg);color:var(--text);line-height:1.45}.field textarea:hover,.field input:hover{border-color:#465255}.field [aria-invalid=true]{border-color:var(--danger)}.field small{color:var(--text-faint);font-size:10px}.field .field-error,.form-error{color:var(--danger)}.form-error{margin:0;padding:10px;border:1px solid rgb(255 130 124 / 30%);border-radius:var(--radius-sm);background:#ff827c0d;font-size:11px;line-height:1.45}.dialog-actions{display:flex;justify-content:flex-end;gap:9px;padding-top:3px}.dialog-actions .primary-button{padding:0 15px}.responsive-scrim{display:none}@media (max-width: 999px){.cowork-app{grid-template-columns:260px minmax(0,1fr)}.room-context{position:fixed;top:0;right:0;width:min(360px,90vw);transform:translate(102%);box-shadow:-18px 0 50px #0006;transition:transform .18s ease;z-index:31}.room-context--open{transform:translate(0)}.context-close,.context-toggle{display:grid!important}.context-toggle{display:block!important}.responsive-scrim{position:fixed;top:0;right:0;bottom:0;left:0;z-index:30;display:block;border:0;background:#0000008c}.disconnect-banner,.error-banner,.notice-banner{right:18px;left:278px}}@media (max-width: 759px){.cowork-app{display:block}.room-rail{position:fixed;top:0;left:0;width:min(340px,92vw);transform:translate(-102%);box-shadow:18px 0 50px #00000073;transition:transform .18s ease;z-index:32}.room-rail--open{transform:translate(0)}.rail-close,.mobile-rooms{display:grid!important}.rail-close{margin-left:auto}.mobile-rooms{flex:0 0 auto}.workspace-header{min-height:76px;gap:10px;padding:12px}.workspace-header .identity-name{display:none}.workspace-header h1{font-size:16px}.lifecycle-badge{padding:4px 6px;font-size:8px}.mission-strip{padding:9px 12px}.mission-strip .quiet-button{font-size:10px}.workspace-tabs{padding:0 8px}.workspace-content{padding:18px 12px}.disconnect-banner,.error-banner,.notice-banner{right:10px;left:10px}.disconnect-banner{top:auto;bottom:10px}.error-banner,.notice-banner{bottom:58px}.room-context{z-index:32}}.invite-form{display:grid;gap:11px;padding:13px 0 17px;border-bottom:1px solid var(--line)}.field select{width:100%;padding:10px 11px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--bg);color:var(--text)}.invite-list,.participant-list{display:grid;gap:9px;margin-top:14px}.invite-card,.participant-card,.receipt{display:grid;gap:7px;padding:12px;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-soft)}.invite-card header{display:flex;justify-content:space-between;gap:8px}.invite-card p,.participant-card span,.participant-card small,.recovery-callout p,.receipt p{margin:0;color:var(--text-muted);font-size:10px;line-height:1.45}.invite-card code,.participant-card code,.receipt code{overflow-wrap:anywhere;font-size:10px}.recovery-callout{display:grid;gap:10px;margin-top:14px;padding:12px;border:1px solid rgb(240 198 108 / 30%);border-radius:var(--radius);background:#f0c66c0d}.receipt pre{overflow-wrap:anywhere;white-space:pre-wrap;-webkit-user-select:all;user-select:all;padding:10px;border:1px solid var(--line-strong);background:var(--bg);color:var(--mint);font-size:11px}.danger-button{min-height:36px;padding:0 14px;border:1px solid var(--danger);border-radius:var(--radius-sm);background:#ff827c14;color:var(--danger);cursor:pointer}.danger-button:disabled{cursor:not-allowed;opacity:.42}.lifecycle-separator{margin:14px 0;padding:8px 12px;border:1px solid var(--line);border-radius:999px;color:var(--text-muted);text-align:center;font-size:10px;letter-spacing:.03em}.lifecycle-separator--provisioning,.lifecycle-separator--closing{border-color:#f0c66c40;color:var(--warning)}.lifecycle-separator--closed{border-color:#ff827c38;color:var(--danger)}.chat-timeline{display:grid;gap:12px;margin-top:16px}.chat-list,.record-list{display:grid;gap:10px;margin:0;padding:0;list-style:none}.chat-row{width:min(82%,610px);padding:12px 14px;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel)}.chat-row--room{justify-self:end;border-color:var(--mint-dim);background:#7ce7b00d}.chat-row--briefing{width:100%;border-left:2px solid var(--mint);background:var(--panel-soft)}.chat-row--file{width:min(92%,680px)}.chat-row__meta{display:flex;align-items:baseline;gap:8px;color:var(--text-faint);font-size:9px}.chat-row__meta strong{color:var(--text);font-size:11px}.chat-row--room .chat-row__meta strong,.chat-row--briefing .chat-row__meta strong{color:var(--mint)}.chat-row__meta code{margin-left:auto}.chat-row__text{margin:8px 0 0;color:#d2d9d7;font-size:13px;line-height:1.55;overflow-wrap:anywhere;white-space:pre-wrap}.file-attachment{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:12px;margin-top:10px;padding:12px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel-soft)}.file-attachment__glyph{display:grid;place-items:center;width:34px;height:34px;border:1px solid var(--mint-dim);border-radius:50%;color:var(--mint)}.file-attachment__body{min-width:0;display:grid;gap:5px}.file-attachment__body>span{color:var(--text-muted);font-size:10px}.file-name{overflow-wrap:anywhere;white-space:pre-wrap}.file-download{min-width:0;display:grid;justify-items:end;gap:6px}.file-download__button{min-width:92px}.file-download__status{max-width:260px;color:var(--danger);font-size:10px;line-height:1.4;text-align:right}.files-view{max-width:900px;display:grid;gap:14px;margin:0 auto}.file-group-list,.file-version-list{display:grid;gap:10px;margin:0;padding:0;list-style:none}.file-group{overflow:hidden;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel)}.file-group__toggle{width:100%;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:6px 12px;min-height:58px;padding:12px 14px;border:0;background:transparent;color:inherit;cursor:pointer;text-align:left}.file-group__toggle:hover{background:#ffffff05}.file-group__chevron{grid-row:1 / 3;color:var(--mint);font-size:20px;transition:transform .14s ease}.file-group__toggle[aria-expanded=true] .file-group__chevron{transform:rotate(90deg)}.file-group__title{min-width:0;font-size:13px;font-weight:650}.file-group__count{color:var(--mint);font-size:10px}.file-group__latest{grid-column:2 / 4;color:var(--text-muted);font-size:10px}.file-version-panel{display:grid;gap:12px;padding:0 14px 14px 42px;border-top:1px solid var(--line)}.file-version-list{padding-top:12px}.file-version{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:14px;padding:11px 12px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-soft)}.file-version__details{min-width:0;display:grid;grid-template-columns:auto 1fr;gap:5px 12px;color:var(--text-muted);font-size:10px}.file-version__details strong{grid-row:1 / 4;color:var(--text);font-size:11px}.file-version__mime{overflow-wrap:anywhere;color:var(--text-faint)}.timeline-empty{margin:20px 0;color:var(--text-faint);text-align:center;font-size:11px}.show-earlier{justify-self:center}.room-composer{position:sticky;bottom:-28px;display:grid;gap:8px;margin:18px -4px -28px;padding:14px 4px 28px;border-top:1px solid var(--line);background:linear-gradient(to bottom,rgb(8 11 12 / 92%),var(--bg) 35%)}.room-composer textarea{width:100%;resize:vertical;padding:11px 12px;border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel);color:var(--text);line-height:1.45}.room-composer textarea:focus{border-color:var(--mint-dim)}.room-composer textarea:disabled{cursor:not-allowed;opacity:.55}.composer-footer{display:flex;align-items:center;justify-content:space-between;gap:12px}.composer-footer small{color:var(--text-faint);font-size:10px}.composer-footer .primary-button{min-width:112px;padding:0 13px}.record-list{max-width:900px;margin:0 auto}.record-row{overflow:hidden;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel)}.record-row header{display:flex;align-items:center;gap:9px;padding:10px 12px;border-bottom:1px solid var(--line);font-size:10px}.record-row header code{color:var(--mint)}.record-row header strong{text-transform:capitalize}.record-row header time{margin-left:auto;color:var(--text-faint)}.record-status{padding:2px 5px;border:1px solid var(--line-strong);border-radius:999px;color:var(--text-muted)}.record-status--send_failed{border-color:#ff827c4d;color:var(--danger)}.record-row>p{margin:0;padding:11px 12px 0;font-size:12px;white-space:pre-wrap}.record-row pre{max-height:240px;overflow:auto;margin:0;padding:11px 12px;color:var(--text-muted);font-size:10px;line-height:1.5;white-space:pre-wrap}.management-actions{display:grid;gap:8px;margin-top:18px;padding-top:16px;border-top:1px solid var(--line)}.destructive-target{margin:0;color:var(--text-muted);font-size:11px;line-height:1.55}.destructive-target code{overflow-wrap:anywhere;color:var(--danger)}.visually-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}@media (max-width: 759px){.workspace-tabs button{flex:1;min-width:0;min-height:44px;padding-inline:4px}.file-attachment{grid-template-columns:auto minmax(0,1fr)}.file-attachment .file-download{grid-column:1 / -1;width:100%;justify-items:stretch}.file-download__button{min-height:44px}.file-download__status{max-width:none;text-align:left}.file-version-panel{padding-left:12px}.file-version{grid-template-columns:1fr}.file-version .file-download{justify-items:stretch}.file-version__details{grid-template-columns:1fr}.file-version__details strong{grid-row:auto}.file-group__latest{overflow-wrap:anywhere}}
|