studiograph 1.3.48-next.280 → 1.3.48-next.281
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/dist/server/index.js +47 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/desktop-diagnostics-api.d.ts +22 -0
- package/dist/server/routes/desktop-diagnostics-api.js +114 -0
- package/dist/server/routes/desktop-diagnostics-api.js.map +1 -0
- package/dist/services/desktop-diagnostics-service.d.ts +177 -0
- package/dist/services/desktop-diagnostics-service.js +343 -0
- package/dist/services/desktop-diagnostics-service.js.map +1 -0
- package/dist/web/_app/immutable/assets/4.a48oSJc8.css +1 -0
- package/dist/web/_app/immutable/assets/DeleteEntryDialog.CuV5GGgm.css +1 -0
- package/dist/web/_app/immutable/assets/EntryActionDialogs.Bk7DSdfo.css +1 -0
- package/dist/web/_app/immutable/chunks/{DzaWUnWv.js → 3KN8jP3c.js} +3 -3
- package/dist/web/_app/immutable/chunks/6xvgZqen.js +1 -0
- package/dist/web/_app/immutable/chunks/{Ba53qoVO.js → B7rD1tc8.js} +1 -1
- package/dist/web/_app/immutable/chunks/BAoPqRQe2.js +1 -0
- package/dist/web/_app/immutable/chunks/BKR_U18i.js +1 -0
- package/dist/web/_app/immutable/chunks/{B8gdzLRB2.js → BO1IS8SY2.js} +1 -1
- package/dist/web/_app/immutable/chunks/BTY6LKQP2.js +2 -0
- package/dist/web/_app/immutable/chunks/BUqPn9bc.js +5 -0
- package/dist/web/_app/immutable/chunks/BYwdNl_6.js +1 -0
- package/dist/web/_app/immutable/chunks/{B9MY422N.js → BbCaFmwr.js} +1 -1
- package/dist/web/_app/immutable/chunks/BetFlDsY2.js +1 -0
- package/dist/web/_app/immutable/chunks/{DvMpJfpG.js → BhXvdD9_.js} +5 -5
- package/dist/web/_app/immutable/chunks/Bi0xMDiZ2.js +2 -0
- package/dist/web/_app/immutable/chunks/{CbOk_o5_.js → BjBlyur1.js} +2 -2
- package/dist/web/_app/immutable/chunks/Bk3YvmMa.js +1 -0
- package/dist/web/_app/immutable/chunks/{CtgdtZ0G2.js → Bl1wqOjP2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{CA8NGDnJ.js → Bm1zMkOs.js} +1 -1
- package/dist/web/_app/immutable/chunks/{BQQaOOf3.js → BrT4x2ps.js} +1 -1
- package/dist/web/_app/immutable/chunks/{rW9JG922.js → Bwk2tzAR.js} +1 -1
- package/dist/web/_app/immutable/chunks/CDWL7K4J2.js +1 -0
- package/dist/web/_app/immutable/chunks/{CrM8HKY2.js → CFcnCWEw.js} +1 -1
- package/dist/web/_app/immutable/chunks/CS4vSmCG.js +1 -0
- package/dist/web/_app/immutable/chunks/CS99yx6h.js +2 -0
- package/dist/web/_app/immutable/chunks/CVk6pSTs.js +3 -0
- package/dist/web/_app/immutable/chunks/{BxeOdaUQ.js → CkeUq-8R.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DYi0TLhD.js → CkhJDrAq.js} +1 -1
- package/dist/web/_app/immutable/chunks/CrI1td1i2.js +1 -0
- package/dist/web/_app/immutable/chunks/{CX_WuP2f.js → CyDz1jcK.js} +1 -1
- package/dist/web/_app/immutable/chunks/D1AgYXMF2.js +2 -0
- package/dist/web/_app/immutable/chunks/D27N0qvQ2.js +1 -0
- package/dist/web/_app/immutable/chunks/{BVKswxB62.js → D6cPOH832.js} +1 -1
- package/dist/web/_app/immutable/chunks/D7-46v9S.js +1 -0
- package/dist/web/_app/immutable/chunks/{CoyEQ_5V.js → DAjr1sZA.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DLuIHCPq.js → DBFtlslO.js} +1 -1
- package/dist/web/_app/immutable/chunks/DBHHqC8f.js +2 -0
- package/dist/web/_app/immutable/chunks/DBUH-iQj.js +6 -0
- package/dist/web/_app/immutable/chunks/DCeG-e2l.js +1 -0
- package/dist/web/_app/immutable/chunks/DK0NSuAS2.js +1 -0
- package/dist/web/_app/immutable/chunks/{Cm_yhEon2.js → DLHpr4Vi2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{Dk2-JtmU2.js → DN-jrZJ02.js} +1 -1
- package/dist/web/_app/immutable/chunks/DNCh8Cb_.js +1 -0
- package/dist/web/_app/immutable/chunks/{DPI7dnke.js → DSDgV2YD.js} +3 -3
- package/dist/web/_app/immutable/chunks/DShaCvAr.js +1 -0
- package/dist/web/_app/immutable/chunks/DV85F2-d.js +1 -0
- package/dist/web/_app/immutable/chunks/{DHepCXpt.js → DWCE-wSZ.js} +1 -1
- package/dist/web/_app/immutable/chunks/DkAKpjj12.js +2 -0
- package/dist/web/_app/immutable/chunks/{Cakxkuk5.js → DlJZ9kVY.js} +1 -1
- package/dist/web/_app/immutable/chunks/{Gk29olsw2.js → DpmptkAg2.js} +2 -2
- package/dist/web/_app/immutable/chunks/{BlsIMcBq.js → DuHa0E8I.js} +1 -1
- package/dist/web/_app/immutable/chunks/DxhO1bqL2.js +1 -0
- package/dist/web/_app/immutable/chunks/FyGHIQwA.js +2 -0
- package/dist/web/_app/immutable/chunks/GikfwGZz.js +1 -0
- package/dist/web/_app/immutable/chunks/{C45ocJQC2.js → QlvGbfkt2.js} +1 -1
- package/dist/web/_app/immutable/chunks/ah3ktS0_.js +2 -0
- package/dist/web/_app/immutable/chunks/{CI12Gaeg.js → cJT54ldG.js} +1 -1
- package/dist/web/_app/immutable/chunks/dMyvBfyH.js +1 -0
- package/dist/web/_app/immutable/chunks/{BCMCHGnl2.js → hA8kwzor.js} +1 -1
- package/dist/web/_app/immutable/chunks/hub1HF5s.js +1 -0
- package/dist/web/_app/immutable/chunks/m96_DtL9.js +1 -0
- package/dist/web/_app/immutable/chunks/{jB_mSyDz.js → n1_hJpnq.js} +1 -1
- package/dist/web/_app/immutable/chunks/om-ip4O12.js +2 -0
- package/dist/web/_app/immutable/chunks/sd1UgxTd.js +1 -0
- package/dist/web/_app/immutable/chunks/secOWbPM.js +1 -0
- package/dist/web/_app/immutable/chunks/tBw__QoK.js +1 -0
- package/dist/web/_app/immutable/chunks/{DbOFiaoY.js → uz0bKlBh.js} +1 -1
- package/dist/web/_app/immutable/chunks/{BeF_YrEc2.js → xGXTHqYt.js} +1 -1
- package/dist/web/_app/immutable/entry/app.BHIqztXG.js +2 -0
- package/dist/web/_app/immutable/entry/start.Jj_CeiCF.js +1 -0
- package/dist/web/_app/immutable/nodes/{0.DPFQMkmA.js → 0.Adu49FsB.js} +2 -2
- package/dist/web/_app/immutable/nodes/{1.BUg3EbJ_.js → 1.DWtfg_P4.js} +1 -1
- package/dist/web/_app/immutable/nodes/{10.CZbTqhAj.js → 10.DDEoihl2.js} +1 -1
- package/dist/web/_app/immutable/nodes/{11.Z-Ou8FlB.js → 11.Dbyeghdx.js} +1 -1
- package/dist/web/_app/immutable/nodes/{12.BUp8Zhqh.js → 12.DH4TMGyG.js} +1 -1
- package/dist/web/_app/immutable/nodes/{13.Po2Xe1O2.js → 13.CFG3CGsv.js} +1 -1
- package/dist/web/_app/immutable/nodes/{15.Cn6zcfI1.js → 15.BDNmh-od.js} +1 -1
- package/dist/web/_app/immutable/nodes/{16.Dal2-WQp.js → 16.DfIJwmGV.js} +1 -1
- package/dist/web/_app/immutable/nodes/{18.BzDlENiF.js → 18.DZH2zZF5.js} +1 -1
- package/dist/web/_app/immutable/nodes/{19.CQhngMoM.js → 19.CwYvbbVl.js} +1 -1
- package/dist/web/_app/immutable/nodes/2.DfL0LG4z.js +124 -0
- package/dist/web/_app/immutable/nodes/3.Qldz4SxJ.js +6 -0
- package/dist/web/_app/immutable/nodes/4.Cgxi5fT2.js +16 -0
- package/dist/web/_app/immutable/nodes/{5.DlfbHz3H.js → 5.D6OaKv4N.js} +1 -1
- package/dist/web/_app/immutable/nodes/{6.BuwXsPuz.js → 6.C8lsqzwP.js} +4 -4
- package/dist/web/_app/immutable/nodes/{7.CWkwNeVy.js → 7.BK_hwkz6.js} +1 -1
- package/dist/web/_app/immutable/nodes/{8.bQx8gIIK.js → 8.Cr8XUj5g.js} +1 -1
- package/dist/web/_app/immutable/nodes/{9.3Mk3Iduz.js → 9._kzCJI8M.js} +1 -1
- package/dist/web/_app/version.json +1 -1
- package/dist/web/index.html +13 -13
- package/package.json +1 -1
- package/dist/web/_app/immutable/assets/4.BS2tc0bg.css +0 -1
- package/dist/web/_app/immutable/assets/RepoCheckList.BLeJ79Eg.css +0 -1
- package/dist/web/_app/immutable/chunks/0iYgHjxP2.js +0 -2
- package/dist/web/_app/immutable/chunks/AdUGDNY9.js +0 -2
- package/dist/web/_app/immutable/chunks/B41i8cw52.js +0 -2
- package/dist/web/_app/immutable/chunks/BKZ9xpix2.js +0 -1
- package/dist/web/_app/immutable/chunks/BTFf1mFm.js +0 -1
- package/dist/web/_app/immutable/chunks/BUcmsNfi.js +0 -3
- package/dist/web/_app/immutable/chunks/B_d4zq-4.js +0 -2
- package/dist/web/_app/immutable/chunks/BqButnP4.js +0 -1
- package/dist/web/_app/immutable/chunks/BuHbdNQt2.js +0 -1
- package/dist/web/_app/immutable/chunks/C6d9nn3k.js +0 -1
- package/dist/web/_app/immutable/chunks/CBDveU8k.js +0 -6
- package/dist/web/_app/immutable/chunks/CEQy5B8f2.js +0 -1
- package/dist/web/_app/immutable/chunks/CIvNZDmy.js +0 -1
- package/dist/web/_app/immutable/chunks/CL_APTyv.js +0 -1
- package/dist/web/_app/immutable/chunks/CMttYaeT2.js +0 -2
- package/dist/web/_app/immutable/chunks/C_A_y7x5.js +0 -2
- package/dist/web/_app/immutable/chunks/ChuPYjb5.js +0 -1
- package/dist/web/_app/immutable/chunks/ClIEtyi4.js +0 -1
- package/dist/web/_app/immutable/chunks/CswcvBI22.js +0 -1
- package/dist/web/_app/immutable/chunks/DO_V9Cgc.js +0 -1
- package/dist/web/_app/immutable/chunks/DWH6DgCd2.js +0 -2
- package/dist/web/_app/immutable/chunks/DZ2Zr5zb.js +0 -1
- package/dist/web/_app/immutable/chunks/DfUXQOZ92.js +0 -1
- package/dist/web/_app/immutable/chunks/Dl0bYyV_.js +0 -1
- package/dist/web/_app/immutable/chunks/DurEh4us2.js +0 -1
- package/dist/web/_app/immutable/chunks/Dvj33Rn2.js +0 -1
- package/dist/web/_app/immutable/chunks/DvylWUzx.js +0 -1
- package/dist/web/_app/immutable/chunks/DwuBUEvU.js +0 -1
- package/dist/web/_app/immutable/chunks/G_Qn9TDJ.js +0 -1
- package/dist/web/_app/immutable/chunks/HDLg5UkK.js +0 -2
- package/dist/web/_app/immutable/chunks/MMtHlrry.js +0 -1
- package/dist/web/_app/immutable/chunks/NhtQS20X.js +0 -1
- package/dist/web/_app/immutable/chunks/aSBc8N1l.js +0 -1
- package/dist/web/_app/immutable/chunks/dCZb8Wbu.js +0 -1
- package/dist/web/_app/immutable/chunks/joKsoiFC.js +0 -1
- package/dist/web/_app/immutable/chunks/sE-xIBIx2.js +0 -1
- package/dist/web/_app/immutable/entry/app.B7VOZHNw.js +0 -2
- package/dist/web/_app/immutable/entry/start.CJX1xbb4.js +0 -1
- package/dist/web/_app/immutable/nodes/2.BxjWYHmV.js +0 -124
- package/dist/web/_app/immutable/nodes/3.B4lvM3dS.js +0 -6
- package/dist/web/_app/immutable/nodes/4.CC_fNxyS.js +0 -16
- /package/dist/web/_app/immutable/assets/{download-with-progress.BZlFTn09.css → LocationPill.BZlFTn09.css} +0 -0
- /package/dist/web/_app/immutable/assets/{checkbox.CAcHq8G6.css → select.CAcHq8G6.css} +0 -0
- /package/dist/web/_app/immutable/chunks/{B2cjR0rG.js → B2cjR0rG2.js} +0 -0
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DesktopDiagnosticsService — metadata-only diagnostics sidecar for the
|
|
3
|
+
* Studiograph desktop app.
|
|
4
|
+
*
|
|
5
|
+
* The desktop app keeps a complete LOCAL log; it uploads only session
|
|
6
|
+
* summaries + errors here so we can debug field issues (transcription
|
|
7
|
+
* failing, notifications not firing, auth/connection problems) on a
|
|
8
|
+
* teammate's machine without physical access. This is a thin metadata
|
|
9
|
+
* layer, NOT a log firehose — never transcript text.
|
|
10
|
+
*
|
|
11
|
+
* Two tables in a dedicated `.studiograph/desktop-diagnostics.db`:
|
|
12
|
+
* - `desktop_diagnostics` — client-uploaded session events (POST /api/desktop/diagnostics)
|
|
13
|
+
* - `desktop_requests` — server-observed desktop HTTP requests (X-Studiograph-Client header)
|
|
14
|
+
*
|
|
15
|
+
* Storage shape and the meta/schema_version migration scaffold mirror the
|
|
16
|
+
* `audit_log` pattern (core/secrets/audit.ts + SqliteEncryptedStore) and the
|
|
17
|
+
* sibling unencrypted service DBs (services/comment-service.ts). It lives in
|
|
18
|
+
* its OWN unencrypted DB rather than the encrypted secrets store so request
|
|
19
|
+
* logging keeps working even when the master key / secret store isn't up, and
|
|
20
|
+
* because none of this data is secret.
|
|
21
|
+
*
|
|
22
|
+
* Retention: every insert opportunistically prunes rows older than
|
|
23
|
+
* RETENTION_DAYS so the tables can't grow unbounded. Cheap on-insert trim
|
|
24
|
+
* (no background job), matching the bounded-table assumption the audit view
|
|
25
|
+
* already relies on.
|
|
26
|
+
*/
|
|
27
|
+
import Database from 'better-sqlite3';
|
|
28
|
+
import { join } from 'node:path';
|
|
29
|
+
import { existsSync, mkdirSync, chmodSync } from 'node:fs';
|
|
30
|
+
/**
|
|
31
|
+
* Bump when columns are added/removed/renamed. Boot runs every migration
|
|
32
|
+
* branch whose version is greater than the recorded `schema_version`.
|
|
33
|
+
* Pattern mirrors services/comment-service.ts.
|
|
34
|
+
*/
|
|
35
|
+
const SCHEMA_VERSION = 1;
|
|
36
|
+
/** Max events accepted per POST. Above this the route returns 413. */
|
|
37
|
+
export const MAX_EVENTS_PER_REQUEST = 500;
|
|
38
|
+
/** Max raw request body bytes accepted per POST. Above this → 413. */
|
|
39
|
+
export const MAX_REQUEST_BYTES = 256 * 1024;
|
|
40
|
+
/** Defensive per-field truncation. The client contract is metadata-only;
|
|
41
|
+
* these caps stop a misbehaving build from ballooning the table. */
|
|
42
|
+
export const MAX_MSG_LENGTH = 4 * 1024;
|
|
43
|
+
export const MAX_DATA_JSON_LENGTH = 16 * 1024;
|
|
44
|
+
export const MAX_TAG_LENGTH = 64;
|
|
45
|
+
export const MAX_CLIENT_FIELD_LENGTH = 128;
|
|
46
|
+
/** Rows older than this are pruned opportunistically on insert. */
|
|
47
|
+
export const RETENTION_DAYS = 30;
|
|
48
|
+
/** Minimum gap between opportunistic prunes. Both write paths (event ingest
|
|
49
|
+
* and the per-request log) trigger a prune, but it only runs once an hour so
|
|
50
|
+
* the hot request-log path doesn't issue a DELETE on every request. */
|
|
51
|
+
export const PRUNE_INTERVAL_MS = 60 * 60 * 1000;
|
|
52
|
+
/** Per-IP write ceiling for the request log. The onResponse hook records ANY
|
|
53
|
+
* request carrying the X-Studiograph-Client header — including unauthenticated
|
|
54
|
+
* ones on routes with no rate limit — so without this an attacker could spoof
|
|
55
|
+
* the header and spray synchronous SQLite writes to balloon the table / stall
|
|
56
|
+
* the event loop. A real desktop client makes far fewer requests than this.
|
|
57
|
+
* In-memory, keyed on the socket peer IP (no trustProxy → not spoofable),
|
|
58
|
+
* resets on restart — same shape as the login rate limiter. */
|
|
59
|
+
export const REQUEST_LOG_MAX_PER_WINDOW = 240;
|
|
60
|
+
export const REQUEST_LOG_WINDOW_MS = 60 * 1000;
|
|
61
|
+
/** Hard cap on tracked IPs so the limiter Map itself can't grow unbounded under
|
|
62
|
+
* a many-source flood; stale windows are evicted first, then a full reset. */
|
|
63
|
+
export const REQUEST_LOG_MAX_TRACKED_IPS = 10_000;
|
|
64
|
+
const VALID_LEVELS = new Set(['info', 'warn', 'error', 'debug']);
|
|
65
|
+
function truncate(value, max) {
|
|
66
|
+
return value.length > max ? value.slice(0, max) : value;
|
|
67
|
+
}
|
|
68
|
+
/** Coerce an arbitrary value to a bounded, single-line string or null. */
|
|
69
|
+
function cleanString(value, max) {
|
|
70
|
+
if (typeof value !== 'string')
|
|
71
|
+
return null;
|
|
72
|
+
const trimmed = value.trim();
|
|
73
|
+
if (!trimmed)
|
|
74
|
+
return null;
|
|
75
|
+
return truncate(trimmed, max);
|
|
76
|
+
}
|
|
77
|
+
export class DesktopDiagnosticsService {
|
|
78
|
+
db;
|
|
79
|
+
insertEvent;
|
|
80
|
+
insertRequest;
|
|
81
|
+
/** Epoch ms of the last prune. 0 → the first write after boot prunes,
|
|
82
|
+
* cleaning up rows left stale across a restart. */
|
|
83
|
+
lastPruneAt = 0;
|
|
84
|
+
/** Per-IP sliding-window counters for the request-log write throttle. */
|
|
85
|
+
requestLogWindows = new Map();
|
|
86
|
+
constructor(workspacePath) {
|
|
87
|
+
const sgDir = join(workspacePath, '.studiograph');
|
|
88
|
+
if (!existsSync(sgDir))
|
|
89
|
+
mkdirSync(sgDir, { recursive: true });
|
|
90
|
+
const dbPath = join(sgDir, 'desktop-diagnostics.db');
|
|
91
|
+
this.db = new Database(dbPath);
|
|
92
|
+
if (process.platform !== 'win32') {
|
|
93
|
+
try {
|
|
94
|
+
chmodSync(dbPath, 0o600);
|
|
95
|
+
}
|
|
96
|
+
catch { /* non-fatal */ }
|
|
97
|
+
}
|
|
98
|
+
this.db.pragma('journal_mode = WAL');
|
|
99
|
+
this.db.exec(`
|
|
100
|
+
CREATE TABLE IF NOT EXISTS desktop_diagnostics (
|
|
101
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
102
|
+
received_at INTEGER NOT NULL,
|
|
103
|
+
user_id INTEGER,
|
|
104
|
+
user_email TEXT,
|
|
105
|
+
session_id TEXT,
|
|
106
|
+
machine_id TEXT,
|
|
107
|
+
app_version TEXT,
|
|
108
|
+
os TEXT,
|
|
109
|
+
event_ts TEXT,
|
|
110
|
+
level TEXT NOT NULL,
|
|
111
|
+
tag TEXT,
|
|
112
|
+
msg TEXT,
|
|
113
|
+
data_json TEXT
|
|
114
|
+
);
|
|
115
|
+
CREATE INDEX IF NOT EXISTS idx_diag_received ON desktop_diagnostics(received_at DESC);
|
|
116
|
+
CREATE INDEX IF NOT EXISTS idx_diag_user ON desktop_diagnostics(user_email, received_at DESC);
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_diag_session ON desktop_diagnostics(session_id, received_at DESC);
|
|
118
|
+
|
|
119
|
+
CREATE TABLE IF NOT EXISTS desktop_requests (
|
|
120
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
121
|
+
ts INTEGER NOT NULL,
|
|
122
|
+
user_id INTEGER,
|
|
123
|
+
user_email TEXT,
|
|
124
|
+
method TEXT NOT NULL,
|
|
125
|
+
route TEXT,
|
|
126
|
+
status_code INTEGER NOT NULL,
|
|
127
|
+
duration_ms INTEGER NOT NULL,
|
|
128
|
+
ip TEXT,
|
|
129
|
+
app_version TEXT
|
|
130
|
+
);
|
|
131
|
+
CREATE INDEX IF NOT EXISTS idx_dreq_ts ON desktop_requests(ts DESC);
|
|
132
|
+
CREATE INDEX IF NOT EXISTS idx_dreq_user ON desktop_requests(user_email, ts DESC);
|
|
133
|
+
|
|
134
|
+
CREATE TABLE IF NOT EXISTS meta (
|
|
135
|
+
key TEXT PRIMARY KEY,
|
|
136
|
+
value TEXT NOT NULL
|
|
137
|
+
);
|
|
138
|
+
`);
|
|
139
|
+
this.runMigrations();
|
|
140
|
+
this.insertEvent = this.db.prepare(`
|
|
141
|
+
INSERT INTO desktop_diagnostics
|
|
142
|
+
(received_at, user_id, user_email, session_id, machine_id, app_version, os, event_ts, level, tag, msg, data_json)
|
|
143
|
+
VALUES
|
|
144
|
+
(@received_at, @user_id, @user_email, @session_id, @machine_id, @app_version, @os, @event_ts, @level, @tag, @msg, @data_json)
|
|
145
|
+
`);
|
|
146
|
+
this.insertRequest = this.db.prepare(`
|
|
147
|
+
INSERT INTO desktop_requests
|
|
148
|
+
(ts, user_id, user_email, method, route, status_code, duration_ms, ip, app_version)
|
|
149
|
+
VALUES
|
|
150
|
+
(@ts, @user_id, @user_email, @method, @route, @status_code, @duration_ms, @ip, @app_version)
|
|
151
|
+
`);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Idempotent: each migration step is guarded by the recorded
|
|
155
|
+
* `schema_version` in `meta`. Add a new branch when bumping
|
|
156
|
+
* `SCHEMA_VERSION`; never edit existing branches.
|
|
157
|
+
*/
|
|
158
|
+
runMigrations() {
|
|
159
|
+
const row = this.db.prepare("SELECT value FROM meta WHERE key='schema_version'").get();
|
|
160
|
+
const current = row ? parseInt(row.value, 10) || 0 : 0;
|
|
161
|
+
if (current >= SCHEMA_VERSION)
|
|
162
|
+
return;
|
|
163
|
+
// Future migrations live here:
|
|
164
|
+
// if (current < 2) { this.db.exec(`ALTER TABLE desktop_diagnostics ADD COLUMN ...`); }
|
|
165
|
+
this.db.prepare('INSERT OR REPLACE INTO meta (key, value) VALUES (?, ?)').run('schema_version', String(SCHEMA_VERSION));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Ingest a batch of client-uploaded diagnostics events. Caller is
|
|
169
|
+
* responsible for the 413 size/count caps (route-level); this method
|
|
170
|
+
* defensively truncates each field and silently drops events with an
|
|
171
|
+
* invalid level. Returns the number of rows actually stored.
|
|
172
|
+
*
|
|
173
|
+
* `data` is stored as JSON text and is NEVER trusted/echoed back into
|
|
174
|
+
* logs — it's opaque metadata. We do not expect or store transcript text.
|
|
175
|
+
*/
|
|
176
|
+
ingest(client, events, user) {
|
|
177
|
+
const receivedAt = Date.now();
|
|
178
|
+
const appVersion = cleanString(client.appVersion, MAX_CLIENT_FIELD_LENGTH);
|
|
179
|
+
const os = cleanString(client.os, MAX_CLIENT_FIELD_LENGTH);
|
|
180
|
+
const machineId = cleanString(client.machineId, MAX_CLIENT_FIELD_LENGTH);
|
|
181
|
+
const sessionId = cleanString(client.sessionId, MAX_CLIENT_FIELD_LENGTH);
|
|
182
|
+
const rows = events
|
|
183
|
+
.filter((e) => e && typeof e === 'object')
|
|
184
|
+
.map((e) => {
|
|
185
|
+
const level = typeof e.level === 'string' && VALID_LEVELS.has(e.level) ? e.level : 'info';
|
|
186
|
+
let dataJson = null;
|
|
187
|
+
if (e.data !== undefined && e.data !== null) {
|
|
188
|
+
try {
|
|
189
|
+
dataJson = truncate(JSON.stringify(e.data), MAX_DATA_JSON_LENGTH);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
dataJson = null; // non-serializable (cycles, BigInt) — drop the field, keep the event
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
received_at: receivedAt,
|
|
197
|
+
user_id: user.id,
|
|
198
|
+
user_email: user.email,
|
|
199
|
+
session_id: sessionId,
|
|
200
|
+
machine_id: machineId,
|
|
201
|
+
app_version: appVersion,
|
|
202
|
+
os,
|
|
203
|
+
event_ts: cleanString(e.ts, MAX_CLIENT_FIELD_LENGTH),
|
|
204
|
+
level,
|
|
205
|
+
tag: cleanString(e.tag, MAX_TAG_LENGTH),
|
|
206
|
+
msg: cleanString(e.msg, MAX_MSG_LENGTH),
|
|
207
|
+
data_json: dataJson,
|
|
208
|
+
};
|
|
209
|
+
});
|
|
210
|
+
const tx = this.db.transaction((batch) => {
|
|
211
|
+
for (const r of batch)
|
|
212
|
+
this.insertEvent.run(r);
|
|
213
|
+
});
|
|
214
|
+
tx(rows);
|
|
215
|
+
this.maybePrune(receivedAt);
|
|
216
|
+
return rows.length;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Record one server-observed desktop request (X-Studiograph-Client). Returns
|
|
220
|
+
* false (and writes nothing) when the source IP has exceeded its per-window
|
|
221
|
+
* write budget — the request itself still succeeds; only the diagnostics row
|
|
222
|
+
* is dropped. This is the abuse gate for the header-triggered hook.
|
|
223
|
+
*/
|
|
224
|
+
recordRequest(input) {
|
|
225
|
+
const ts = Date.now();
|
|
226
|
+
if (!this.allowRequestLog(input.ip ?? 'unknown', ts))
|
|
227
|
+
return false;
|
|
228
|
+
this.insertRequest.run({
|
|
229
|
+
ts,
|
|
230
|
+
user_id: input.userId,
|
|
231
|
+
user_email: input.userEmail,
|
|
232
|
+
method: truncate(input.method, 16),
|
|
233
|
+
route: input.route ? truncate(input.route, 512) : null,
|
|
234
|
+
status_code: input.statusCode,
|
|
235
|
+
duration_ms: Math.round(input.durationMs),
|
|
236
|
+
ip: input.ip ? truncate(input.ip, 64) : null,
|
|
237
|
+
app_version: input.appVersion ? truncate(input.appVersion, MAX_CLIENT_FIELD_LENGTH) : null,
|
|
238
|
+
});
|
|
239
|
+
// The request log is the hottest write path and (unlike event ingest) may
|
|
240
|
+
// be the ONLY path a given deployment exercises — so it must drive prune
|
|
241
|
+
// too, or desktop_requests would grow unbounded. maybePrune throttles to
|
|
242
|
+
// once an hour so this stays a no-op on all but the first request per hour.
|
|
243
|
+
this.maybePrune(ts);
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Per-IP sliding-window gate for request-log writes. Returns true while the
|
|
248
|
+
* IP is under REQUEST_LOG_MAX_PER_WINDOW for the current window. Keeps the
|
|
249
|
+
* tracking Map bounded: a new window evicts stale entries once the Map grows
|
|
250
|
+
* past REQUEST_LOG_MAX_TRACKED_IPS, and fully resets if a many-source flood
|
|
251
|
+
* keeps it oversized.
|
|
252
|
+
*/
|
|
253
|
+
allowRequestLog(ip, now) {
|
|
254
|
+
let w = this.requestLogWindows.get(ip);
|
|
255
|
+
if (!w || now - w.windowStart >= REQUEST_LOG_WINDOW_MS) {
|
|
256
|
+
if (this.requestLogWindows.size > REQUEST_LOG_MAX_TRACKED_IPS) {
|
|
257
|
+
for (const [k, v] of this.requestLogWindows) {
|
|
258
|
+
if (now - v.windowStart >= REQUEST_LOG_WINDOW_MS)
|
|
259
|
+
this.requestLogWindows.delete(k);
|
|
260
|
+
}
|
|
261
|
+
if (this.requestLogWindows.size > REQUEST_LOG_MAX_TRACKED_IPS)
|
|
262
|
+
this.requestLogWindows.clear();
|
|
263
|
+
}
|
|
264
|
+
w = { count: 0, windowStart: now };
|
|
265
|
+
this.requestLogWindows.set(ip, w);
|
|
266
|
+
}
|
|
267
|
+
w.count++;
|
|
268
|
+
return w.count <= REQUEST_LOG_MAX_PER_WINDOW;
|
|
269
|
+
}
|
|
270
|
+
/** Newest-first diagnostics events, filtered. */
|
|
271
|
+
queryDiagnostics(opts = {}) {
|
|
272
|
+
const where = [];
|
|
273
|
+
const params = [];
|
|
274
|
+
if (opts.session) {
|
|
275
|
+
where.push('session_id = ?');
|
|
276
|
+
params.push(opts.session);
|
|
277
|
+
}
|
|
278
|
+
if (opts.userEmail) {
|
|
279
|
+
where.push('user_email = ?');
|
|
280
|
+
params.push(opts.userEmail);
|
|
281
|
+
}
|
|
282
|
+
if (opts.userId !== undefined) {
|
|
283
|
+
where.push('user_id = ?');
|
|
284
|
+
params.push(opts.userId);
|
|
285
|
+
}
|
|
286
|
+
if (opts.level) {
|
|
287
|
+
where.push('level = ?');
|
|
288
|
+
params.push(opts.level);
|
|
289
|
+
}
|
|
290
|
+
if (opts.since !== undefined) {
|
|
291
|
+
where.push('received_at >= ?');
|
|
292
|
+
params.push(opts.since);
|
|
293
|
+
}
|
|
294
|
+
const limit = Math.min(Math.max(opts.limit ?? 100, 1), 1000);
|
|
295
|
+
const sql = `SELECT * FROM desktop_diagnostics
|
|
296
|
+
${where.length ? `WHERE ${where.join(' AND ')}` : ''}
|
|
297
|
+
ORDER BY received_at DESC, id DESC
|
|
298
|
+
LIMIT ?`;
|
|
299
|
+
return this.db.prepare(sql).all(...params, limit);
|
|
300
|
+
}
|
|
301
|
+
/** Newest-first desktop request log, filtered. */
|
|
302
|
+
queryRequests(opts = {}) {
|
|
303
|
+
const where = [];
|
|
304
|
+
const params = [];
|
|
305
|
+
if (opts.userEmail) {
|
|
306
|
+
where.push('user_email = ?');
|
|
307
|
+
params.push(opts.userEmail);
|
|
308
|
+
}
|
|
309
|
+
if (opts.userId !== undefined) {
|
|
310
|
+
where.push('user_id = ?');
|
|
311
|
+
params.push(opts.userId);
|
|
312
|
+
}
|
|
313
|
+
if (opts.since !== undefined) {
|
|
314
|
+
where.push('ts >= ?');
|
|
315
|
+
params.push(opts.since);
|
|
316
|
+
}
|
|
317
|
+
const limit = Math.min(Math.max(opts.limit ?? 100, 1), 1000);
|
|
318
|
+
const sql = `SELECT * FROM desktop_requests
|
|
319
|
+
${where.length ? `WHERE ${where.join(' AND ')}` : ''}
|
|
320
|
+
ORDER BY ts DESC, id DESC
|
|
321
|
+
LIMIT ?`;
|
|
322
|
+
return this.db.prepare(sql).all(...params, limit);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Prune rows in both tables older than RETENTION_DAYS, but at most once per
|
|
326
|
+
* PRUNE_INTERVAL_MS. Called from BOTH write paths (event ingest + request
|
|
327
|
+
* log) so retention holds regardless of which one a deployment exercises;
|
|
328
|
+
* the throttle keeps the hot request-log path from issuing a DELETE per
|
|
329
|
+
* request. `now` is the caller's already-sampled timestamp.
|
|
330
|
+
*/
|
|
331
|
+
maybePrune(now) {
|
|
332
|
+
if (now - this.lastPruneAt < PRUNE_INTERVAL_MS)
|
|
333
|
+
return;
|
|
334
|
+
this.lastPruneAt = now;
|
|
335
|
+
const cutoff = now - RETENTION_DAYS * 24 * 60 * 60 * 1000;
|
|
336
|
+
this.db.prepare('DELETE FROM desktop_diagnostics WHERE received_at < ?').run(cutoff);
|
|
337
|
+
this.db.prepare('DELETE FROM desktop_requests WHERE ts < ?').run(cutoff);
|
|
338
|
+
}
|
|
339
|
+
close() {
|
|
340
|
+
this.db.close();
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=desktop-diagnostics-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-diagnostics-service.js","sourceRoot":"","sources":["../../src/services/desktop-diagnostics-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE3D;;;;GAIG;AACH,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,sEAAsE;AACtE,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAC1C,sEAAsE;AACtE,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,GAAG,IAAI,CAAC;AAC5C;qEACqE;AACrE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC;AACvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAC3C,mEAAmE;AACnE,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC;;wEAEwE;AACxE,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAChD;;;;;;gEAMgE;AAChE,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC/C;+EAC+E;AAC/E,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC;AAElD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AA0EjE,SAAS,QAAQ,CAAC,KAAa,EAAE,GAAW;IAC1C,OAAO,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1D,CAAC;AAED,0EAA0E;AAC1E,SAAS,WAAW,CAAC,KAAc,EAAE,GAAW;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,OAAO,yBAAyB;IAC5B,EAAE,CAAoB;IACb,WAAW,CAAqB;IAChC,aAAa,CAAqB;IACnD;wDACoD;IAC5C,WAAW,GAAG,CAAC,CAAC;IACxB,yEAAyE;IACxD,iBAAiB,GAAG,IAAI,GAAG,EAAkD,CAAC;IAE/F,YAAY,aAAqB;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;QACrD,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC;gBAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAErC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuCZ,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAKlC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAKpC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,aAAa;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,EAAmC,CAAC;QACxH,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,OAAO,IAAI,cAAc;YAAE,OAAO;QACtC,+BAA+B;QAC/B,yFAAyF;QACzF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IAC1H,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CACJ,MAA6B,EAC7B,MAA+B,EAC/B,IAAiD;QAEjD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;QAC3E,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;QAEzE,MAAM,IAAI,GAAG,MAAM;aAChB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;aACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;YAC1F,IAAI,QAAQ,GAAkB,IAAI,CAAC;YACnC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC;gBACpE,CAAC;gBAAC,MAAM,CAAC;oBACP,QAAQ,GAAG,IAAI,CAAC,CAAC,qEAAqE;gBACxF,CAAC;YACH,CAAC;YACD,OAAO;gBACL,WAAW,EAAE,UAAU;gBACvB,OAAO,EAAE,IAAI,CAAC,EAAE;gBAChB,UAAU,EAAE,IAAI,CAAC,KAAK;gBACtB,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,UAAU;gBACvB,EAAE;gBACF,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,uBAAuB,CAAC;gBACpD,KAAK;gBACL,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC;gBACvC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC;gBACvC,SAAS,EAAE,QAAQ;aACpB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEL,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,KAAkB,EAAE,EAAE;YACpD,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,CAAC;QAET,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,KAAsB;QAClC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,IAAI,SAAS,EAAE,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QACnE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YACrB,EAAE;YACF,OAAO,EAAE,KAAK,CAAC,MAAM;YACrB,UAAU,EAAE,KAAK,CAAC,SAAS;YAC3B,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAClC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;YACtD,WAAW,EAAE,KAAK,CAAC,UAAU;YAC7B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;YACzC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;YAC5C,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,IAAI;SAC3F,CAAC,CAAC;QACH,0EAA0E;QAC1E,yEAAyE;QACzE,yEAAyE;QACzE,4EAA4E;QAC5E,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACK,eAAe,CAAC,EAAU,EAAE,GAAW;QAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,WAAW,IAAI,qBAAqB,EAAE,CAAC;YACvD,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,2BAA2B,EAAE,CAAC;gBAC9D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC5C,IAAI,GAAG,GAAG,CAAC,CAAC,WAAW,IAAI,qBAAqB;wBAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACrF,CAAC;gBACD,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,2BAA2B;oBAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;YAChG,CAAC;YACD,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;YACnC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;QACD,CAAC,CAAC,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,CAAC,KAAK,IAAI,0BAA0B,CAAC;IAC/C,CAAC;IAED,iDAAiD;IACjD,gBAAgB,CAAC,OAA6B,EAAE;QAC9C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAC9E,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAClF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QACvF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;QACrE,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;QAC1F,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG;UACN,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;;gBAE5C,CAAC;QACb,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,CAAqB,CAAC;IACxE,CAAC;IAED,kDAAkD;IAClD,aAAa,CAAC,OAA0B,EAAE;QACxC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAClF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QACvF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;QACjF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG;UACN,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;;gBAE5C,CAAC;QACb,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,CAAiB,CAAC;IACpE,CAAC;IAED;;;;;;OAMG;IACK,UAAU,CAAC,GAAW;QAC5B,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,GAAG,iBAAiB;YAAE,OAAO;QACvD,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,GAAG,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC1D,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.entity-properties.svelte-1a2lez6{padding:var(--space-4) 0 var(--space-2)}.name-headline.svelte-1a2lez6{margin:var(--space-8) 0 var(--space-3);cursor:text;align-items:flex-start;display:flex;position:relative}.name-headline.readonly.svelte-1a2lez6{cursor:text}.name-static.svelte-1a2lez6{white-space:pre-wrap;word-break:break-word}.task-cancelled.svelte-1a2lez6 .name-input:where(.svelte-1a2lez6){color:var(--color-text-tertiary)}.name-input.svelte-1a2lez6{font-size:var(--text-xl);color:var(--color-text-primary);resize:none;background:0 0;border:none;outline:none;width:100%;padding:0;font-family:inherit;font-weight:600;line-height:1.3;display:block;overflow:hidden}.title-meta.svelte-1a2lez6{align-items:center;gap:var(--space-2);margin-bottom:var(--space-10);margin-left:calc(-1 * var(--space-2));flex-wrap:wrap;display:flex}.title-strip.svelte-1a2lez6{align-items:center;gap:var(--space-2);flex-wrap:wrap;display:flex}.strip-chip.svelte-1a2lez6{all:unset;align-items:baseline;gap:var(--space-1);padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm,6px);font-size:var(--text-base);color:var(--color-text-secondary);background:var(--color-bg-subtle,var(--color-surface));cursor:pointer;max-width:100%;display:inline-flex}.strip-chip.svelte-1a2lez6:not([disabled]):hover{background:var(--color-surface-hover,var(--color-bg-subtle));color:var(--color-text-primary)}.strip-chip[disabled].svelte-1a2lez6{cursor:default}.strip-label.svelte-1a2lez6{color:var(--color-text-tertiary);white-space:nowrap}.strip-value.svelte-1a2lez6{color:var(--color-text-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.strip-chip.svelte-1a2lez6:not([disabled]):hover .strip-value:where(.svelte-1a2lez6){color:var(--color-text-primary)}.show-metadata.svelte-1a2lez6{all:unset;cursor:pointer;padding:var(--space-1) var(--space-2);font-size:var(--text-base);color:var(--color-text-secondary);display:inline-flex}.show-metadata.svelte-1a2lez6:hover{color:var(--color-text-primary)}.share-desc.svelte-rglo5x{font-size:var(--text-base);line-height:var(--text-base--line-height);color:var(--color-text-secondary);margin:0}.share-desc--warn.svelte-rglo5x{margin-top:var(--space-3);color:var(--color-destructive-fg)}.share-stop-btn{margin-right:auto;color:var(--color-text-secondary)!important}.share-access.svelte-rglo5x{margin:0 0 var(--space-3);font-size:var(--text-base);line-height:var(--text-base--line-height);color:var(--color-text-secondary)}.share-access.svelte-rglo5x b:where(.svelte-rglo5x){color:var(--color-text-primary);font-weight:600}.share-error.svelte-rglo5x{margin:var(--space-3) 0 0;font-size:var(--text-sm);color:var(--color-destructive)}.share-sheet-body.svelte-rglo5x{padding:var(--space-2) var(--space-4) var(--space-4)}.share-footer-mobile button{width:100%;min-height:2.75rem}.entry-toolbar.svelte-151iknq{align-items:center;gap:var(--space-3);height:var(--row-height);padding:0 var(--toolbar-padding-x);z-index:1;border-bottom:1px solid var(--color-border);background:var(--color-bg);flex-shrink:0;display:flex;position:relative;container:entry-toolbar/inline-size}.toolbar-left.svelte-151iknq{align-items:center;gap:var(--space-3);min-width:0;display:flex;overflow:hidden}.toolbar-left.no-back.svelte-151iknq{padding-left:8px}.toolbar-right.svelte-151iknq{align-items:center;gap:var(--space-1);flex-shrink:0;margin-left:auto;display:flex}.share-toolbar-btn{--btn-height:var(--icon-btn-height)}.breadcrumb-back.svelte-151iknq{flex-shrink:0}.folder-breadcrumb-middle.svelte-151iknq,.breadcrumb-sep-middle.svelte-151iknq{display:none}.breadcrumb-sep-ellipsis.svelte-151iknq,.toolbar-left.svelte-151iknq .folder-breadcrumb-ellipsis{display:inline}@container entry-toolbar (width<=460px){.breadcrumb-sep.svelte-151iknq,.folder-breadcrumb-segment.svelte-151iknq,.toolbar-left.svelte-151iknq .folder-breadcrumb-ellipsis{display:none}}.folder-breadcrumb.svelte-151iknq{align-items:center;gap:var(--sg-crumb-icon-gap);font-size:var(--text-base);color:var(--color-text-secondary);white-space:nowrap;min-width:0;text-decoration:none;display:inline-flex}.folder-breadcrumb.svelte-151iknq>svg{width:var(--icon-btn-icon-size);height:var(--icon-btn-icon-size);flex-shrink:0}.bc-label.svelte-151iknq{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.folder-breadcrumb.svelte-151iknq:hover{color:var(--color-text-primary)}.folder-breadcrumb-segment.svelte-151iknq{gap:0}.folder-breadcrumb-leaf.svelte-151iknq{gap:.375rem}.toolbar-left.svelte-151iknq .folder-breadcrumb-ellipsis{appearance:none;font:inherit;font-size:var(--text-base);line-height:inherit;color:var(--color-text-tertiary);cursor:pointer;background:0 0;border:none;margin:0;padding:0}.toolbar-left.svelte-151iknq .folder-breadcrumb-ellipsis:hover,.toolbar-left.svelte-151iknq .folder-breadcrumb-ellipsis[data-state=open]{color:var(--color-text-primary)}.breadcrumb-sep.svelte-151iknq{font-size:var(--text-base);color:var(--color-text-tertiary);-webkit-user-select:none;user-select:none}.dialog-desc.svelte-151iknq{font-size:var(--text-base);color:var(--color-text-secondary);margin:0 0 var(--space-3)}.move-name.svelte-151iknq{font-size:var(--text-base);color:var(--color-text-primary);margin:var(--space-1) 0 var(--space-2);overflow-wrap:anywhere;font-weight:600}.move-location.svelte-151iknq{margin:0 0 var(--space-3)}.csv-editor.svelte-63hltt{padding:var(--space-8) var(--space-4) 0}.table-scroll.svelte-63hltt{overflow-x:auto}table.svelte-63hltt{border-collapse:collapse;width:max-content;font-size:var(--text-base);font-family:var(--font-sans)}th.svelte-63hltt,td.svelte-63hltt{border:1px solid var(--color-border);min-width:7.5rem;max-width:18.75rem;height:2rem;padding:0}@media (width<=767.98px),(hover:none) and (pointer:coarse) and (height<=500px){table.svelte-63hltt{width:100%}th.svelte-63hltt:not(.row-num):not(.col-add),td.svelte-63hltt:not(.row-num):not(.col-add){min-width:calc(50% - 2.25rem);max-width:none}}th.svelte-63hltt{color:var(--color-text-secondary);z-index:1;background:0 0;font-weight:500;position:sticky;top:0}th.svelte-63hltt:not(.row-num):not(.col-add){z-index:1;position:sticky;top:0}.row-num.svelte-63hltt{text-align:center;width:2.5rem;min-width:2.5rem;max-width:2.5rem;color:var(--color-text-tertiary);font-size:var(--text-xs);background:0 0}.cell-input.svelte-63hltt{width:100%;height:100%;color:var(--color-text-primary);font-family:var(--font-sans);font-size:var(--text-base);padding:var(--space-1) var(--space-2);background:0 0;border:none;outline:none}.cell-input.svelte-63hltt:focus{outline:none}tbody.svelte-63hltt td:where(.svelte-63hltt):not(.row-num):not(.actions):focus-within:after,thead.svelte-63hltt th:where(.svelte-63hltt):not(.row-num):not(.col-add):focus-within:after{content:"";box-shadow:inset 0 0 0 1px var(--color-accent);pointer-events:none;z-index:3;position:absolute;inset:0}.header-input.svelte-63hltt{color:var(--color-text-secondary);font-weight:500}th.svelte-63hltt:not(.row-num):not(.col-add){position:relative}th.svelte-63hltt button.col-delete-btn{background:var(--color-bg);width:2rem;height:100%;color:var(--color-text-tertiary);border-radius:0;justify-content:center;align-items:center;padding:0;display:none;position:absolute;top:0;bottom:0;right:0}th.svelte-63hltt:focus-within button.col-delete-btn{display:flex}@media (hover:hover){th.svelte-63hltt button.col-delete-btn:hover{background:var(--color-bg)!important;color:var(--color-text-primary)!important}}.col-add.svelte-63hltt{background:0 0;width:2rem;min-width:2rem;max-width:2rem}.col-add.svelte-63hltt .col-add-btn{border-radius:0;width:100%;height:100%;padding:0}.actions.svelte-63hltt{text-align:center;vertical-align:middle;width:2rem;min-width:2rem;max-width:2rem}td.actions.svelte-63hltt button.delete-btn{background:0 0;justify-content:center;align-items:center;width:2rem;height:100%;margin:0 auto;padding:0;display:none;color:var(--color-text-tertiary)!important}tr.svelte-63hltt:focus-within td.actions:where(.svelte-63hltt) button.delete-btn{display:flex}@media (hover:hover){td.actions.svelte-63hltt button.delete-btn:hover{color:var(--color-text-primary)!important;background:0 0!important}}.csv-footer.svelte-63hltt{align-items:center;gap:var(--space-4);padding:var(--space-2) 0;display:flex}.csv-footer.svelte-63hltt .add-row-btn{font-size:var(--text-base)}.remote-active.svelte-63hltt{outline:1px solid var(--rc-color,#f04e4e);outline-offset:-1px;position:relative}.remote-active.svelte-63hltt:focus-within{outline:none}.remote-cell-label.svelte-63hltt{font-size:var(--text-xs);font-family:var(--font-sans);padding:0 var(--space-1);white-space:nowrap;color:var(--color-accent-text,#ededef);z-index:2;pointer-events:none;border-radius:.1875rem .1875rem .1875rem 0;font-weight:500;line-height:1.6;position:absolute;top:-18px;left:-1px}.remote-header.svelte-63hltt .remote-cell-label:where(.svelte-63hltt){border-radius:0 .1875rem .1875rem;top:100%}.remote-cell-count.svelte-63hltt{opacity:.85;margin-left:.25rem;font-weight:600}tbody.svelte-63hltt td:where(.svelte-63hltt):not(.row-num):not(.actions){position:relative}.has-comment.svelte-63hltt{background:color-mix(in srgb, var(--color-accent) 9%, transparent)}.comment-hovered.svelte-63hltt{background:color-mix(in srgb, var(--color-accent) 15%, transparent)}.comment-active.svelte-63hltt{background:color-mix(in srgb, var(--color-accent) 20%, transparent)}.comment-pending.svelte-63hltt{background:color-mix(in srgb, var(--color-accent) 18%, transparent)}.comment-flash{animation:1.2s ease-out svelte-63hltt-cell-comment-flash}@keyframes svelte-63hltt-cell-comment-flash{0%{background:color-mix(in srgb, var(--color-accent) 28%, transparent)}to{background:0 0}}.cell-comment-btn.svelte-63hltt{background:var(--color-bg);cursor:pointer;z-index:2;border:none;justify-content:center;align-items:center;width:2rem;padding:0;line-height:0;display:inline-flex;position:absolute;top:0;bottom:0;right:0}.has-comment.svelte-63hltt .cell-comment-btn:where(.svelte-63hltt){background:color-mix(in srgb, var(--color-accent) 9%, var(--color-bg))}.comment-hovered.svelte-63hltt .cell-comment-btn:where(.svelte-63hltt){background:color-mix(in srgb, var(--color-accent) 15%, var(--color-bg))}.comment-pending.svelte-63hltt .cell-comment-btn:where(.svelte-63hltt){background:color-mix(in srgb, var(--color-accent) 18%, var(--color-bg))}.comment-active.svelte-63hltt .cell-comment-btn:where(.svelte-63hltt){background:color-mix(in srgb, var(--color-accent) 20%, var(--color-bg))}.cell-comment-btn.is-add.svelte-63hltt{color:var(--color-text-tertiary)}@media (hover:hover){.cell-comment-btn.is-add.svelte-63hltt:hover{color:var(--color-text-primary)}}.cell-comment-btn.is-anchored.svelte-63hltt{color:var(--color-accent)}@media (hover:hover){.cell-comment-btn.is-anchored.svelte-63hltt:hover{color:var(--color-accent-fg,var(--color-accent))}}.entry-layout.svelte-udj3er{flex:1;min-width:0;min-height:0;display:flex}.editor-column.svelte-udj3er{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.document-scroll.svelte-udj3er{scrollbar-gutter:stable;flex:1;min-width:0;min-height:0;overflow-y:auto}.document-scroll.artifact-scroll.svelte-udj3er{scrollbar-gutter:auto;flex-direction:column;display:flex;overflow:hidden}.document-scroll.artifact-scroll.svelte-udj3er>.document-well:where(.svelte-udj3er){flex:none}.document-well.svelte-udj3er{box-sizing:border-box;width:100%;max-width:45rem;margin:0 auto;padding:0 2.5rem}.editor-well.svelte-udj3er{position:relative}.document-well.editor-well.svelte-udj3er .cm-content{padding-bottom:clamp(6rem,40vh,20rem)}.preview-editor.svelte-udj3er .cm-content{cursor:text}.preview-banner.svelte-udj3er{align-items:center;gap:var(--space-3);height:var(--row-height);box-sizing:border-box;padding:0 var(--toolbar-padding-x);padding-left:calc(var(--toolbar-padding-x) + 8px);background:var(--color-bg-surface);border-bottom:1px solid var(--color-border);flex-shrink:0;display:flex}.preview-banner-lead.svelte-udj3er{align-items:center;gap:.375rem;min-width:0;display:flex}.preview-banner-icon.svelte-udj3er{color:var(--color-text-secondary);flex-shrink:0;display:inline-flex}.preview-banner-label.svelte-udj3er{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--text-base);color:var(--color-text-secondary);overflow:hidden}.preview-banner-actions.svelte-udj3er{align-items:center;gap:var(--space-1);flex-shrink:0;margin-left:auto;display:flex}.preview-state.svelte-udj3er{justify-content:center;align-items:center;gap:var(--space-2);min-height:100%;padding:0 var(--space-4);color:var(--color-text-tertiary);font-size:var(--text-base);text-align:center;flex-direction:column;display:flex}.preview-retry.svelte-udj3er{font-family:inherit;font-size:var(--text-sm);color:var(--color-accent-fg);cursor:pointer;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);background:0 0;border:none}.preview-retry.svelte-udj3er:hover{background:var(--color-bg-hover)}.sr-only.svelte-udj3er{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.dataset-view.svelte-udj3er .csv-editor{max-width:45rem;padding-inline:2.5rem;padding-bottom:var(--space-8);margin-inline:auto;container-type:inline-size}.dataset-view.svelte-udj3er .table-scroll{width:fit-content;min-width:min(40rem,100%);max-width:100%;margin-inline:auto}.dataset-view.svelte-udj3er thead th:not(.row-num):not(.col-add),.dataset-view.svelte-udj3er tbody td:not(.row-num):not(.actions){--data-col-w:calc((100cqi - 2.5rem - 2rem - 1px) / 3);width:var(--data-col-w);min-width:var(--data-col-w);max-width:var(--data-col-w)}.editor-well.processing.svelte-udj3er .cm-content{opacity:.4;pointer-events:none;-webkit-user-select:none;user-select:none}.processing-overlay.svelte-udj3er{justify-content:center;align-items:center;gap:var(--space-2);pointer-events:none;flex-direction:column;display:flex;position:absolute;inset:0}.processing-spinner.svelte-udj3er{border:2px solid var(--color-border);border-top-color:var(--color-accent);border-radius:50%;width:1.5rem;height:1.5rem;animation:.9s linear infinite svelte-udj3er-processing-spin}.processing-label.svelte-udj3er{font-size:var(--text-sm);color:var(--color-text-secondary)}@keyframes svelte-udj3er-processing-spin{to{transform:rotate(360deg)}}.entity-error.svelte-udj3er{justify-content:center;align-items:center;gap:var(--space-2);min-height:100%;color:var(--color-text-tertiary);font-size:var(--text-base);text-align:center;flex-direction:column;display:flex}.entity-error.svelte-udj3er p:where(.svelte-udj3er){margin:0}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.impact-loading.svelte-1mmell3{font-size:var(--text-base);color:var(--color-text-tertiary);align-items:center;gap:8px;padding:4px 0;display:flex}.impact.svelte-1mmell3{flex-direction:column;gap:8px;min-width:0;max-width:100%;display:flex}.impact-lede.svelte-1mmell3{font-size:var(--text-base);color:var(--color-text-tertiary);margin:0}.impact-footer.svelte-1mmell3{margin-bottom:var(--space-2);align-items:center;display:flex}.impact-select-all.svelte-1mmell3{color:var(--color-text-secondary);cursor:pointer;border-radius:var(--radius-sm);background:0 0;border:none;padding:2px 4px;font-size:12px}.impact-select-all.svelte-1mmell3:hover{color:var(--color-text-primary);background:var(--color-bg-hover)}.impact-sole.svelte-1mmell3{color:var(--color-text-tertiary);flex-shrink:0;display:flex}.impact-footnote.svelte-1mmell3{color:var(--color-text-tertiary);align-items:center;gap:6px;margin:0 0 0 auto;font-size:12px;display:flex}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.move-name.svelte-35dzzf{font-size:var(--text-lg);margin:var(--space-2) 0 0;font-weight:600}.move-location.svelte-35dzzf{margin:var(--space-2) 0 var(--space-3)}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./
|
|
2
|
-
import{St as e,Z as t,xt as n,yt as r}from"./FISIvbqq.js";import{i,r as a}from"./
|
|
3
|
-
`):e.textContent||``}let t=document.querySelector(`.entity-editor textarea`);return t?t.value:``}async function le(){try{let e=await c(`/api/preferences/settings`);if(e.default_meeting_folder)return e.default_meeting_folder}catch{}return null}function B(e){return f(u.repos.find(t=>t.name===e)?.displayName??d(e))}var V=null,H=null,U=null,W=null,ue=null,G=[],de=null,fe=[],pe=[],me=[],K=[],q=[],J=null,Y=1e3,X=n(!1),he=n(null),Z={},Q={};function ge(e){let t=m.user?.displayName;if(e.type===`sync_progress`){let t=Z[e.repo];if(t){let n=e.message.trim(),r=n.match(/^Syncing from source:\s*(.+)$/i);r&&(Q[e.repo]=`Syncing ${r[1].trim()}…`);let i=Q[e.repo]??`Syncing ${e.repo}…`;h.loading(i,{id:t,description:n,duration:36e5})}return}if(e.type===`entity_change`){for(let t of K)try{t(e)}catch{}if(e.entityType===`_folder`){u.repos.some(t=>t.name===e.repo)?u.refreshRepoAfterFolderMutation(e.repo):u.ensureFolderInSidebar(e.repo);return}if(t&&e.actor===t&&e.source===`api`&&!e.agent){u.refreshEntities(e.repo);return}u.refreshEntities(e.repo),L.handleEntityUpdated(e.repo,e.entityType,e.entityId),p.selectedRepo===e.repo&&p.selectedType===e.entityType&&p.selectedId===e.entityId&&(e.agent?(h(`Agent edited this entry`,{duration:3e3}),S.hasPending||i()):S.hasPending?h(`${e.actor} also saved changes to this entity`):i());return}if(e.type===`session_commit`){if(t&&e.actor===t){r(he,e.timestamp,!0);return}let n=e.entities.length;h(n===1?`${e.actor} updated ${e.entities[0]}`:`${e.actor} updated ${n} entries in ${e.repo}`),u.refreshEntities(e.repo);return}if(e.type===`sync_complete`){if(!Z[e.repo]){let t=e.created+e.updated+e.deleted,n=t===0?`Sync complete · no changes in ${e.repo}`:`Sync complete · ${t} ${t===1?`entity`:`entities`} from ${e.source}`;h.success(n)}u.refreshEntities(e.repo);return}if(e.type===`folder_created`){h(`${e.actor} created folder ${B(e.repo)}`),u.ensureFolderInSidebar(e.repo);return}if(e.type===`folder_deleted`){h(`${e.actor} deleted folder ${B(e.repo)}`);return}if(e.type===`repo_sync`){if(!(t&&e.actor===t&&e.source===`api`)){let t=e.workspaceWide?`Studio`:B(e.repo);e.source===`git-push`?h(`${e.actor} pushed to ${t}`):e.summary?h(`${e.actor} ${e.summary} in ${t}`):h(`${e.actor} updated ${t}`)}u.refreshRepoAfterFolderMutation(e.repo);for(let t of q)t(e);return}if(e.type===`presence`){H?.(e);return}if(e.type===`agent_activity`){U?.(e);return}if(e.type===`online`){W?.(e);return}if(e.type===`user_mention`){ue?.(e);return}if(e.type===`comment_created`||e.type===`comment_updated`||e.type===`comment_resolved`||e.type===`comment_reopened`||e.type===`comment_deleted`){for(let t of G)t(e);return}if(e.type===`comment_agent_thinking`){de?.(e);return}if(e.type===`state_cleared`){Promise.all([o(()=>import(`./
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./Bwk2tzAR.js","./FISIvbqq.js","./DlJZ9kVY.js","./hub1HF5s.js","./CgOgBK5j.js","./QsO256-z.js","./BEnhEpl4.js","./nqo2e2Yv.js","./DuHa0E8I.js","./Bm1zMkOs.js","./CWZSexLW.js","./D6toh9Mr.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{St as e,Z as t,xt as n,yt as r}from"./FISIvbqq.js";import{i,r as a}from"./DlJZ9kVY.js";import{t as o}from"./kNaey6uv.js";import"./hub1HF5s.js";import{$ as s,nt as c,s as l}from"./nqo2e2Yv.js";import{i as u,r as d}from"./CWZSexLW.js";import{r as f}from"./QsO256-z.js";import{t as p}from"./Bm1zMkOs.js";import{t as m}from"./DCgKWtld.js";import{t as h}from"./CgOgBK5j.js";function ee(e){return e.pendingHash===e.serverHash?`convergent-retry`:e.liveHash===null?e.wsConnected?`drop`:`requeue-stale`:e.liveHash===e.serverHash?`drop`:e.wsConnected?`defer`:`requeue-live`}var g=800,_=10;function v(e,t,n,r,i){if(!(typeof localStorage>`u`))try{let a=`sg-editor-recovery:${e}/${t}/${n}`,o=JSON.parse(localStorage.getItem(a)??`[]`),s=Array.isArray(o)?o:[];for(s.push({content:r,reason:i,ts:new Date().toISOString()});s.length>_;)s.shift();localStorage.setItem(a,JSON.stringify(s))}catch{}}async function y(e){let t=new TextEncoder().encode(e),n=await crypto.subtle.digest(`SHA-256`,t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}function b(e,t,n){return`${e}/${t}/${n}`}function x(){let e=n(!1),i=n(null),a=n(null),o=null,c=null,l=!1,d=null,f=new Map,p=new Map;function m(e,t,n,r){o&&o.repo===e&&o.type===t&&o.id===n?(r.data!==void 0&&(o.payload.data=r.data),r.content!==void 0&&(o.payload.content=r.content)):o={repo:e,type:t,id:n,payload:{...r}},h()}function h(){c&&clearTimeout(c),c=setTimeout(_,g)}async function _(){if(c=null,!l&&o){let{repo:t,type:n,id:c,payload:m}=o;o=null,l=!0,r(e,!0),r(a,null);let h;d=new Promise(e=>{h=e});let g=b(t,n,c),x=m.content===void 0?void 0:f.get(g);try{let e=await s(t,n,c,m,{baseBodyHash:x});if(r(i,new Date,!0),m.content!==void 0){let t=e.document?.content??m.content;f.set(g,await y(t))}if(m.data?.name){let e=u.repos.find(e=>e.name===t)?.entities.find(e=>e.id===c);e&&(e.title=m.data.name)}}catch(e){let i=e.status??e.statusCode;if(i===412&&e.body?.code===`STALE_BODY_HASH`&&m.content!==void 0){let i=m.content,s=await y(i),l=e.body.currentBodyHash,u=p.get(g)?.()??null,d=ee({serverHash:l,pendingHash:s,liveHash:u===null?null:await y(u),wsConnected:Re.connected});switch(r(a,null),d){case`convergent-retry`:f.set(g,l),o={repo:t,type:n,id:c,payload:m};break;case`drop`:f.set(g,l),v(t,n,c,i,`divergent-412-drop`);break;case`defer`:v(t,n,c,i,`divergent-412-defer`);break;case`requeue-live`:f.set(g,l),v(t,n,c,i,`divergent-412-requeue-live`),o={repo:t,type:n,id:c,payload:{...m,content:u}};break;case`requeue-stale`:f.set(g,l),o={repo:t,type:n,id:c,payload:m};break}}else r(a,e.message??`Save failed`,!0),(!i||i>=500)&&(o={repo:t,type:n,id:c,payload:m})}finally{r(e,!1),l=!1,h(),d=null,o&&_()}}}async function x(){c&&=(clearTimeout(c),null);let e=0;for(;e<50&&(l||o);e++)l&&d?await d:o&&await _();(l||o)&&console.warn(`editorStore.flush: gave up with a save still pending after`,e,`iterations`)}async function S(t,n,o,c){r(e,!0),r(a,null);try{let e=await s(t,n,o,c);return r(i,new Date,!0),e}catch(e){return r(a,e.message??`Save failed`,!0),null}finally{r(e,!1)}}function C(){r(a,null),r(i,null),o=null,c&&=(clearTimeout(c),null)}async function w(e,t,n,r){let i=b(e,t,n);f.set(i,await y(r))}function T(e,t,n){f.delete(b(e,t,n))}function E(e,t,n,r){p.set(b(e,t,n),r)}function te(e,t,n){p.delete(b(e,t,n))}return{get saving(){return t(e)},get lastSaved(){return t(i)},get error(){return t(a)},get hasPending(){return!!(o||l)},scheduleAutoSave:m,flush:x,saveEntity:S,setBaseBodyHash:w,clearBaseBodyHash:T,registerLiveContentGetter:E,clearLiveContentGetter:te,reset:C}}var S=x();function C(e=new Date){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function w(e,t=new Date){if(!e)return``;let n=new Date(e),r=n.getTime();if(Number.isNaN(r))return``;let i=Math.round((t.getTime()-r)/1e3);if(i<60)return`now`;let a=Math.floor(i/60);if(a<60)return`${a}m`;let o=Math.floor(a/60);if(o<24)return`${o}h`;let s=Math.floor(o/24);return s<7?`${s}d`:T(n,t)}function T(e,t=new Date){let n=e.getFullYear()===t.getFullYear();return e.toLocaleDateString(void 0,{month:`short`,day:`numeric`,...n?{}:{year:`numeric`}})}function E(e){if(!e)return null;let t=new Date(e.length===10?`${e}T00:00:00`:e);return Number.isNaN(t.getTime())?null:t}function te(e,t=new Date){let n=E(e);return n?n.getTime()>t.getTime()?T(n,t):w(n.toISOString(),t):``}var D=n(`idle`),O=n(!1),k=n(null),A=n(null),j=n(null),M=n(``),N=n(null),P=n(0),F=null,ne=n(19877),I=null,L={get state(){return t(D)},get isElectron(){return t(O)},get activeEntityId(){return t(k)},get activeRepo(){return t(A)},get meetingTitle(){return t(M)},get platform(){return t(N)},get elapsedSeconds(){return t(P)},get recordingStartTime(){return t(j)},handleElectronReady(e){r(O,!0),e?.port&&r(ne,e.port,!0)},async handleRecordingStarted(n){if(r(O,!0),t(D)===`processing`&&this.reset(),t(D)!==`idle`)return;let i=n.repo||await le()||u.repos[0]?.name||null;if(!i){h.error(`No folder configured. Set one in Connectors → Meeting Capture.`);return}r(M,n.meetingTitle||``,!0),r(N,n.platform||null,!0),r(A,i,!0),r(j,new Date,!0),r(D,`recording`),r(P,0),F=setInterval(()=>{e(P)},1e3);let o=ae(t(M)||`Meeting`,t(j));try{let e=t(j).toISOString();await l(i,`event`,o,{entity_type:`event`,entity_id:o,type:`meeting`,name:t(M)||`Meeting ${oe(t(j))}`,date:C(t(j)),created_at:e,updated_at:e,created_by:`desktop`,updated_by:`desktop`,attendees:(n.attendees||[]).filter(e=>!e.isSelf).map(e=>`[[${z(e.name)}]]`),tags:[`auto-transcribed`,n.platform].filter(Boolean)},``),r(k,o,!0),a(`/${i}/event/${o}`),ie({type:`sg:entity-created`,repo:i,entityType:`event`,entityId:o},`*`)}catch(e){console.error(`[Meeting] Failed to create entity:`,e),r(D,`idle`),R()}},handleRecordingStopped(e){t(D)!==`recording`&&t(D)!==`stopping`||re()},startRecording(){t(O)&&ie({type:`sg:start-recording`},`*`)},stopRecording(){t(D)===`recording`&&re()},reset(){r(D,`idle`),r(k,null),r(A,null),r(j,null),r(M,``),r(N,null),r(P,0),R()},handleEntityUpdated(e,n,r){t(D)===`processing`&&n===`event`&&(e!==t(A)||r!==t(k)||this.reset())},registerEditorContentProvider(e,n,r){e!==t(A)||n!==t(k)||(I=r)},unregisterEditorContentProvider(){I=null}};function re(){let e=se();r(D,`processing`),R(),fetch(`http://127.0.0.1:${t(ne)}/stop`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({entityId:t(k),memo:e})}).catch(()=>{}),h(`Processing meeting notes…`,{description:`Your notes will be ready in a moment.`,duration:5e3})}function ie(e,t){let{type:n,...r}=e;window.sgBridge?.send(n,r)}function R(){F&&=(clearInterval(F),null)}function z(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``)}function ae(e,t){let n=C(t),r=t.toTimeString().slice(0,8).replace(/:/g,``);return`${n}-${z(e||`meeting`)}-${r}`}function oe(e){return e.toLocaleTimeString([],{hour:`numeric`,minute:`2-digit`})}function se(){if(I)try{let e=I();if(typeof e==`string`)return e}catch{}return ce()}function ce(){let e=document.querySelector(`.cm-content`);if(e){let t=e.querySelectorAll(`.cm-line`);return t.length>0?Array.from(t).map(e=>e.textContent||``).join(`
|
|
3
|
+
`):e.textContent||``}let t=document.querySelector(`.entity-editor textarea`);return t?t.value:``}async function le(){try{let e=await c(`/api/preferences/settings`);if(e.default_meeting_folder)return e.default_meeting_folder}catch{}return null}function B(e){return f(u.repos.find(t=>t.name===e)?.displayName??d(e))}var V=null,H=null,U=null,W=null,ue=null,G=[],de=null,fe=[],pe=[],me=[],K=[],q=[],J=null,Y=1e3,X=n(!1),he=n(null),Z={},Q={};function ge(e){let t=m.user?.displayName;if(e.type===`sync_progress`){let t=Z[e.repo];if(t){let n=e.message.trim(),r=n.match(/^Syncing from source:\s*(.+)$/i);r&&(Q[e.repo]=`Syncing ${r[1].trim()}…`);let i=Q[e.repo]??`Syncing ${e.repo}…`;h.loading(i,{id:t,description:n,duration:36e5})}return}if(e.type===`entity_change`){for(let t of K)try{t(e)}catch{}if(e.entityType===`_folder`){u.repos.some(t=>t.name===e.repo)?u.refreshRepoAfterFolderMutation(e.repo):u.ensureFolderInSidebar(e.repo);return}if(t&&e.actor===t&&e.source===`api`&&!e.agent){u.refreshEntities(e.repo);return}u.refreshEntities(e.repo),L.handleEntityUpdated(e.repo,e.entityType,e.entityId),p.selectedRepo===e.repo&&p.selectedType===e.entityType&&p.selectedId===e.entityId&&(e.agent?(h(`Agent edited this entry`,{duration:3e3}),S.hasPending||i()):S.hasPending?h(`${e.actor} also saved changes to this entity`):i());return}if(e.type===`session_commit`){if(t&&e.actor===t){r(he,e.timestamp,!0);return}let n=e.entities.length;h(n===1?`${e.actor} updated ${e.entities[0]}`:`${e.actor} updated ${n} entries in ${e.repo}`),u.refreshEntities(e.repo);return}if(e.type===`sync_complete`){if(!Z[e.repo]){let t=e.created+e.updated+e.deleted,n=t===0?`Sync complete · no changes in ${e.repo}`:`Sync complete · ${t} ${t===1?`entity`:`entities`} from ${e.source}`;h.success(n)}u.refreshEntities(e.repo);return}if(e.type===`folder_created`){h(`${e.actor} created folder ${B(e.repo)}`),u.ensureFolderInSidebar(e.repo);return}if(e.type===`folder_deleted`){h(`${e.actor} deleted folder ${B(e.repo)}`);return}if(e.type===`repo_sync`){if(!(t&&e.actor===t&&e.source===`api`)){let t=e.workspaceWide?`Studio`:B(e.repo);e.source===`git-push`?h(`${e.actor} pushed to ${t}`):e.summary?h(`${e.actor} ${e.summary} in ${t}`):h(`${e.actor} updated ${t}`)}u.refreshRepoAfterFolderMutation(e.repo);for(let t of q)t(e);return}if(e.type===`presence`){H?.(e);return}if(e.type===`agent_activity`){U?.(e);return}if(e.type===`online`){W?.(e);return}if(e.type===`user_mention`){ue?.(e);return}if(e.type===`comment_created`||e.type===`comment_updated`||e.type===`comment_resolved`||e.type===`comment_reopened`||e.type===`comment_deleted`){for(let t of G)t(e);return}if(e.type===`comment_agent_thinking`){de?.(e);return}if(e.type===`state_cleared`){Promise.all([o(()=>import(`./Bwk2tzAR.js`).then(e=>e.n),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10]),import.meta.url),o(()=>import(`./D6toh9Mr.js`).then(e=>e.n),__vite__mapDeps([11,1,7]),import.meta.url)]).then(([t,n])=>{t.chatStore.wipeLocal(),e.target===`all`&&n.insightsStore.load()});return}if(e.type===`access_granted`){u.ensureFolderInSidebar(e.repo);return}if(e.type===`access_revoked`){p.selectedRepo===e.repo&&p.deselect(),u.onFolderAccessRevoked(e.repo);return}}function _e(){if(typeof window>`u`||V&&(V.readyState===WebSocket.OPEN||V.readyState===WebSocket.CONNECTING))return;let e=`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}/ws`;V=new WebSocket(e),V.binaryType=`arraybuffer`,V.onopen=()=>{r(X,!0),Y=1e3,u.refreshAll();for(let e of fe)e()},V.onmessage=e=>{if(!(e.data instanceof ArrayBuffer))try{let t=JSON.parse(e.data);if(t?.type===`ping`){V?.send(JSON.stringify({type:`pong`}));return}if(t?.type===`server_version`&&typeof t.version==`string`){xe(t.version);return}let n=t;n.type&&n.type!==`toast`&&ge(n)}catch{}},V.onclose=()=>{r(X,!1),V=null;for(let e of pe)e();J=setTimeout(()=>{Y=Math.min(Y*2,1e4),_e()},Y)},V.onerror=()=>{}}function ve(){J&&=(clearTimeout(J),null),V&&=(V.onclose=null,V.close(),null),r(X,!1);for(let e of me)e()}function ye(e,t=4e3){h(e,{duration:t})}var $=n(!1),be={get value(){return t($)}};function xe(e){!e||e===`1.3.48-next.281`||t($)||r($,!0)}function Se(e,t){let n=crypto.randomUUID();return t?.loading?h.loading(e,{id:n,duration:36e5}):h(e,{id:n}),n}function Ce(e,t,n){if(n?.loading){h.loading(t,{id:e});return}/failed|error/i.test(t)?h.error(t,{id:e,duration:n?.duration??6e3}):h.success(t,{id:e,duration:n?.duration??4e3})}function we(e){let t=crypto.randomUUID();Z[e]=t,h.loading(`Syncing ${e}…`,{id:t,duration:36e5})}function Te(e,t,n){let r=Z[e];r&&(delete Z[e],delete Q[e],n?h.error(t,{id:r,duration:6e3}):h.success(t,{id:r,duration:4e3}))}function Ee(e){H=e}function De(e){U=e}function Oe(e){W=e}function ke(e){ue=e}function Ae(e){return G.push(e),()=>{let t=G.indexOf(e);t!==-1&&G.splice(t,1)}}function je(e){de=e}function Me(e){fe.push(e)}function Ne(e){pe.push(e)}function Pe(e){me.push(e)}function Fe(e){return K.push(e),()=>{let t=K.indexOf(e);t!==-1&&K.splice(t,1)}}function Ie(e){return q.push(e),()=>{let t=q.indexOf(e);t!==-1&&q.splice(t,1)}}function Le(e){V?.readyState===WebSocket.OPEN&&V.send(JSON.stringify(e))}var Re={get connected(){return t(X)},get lastAutoSaved(){return t(he)},get ws(){return V},connect:_e,disconnect:ve,showToast:ye,showPersistentToast:Se,updateToast:Ce,startSyncToast:we,finishSyncToast:Te,send:Le,setPresenceHandler:Ee,setAgentActivityHandler:De,setOnlineHandler:Oe,setUserMentionHandler:ke,addCommentHandler:Ae,setCommentAgentThinkingHandler:je,addConnectHandler:Me,addDisconnectHandler:Ne,addTeardownHandler:Pe,addEntityChangeHandler:Fe,addRepoSyncHandler:Ie};export{w as a,S as c,te as i,be as n,C as o,L as r,E as s,Re as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./B2cjR0rG2.js";import"./CkeUq-8R.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{B as e,Ft as t,O as n,Pt as r,R as i,U as a,Vt as o,Z as s,ct as c,ht as l,mt as u,wt as d,xt as f,yt as p,z as m}from"./FISIvbqq.js";import"./xihTtKlq.js";import{t as h}from"./
|
|
1
|
+
import{B as e,Ft as t,O as n,Pt as r,R as i,U as a,Vt as o,Z as s,ct as c,ht as l,mt as u,wt as d,xt as f,yt as p,z as m}from"./FISIvbqq.js";import"./xihTtKlq.js";import{t as h}from"./Bwk2tzAR.js";import{A as g,F as _,M as v,N as y,O as b,P as x,k as S}from"./DNCh8Cb_.js";import{t as C}from"./GC5Izn9E2.js";import{t as w}from"./CmWflMFc.js";import{t as T}from"./n1_hJpnq.js";var E=e(`<!> <!>`,1),D=e(`<!> <!>`,1),O=e(`<!> <!> <!>`,1);function k(e,k){t(k,!0);let A=d(()=>T.id!==null),j=f(``),M=f(null);c(()=>{T.id!==null&&p(j,T.title,!0)}),c(()=>{T.id!==null&&s(M)&&requestAnimationFrame(()=>{s(M)?.focus(),s(M)?.select()})});function N(){T.close()}function P(){let e=T.id;!e||!s(j).trim()||(h.renameSession(e,s(j)),N())}var F=m();n(u(F),()=>_,(e,t)=>{t(e,{get open(){return s(A)},onOpenChange:e=>{e||N()},children:(e,t)=>{var r=m();n(u(r),()=>x,(e,t)=>{t(e,{size:`sm`,children:(e,t)=>{var r=O(),c=u(r);n(c,()=>y,(e,t)=>{t(e,{class:`close-only-header`,children:(e,t)=>{var r=m();n(u(r),()=>b,(e,t)=>{t(e,{})}),i(e,r)},$$slots:{default:!0}})});var f=l(c,2);n(f,()=>g,(e,t)=>{t(e,{class:`dialog-body-lg`,children:(e,t)=>{var r=E(),c=u(r);n(c,()=>v,(e,t)=>{t(e,{children:(e,t)=>{o(),i(e,a(`Rename Chat`))},$$slots:{default:!0}})}),w(l(c,2),{type:`text`,placeholder:`Chat name`,get ref(){return s(M)},set ref(e){p(M,e,!0)},get value(){return s(j)},set value(e){p(j,e,!0)}}),i(e,r)},$$slots:{default:!0}})}),n(l(f,2),()=>S,(e,t)=>{t(e,{children:(e,t)=>{var n=D(),r=u(n);C(r,{variant:`ghost`,onclick:N,children:(e,t)=>{o(),i(e,a(`Cancel`))},$$slots:{default:!0}});var c=l(r,2);{let e=d(()=>!s(j).trim());C(c,{variant:`accent`,enterKey:!0,get disabled(){return s(e)},onclick:P,children:(e,t)=>{o(),i(e,a(`Rename`))},$$slots:{default:!0}})}i(e,n)},$$slots:{default:!0}})}),i(e,r)},$$slots:{default:!0}})}),i(e,r)},$$slots:{default:!0}})}),i(e,F),r()}export{k as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{qt as e}from"./FISIvbqq.js";import{m as t,p as n}from"./CaimSvvF.js";import{a as r,r as i,t as a}from"./CM400nLL.js";import{n as o}from"./B_y9A6Kg.js";import{t as s}from"./xGXTHqYt.js";var c=e({commentExtension:()=>p,refreshCommentsEffect:()=>l}),l=n.define(),u=t.define({create(){return a.none},update(e,t){let n=e.map(t.changes);for(let e of t.effects)e.is(l),e.is(d)&&(n=e.value.map(t.changes));return n},provide:e=>i.decorations.from(e)}),d=n.define();function f(e,t){let n=s.getForEntry(t.repo,t.entryType,t.entryId),r=e.state.doc.length,i=[],c=[];for(let e of n){if(e.deletedAt||e.commentId!==e.threadId||!e.anchorRelpos)continue;let n=o(t.ydoc,t.ytext,e.anchorRelpos,e.anchorQuote??``);if(n.orphaned)continue;let s=Math.max(0,Math.min(n.from,r)),l=Math.max(s,Math.min(n.to,r));if(s===l)continue;let u=e.resolvedAt!==null,d=u?`sg-comment-highlight sg-comment-resolved`:`sg-comment-highlight`;i.push({from:s,to:l,deco:a.mark({class:d,attributes:{"data-comment-id":e.commentId,"data-thread-id":e.threadId}})}),c.push({commentId:e.commentId,threadId:e.threadId,from:s,to:l,recovered:n.recovered,resolved:u,authorRole:e.authorRole})}return i.sort((e,t)=>e.from-t.from||e.to-t.to),{decorations:a.set(i.map(e=>e.deco.range(e.from,e.to))),markers:c}}function p(e){let t=[];return[u,r.define(n=>{function r(){let r=e.getContext();if(!r)return;let{decorations:i,markers:a}=f(n,r);n.dispatch({effects:d.of(i)}),t=a,e.onMarkersChanged?.(a)}let i=!1,a=()=>{i||(i=!0,queueMicrotask(()=>{i=!1,r()}))};return a(),{update(e){for(let t of e.transactions)for(let e of t.effects)if(e.is(l)){a();return}e.docChanged&&a()}}}),i.domEventHandlers({click(n,r){let i=n.target.closest(`.sg-comment-highlight`);if(!i)return e.onCommentClickAway?.(),!1;let a=i.dataset.threadId;if(!a)return!1;if(t.some(e=>e.threadId===a))return e.onCommentClick(a),!0;let o=r.posAtCoords({x:n.clientX,y:n.clientY});if(o!==null){let n=null;for(let e of t)o>=e.from&&o<=e.to&&(!n||e.to-e.from<n.to-n.from)&&(n=e);if(n)return e.onCommentClick(n.threadId),!0}return e.onCommentClickAway?.(),!1}})]}export{l as n,c as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,B as t,Ft as n,G as r,Ht as i,I as a,K as o,P as s,Pt as c,R as l,S as u,T as d,U as f,V as p,Vt as m,W as h,X as g,Z as _,a as v,at as y,ct as b,d as x,g as S,gt as C,ht as w,j as T,k as E,mt as ee,n as D,o as O,ot as te,pt as k,r as ne,st as A,u as j,v as M,vt as re,wt as N,x as P,xt as F,yt as I,z as ie}from"./FISIvbqq.js";import{r as L}from"./DlJZ9kVY.js";import"./xihTtKlq.js";import"./hub1HF5s.js";import{$ as ae}from"./nqo2e2Yv.js";import{i as oe}from"./CWZSexLW.js";import"./CWIHttTH.js";import{t as se}from"./F92HmKX8.js";import{D as ce}from"./DNCh8Cb_.js";import{d as le,r as ue,s as de,t as fe}from"./CrI1td1i2.js";import{i as pe}from"./Bi0xMDiZ2.js";import{r as me}from"./DPLkAijI2.js";import{r as he}from"./DiMsLIh3.js";import{n as ge,r as _e}from"./secOWbPM.js";import{o as ve}from"./CVk6pSTs.js";import{i as ye,n as be,r as xe}from"./C8ZiSqQm.js";import{n as Se,r as Ce}from"./tBw__QoK.js";import{t as we}from"./uHaS74te.js";import{t as Te}from"./CqyFdLMa.js";import{r as Ee}from"./D1AgYXMF2.js";import{r as De,t as Oe}from"./DQMWa2t7.js";var ke={project:{start:`start_date`,end:`date`},task:{start:`start_date`,end:`date`},deliverable:{start:`start_date`,end:`date`},deal:{start:`start_date`,end:`date`},event:{start:`start_date`,end:`date`}},Ae={weeks:24,months:5,quarters:1.6},je=[`project`,`deliverable`,`task`,`deal`,`event`],Me={project:`Projects`,deliverable:`Deliverables`,task:`Tasks`,deal:`Deals`,event:`Events`},Ne={project:`project`,deliverable:`deliverable`,task:`task`,deal:`deal`,event:`event`},R=ke,z={project:new Set([`complete`,`archived`]),task:new Set([`done`,`cancelled`]),deliverable:new Set([`delivered`,`accepted`,`rejected`]),deal:new Set([`won`,`lost`])},B=new Set([`archived`]),V={deal:`stage`};function Pe(e){return V[e]??`status`}function Fe(e){let t=R[e];return t?{startField:t.start,endField:t.end}:{}}function Ie(e){return Ne[e]??null}function Le(e,t){let n=e.fields[t];if(typeof n!=`string`)return null;let r=/^(\d{4})-(\d{2})-(\d{2})/.exec(n);return r?new Date(Date.UTC(+r[1],r[2]-1,+r[3])):null}function Re(e){let t=R[e.entityType];if(!t)return null;let n=Le(e,t.start),r=Le(e,t.end);if(!n&&!r)return null;if(n&&r)return n.getTime()>r.getTime()?{start:r,end:n}:{start:n,end:r};let i=n??r;return{start:i,end:i,singleEndpoint:n?`start`:`end`}}function H(e){let t=z[e.entityType]??B,n=e.fields[Pe(e.entityType)];return typeof n==`string`&&t.has(n)}function ze(e,t){t.today;let n=[];for(let r of e){let e=Ie(r.entityType);if(!e)continue;let i=Re(r);if(!i)continue;let a=H(r);t.hideCompleted&&a||n.push({entity:r,start:i.start,end:i.end,isCompleted:a,sectionKey:e,color:he(r.entityType),singleEndpoint:i.singleEndpoint})}return n}function Be(e){let t=0;for(let n of e)Ie(n.entityType)&&(Re(n)||t++);return t}function Ve(e,t){let n=W(He(t),-30),r=W(He(t),90);for(let t of e)t.start.getTime()<n.getTime()&&(n=W(He(t.start),-7)),t.end.getTime()>r.getTime()&&(r=He(W(t.end,1)));return{start:n,end:r,days:U(n,r)}}function U(e,t){return Math.round((t.getTime()-e.getTime())/864e5)}function He(e){return new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()))}function W(e,t){let n=new Date(e.getTime());return n.setUTCDate(n.getUTCDate()+t),n}function G(e,t,n,r,i,a){let o=U(t.start,r)*n,s=U(r,i)*n;s>0&&e.push({x:o,width:s,label:a})}function Ue(e,t){let n=new Date(Date.UTC(e.start.getUTCFullYear(),0,1));for(;n<e.end;){let e=new Date(Date.UTC(n.getUTCFullYear()+1,0,1));t(n,e),n.setTime(e.getTime())}}function We(e,t){let n=Math.floor(e.start.getUTCMonth()/3)*3,r=new Date(Date.UTC(e.start.getUTCFullYear(),n,1));for(;r<e.end;){let e=new Date(Date.UTC(r.getUTCFullYear(),r.getUTCMonth()+3,1));t(r,e),r.setTime(e.getTime())}}function K(e,t){let n=new Date(Date.UTC(e.start.getUTCFullYear(),e.start.getUTCMonth(),1));for(;n<e.end;){let e=new Date(Date.UTC(n.getUTCFullYear(),n.getUTCMonth()+1,1));t(n,e),n.setTime(e.getTime())}}function q(e,t){let n=new Date(e.start.getTime()),r=(n.getUTCDay()+6)%7;for(n.setUTCDate(n.getUTCDate()-r);n<e.end;){let e=W(n,7);t(n,e),n.setTime(e.getTime())}}function Ge(e,t,n){let r=n??Ae[t],i=[],a=[];return t===`weeks`?(K(e,(t,n)=>{G(i,e,r,t,n,t.toLocaleDateString(`en-US`,{month:`long`,year:`numeric`,timeZone:`UTC`}))}),q(e,(t,n)=>{G(a,e,r,t,n,t.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`,timeZone:`UTC`}))})):t===`months`?(Ue(e,(t,n)=>{G(i,e,r,t,n,String(t.getUTCFullYear()))}),K(e,(t,n)=>{G(a,e,r,t,n,t.toLocaleDateString(`en-US`,{month:`short`,timeZone:`UTC`}))})):(We(e,(t,n)=>{G(i,e,r,t,n,`Q${Math.floor(t.getUTCMonth()/3)+1} ${t.getUTCFullYear()}`)}),K(e,(t,n)=>{G(a,e,r,t,n,t.toLocaleDateString(`en-US`,{month:`short`,timeZone:`UTC`}))})),{primary:i,secondary:a}}var J=p(`<title> </title>`),Ke=p(`<svg><!><path d="M14 21.414 9 16.413 10.413 15 14 18.586 21.585 11 23 12.415 14 21.414z"></path><path d="M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2Zm0,26A12,12,0,1,1,28,16,12,12,0,0,1,16,28Z"></path></svg>`);function qe(e,t){let r=v(t,[`children`,`$$slots`,`$$events`,`$$legacy`]),o=v(r,[`size`,`title`]);n(t,!1);let u=re(),d=re(),f=O(t,`size`,8,16),p=O(t,`title`,8,void 0);y(()=>(g(r),g(p())),()=>{I(u,r[`aria-label`]||r[`aria-labelledby`]||p())}),y(()=>(_(u),g(r)),()=>{I(d,{"aria-hidden":_(u)?void 0:!0,role:_(u)?`img`:void 0,focusable:Number(r.tabindex)===0?!0:void 0})}),te(),j();var h=Ke();S(h,()=>({xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 32 32`,fill:`currentColor`,preserveAspectRatio:`xMidYMid meet`,width:f(),height:f(),..._(d),...o}));var b=k(h),x=e=>{var t=J(),n=k(t,!0);i(t),A(()=>a(n,p())),l(e,t)};s(b,e=>{p()&&e(x)}),m(2),i(h),l(e,h),c()}var Y=t(`<button type="button"><!></button>`);function Je(e,t){n(t,!0);let a=O(t,`hideCompleted`,15);var o=Y();let d;var f=k(o),p=e=>{se(e,{size:16})},m=e=>{qe(e,{size:16})};s(f,e=>{a()?e(m,-1):e(p)}),i(o),A(()=>{d=u(o,1,`toolbar-icon-btn`,null,d,{active:!a()}),M(o,`title`,a()?`Show completed`:`Hide completed`),M(o,`aria-pressed`,!a())}),r(`click`,o,()=>a(!a())),l(e,o),c()}h([`click`]);var Ye=t(`<div class="toolbar-group"><!></div>`),Xe=t(`<div class="toolbar-group"><!></div>`),Ze=t(`<div class="timeline-empty svelte-13deb53"><p class="empty-title svelte-13deb53">Map your entries across time</p> <p class="empty-hint svelte-13deb53">Give a project, task, deliverable, or event a start and due date and it'll appear here.</p></div>`),Qe=t(`<div class="grid-line svelte-13deb53" aria-hidden="true"></div>`),$e=t(`<div class="tick-cell tick-primary svelte-13deb53"><span class="tick-label svelte-13deb53"> </span></div>`),et=t(`<div class="tick-cell tick-secondary svelte-13deb53"><span class="tick-label svelte-13deb53"> </span></div>`),tt=t(`<div class="section-row svelte-13deb53" role="button" tabindex="0"><div class="section-header svelte-13deb53"><span><!></span> <span class="section-label svelte-13deb53"> </span></div></div>`),nt=t(`<span> </span>`),rt=t(`<div><button type="button"><span class="resize-handle resize-handle-left svelte-13deb53" aria-hidden="true"></span> <span class="resize-handle resize-handle-right svelte-13deb53" aria-hidden="true"></span> <!></button> <button type="button"><!> <span class="arrow-label svelte-13deb53"> </span></button> <button type="button"><span class="arrow-label svelte-13deb53"> </span> <!></button></div>`),it=t(`<!> <!>`,1),at=t(`<div class="timeline-scroll svelte-13deb53"><div class="timeline-canvas svelte-13deb53"><!> <div class="timeline-header svelte-13deb53"><div class="header-tier header-primary svelte-13deb53"></div> <div class="header-tier header-secondary svelte-13deb53"></div></div> <div class="timeline-body"></div> <div class="today-line svelte-13deb53" aria-hidden="true"></div></div></div>`),ot=t(`<div class="timeline-view svelte-13deb53"><div class="timeline-toolbar view-toolbar svelte-13deb53"><div class="toolbar-left toolbar-row svelte-13deb53"><!> <div class="toolbar-group"><button type="button"><!></button> <!> <!></div> <!> <div class="toolbar-group"><button type="button" class="toolbar-text-btn today-btn" title="Jump to today">Today</button></div></div> <div class="toolbar-flex-spacer svelte-13deb53"></div> <div class="toolbar-right toolbar-group svelte-13deb53"><!></div></div> <!> <!></div>`);function st(t,p){n(p,!0);let h=O(p,`lockedType`,3,null),g=O(p,`lockedFolder`,3,null),v=O(p,`lockedFolderPath`,3,null),y=O(p,`storageId`,3,null),S=O(p,`sharedConfig`,3,null),te=O(p,`sharedConfigId`,3,null),j=O(p,`entities`,3,null),re=N(()=>y()?`sg-timelineview-${y()}`:null),se=y()?`sg-timelineview-${y()}`:null,he=(()=>{if(!se||typeof localStorage>`u`)return[];try{let e=localStorage.getItem(se),t=e?JSON.parse(e):null;return Array.isArray(t?.collapsed)?t.collapsed:[]}catch{return[]}})(),ke=F(C(new Set(he)));b(()=>{if(_(re))try{localStorage.setItem(_(re),JSON.stringify({collapsed:[..._(ke)]}))}catch{}});let Ne=S()??null,R=Ne===null?null:te(),z=F(C(Ne?.zoom??`months`)),B=F(C(Ne?.groupBy??`type`)),V=F(C(Ne?.hideCompleted??!0));function Pe(){return{zoom:_(z),groupBy:_(B),hideCompleted:_(V)}}let Ie=F(C(R===null?null:JSON.stringify(Pe())));b(()=>{let e=S(),t=te();e==null||t===R||(I(z,e.zoom??`months`,!0),I(B,e.groupBy??`type`,!0),I(V,e.hideCompleted??!0,!0),I(Ie,JSON.stringify(Pe()),!0),R=t)}),b(()=>{let e=Pe();if(e.zoom,e.groupBy,e.hideCompleted,R===null)return;let t=JSON.stringify(e);t!==_(Ie)&&(I(Ie,t,!0),p.onConfigChange?.(e))});let Le=He(new Date),Re=N(()=>{let e=j()??[];return h()?e.filter(e=>e.entityType===h()):e}),H=N(()=>ze(_(Re),{hideCompleted:_(V),today:Le})),G=N(()=>Be(_(Re)));function Ue(e,t){let n=e.start.getTime(),r=t.start.getTime();return n===r?e.entity.title.localeCompare(t.entity.title):n-r}let We=N(()=>{if(_(B)===`none`){let e=[..._(H)].sort(Ue);return e.length===0?[]:[{key:`__all__`,label:``,entries:e,isUngrouped:!0}]}let e=new Map;for(let t of _(H)){let n=e.get(t.sectionKey);n||(n=[],e.set(t.sectionKey,n)),n.push(t)}let t=[];for(let n of je){let r=e.get(n);!r||r.length===0||(r.sort(Ue),t.push({key:n,label:Me[n],entries:r}))}return t}),K=N(()=>Ve(_(H),Le)),q=N(()=>{let e=Ae[_(z)];return!_(lt)||_(ct)<=0||_(K).days<=0?e:Math.max(e,_(ct)/_(K).days)}),J=N(()=>_(K).days*_(q)),Ke=N(()=>Ge(_(K),_(z),_(q))),qe=N(()=>U(_(K).start,Le)*_(q));b(()=>{_e.count=_(H).length}),D(()=>{_e.count=null,cancelAnimationFrame(mt)});let Y=F(null),st=F(0),ct=F(0),lt=F(!1),ut=!1,dt=C({});function ft(e){let t=()=>{e.classList.toggle(`is-overflowing`,e.scrollWidth>e.clientWidth)};t();let n=new ResizeObserver(t);return n.observe(e),{destroy(){n.disconnect()}}}function pt(e,t){let n=new ResizeObserver(()=>{dt[t]=e.offsetWidth});return n.observe(e),dt[t]=e.offsetWidth,{destroy(){n.disconnect(),delete dt[t]}}}let mt=0;function ht(){_(Y)&&(I(st,_(Y).scrollLeft,!0),cancelAnimationFrame(mt),mt=requestAnimationFrame(()=>{_(Y)&&De(y(),_(Y))}))}b(()=>{if(!_(Y))return;I(ct,_(Y).clientWidth,!0),I(lt,!0);let e=new ResizeObserver(()=>{_(Y)&&I(ct,_(Y).clientWidth,!0)});return e.observe(_(Y)),()=>e.disconnect()});function gt(e,t=`smooth`){if(!_(Y))return;let n=Math.max(0,_(J)-_(Y).clientWidth);_(Y).scrollTo({left:Math.min(n,Math.max(0,e)),behavior:t})}function _t(e=`auto`){_(Y)&>(_(qe)-_(Y).clientWidth/2,e)}function vt(e){_(Y)&>(e-_(Y).clientWidth/4,`smooth`)}ne(()=>(e().then(()=>{if(ut)return;ut=!0;let e=Oe(y());if(e&&_(Y)){let t=Math.max(0,_(J)-_(Y).clientWidth),n=Math.max(0,_(Y).scrollHeight-_(Y).clientHeight);_(Y).scrollLeft=Math.min(e.x,t),_(Y).scrollTop=Math.min(e.y,n)}else _t()}),window.addEventListener(`keydown`,Et),()=>window.removeEventListener(`keydown`,Et)));let yt=F(C(_(q)));b(()=>{if(!_(Y)){I(yt,_(q),!0);return}if(_(yt)===_(q))return;let t=_(yt);I(yt,_(q),!0);let n=(_(Y).scrollLeft+_(Y).clientWidth/2)*(_(q)/t);e().then(()=>{_(Y)&&(_(Y).scrollLeft=Math.max(0,Math.min(_(J)-_(Y).clientWidth,n-_(Y).clientWidth/2)))})});let X=F(null),Z=F(C({})),bt=!1;function Q(e){return`${e.getUTCFullYear()}-${String(e.getUTCMonth()+1).padStart(2,`0`)}-${String(e.getUTCDate()).padStart(2,`0`)}`}function xt(e){return _(X)?.entityId===e.entity.id&&_(X).committed?_(X).currentStart:_(Z)[e.entity.id]?.start??e.start}function St(e){return _(X)?.entityId===e.entity.id&&_(X).committed?_(X).currentEnd:_(Z)[e.entity.id]?.end??e.end}function Ct(e,t){return t<24?e<t/2?`resize-start`:`resize-end`:e<8?`resize-start`:e>t-8?`resize-end`:`move`}function wt(e,t,n){if(e.button!==0)return;bt=!1;let{startField:r,endField:i}=Fe(t.entity.entityType);if(!i)return;let a=e.currentTarget,o=a.getBoundingClientRect(),s=Ct(e.clientX-o.left,n),c=xt(t),l=St(t);I(X,{entityId:t.entity.id,mode:s,committed:!1,pointerId:e.pointerId,pointerStartX:e.clientX,initialStart:c,initialEnd:l,currentStart:c,currentEnd:l,startField:r,endField:i,captureEl:a},!0),a.setPointerCapture(e.pointerId)}function Tt(){if(_(X)){_(X).committed&&(bt=!0);try{_(X).captureEl.releasePointerCapture(_(X).pointerId)}catch{}document.body.style.cursor=``,I(X,null)}}function Et(e){e.key!==`Escape`||!_(X)||(e.preventDefault(),Tt())}function Dt(e){if(!_(X)||_(X).pointerId!==e.pointerId)return;let t=e.clientX-_(X).pointerStartX;if(!_(X).committed){if(Math.abs(t)<4)return;_(X).committed=!0,be(),document.body.style.cursor=_(X).mode===`move`?`pointer`:`ew-resize`}let n=Math.round(t/_(q));if(_(X).mode===`move`)_(X).currentStart=W(_(X).initialStart,n),_(X).currentEnd=W(_(X).initialEnd,n);else if(_(X).mode===`resize-start`){let e=W(_(X).initialStart,n);e.getTime()>_(X).initialEnd.getTime()&&(e=_(X).initialEnd),_(X).currentStart=e}else{let e=W(_(X).initialEnd,n);e.getTime()<_(X).initialStart.getTime()&&(e=_(X).initialStart),_(X).currentEnd=e}}function Ot(e){!_(X)||_(X).pointerId!==e.pointerId||(document.body.style.cursor=``,_(X).committed&&(bt=!0,(_(X).currentStart.getTime()!==_(X).initialStart.getTime()||_(X).currentEnd.getTime()!==_(X).initialEnd.getTime())&&At(_(X))),I(X,null))}function kt(e){!_(X)||_(X).pointerId!==e.pointerId||(document.body.style.cursor=``,I(X,null))}async function At(e){let t=_(H).find(t=>t.entity.id===e.entityId);if(!t)return;let n=t.entity,r={};if(t.singleEndpoint===`start`?e.mode===`move`&&e.startField?r[e.startField]=Q(e.currentStart):e.mode===`resize-end`?r[e.endField]=Q(e.currentEnd):e.mode===`resize-start`&&(e.startField&&(r[e.startField]=Q(e.currentStart)),r[e.endField]=Q(e.currentEnd)):t.singleEndpoint===`end`?e.mode===`move`?r[e.endField]=Q(e.currentEnd):e.mode===`resize-start`&&e.startField?r[e.startField]=Q(e.currentStart):e.mode===`resize-end`&&(e.startField&&(r[e.startField]=Q(e.currentStart)),r[e.endField]=Q(e.currentEnd)):((e.mode===`move`||e.mode===`resize-start`)&&e.startField&&(r[e.startField]=Q(e.currentStart)),(e.mode===`move`||e.mode===`resize-end`)&&(r[e.endField]=Q(e.currentEnd))),Object.keys(r).length!==0){I(Z,{..._(Z),[n.id]:{start:e.currentStart,end:e.currentEnd}},!0);try{await ae(n.repo,n.entityType,n.id,{data:r}),await oe.refreshEntities(n.repo);let e={..._(Z)};delete e[n.id],I(Z,e,!0)}catch(e){console.error(`[timeline] failed to persist date change`,e);let t={..._(Z)};delete t[n.id],I(Z,t,!0)}}}function jt(e){if(bt){bt=!1;return}L(`/${e.repo}/${e.entityType}/${e.id}`)}function Mt(e,t){be(),de.show(e,fe(ue(t)))}let Nt=()=>Se(g(),v()??``);function Pt(e,t){e.stopPropagation(),vt(t)}function Ft(e){let t=new Set(_(ke));t.has(e)?t.delete(e):t.add(e),I(ke,t,!0)}function It(){_t(`smooth`)}function Lt(e){return e.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`,year:`numeric`,timeZone:`UTC`})}function Rt(e,t){let n=pe(e,void 0).find(e=>e.key===t);return n?.label?n.label:t.replace(/[-_]/g,` `).replace(/^./,e=>e.toUpperCase())}function zt(e){let t=e.entity.entityType,{startField:n,endField:r}=Fe(t),i=[],a=[],o=xt(e),s=St(e);return e.singleEndpoint===`start`&&n?(i.push({label:Rt(t,n),value:Lt(o)}),a.push(n),{extraLines:i,suppressMetaKeys:a}):e.singleEndpoint===`end`&&r?(i.push({label:Rt(t,r),value:Lt(s)}),a.push(r),{extraLines:i,suppressMetaKeys:a}):(n&&(i.push({label:Rt(t,n),value:Lt(o)}),a.push(n)),r&&(i.push({label:Rt(t,r),value:Lt(s)}),a.push(r)),{extraLines:i,suppressMetaKeys:a})}let Bt={weeks:`Weeks`,months:`Months`,quarters:`Quarters`};var Vt=ot(),Ht=k(Vt),Ut=k(Ht),Wt=k(Ut),Gt=e=>{var t=Ye();Ce(k(t),{get repoName(){return g()},get currentPath(){return v()}}),i(t),l(e,t)};s(Wt,e=>{g()&&v()&&e(Gt)});var Kt=w(Wt,2),$=k(Kt);let qt;Ee(k($),{size:16}),i($);var Jt=w($,2);{let e=e=>{le(e,{size:16})},t=N(()=>`Zoom: ${Bt[_(z)]}`),n=N(()=>[`weeks`,`months`,`quarters`].map(e=>({value:e,label:Bt[e]})));ge(Jt,{triggerClass:`toolbar-icon-btn`,get triggerTitle(){return _(t)},title:`Zoom`,align:`start`,get value(){return _(z)},get items(){return _(n)},onSelect:e=>I(z,e,!0),trigger:e,$$slots:{trigger:!0}})}Je(w(Jt,2),{get hideCompleted(){return _(V)},set hideCompleted(e){I(V,e,!0)}}),i(Kt);var Yt=w(Kt,2),Xt=e=>{var t=Xe();E(k(t),()=>p.toolbarLeft),i(t),l(e,t)};s(Yt,e=>{p.toolbarLeft&&e(Xt)});var Zt=w(Yt,2),Qt=k(Zt);i(Zt),i(Ut);var $t=w(Ut,4),en=k($t),tn=e=>{var t=ie();E(ee(t),()=>p.toolbarRight),l(e,t)};s(en,e=>{p.toolbarRight&&e(tn)}),i($t),i(Ht);var nn=w(Ht,2),rn=e=>{we(e,{children:(e,t)=>{m();var n=f();A(()=>a(n,`${_(G)??``} ${_(G)===1?`entry isn't`:`entries aren't`} on the timeline yet — add a start and due date to place ${_(G)===1?`it`:`them`}.`)),l(e,n)},$$slots:{default:!0}})};s(nn,e=>{_(G)>0&&_(H).length>0&&e(rn)});var an=w(nn,2),on=e=>{l(e,Ze())},sn=e=>{var t=at(),n=k(t),c=k(n);T(c,17,()=>_(Ke).primary,e=>e.x,(e,t,n,r)=>{var i=Qe();A(()=>P(i,`left: ${_(t).x??``}px;`)),l(e,i)});var f=w(c,2),p=k(f);T(p,21,()=>_(Ke).primary,e=>e.x,(e,t,n,r)=>{var o=$e(),s=k(o),c=k(s,!0);i(s),i(o),A(()=>{P(o,`left: ${_(t).x??``}px; width: ${_(t).width??``}px;`),a(c,_(t).label)}),l(e,o)}),i(p);var m=w(p,2);T(m,21,()=>_(Ke).secondary,e=>e.x,(e,t,n,r)=>{var o=et(),s=k(o),c=k(s,!0);i(s),i(o),A(()=>{P(o,`left: ${_(t).x??``}px; width: ${_(t).width??``}px;`),a(c,_(t).label)}),l(e,o)}),i(m),i(f);var h=w(f,2);T(h,21,()=>_(We),e=>e.key,(e,t)=>{let n=N(()=>_(ke).has(_(t).key));var c=it(),f=ee(c),p=e=>{var o=tt(),s=k(o),c=k(s);let d;me(k(c),{size:14}),i(c);var f=w(c,2),p=k(f,!0);i(f),i(s),i(o),A(()=>{d=u(c,1,`section-chevron svelte-13deb53`,null,d,{open:!_(n)}),a(p,_(t).label)}),r(`click`,o,()=>Ft(_(t).key)),r(`keydown`,o,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),Ft(_(t).key))}),l(e,o)};s(f,e=>{_(t).isUngrouped||e(p)});var m=w(f,2),h=e=>{var n=ie();T(ee(n),17,()=>_(t).entries,e=>e.entity.id,(e,t)=>{let n=N(()=>xt(_(t))),c=N(()=>St(_(t))),f=N(()=>U(_(K).start,_(n))*_(q)),p=N(()=>Math.max(0,U(_(n),_(c)))),m=N(()=>(_(p)+1)*_(q)),h=N(()=>_(X)?.entityId===_(t).entity.id&&_(X).committed),v=N(()=>_(X)&&_(X).committed&&_(X).entityId===_(t).entity.id?(Math.max(0,U(_(X).initialStart,_(X).initialEnd))+1)*_(q):_(m)),y=N(()=>Math.max(0,24-_(v))),b=N(()=>Math.max(24,_(m)+_(y))),x=N(()=>_(lt)&&_(f)+_(b)<_(st)),S=N(()=>_(lt)&&_(f)>_(st)+_(ct)),C=N(()=>dt[_(t).entity.id]??0),T=N(()=>_(C)>0&&_(C)<=_(b)-11);var E=rt();let ee;var D=k(E);let O;var te=w(k(D),4),ne=e=>{var n=nt();let r;var o=k(n,!0);i(n),d(n,(e,t)=>pt?.(e,t),()=>_(t).entity.id),A(e=>{r=u(n,1,`bar-label svelte-13deb53`,null,r,{"sticky-label":_(T)}),a(o,e)},[()=>ve(_(t).entity.title)]),l(e,n)};s(te,e=>{!_(x)&&!_(S)&&e(ne)}),i(D);var j=w(D,2);let re;var F=k(j);Te(F,{size:14});var I=w(F,2),ie=k(I,!0);i(I),d(I,e=>ft?.(e)),i(j);var L=w(j,2);let ae;var oe=k(L),se=k(oe,!0);i(oe),d(oe,e=>ft?.(e)),ce(w(oe,2),{size:14}),i(L),i(E),A((e,n)=>{ee=u(E,1,`entry-row svelte-13deb53`,null,ee,{completed:_(t).isCompleted}),O=u(D,1,`timeline-bar svelte-13deb53`,null,O,{"is-dragging":_(h),"dragging-resize":_(h)&&_(X)?.mode!==`move`}),P(D,`left: ${_(f)??``}px; width: ${_(b)??``}px; --entry-color: ${_(t).color??``};`),re=u(j,1,`row-arrow row-arrow-left svelte-13deb53`,null,re,{visible:_(x)}),M(j,`aria-hidden`,!_(x)),M(j,`tabindex`,_(x)?0:-1),M(j,`title`,`Scroll back to ${_(t).entity.title}`),a(ie,e),ae=u(L,1,`row-arrow row-arrow-right svelte-13deb53`,null,ae,{visible:_(S)}),M(L,`aria-hidden`,!_(S)),M(L,`tabindex`,_(S)?0:-1),M(L,`title`,`Scroll forward to ${_(t).entity.title}`),a(se,n)},[()=>ve(_(t).entity.title),()=>ve(_(t).entity.title)]),r(`click`,D,()=>jt(_(t).entity)),r(`contextmenu`,D,e=>Mt(e,_(t).entity)),r(`pointerdown`,D,e=>wt(e,_(t),_(b))),r(`pointermove`,D,Dt),r(`pointerup`,D,Ot),o(`pointercancel`,D,kt),o(`mouseenter`,D,e=>{if(_(X))return;let{extraLines:n,suppressMetaKeys:r}=zt(_(t));ye(e,_(t).entity,{extraLines:n,suppressMetaKeys:r,hideFolder:!!g()})}),r(`mousemove`,D,e=>{_(X)||xe(e)}),o(`mouseleave`,D,function(...e){be?.apply(this,e)}),r(`click`,j,e=>Pt(e,_(f))),r(`click`,L,e=>Pt(e,_(f))),l(e,E)}),l(e,n)};s(m,e=>{(!_(n)||_(t).isUngrouped)&&e(h)}),l(e,c)}),i(h);var v=w(h,2);i(n),i(t),x(t,e=>I(Y,e),()=>_(Y)),A(()=>{P(n,`width: ${_(J)??``}px;`),P(f,`width: ${_(J)??``}px;`),P(h,`width: ${_(J)??``}px;`),P(v,`left: ${_(qe)??``}px;`)}),o(`scroll`,t,ht),l(e,t)};s(an,e=>{_(H).length===0?e(on):e(sn,-1)}),i(Vt),A(()=>{qt=u($,1,`toolbar-icon-btn`,null,qt,{active:_(B)===`type`}),M($,`title`,_(B)===`type`?`Grouped by Type (click to ungroup)`:`Group by Type`)}),r(`contextmenu`,Vt,e=>de.show(e,Nt())),r(`click`,$,()=>I(B,_(B)===`type`?`none`:`type`,!0)),r(`click`,Qt,It),l(t,Vt),c()}h([`contextmenu`,`click`,`keydown`,`pointerdown`,`pointermove`,`pointerup`,`mousemove`]);export{st as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{B as e,Ft as t,G as n,Ht as r,I as i,J as a,K as o,N as s,P as c,Pt as l,R as u,S as d,T as f,V as p,Vt as m,W as h,X as g,Z as _,_ as ee,a as v,at as y,ct as b,d as te,et as ne,ft as re,g as ie,gt as x,ht as S,j as ae,mt as oe,n as se,o as C,ot as ce,p as le,pt as w,st as T,u as ue,v as E,vt as D,wt as O,x as de,xt as k,yt as A,z as fe}from"./FISIvbqq.js";import{t as pe}from"./kNaey6uv.js";import"./xihTtKlq.js";import{R as me,o as he,z as ge}from"./nqo2e2Yv.js";import{t as _e}from"./CA8NGDnJ.js";import{n as ve}from"./BEyPhM3C.js";import{t as ye}from"./CgOgBK5j.js";import"./CWIHttTH.js";import{n as j,r as be,t as M}from"./BEnhEpl4.js";import{t as xe}from"./DIsSxB_C.js";import{i as Se,n as Ce,r as we,t as Te}from"./DPLkAijI2.js";var N=p(`<title> </title>`),Ee=p(`<svg><!><path d="M27.34,12.06l-22-8A1,1,0,0,0,4.06,5.34l8,22A1,1,0,0,0,13,28h0a1,1,0,0,0,.93-.63l3.84-9.6,9.6-3.84a1,1,0,0,0,0-1.87Zm-10.71,4h0l-.4.16-.16.4h0L13,24.2,6.67,6.67,24.2,13Z"></path></svg>`);function De(e,n){let a=v(n,[`children`,`$$slots`,`$$events`,`$$legacy`]),o=v(a,[`size`,`title`]);t(n,!1);let s=D(),d=D(),f=C(n,`size`,8,16),p=C(n,`title`,8,void 0);y(()=>(g(a),g(p())),()=>{A(s,a[`aria-label`]||a[`aria-labelledby`]||p())}),y(()=>(_(s),g(a)),()=>{A(d,{"aria-hidden":_(s)?void 0:!0,role:_(s)?`img`:void 0,focusable:Number(a.tabindex)===0?!0:void 0})}),ce(),ue();var h=Ee();ie(h,()=>({xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 32 32`,fill:`currentColor`,preserveAspectRatio:`xMidYMid meet`,width:f(),height:f(),..._(d),...o}));var ee=w(h),b=e=>{var t=N(),n=w(t,!0);r(t),T(()=>i(n,p())),u(e,t)};c(ee,e=>{p()&&e(b)}),m(),r(h),u(e,h),l()}var Oe=p(`<title> </title>`),ke=p(`<svg><!><path d="M27.01 12 25.6 13.41 28.18 16 25.59 18.59 27.01 20 31.01 16 27.01 12z"></path><path d="M6.41 13.42 5 12 1 16 5 20 6.42 18.59 3.83 16 6.41 13.42z"></path><path d="M16 28.17 13.41 25.58 12 27 16 31 20 27 18.59 25.59 16 28.17z"></path><path d="M16 3.83 18.58 6.41 20 5 16 1 12 5 13.41 6.42 16 3.83z"></path><path d="M22,16a6,6,0,1,0-2.53,4.89l3.82,3.82,1.42-1.42-3.82-3.82A6,6,0,0,0,22,16Zm-6,4a4,4,0,1,1,4-4A4,4,0,0,1,16,20Z"></path></svg>`);function Ae(e,n){let a=v(n,[`children`,`$$slots`,`$$events`,`$$legacy`]),o=v(a,[`size`,`title`]);t(n,!1);let s=D(),d=D(),f=C(n,`size`,8,16),p=C(n,`title`,8,void 0);y(()=>(g(a),g(p())),()=>{A(s,a[`aria-label`]||a[`aria-labelledby`]||p())}),y(()=>(_(s),g(a)),()=>{A(d,{"aria-hidden":_(s)?void 0:!0,role:_(s)?`img`:void 0,focusable:Number(a.tabindex)===0?!0:void 0})}),ce(),ue();var h=ke();ie(h,()=>({xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 32 32`,fill:`currentColor`,preserveAspectRatio:`xMidYMid meet`,width:f(),height:f(),..._(d),...o}));var ee=w(h),b=e=>{var t=Oe(),n=w(t,!0);r(t),T(()=>i(n,p())),u(e,t)};c(ee,e=>{p()&&e(b)}),m(5),r(h),u(e,h),l()}var je=p(`<title> </title>`),Me=p(`<svg><!><path d="M18,28A12,12,0,1,0,6,16v6.2L2.4,18.6,1,20l6,6,6-6-1.4-1.4L8,22.2V16H8A10,10,0,1,1,18,26Z"></path></svg>`);function Ne(e,n){let a=v(n,[`children`,`$$slots`,`$$events`,`$$legacy`]),o=v(a,[`size`,`title`]);t(n,!1);let s=D(),d=D(),f=C(n,`size`,8,16),p=C(n,`title`,8,void 0);y(()=>(g(a),g(p())),()=>{A(s,a[`aria-label`]||a[`aria-labelledby`]||p())}),y(()=>(_(s),g(a)),()=>{A(d,{"aria-hidden":_(s)?void 0:!0,role:_(s)?`img`:void 0,focusable:Number(a.tabindex)===0?!0:void 0})}),ce(),ue();var h=Me();ie(h,()=>({xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 32 32`,fill:`currentColor`,preserveAspectRatio:`xMidYMid meet`,width:f(),height:f(),..._(d),...o}));var ee=w(h),b=e=>{var t=je(),n=w(t,!0);r(t),T(()=>i(n,p())),u(e,t)};c(ee,e=>{p()&&e(b)}),m(),r(h),u(e,h),l()}var Pe=p(`<title> </title>`),Fe=p(`<svg><!><path d="M18 12 14 12 14 8 12 8 12 12 8 12 8 14 12 14 12 18 14 18 14 14 18 14 18 12z"></path><path d="M21.4479,20A10.856,10.856,0,0,0,24,13,11,11,0,1,0,13,24a10.856,10.856,0,0,0,7-2.5521L27.5859,29,29,27.5859ZM13,22a9,9,0,1,1,9-9A9.01,9.01,0,0,1,13,22Z"></path></svg>`);function Ie(e,n){let a=v(n,[`children`,`$$slots`,`$$events`,`$$legacy`]),o=v(a,[`size`,`title`]);t(n,!1);let s=D(),d=D(),f=C(n,`size`,8,16),p=C(n,`title`,8,void 0);y(()=>(g(a),g(p())),()=>{A(s,a[`aria-label`]||a[`aria-labelledby`]||p())}),y(()=>(_(s),g(a)),()=>{A(d,{"aria-hidden":_(s)?void 0:!0,role:_(s)?`img`:void 0,focusable:Number(a.tabindex)===0?!0:void 0})}),ce(),ue();var h=Fe();ie(h,()=>({xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 32 32`,fill:`currentColor`,preserveAspectRatio:`xMidYMid meet`,width:f(),height:f(),..._(d),...o}));var ee=w(h),b=e=>{var t=Pe(),n=w(t,!0);r(t),T(()=>i(n,p())),u(e,t)};c(ee,e=>{p()&&e(b)}),m(2),r(h),u(e,h),l()}var P=p(`<title> </title>`),Le=p(`<svg><!><path d="M8 12H18V14H8z"></path><path d="M21.4479,20A10.856,10.856,0,0,0,24,13,11,11,0,1,0,13,24a10.856,10.856,0,0,0,7-2.5521L27.5859,29,29,27.5859ZM13,22a9,9,0,1,1,9-9A9.01,9.01,0,0,1,13,22Z"></path></svg>`);function Re(e,n){let a=v(n,[`children`,`$$slots`,`$$events`,`$$legacy`]),o=v(a,[`size`,`title`]);t(n,!1);let s=D(),d=D(),f=C(n,`size`,8,16),p=C(n,`title`,8,void 0);y(()=>(g(a),g(p())),()=>{A(s,a[`aria-label`]||a[`aria-labelledby`]||p())}),y(()=>(_(s),g(a)),()=>{A(d,{"aria-hidden":_(s)?void 0:!0,role:_(s)?`img`:void 0,focusable:Number(a.tabindex)===0?!0:void 0})}),ce(),ue();var h=Le();ie(h,()=>({xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 32 32`,fill:`currentColor`,preserveAspectRatio:`xMidYMid meet`,width:f(),height:f(),..._(d),...o}));var ee=w(h),b=e=>{var t=P(),n=w(t,!0);r(t),T(()=>i(n,p())),u(e,t)};c(ee,e=>{p()&&e(b)}),m(2),r(h),u(e,h),l()}var F=6,I=720,L=1280,R=800;function ze(e,t){return e.geometry.width===`fill`?Math.round(t?.width||L):e.geometry.width}function Be(e,t,n=I,r){if(e.geometry.height===`fill`)return Math.round(r?.height||R);if(e.geometry.height!==`auto`)return e.geometry.height;let i=t?.[e.id];return i&&i>0?Math.round(i):n}function Ve(e,t={}){let n=t.gap??64,r=Math.max(1,t.maxColumns??F),i=e.length;if(i===0)return{rects:[],width:0,height:0,columns:0};let a=Math.min(r,Math.max(1,Math.ceil(Math.sqrt(i)))),o=Math.ceil(i/a),s=e.map(e=>ze(e,t.viewport)),c=e.map(e=>Be(e,t.measuredHeights,t.autoHeightFallback,t.viewport)),l=Array(a).fill(0),u=Array(o).fill(0);for(let e=0;e<i;e+=1){let t=e%a,n=Math.floor(e/a);l[t]=Math.max(l[t],s[e]),u[n]=Math.max(u[n],c[e])}let d=Array(a).fill(0);for(let e=1;e<a;e+=1)d[e]=d[e-1]+l[e-1]+n;let f=Array(o).fill(0);for(let e=1;e<o;e+=1)f[e]=f[e-1]+u[e-1]+n;let p=e.map((e,t)=>{let n=t%a,r=Math.floor(t/a),i=s[t],o=c[t],l=d[n],u=f[r];return{id:e.id,x:Math.round(l),y:Math.round(u),width:i,height:o}}),m=d[a-1]+l[a-1],h=f[o-1]+u[o-1];return{rects:p,width:Math.round(m),height:Math.round(h),columns:a}}function He(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}function z(e){return He(e).replace(/'/g,`'`)}function Ue(e){return e.replace(/<\/script/gi,`<\\/script`)}function B(e){return e.replace(/<\/style/gi,`<\\/style`)}function We(e){let t=new TextEncoder().encode(e),n=``,r=32768;for(let e=0;e<t.length;e+=r)n+=String.fromCharCode(...t.slice(e,e+r));return btoa(n)}var Ge=/(https?:\/\/[^\s"'()<>\/]+)?\/api\/assets\/([A-Za-z0-9._%-]+)\/([A-Za-z0-9._%-]+)(?![A-Za-z0-9._%/-])(\?[^\s"'()<>]*)?/g;function V(e){try{return decodeURIComponent(e)}catch{return e}}function Ke(e){return encodeURIComponent(e).replace(/[!~*'()]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function qe(e){let t=new Map;for(let n of e.matchAll(Ge)){let e=n[2],r=V(n[3]),i=`${e}/${r}`;t.has(i)||t.set(i,{key:i,assetId:e,filename:r})}return[...t.values()]}function Je(e,t){let n=encodeURIComponent(t);return e.replace(Ge,(e,t,r,i,a)=>{let o=`${t??``}/api/assets/${r}/${i}`,s=a?a.slice(1).split(`&`).filter(e=>e&&!/^at=/i.test(e)):[];return s.push(`at=${n}`),`${o}?${s.join(`&`)}`})}function Ye(e,t){return e.replace(Ge,(e,n,r,i)=>{let a=V(i);return t({key:`${r}/${a}`,assetId:r,filename:a},i)??e})}function Xe(e,t){return e.replace(Ge,(e,n,r,i)=>`/api/share/${t}/asset/${r}/${i}`)}function Ze(e){return e.replace(/[&<>"']/g,e=>e===`&`?`&`:e===`<`?`<`:e===`>`?`>`:e===`"`?`"`:`'`)}function Qe(e){return`data:image/svg+xml,${Ke(`<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360"><rect width="640" height="360" fill="#f4f4f4"/><rect x="0.5" y="0.5" width="639" height="359" fill="none" stroke="#d0d0d0"/><g fill="#8a8a8a" font-family="system-ui, -apple-system, sans-serif" text-anchor="middle"><text x="320" y="168" font-size="15">Image not included in export</text><text x="320" y="196" font-size="13">${Ze(e.length>48?`${e.slice(0,45)}…`:e)}</text></g></svg>`)}`}function $e(e,t=`./assets`,n={}){let r=t.replace(/\/+$/,``);return e.replace(Ge,(e,t,i,a)=>{let o=V(a);return!n.bundledKeys||n.bundledKeys.has(`${i}/${o}`)?`${r}/${i}/${a}`:Qe(o)})}function et(e){try{let t=new URL(e);return t.protocol!==`http:`&&t.protocol!==`https:`?null:t.origin}catch{return null}}var tt=/^[A-Za-z0-9._-]+$/;function nt(e){return e.length>0&&tt.test(e)}function rt(e){switch(e.mode){case`token`:{let t=et(e.origin);return t?[`${t}/api/assets/`]:[]}case`share`:{let t=et(e.origin);return!t||!nt(e.shareToken)?[]:[`${t}/api/share/${e.shareToken}/asset/`]}case`relative`:return[`file:`];case`none`:return[]}}function it(e={mode:`none`},t={}){let n=rt(e),r=e=>n.length?`${e} ${n.join(` `)}`:e,i=t.allowBaseOrigin?et(t.allowBaseOrigin):null;return[`default-src 'none'`,i?`base-uri ${i}`:`base-uri 'none'`,`connect-src 'none'`,r(`font-src data: blob:`),`form-action 'none'`,`frame-src 'none'`,r(`img-src data: blob:`),r(`media-src data: blob:`),`object-src 'none'`,`script-src 'unsafe-inline' blob:`,`style-src 'unsafe-inline'`].join(`; `)}function at(e,t={mode:`none`}){switch(t.mode){case`token`:return t.token?Je(e,t.token):e;case`share`:return nt(t.shareToken)?Xe(e,t.shareToken):e;case`relative`:return $e(e,`./assets`,{bundledKeys:t.bundledKeys});case`none`:return e}}function H(e,t={}){if(e.length===0)return``;let n=[];for(let r of e)if(r===`d3`||r===`motion`){let e=t[r];if(!e)continue;n.push(`<script data-artifact-library="${r}">\n${Ue(e)}\n<\/script>`)}let r=[];return e.includes(`three`)&&t.three&&r.push(`
|
|
1
|
+
import{B as e,Ft as t,G as n,Ht as r,I as i,J as a,K as o,N as s,P as c,Pt as l,R as u,S as d,T as f,V as p,Vt as m,W as h,X as g,Z as _,_ as ee,a as v,at as y,ct as b,d as te,et as ne,ft as re,g as ie,gt as x,ht as S,j as ae,mt as oe,n as se,o as C,ot as ce,p as le,pt as w,st as T,u as ue,v as E,vt as D,wt as O,x as de,xt as k,yt as A,z as fe}from"./FISIvbqq.js";import{t as pe}from"./kNaey6uv.js";import"./xihTtKlq.js";import{R as me,o as he,z as ge}from"./nqo2e2Yv.js";import{t as _e}from"./Bm1zMkOs.js";import{n as ve}from"./BEyPhM3C.js";import{t as ye}from"./CgOgBK5j.js";import"./CWIHttTH.js";import{n as j,r as be,t as M}from"./BEnhEpl4.js";import{t as xe}from"./DIsSxB_C.js";import{i as Se,n as Ce,r as we,t as Te}from"./DPLkAijI2.js";var N=p(`<title> </title>`),Ee=p(`<svg><!><path d="M27.34,12.06l-22-8A1,1,0,0,0,4.06,5.34l8,22A1,1,0,0,0,13,28h0a1,1,0,0,0,.93-.63l3.84-9.6,9.6-3.84a1,1,0,0,0,0-1.87Zm-10.71,4h0l-.4.16-.16.4h0L13,24.2,6.67,6.67,24.2,13Z"></path></svg>`);function De(e,n){let a=v(n,[`children`,`$$slots`,`$$events`,`$$legacy`]),o=v(a,[`size`,`title`]);t(n,!1);let s=D(),d=D(),f=C(n,`size`,8,16),p=C(n,`title`,8,void 0);y(()=>(g(a),g(p())),()=>{A(s,a[`aria-label`]||a[`aria-labelledby`]||p())}),y(()=>(_(s),g(a)),()=>{A(d,{"aria-hidden":_(s)?void 0:!0,role:_(s)?`img`:void 0,focusable:Number(a.tabindex)===0?!0:void 0})}),ce(),ue();var h=Ee();ie(h,()=>({xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 32 32`,fill:`currentColor`,preserveAspectRatio:`xMidYMid meet`,width:f(),height:f(),..._(d),...o}));var ee=w(h),b=e=>{var t=N(),n=w(t,!0);r(t),T(()=>i(n,p())),u(e,t)};c(ee,e=>{p()&&e(b)}),m(),r(h),u(e,h),l()}var Oe=p(`<title> </title>`),ke=p(`<svg><!><path d="M27.01 12 25.6 13.41 28.18 16 25.59 18.59 27.01 20 31.01 16 27.01 12z"></path><path d="M6.41 13.42 5 12 1 16 5 20 6.42 18.59 3.83 16 6.41 13.42z"></path><path d="M16 28.17 13.41 25.58 12 27 16 31 20 27 18.59 25.59 16 28.17z"></path><path d="M16 3.83 18.58 6.41 20 5 16 1 12 5 13.41 6.42 16 3.83z"></path><path d="M22,16a6,6,0,1,0-2.53,4.89l3.82,3.82,1.42-1.42-3.82-3.82A6,6,0,0,0,22,16Zm-6,4a4,4,0,1,1,4-4A4,4,0,0,1,16,20Z"></path></svg>`);function Ae(e,n){let a=v(n,[`children`,`$$slots`,`$$events`,`$$legacy`]),o=v(a,[`size`,`title`]);t(n,!1);let s=D(),d=D(),f=C(n,`size`,8,16),p=C(n,`title`,8,void 0);y(()=>(g(a),g(p())),()=>{A(s,a[`aria-label`]||a[`aria-labelledby`]||p())}),y(()=>(_(s),g(a)),()=>{A(d,{"aria-hidden":_(s)?void 0:!0,role:_(s)?`img`:void 0,focusable:Number(a.tabindex)===0?!0:void 0})}),ce(),ue();var h=ke();ie(h,()=>({xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 32 32`,fill:`currentColor`,preserveAspectRatio:`xMidYMid meet`,width:f(),height:f(),..._(d),...o}));var ee=w(h),b=e=>{var t=Oe(),n=w(t,!0);r(t),T(()=>i(n,p())),u(e,t)};c(ee,e=>{p()&&e(b)}),m(5),r(h),u(e,h),l()}var je=p(`<title> </title>`),Me=p(`<svg><!><path d="M18,28A12,12,0,1,0,6,16v6.2L2.4,18.6,1,20l6,6,6-6-1.4-1.4L8,22.2V16H8A10,10,0,1,1,18,26Z"></path></svg>`);function Ne(e,n){let a=v(n,[`children`,`$$slots`,`$$events`,`$$legacy`]),o=v(a,[`size`,`title`]);t(n,!1);let s=D(),d=D(),f=C(n,`size`,8,16),p=C(n,`title`,8,void 0);y(()=>(g(a),g(p())),()=>{A(s,a[`aria-label`]||a[`aria-labelledby`]||p())}),y(()=>(_(s),g(a)),()=>{A(d,{"aria-hidden":_(s)?void 0:!0,role:_(s)?`img`:void 0,focusable:Number(a.tabindex)===0?!0:void 0})}),ce(),ue();var h=Me();ie(h,()=>({xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 32 32`,fill:`currentColor`,preserveAspectRatio:`xMidYMid meet`,width:f(),height:f(),..._(d),...o}));var ee=w(h),b=e=>{var t=je(),n=w(t,!0);r(t),T(()=>i(n,p())),u(e,t)};c(ee,e=>{p()&&e(b)}),m(),r(h),u(e,h),l()}var Pe=p(`<title> </title>`),Fe=p(`<svg><!><path d="M18 12 14 12 14 8 12 8 12 12 8 12 8 14 12 14 12 18 14 18 14 14 18 14 18 12z"></path><path d="M21.4479,20A10.856,10.856,0,0,0,24,13,11,11,0,1,0,13,24a10.856,10.856,0,0,0,7-2.5521L27.5859,29,29,27.5859ZM13,22a9,9,0,1,1,9-9A9.01,9.01,0,0,1,13,22Z"></path></svg>`);function Ie(e,n){let a=v(n,[`children`,`$$slots`,`$$events`,`$$legacy`]),o=v(a,[`size`,`title`]);t(n,!1);let s=D(),d=D(),f=C(n,`size`,8,16),p=C(n,`title`,8,void 0);y(()=>(g(a),g(p())),()=>{A(s,a[`aria-label`]||a[`aria-labelledby`]||p())}),y(()=>(_(s),g(a)),()=>{A(d,{"aria-hidden":_(s)?void 0:!0,role:_(s)?`img`:void 0,focusable:Number(a.tabindex)===0?!0:void 0})}),ce(),ue();var h=Fe();ie(h,()=>({xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 32 32`,fill:`currentColor`,preserveAspectRatio:`xMidYMid meet`,width:f(),height:f(),..._(d),...o}));var ee=w(h),b=e=>{var t=Pe(),n=w(t,!0);r(t),T(()=>i(n,p())),u(e,t)};c(ee,e=>{p()&&e(b)}),m(2),r(h),u(e,h),l()}var P=p(`<title> </title>`),Le=p(`<svg><!><path d="M8 12H18V14H8z"></path><path d="M21.4479,20A10.856,10.856,0,0,0,24,13,11,11,0,1,0,13,24a10.856,10.856,0,0,0,7-2.5521L27.5859,29,29,27.5859ZM13,22a9,9,0,1,1,9-9A9.01,9.01,0,0,1,13,22Z"></path></svg>`);function Re(e,n){let a=v(n,[`children`,`$$slots`,`$$events`,`$$legacy`]),o=v(a,[`size`,`title`]);t(n,!1);let s=D(),d=D(),f=C(n,`size`,8,16),p=C(n,`title`,8,void 0);y(()=>(g(a),g(p())),()=>{A(s,a[`aria-label`]||a[`aria-labelledby`]||p())}),y(()=>(_(s),g(a)),()=>{A(d,{"aria-hidden":_(s)?void 0:!0,role:_(s)?`img`:void 0,focusable:Number(a.tabindex)===0?!0:void 0})}),ce(),ue();var h=Le();ie(h,()=>({xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 32 32`,fill:`currentColor`,preserveAspectRatio:`xMidYMid meet`,width:f(),height:f(),..._(d),...o}));var ee=w(h),b=e=>{var t=P(),n=w(t,!0);r(t),T(()=>i(n,p())),u(e,t)};c(ee,e=>{p()&&e(b)}),m(2),r(h),u(e,h),l()}var F=6,I=720,L=1280,R=800;function ze(e,t){return e.geometry.width===`fill`?Math.round(t?.width||L):e.geometry.width}function Be(e,t,n=I,r){if(e.geometry.height===`fill`)return Math.round(r?.height||R);if(e.geometry.height!==`auto`)return e.geometry.height;let i=t?.[e.id];return i&&i>0?Math.round(i):n}function Ve(e,t={}){let n=t.gap??64,r=Math.max(1,t.maxColumns??F),i=e.length;if(i===0)return{rects:[],width:0,height:0,columns:0};let a=Math.min(r,Math.max(1,Math.ceil(Math.sqrt(i)))),o=Math.ceil(i/a),s=e.map(e=>ze(e,t.viewport)),c=e.map(e=>Be(e,t.measuredHeights,t.autoHeightFallback,t.viewport)),l=Array(a).fill(0),u=Array(o).fill(0);for(let e=0;e<i;e+=1){let t=e%a,n=Math.floor(e/a);l[t]=Math.max(l[t],s[e]),u[n]=Math.max(u[n],c[e])}let d=Array(a).fill(0);for(let e=1;e<a;e+=1)d[e]=d[e-1]+l[e-1]+n;let f=Array(o).fill(0);for(let e=1;e<o;e+=1)f[e]=f[e-1]+u[e-1]+n;let p=e.map((e,t)=>{let n=t%a,r=Math.floor(t/a),i=s[t],o=c[t],l=d[n],u=f[r];return{id:e.id,x:Math.round(l),y:Math.round(u),width:i,height:o}}),m=d[a-1]+l[a-1],h=f[o-1]+u[o-1];return{rects:p,width:Math.round(m),height:Math.round(h),columns:a}}function He(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}function z(e){return He(e).replace(/'/g,`'`)}function Ue(e){return e.replace(/<\/script/gi,`<\\/script`)}function B(e){return e.replace(/<\/style/gi,`<\\/style`)}function We(e){let t=new TextEncoder().encode(e),n=``,r=32768;for(let e=0;e<t.length;e+=r)n+=String.fromCharCode(...t.slice(e,e+r));return btoa(n)}var Ge=/(https?:\/\/[^\s"'()<>\/]+)?\/api\/assets\/([A-Za-z0-9._%-]+)\/([A-Za-z0-9._%-]+)(?![A-Za-z0-9._%/-])(\?[^\s"'()<>]*)?/g;function V(e){try{return decodeURIComponent(e)}catch{return e}}function Ke(e){return encodeURIComponent(e).replace(/[!~*'()]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function qe(e){let t=new Map;for(let n of e.matchAll(Ge)){let e=n[2],r=V(n[3]),i=`${e}/${r}`;t.has(i)||t.set(i,{key:i,assetId:e,filename:r})}return[...t.values()]}function Je(e,t){let n=encodeURIComponent(t);return e.replace(Ge,(e,t,r,i,a)=>{let o=`${t??``}/api/assets/${r}/${i}`,s=a?a.slice(1).split(`&`).filter(e=>e&&!/^at=/i.test(e)):[];return s.push(`at=${n}`),`${o}?${s.join(`&`)}`})}function Ye(e,t){return e.replace(Ge,(e,n,r,i)=>{let a=V(i);return t({key:`${r}/${a}`,assetId:r,filename:a},i)??e})}function Xe(e,t){return e.replace(Ge,(e,n,r,i)=>`/api/share/${t}/asset/${r}/${i}`)}function Ze(e){return e.replace(/[&<>"']/g,e=>e===`&`?`&`:e===`<`?`<`:e===`>`?`>`:e===`"`?`"`:`'`)}function Qe(e){return`data:image/svg+xml,${Ke(`<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360"><rect width="640" height="360" fill="#f4f4f4"/><rect x="0.5" y="0.5" width="639" height="359" fill="none" stroke="#d0d0d0"/><g fill="#8a8a8a" font-family="system-ui, -apple-system, sans-serif" text-anchor="middle"><text x="320" y="168" font-size="15">Image not included in export</text><text x="320" y="196" font-size="13">${Ze(e.length>48?`${e.slice(0,45)}…`:e)}</text></g></svg>`)}`}function $e(e,t=`./assets`,n={}){let r=t.replace(/\/+$/,``);return e.replace(Ge,(e,t,i,a)=>{let o=V(a);return!n.bundledKeys||n.bundledKeys.has(`${i}/${o}`)?`${r}/${i}/${a}`:Qe(o)})}function et(e){try{let t=new URL(e);return t.protocol!==`http:`&&t.protocol!==`https:`?null:t.origin}catch{return null}}var tt=/^[A-Za-z0-9._-]+$/;function nt(e){return e.length>0&&tt.test(e)}function rt(e){switch(e.mode){case`token`:{let t=et(e.origin);return t?[`${t}/api/assets/`]:[]}case`share`:{let t=et(e.origin);return!t||!nt(e.shareToken)?[]:[`${t}/api/share/${e.shareToken}/asset/`]}case`relative`:return[`file:`];case`none`:return[]}}function it(e={mode:`none`},t={}){let n=rt(e),r=e=>n.length?`${e} ${n.join(` `)}`:e,i=t.allowBaseOrigin?et(t.allowBaseOrigin):null;return[`default-src 'none'`,i?`base-uri ${i}`:`base-uri 'none'`,`connect-src 'none'`,r(`font-src data: blob:`),`form-action 'none'`,`frame-src 'none'`,r(`img-src data: blob:`),r(`media-src data: blob:`),`object-src 'none'`,`script-src 'unsafe-inline' blob:`,`style-src 'unsafe-inline'`].join(`; `)}function at(e,t={mode:`none`}){switch(t.mode){case`token`:return t.token?Je(e,t.token):e;case`share`:return nt(t.shareToken)?Xe(e,t.shareToken):e;case`relative`:return $e(e,`./assets`,{bundledKeys:t.bundledKeys});case`none`:return e}}function H(e,t={}){if(e.length===0)return``;let n=[];for(let r of e)if(r===`d3`||r===`motion`){let e=t[r];if(!e)continue;n.push(`<script data-artifact-library="${r}">\n${Ue(e)}\n<\/script>`)}let r=[];return e.includes(`three`)&&t.three&&r.push(`
|
|
2
2
|
const decodeLibrarySource = (base64) => {
|
|
3
3
|
const binary = atob(base64);
|
|
4
4
|
const bytes = new Uint8Array(binary.length);
|