@telepath-computer/television 0.1.2 → 0.1.4
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/artifact-runtime/index.js +1 -0
- package/dist/artifact-runtime/style.css +1 -0
- package/dist/browser/assets/index-BZ2x6hDr.js +481 -0
- package/dist/browser/assets/index-C_dcmI6X.css +1 -0
- package/dist/browser/index.html +2 -2
- package/dist/cli.cjs +40 -7
- package/dist/electron.cjs +34 -6
- package/package.json +5 -4
- package/dist/browser/assets/index-BmwVdck9.css +0 -1
- package/dist/browser/assets/index-DZhAP0Dt.js +0 -430
|
@@ -0,0 +1 @@
|
|
|
1
|
+
artifact-view{background:var(--color-bg-muted);border:1px solid var(--color-border);border-radius:10px;box-sizing:border-box;width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden}.artifact-title-bar{display:flex;align-items:center;height:34px;padding:0 12px;flex-shrink:0;border-bottom:1px solid var(--color-border);-webkit-user-select:none;user-select:none}.artifact-title{flex:1;font-size:13px;font-weight:500;color:var(--color-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.artifact-close-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;border-radius:6px;background:transparent;color:var(--color-text-muted);cursor:pointer;flex-shrink:0}.artifact-close-btn:hover{background:var(--color-interactive);color:var(--color-text)}.artifact-content{flex:1;min-height:0;overflow-y:auto;padding:0}artifact-view[type=markdown] .artifact-content{padding:16px 20px}artifact-view[type=html] .artifact-content{overflow:hidden}.artifact-html-frame{pointer-events:none}.markdown-body{font-size:14px;line-height:1.6;color:var(--color-text)}.markdown-body>:first-child{margin-top:0}.markdown-body>:last-child{margin-bottom:0}.markdown-body h1,.markdown-body h2,.markdown-body h3{font-weight:600;margin:1.25em 0 .5em}.markdown-body h1{font-size:1.4em}.markdown-body h2{font-size:1.2em}.markdown-body h3{font-size:1.05em}.markdown-body p{margin:.75em 0}.markdown-body code{font-family:var(--font-mono);font-size:.9em;background:var(--color-interactive);padding:.15em .35em;border-radius:4px}.markdown-body pre{background:var(--color-interactive);border-radius:6px;padding:12px 14px;overflow-x:auto}.markdown-body pre code{background:none;padding:0}.markdown-body ul,.markdown-body ol{padding-left:1.5em;margin:.75em 0}.markdown-body blockquote{margin:.75em 0;padding-left:1em;border-left:3px solid var(--color-border);color:var(--color-text-muted)}.markdown-body a{color:var(--color-text);text-decoration:underline}.markdown-body hr{border:none;border-top:1px solid var(--color-border);margin:1em 0}layout-stream{width:100%;flex:1;min-width:0;min-height:0;display:flex;align-items:center;overflow:hidden;outline:none;position:relative;--layout-col-width: 300px;--layout-row-height: 133.33px;--layout-gap: 16px}layout-stream .track{display:flex;align-items:start;gap:var(--layout-gap);flex-shrink:0;width:max-content;will-change:transform;transition:transform .2s ease}layout-stream .band{display:grid;grid-template-rows:repeat(6,var(--layout-row-height));gap:var(--layout-gap);align-self:start}layout-stream .band[layout-band-cols="1"]{grid-template-columns:var(--layout-col-width);width:var(--layout-col-width)}layout-stream .band[layout-band-cols="2"]{grid-template-columns:repeat(2,var(--layout-col-width));width:calc(var(--layout-col-width) * 2 + var(--layout-gap))}layout-stream .card-slot{border-radius:12px;box-sizing:border-box;cursor:pointer;min-width:0;min-height:0}layout-stream .card-slot.placeholder{background:#94a3b829;border:2px dashed rgba(148,163,184,.7);box-shadow:inset 0 0 0 1px #0f172a0d}layout-stream .card-slot.dragging{position:fixed;z-index:100;opacity:.7;transform:rotate(2deg);pointer-events:none;cursor:grabbing}layout-stream .card-slot artifact-view{width:100%;height:100%}layout-stream .card-slot[layout-cols="1"][layout-rows="2"]{padding:16px}layout-stream .card-slot[layout-cols="1"][layout-rows="2"] artifact-view{position:relative}layout-stream .card-slot[layout-cols="1"][layout-rows="2"] .artifact-title-bar{position:absolute;top:0;left:0;right:0;z-index:2;border-radius:10px 10px 0 0;background:var(--color-bg-muted);opacity:0;pointer-events:none;transition:opacity .12s ease}layout-stream .card-slot[layout-cols="1"][layout-rows="2"]:hover .artifact-title-bar,layout-stream .card-slot[layout-cols="1"][layout-rows="2"]:focus-within .artifact-title-bar{opacity:1;pointer-events:auto}workspace-view{width:100%;flex:1;min-width:0;min-height:0;display:flex;flex-direction:column}workspace-view [data-testid=empty-workspace]{margin:0;padding:1rem}television-app{width:100%;height:100%;display:grid;grid-template-rows:auto 1fr;grid-template-areas:"header" "main"}television-app>header{grid-area:header}television-app>main{grid-area:main;grid-row:1 / -1}body.electron television-app>header{-webkit-app-region:drag;padding-left:80px;border-bottom:1px solid var(--color-border)}header{display:flex;align-items:center;justify-content:space-between;height:34px;padding:0 12px;flex-shrink:0;-webkit-user-select:none;user-select:none}television-app>header>nav{display:flex;align-items:center;gap:8px;min-width:0}workspace-picker,workspace-picker [trigger],button[variant=toolbar],.settings-server-remove-button,.settings-submit-button,.settings-cancel-button,.settings-connect-button,.settings-field input{-webkit-app-region:no-drag}workspace-picker dropdown-menu::part(panel){min-width:18rem}workspace-picker [trigger],workspace-picker [trigger][data-dropdown-trigger]{min-width:0;padding:0;border:none;background:transparent;font-size:13px;font-weight:600}workspace-picker [trigger] .trigger-label{white-space:nowrap}dropdown-group{display:block;padding:4px 0}dropdown-label{display:block;padding:0 10px 4px;font-size:12px;color:color-mix(in srgb,currentColor 60%,transparent)}dropdown-item{display:block;padding:6px 10px;border-radius:4px;cursor:pointer}dropdown-item[selected]{background:color-mix(in srgb,var(--color-border) 70%,white)}dropdown-item[action]{color:color-mix(in srgb,currentColor 50%,transparent)}dropdown-item[danger]{color:#c74343}television-app>main{min-width:0;min-height:0;overflow:hidden;display:flex;flex-direction:column}television-app>main.auth-gate{display:flex;align-items:center;justify-content:center}.settings-panel{width:min(32rem,100%);display:flex;flex-direction:column;padding:20px;border:1px solid var(--color-border);border-radius:12px;background:var(--color-bg)}.workspace-modal,.auth-modal{width:min(24rem,100%);display:flex;flex-direction:column;padding:20px;border:1px solid var(--color-border);border-radius:12px;background:var(--color-bg)}.auth-form{display:flex;flex-direction:column;gap:12px}.auth-modal-title,.auth-modal-copy{margin:0}.auth-token-input-invalid{border-color:#c74343}.workspace-form{display:flex;flex-direction:column;gap:12px}.workspace-form-actions{display:flex;gap:8px}.workspace-modal-title,.workspace-delete-copy,.workspace-delete-warning,.workspace-delete-error{margin:0}.workspace-delete-warning,.workspace-delete-error{font-size:13px}.workspace-delete-error{color:#c74343}.settings-section-title{margin:0}.settings-section,.settings-server-list,.settings-add-server-form{display:flex;flex-direction:column;gap:12px}.settings-form-actions{display:flex;gap:8px}.settings-card{padding:12px;border:1px solid var(--color-border);border-radius:8px}.settings-server{display:flex;align-items:center;justify-content:space-between;gap:12px}.settings-server-details{min-width:0}.settings-server-name{font-weight:600}.settings-server-url{font-size:13px;word-break:break-word;color:color-mix(in srgb,currentColor 70%,transparent)}.settings-server-remove-button,.settings-submit-button,.settings-cancel-button,.settings-connect-button{padding:8px 12px;border-radius:8px}.settings-field{display:flex;flex-direction:column;gap:6px}.settings-field input{width:100%;padding:8px 10px;border:1px solid var(--color-border);border-radius:8px;background:var(--color-bg);color:inherit;font:inherit;box-sizing:border-box}.settings-submit-button,.settings-cancel-button,.settings-connect-button{align-self:flex-start}:root{--black: #000000;--white: #ffffff;--neutral-50: oklch(.985 .001 106.423);--neutral-100: oklch(.97 .001 106.424);--neutral-200: oklch(.923 .003 48.717);--neutral-300: oklch(.869 .005 56.366);--neutral-400: oklch(.709 .01 56.259);--neutral-500: oklch(.553 .013 58.071);--neutral-600: oklch(.444 .011 73.639);--neutral-700: oklch(.374 .01 67.558);--neutral-800: oklch(.268 .007 34.298);--neutral-900: oklch(.216 .006 56.043);--neutral-950: oklch(.147 .004 49.25)}dropdown-menu{position:relative;display:inline-block;color:inherit}dropdown-group{display:grid;gap:var(--space-4)}dropdown-label{display:block;padding:var(--space-4) var(--space-8);color:var(--color-text-muted);font:inherit;font-size:var(--text-sm);font-weight:600;letter-spacing:.04em;text-transform:uppercase}dropdown-divider{display:block;height:1px;margin:var(--space-4) 0;background:var(--color-border)}[data-dropdown-trigger],dropdown-item{color:inherit;font:inherit;line-height:1.2}[data-dropdown-trigger],dropdown-menu::part(trigger){display:inline-flex;align-items:center;gap:var(--space-8);margin:0;padding:.375rem .5rem;border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-surface);color:var(--color-text);box-shadow:none;cursor:pointer}[data-dropdown-trigger]:hover,dropdown-menu::part(trigger):hover{background:var(--color-interactive-hover)}dropdown-menu[open] [data-dropdown-trigger],dropdown-menu[open]::part(trigger){background:var(--color-interactive)}[data-dropdown-trigger-label],dropdown-menu::part(trigger-label){min-width:0}[data-dropdown-trigger-icon],dropdown-menu::part(trigger-icon){display:inline-flex;align-items:center;justify-content:center;flex:none}[data-dropdown-trigger]:focus-visible,dropdown-menu::part(trigger):focus-visible,dropdown-item:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}dropdown-menu::part(panel){position:absolute;top:calc(100% + var(--space-4));left:0;z-index:var(--layer-popover);min-width:12rem;padding:var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);color:var(--color-text);box-shadow:var(--shadow-popover)}dropdown-item{display:block;margin:0;padding:.375rem .5rem;border-radius:var(--radius-sm);cursor:pointer;-webkit-user-select:none;user-select:none}dropdown-item:hover{background:var(--color-interactive-hover)}dropdown-item[selected]{background:var(--color-interactive)}panel-view{display:block}panel-view::part(panel){display:flex;flex-direction:column;gap:var(--space-16);color:var(--color-text)}panel-view::part(header){display:flex;align-items:center;justify-content:space-between;gap:var(--space-12)}panel-view::part(title-group){display:flex;align-items:center;gap:var(--space-8);min-width:0}panel-view::part(title){margin:0;font:inherit;font-size:var(--text-lg);font-weight:600;color:var(--color-text)}panel-view::part(button){display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;margin:0;border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-surface);color:var(--color-text);box-shadow:none;cursor:pointer}panel-view::part(button):hover{background:var(--color-interactive-hover)}panel-view::part(button):focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}panel-view::part(icon){display:inline-flex;align-items:center;justify-content:center;flex:none}panel-view::part(back-icon){transform:rotate(90deg)}modal-overlay{color:inherit}modal-overlay::part(backdrop){position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--layer-modal);display:flex;align-items:center;justify-content:center;padding:var(--space-16);background:var(--color-overlay-backdrop)}*,*:before,*:after{box-sizing:border-box}:root{--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;--font-brand: var(--font-sans);--font-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, monospace;--text-sm: 12px;--text-base: 14px;--text-lg: 16px;--leading-base: 1.5;--space-2: 2px;--space-4: 4px;--space-6: 6px;--space-8: 8px;--space-12: 12px;--space-16: 16px;--radius-sm: .375rem;--radius-md: .5rem;--layer-popover: 10;--layer-modal: 1000;--shadow-popover: 0 12px 32px rgb(0 0 0 / .14);--shadow-modal: 0 24px 64px rgb(0 0 0 / .2);--color-bg: var(--neutral-50);--color-bg-muted: var(--neutral-100);--color-surface: var(--white);--color-surface-muted: var(--neutral-100);--color-interactive: var(--neutral-200);--color-interactive-hover: var(--neutral-300);--color-border: var(--neutral-300);--color-border-muted: var(--neutral-200);--color-text: var(--neutral-900);--color-text-muted: var(--neutral-500);--color-link: inherit;--color-focus-ring: var(--neutral-500);--color-overlay-backdrop: rgb(0 0 0 / .5)}html,body{margin:0;padding:0;width:100%;height:100%}html{color-scheme:light}body{font-family:var(--font-sans);font-size:var(--text-base);line-height:var(--leading-base);color:var(--color-text);background:var(--color-bg)}a{text-underline-offset:.15em;text-decoration-thickness:.08em}button,input,textarea,select{font:inherit;color:inherit}a{color:var(--color-link)}code,pre{font-family:var(--font-mono)}h1,h2,h3,h4,h5,h6{color:var(--color-text)}[data-ui-icon]{display:inline-block;vertical-align:middle}button{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-6);border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg);color:inherit;cursor:pointer}button:hover{background:var(--color-interactive)}button[variant=toolbar]{border:none;background:transparent;color:var(--color-text-muted)}button[size=sm]{min-height:26px;padding:var(--space-2) var(--space-6)}button[size=md]{min-height:32px;padding:var(--space-6) var(--space-12)}:root{--color-bg: var(--neutral-200);--color-border: var(--neutral-300)}
|
package/dist/browser/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>Television</title>
|
|
7
|
-
<script type="module" crossorigin src="./assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
7
|
+
<script type="module" crossorigin src="./assets/index-BZ2x6hDr.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="./assets/index-C_dcmI6X.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body></body>
|
|
11
11
|
</html>
|
package/dist/cli.cjs
CHANGED
|
@@ -59600,6 +59600,7 @@ var TelevisionClient = class {
|
|
|
59600
59600
|
body: {
|
|
59601
59601
|
title: input.title,
|
|
59602
59602
|
content: input.content,
|
|
59603
|
+
type: input.type,
|
|
59603
59604
|
workspaceID: input.workspaceID
|
|
59604
59605
|
}
|
|
59605
59606
|
});
|
|
@@ -74800,6 +74801,7 @@ function createTools(store) {
|
|
|
74800
74801
|
type: "object",
|
|
74801
74802
|
properties: {
|
|
74802
74803
|
id: { type: "string" },
|
|
74804
|
+
type: { type: "string", enum: ["markdown", "html"] },
|
|
74803
74805
|
title: { type: "string" },
|
|
74804
74806
|
content: { type: "string" },
|
|
74805
74807
|
workspaceID: { type: "string" }
|
|
@@ -74812,6 +74814,13 @@ function createTools(store) {
|
|
|
74812
74814
|
const title = args.title;
|
|
74813
74815
|
const content = args.content;
|
|
74814
74816
|
let workspaceID = typeof args.workspaceID === "string" ? args.workspaceID : void 0;
|
|
74817
|
+
let artifactType;
|
|
74818
|
+
if (args.type !== void 0) {
|
|
74819
|
+
if (args.type !== "markdown" && args.type !== "html") {
|
|
74820
|
+
return { error: 'type must be "markdown" or "html"' };
|
|
74821
|
+
}
|
|
74822
|
+
artifactType = args.type;
|
|
74823
|
+
}
|
|
74815
74824
|
if (typeof title !== "string" || typeof content !== "string" || id !== void 0 && typeof id !== "string" || workspaceID !== void 0 && typeof workspaceID !== "string") {
|
|
74816
74825
|
return { error: "title and content must be strings" };
|
|
74817
74826
|
}
|
|
@@ -74824,7 +74833,7 @@ function createTools(store) {
|
|
|
74824
74833
|
}
|
|
74825
74834
|
}
|
|
74826
74835
|
try {
|
|
74827
|
-
const artifact = store.createArtifact({ id, title, content, workspaceID });
|
|
74836
|
+
const artifact = store.createArtifact({ id, title, content, workspaceID, type: artifactType });
|
|
74828
74837
|
return { artifact };
|
|
74829
74838
|
} catch (error2) {
|
|
74830
74839
|
return { error: error2 instanceof Error ? error2.message : "Failed to create artifact" };
|
|
@@ -75315,6 +75324,20 @@ function ulid3(seedTime, prng) {
|
|
|
75315
75324
|
|
|
75316
75325
|
// src/server/workspace-store.ts
|
|
75317
75326
|
var import_node_crypto2 = require("node:crypto");
|
|
75327
|
+
|
|
75328
|
+
// src/artifacts.ts
|
|
75329
|
+
var DEFAULT_ARTIFACT_TYPE = "markdown";
|
|
75330
|
+
function createArtifact(input) {
|
|
75331
|
+
const type = input.type ?? DEFAULT_ARTIFACT_TYPE;
|
|
75332
|
+
return {
|
|
75333
|
+
id: input.id ?? ulid3(),
|
|
75334
|
+
type,
|
|
75335
|
+
title: input.title,
|
|
75336
|
+
content: input.content
|
|
75337
|
+
};
|
|
75338
|
+
}
|
|
75339
|
+
|
|
75340
|
+
// src/server/workspace-store.ts
|
|
75318
75341
|
var import_node_fs2 = require("node:fs");
|
|
75319
75342
|
var import_node_path3 = __toESM(require("node:path"), 1);
|
|
75320
75343
|
|
|
@@ -75324,8 +75347,14 @@ var DEFAULT_LAYOUT_CARD_ROWS = 6;
|
|
|
75324
75347
|
var LAYOUT_COLS_NARROW = 1;
|
|
75325
75348
|
var LAYOUT_ROW_SHORT = 2;
|
|
75326
75349
|
var LAYOUT_ROW_MID = 3;
|
|
75350
|
+
var LAYOUT_ROW_TALL = 4;
|
|
75327
75351
|
var ALLOWED_COLS = [LAYOUT_COLS_NARROW, DEFAULT_LAYOUT_CARD_COLS];
|
|
75328
|
-
var ALLOWED_ROWS = [
|
|
75352
|
+
var ALLOWED_ROWS = [
|
|
75353
|
+
LAYOUT_ROW_SHORT,
|
|
75354
|
+
LAYOUT_ROW_MID,
|
|
75355
|
+
LAYOUT_ROW_TALL,
|
|
75356
|
+
DEFAULT_LAYOUT_CARD_ROWS
|
|
75357
|
+
];
|
|
75329
75358
|
function clampLayoutCols(cols) {
|
|
75330
75359
|
const n = Math.round(cols);
|
|
75331
75360
|
return ALLOWED_COLS.includes(n) ? n : DEFAULT_LAYOUT_CARD_COLS;
|
|
@@ -75426,12 +75455,12 @@ var WorkspaceStore = class extends Emitter {
|
|
|
75426
75455
|
throw new Error("workspaceID is required");
|
|
75427
75456
|
}
|
|
75428
75457
|
const workspace = this.requireWorkspace(input.workspaceID);
|
|
75429
|
-
const artifact = {
|
|
75430
|
-
id: input.id
|
|
75431
|
-
type:
|
|
75458
|
+
const artifact = createArtifact({
|
|
75459
|
+
id: input.id,
|
|
75460
|
+
type: input.type,
|
|
75432
75461
|
title: input.title,
|
|
75433
75462
|
content: input.content
|
|
75434
|
-
};
|
|
75463
|
+
});
|
|
75435
75464
|
this.artifacts.set(artifact.id, artifact);
|
|
75436
75465
|
workspace.layout.push(createLayoutCardRecord(artifact.id));
|
|
75437
75466
|
this.persistArtifact(artifact);
|
|
@@ -75744,11 +75773,15 @@ function createProgram(env) {
|
|
|
75744
75773
|
});
|
|
75745
75774
|
});
|
|
75746
75775
|
});
|
|
75747
|
-
program2.command("create-artifact").description("Create an artifact in a workspace").requiredOption("--title <title>", "Artifact title").requiredOption("--content <content>", "Artifact content (markdown)").option("--workspace <id>", "Target workspace ID").option("--server <url>", "Server URL", DEFAULT_SERVER_URL).action(async (opts) => {
|
|
75776
|
+
program2.command("create-artifact").description("Create an artifact in a workspace").requiredOption("--title <title>", "Artifact title").requiredOption("--content <content>", "Artifact content").option("--type <type>", "Artifact type (markdown or html)", "markdown").option("--workspace <id>", "Target workspace ID").option("--server <url>", "Server URL", DEFAULT_SERVER_URL).action(async (opts) => {
|
|
75777
|
+
if (opts.type !== "markdown" && opts.type !== "html") {
|
|
75778
|
+
throw new Error("--type must be 'markdown' or 'html'");
|
|
75779
|
+
}
|
|
75748
75780
|
const client = createAuthenticatedClient(opts.server);
|
|
75749
75781
|
writeJSON(env.stdout, await client.createArtifact({
|
|
75750
75782
|
title: opts.title,
|
|
75751
75783
|
content: opts.content,
|
|
75784
|
+
type: opts.type,
|
|
75752
75785
|
workspaceID: opts.workspace
|
|
75753
75786
|
}));
|
|
75754
75787
|
});
|
package/dist/electron.cjs
CHANGED
|
@@ -71089,6 +71089,7 @@ function createTools(store) {
|
|
|
71089
71089
|
type: "object",
|
|
71090
71090
|
properties: {
|
|
71091
71091
|
id: { type: "string" },
|
|
71092
|
+
type: { type: "string", enum: ["markdown", "html"] },
|
|
71092
71093
|
title: { type: "string" },
|
|
71093
71094
|
content: { type: "string" },
|
|
71094
71095
|
workspaceID: { type: "string" }
|
|
@@ -71101,6 +71102,13 @@ function createTools(store) {
|
|
|
71101
71102
|
const title = args.title;
|
|
71102
71103
|
const content = args.content;
|
|
71103
71104
|
let workspaceID = typeof args.workspaceID === "string" ? args.workspaceID : void 0;
|
|
71105
|
+
let artifactType;
|
|
71106
|
+
if (args.type !== void 0) {
|
|
71107
|
+
if (args.type !== "markdown" && args.type !== "html") {
|
|
71108
|
+
return { error: 'type must be "markdown" or "html"' };
|
|
71109
|
+
}
|
|
71110
|
+
artifactType = args.type;
|
|
71111
|
+
}
|
|
71104
71112
|
if (typeof title !== "string" || typeof content !== "string" || id !== void 0 && typeof id !== "string" || workspaceID !== void 0 && typeof workspaceID !== "string") {
|
|
71105
71113
|
return { error: "title and content must be strings" };
|
|
71106
71114
|
}
|
|
@@ -71113,7 +71121,7 @@ function createTools(store) {
|
|
|
71113
71121
|
}
|
|
71114
71122
|
}
|
|
71115
71123
|
try {
|
|
71116
|
-
const artifact = store.createArtifact({ id, title, content, workspaceID });
|
|
71124
|
+
const artifact = store.createArtifact({ id, title, content, workspaceID, type: artifactType });
|
|
71117
71125
|
return { artifact };
|
|
71118
71126
|
} catch (error2) {
|
|
71119
71127
|
return { error: error2 instanceof Error ? error2.message : "Failed to create artifact" };
|
|
@@ -71604,6 +71612,20 @@ function ulid3(seedTime, prng) {
|
|
|
71604
71612
|
|
|
71605
71613
|
// src/server/workspace-store.ts
|
|
71606
71614
|
var import_node_crypto2 = require("node:crypto");
|
|
71615
|
+
|
|
71616
|
+
// src/artifacts.ts
|
|
71617
|
+
var DEFAULT_ARTIFACT_TYPE = "markdown";
|
|
71618
|
+
function createArtifact(input) {
|
|
71619
|
+
const type = input.type ?? DEFAULT_ARTIFACT_TYPE;
|
|
71620
|
+
return {
|
|
71621
|
+
id: input.id ?? ulid3(),
|
|
71622
|
+
type,
|
|
71623
|
+
title: input.title,
|
|
71624
|
+
content: input.content
|
|
71625
|
+
};
|
|
71626
|
+
}
|
|
71627
|
+
|
|
71628
|
+
// src/server/workspace-store.ts
|
|
71607
71629
|
var import_node_fs = require("node:fs");
|
|
71608
71630
|
var import_node_path2 = __toESM(require("node:path"), 1);
|
|
71609
71631
|
|
|
@@ -71613,8 +71635,14 @@ var DEFAULT_LAYOUT_CARD_ROWS = 6;
|
|
|
71613
71635
|
var LAYOUT_COLS_NARROW = 1;
|
|
71614
71636
|
var LAYOUT_ROW_SHORT = 2;
|
|
71615
71637
|
var LAYOUT_ROW_MID = 3;
|
|
71638
|
+
var LAYOUT_ROW_TALL = 4;
|
|
71616
71639
|
var ALLOWED_COLS = [LAYOUT_COLS_NARROW, DEFAULT_LAYOUT_CARD_COLS];
|
|
71617
|
-
var ALLOWED_ROWS = [
|
|
71640
|
+
var ALLOWED_ROWS = [
|
|
71641
|
+
LAYOUT_ROW_SHORT,
|
|
71642
|
+
LAYOUT_ROW_MID,
|
|
71643
|
+
LAYOUT_ROW_TALL,
|
|
71644
|
+
DEFAULT_LAYOUT_CARD_ROWS
|
|
71645
|
+
];
|
|
71618
71646
|
function clampLayoutCols(cols) {
|
|
71619
71647
|
const n = Math.round(cols);
|
|
71620
71648
|
return ALLOWED_COLS.includes(n) ? n : DEFAULT_LAYOUT_CARD_COLS;
|
|
@@ -71715,12 +71743,12 @@ var WorkspaceStore = class extends Emitter {
|
|
|
71715
71743
|
throw new Error("workspaceID is required");
|
|
71716
71744
|
}
|
|
71717
71745
|
const workspace = this.requireWorkspace(input.workspaceID);
|
|
71718
|
-
const artifact = {
|
|
71719
|
-
id: input.id
|
|
71720
|
-
type:
|
|
71746
|
+
const artifact = createArtifact({
|
|
71747
|
+
id: input.id,
|
|
71748
|
+
type: input.type,
|
|
71721
71749
|
title: input.title,
|
|
71722
71750
|
content: input.content
|
|
71723
|
-
};
|
|
71751
|
+
});
|
|
71724
71752
|
this.artifacts.set(artifact.id, artifact);
|
|
71725
71753
|
workspace.layout.push(createLayoutCardRecord(artifact.id));
|
|
71726
71754
|
this.persistArtifact(artifact);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@telepath-computer/television",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/electron.cjs",
|
|
6
6
|
"bin": {
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
"dev": "npm run dev:server",
|
|
14
14
|
"dev:electron": "scripts/dev-electron.sh",
|
|
15
15
|
"dev:server": "scripts/dev-server.sh",
|
|
16
|
-
"demo:layout": "vite --config vite.demo-layout.
|
|
17
|
-
"build": "npm run build:renderer && npm run build:cli && npm run build:electron",
|
|
16
|
+
"demo:layout": "vite --config config/vite.demo-layout.ts --host 127.0.0.1",
|
|
17
|
+
"build": "npm run build:artifact-runtime && npm run build:renderer && npm run build:cli && npm run build:electron",
|
|
18
18
|
"prepack": "npm run build",
|
|
19
19
|
"start": "npm run build && env -u ELECTRON_RUN_AS_NODE electron .",
|
|
20
20
|
"lint": "eslint . --ext .ts --max-warnings=0",
|
|
@@ -27,7 +27,8 @@
|
|
|
27
27
|
"test:all": "npm test && npm run test:e2e && npm run test:electron",
|
|
28
28
|
"test:watch": "vitest",
|
|
29
29
|
"verify": "npm run lint && npm run type-check && npm run test:all",
|
|
30
|
-
"build:
|
|
30
|
+
"build:artifact-runtime": "vite build --config config/vite.artifact-runtime.ts",
|
|
31
|
+
"build:renderer": "vite build --config config/vite.app.ts",
|
|
31
32
|
"build:electron": "esbuild src/electron/index.ts --bundle --platform=node --target=node18 --format=cjs --outfile=dist/electron.cjs --external:electron --external:@rupertsworld/electron-ipc",
|
|
32
33
|
"build:cli": "esbuild src/cli/index.ts --bundle --platform=node --target=node18 --format=cjs --banner:js=\"#!/usr/bin/env node\" --outfile=dist/cli.cjs"
|
|
33
34
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
artifact-view{background:var(--color-bg-muted);border:1px solid var(--color-border);border-radius:10px;box-sizing:border-box;width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden}.artifact-title-bar{display:flex;align-items:center;height:34px;padding:0 12px;flex-shrink:0;border-bottom:1px solid var(--color-border);-webkit-user-select:none;user-select:none}.artifact-title{flex:1;font-size:13px;font-weight:500;color:var(--color-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.artifact-close-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;border-radius:6px;background:transparent;color:var(--color-text-muted);cursor:pointer;flex-shrink:0}.artifact-close-btn:hover{background:var(--color-interactive);color:var(--color-text)}.artifact-content{flex:1;min-height:0;overflow-y:auto;padding:16px 20px}.markdown-body{font-size:14px;line-height:1.6;color:var(--color-text)}.markdown-body>:first-child{margin-top:0}.markdown-body>:last-child{margin-bottom:0}.markdown-body h1,.markdown-body h2,.markdown-body h3{font-weight:600;margin:1.25em 0 .5em}.markdown-body h1{font-size:1.4em}.markdown-body h2{font-size:1.2em}.markdown-body h3{font-size:1.05em}.markdown-body p{margin:.75em 0}.markdown-body code{font-family:var(--font-mono);font-size:.9em;background:var(--color-interactive);padding:.15em .35em;border-radius:4px}.markdown-body pre{background:var(--color-interactive);border-radius:6px;padding:12px 14px;overflow-x:auto}.markdown-body pre code{background:none;padding:0}.markdown-body ul,.markdown-body ol{padding-left:1.5em;margin:.75em 0}.markdown-body blockquote{margin:.75em 0;padding-left:1em;border-left:3px solid var(--color-border);color:var(--color-text-muted)}.markdown-body a{color:var(--color-text);text-decoration:underline}.markdown-body hr{border:none;border-top:1px solid var(--color-border);margin:1em 0}layout-stream{width:100%;flex:1;min-width:0;min-height:0;display:flex;align-items:center;overflow:hidden;outline:none;position:relative;--layout-base-w: 600px;--layout-base-h: 800px}@media (max-width: 799px){layout-stream{--layout-base-w: min(85vw, 600px);--layout-base-h: min(85vh, 800px)}}layout-stream .track{display:flex;align-items:center;flex-shrink:0;width:max-content;will-change:transform;transition:transform .2s ease}layout-stream .card-slot{flex-shrink:0;border-radius:12px;box-sizing:border-box;cursor:pointer;width:calc(var(--layout-base-w) * var(--layout-cols, 2) / 2);height:calc(var(--layout-base-h) * var(--layout-rows, 6) / 6)}layout-stream .card-slot.placeholder{background:#94a3b829;border:2px dashed rgba(148,163,184,.7);box-shadow:inset 0 0 0 1px #0f172a0d}layout-stream .card-slot.dragging{position:fixed;z-index:100;opacity:.7;transform:rotate(2deg);pointer-events:none;cursor:grabbing}layout-stream .card-slot artifact-view{width:100%;height:100%}workspace-view{width:100%;height:100%;min-width:0;display:flex;flex-direction:column}workspace-view [data-testid=empty-workspace]{margin:0;padding:1rem}television-app{width:100%;height:100%;display:flex;flex-direction:column}body.electron television-app>header{-webkit-app-region:drag;padding-left:80px;border-bottom:1px solid var(--color-border)}header{display:flex;align-items:center;justify-content:space-between;height:34px;padding:0 12px;flex-shrink:0;-webkit-user-select:none;user-select:none}television-app>header>nav{display:flex;align-items:center;gap:8px;min-width:0}workspace-picker,workspace-picker [trigger],button[variant=toolbar],.settings-server-remove-button,.settings-submit-button,.settings-cancel-button,.settings-connect-button,.settings-field input{-webkit-app-region:no-drag}workspace-picker dropdown-menu::part(panel){min-width:18rem}workspace-picker [trigger],workspace-picker [trigger][data-dropdown-trigger]{min-width:0;padding:0;border:none;background:transparent;font-size:13px;font-weight:600}workspace-picker [trigger] .trigger-label{white-space:nowrap}dropdown-group{display:block;padding:4px 0}dropdown-label{display:block;padding:0 10px 4px;font-size:12px;color:color-mix(in srgb,currentColor 60%,transparent)}dropdown-item{display:block;padding:6px 10px;border-radius:4px;cursor:pointer}dropdown-item[selected]{background:color-mix(in srgb,var(--color-border) 70%,white)}dropdown-item[action]{color:color-mix(in srgb,currentColor 50%,transparent)}dropdown-item[danger]{color:#c74343}television-app>main{flex:1;min-width:0;min-height:0;overflow:hidden}television-app>main.auth-gate{display:flex;align-items:center;justify-content:center}.settings-panel{width:min(32rem,100%);display:flex;flex-direction:column;padding:20px;border:1px solid var(--color-border);border-radius:12px;background:var(--color-bg)}.workspace-modal,.auth-modal{width:min(24rem,100%);display:flex;flex-direction:column;padding:20px;border:1px solid var(--color-border);border-radius:12px;background:var(--color-bg)}.auth-form{display:flex;flex-direction:column;gap:12px}.auth-modal-title,.auth-modal-copy{margin:0}.auth-token-input-invalid{border-color:#c74343}.workspace-form{display:flex;flex-direction:column;gap:12px}.workspace-form-actions{display:flex;gap:8px}.workspace-modal-title,.workspace-delete-copy,.workspace-delete-warning,.workspace-delete-error{margin:0}.workspace-delete-warning,.workspace-delete-error{font-size:13px}.workspace-delete-error{color:#c74343}.settings-section-title{margin:0}.settings-section,.settings-server-list,.settings-add-server-form{display:flex;flex-direction:column;gap:12px}.settings-form-actions{display:flex;gap:8px}.settings-card{padding:12px;border:1px solid var(--color-border);border-radius:8px}.settings-server{display:flex;align-items:center;justify-content:space-between;gap:12px}.settings-server-details{min-width:0}.settings-server-name{font-weight:600}.settings-server-url{font-size:13px;word-break:break-word;color:color-mix(in srgb,currentColor 70%,transparent)}.settings-server-remove-button,.settings-submit-button,.settings-cancel-button,.settings-connect-button{padding:8px 12px;border-radius:8px}.settings-field{display:flex;flex-direction:column;gap:6px}.settings-field input{width:100%;padding:8px 10px;border:1px solid var(--color-border);border-radius:8px;background:var(--color-bg);color:inherit;font:inherit;box-sizing:border-box}.settings-submit-button,.settings-cancel-button,.settings-connect-button{align-self:flex-start}:root{--black: #000000;--white: #ffffff;--neutral-50: oklch(.985 .001 106.423);--neutral-100: oklch(.97 .001 106.424);--neutral-200: oklch(.923 .003 48.717);--neutral-300: oklch(.869 .005 56.366);--neutral-400: oklch(.709 .01 56.259);--neutral-500: oklch(.553 .013 58.071);--neutral-600: oklch(.444 .011 73.639);--neutral-700: oklch(.374 .01 67.558);--neutral-800: oklch(.268 .007 34.298);--neutral-900: oklch(.216 .006 56.043);--neutral-950: oklch(.147 .004 49.25)}dropdown-menu{position:relative;display:inline-block;color:inherit}dropdown-group{display:grid;gap:var(--space-4)}dropdown-label{display:block;padding:var(--space-4) var(--space-8);color:var(--color-text-muted);font:inherit;font-size:var(--text-sm);font-weight:600;letter-spacing:.04em;text-transform:uppercase}dropdown-divider{display:block;height:1px;margin:var(--space-4) 0;background:var(--color-border)}[data-dropdown-trigger],dropdown-item{color:inherit;font:inherit;line-height:1.2}[data-dropdown-trigger],dropdown-menu::part(trigger){display:inline-flex;align-items:center;gap:var(--space-8);margin:0;padding:.375rem .5rem;border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-surface);color:var(--color-text);box-shadow:none;cursor:pointer}[data-dropdown-trigger]:hover,dropdown-menu::part(trigger):hover{background:var(--color-interactive-hover)}dropdown-menu[open] [data-dropdown-trigger],dropdown-menu[open]::part(trigger){background:var(--color-interactive)}[data-dropdown-trigger-label],dropdown-menu::part(trigger-label){min-width:0}[data-dropdown-trigger-icon],dropdown-menu::part(trigger-icon){display:inline-flex;align-items:center;justify-content:center;flex:none}[data-dropdown-trigger]:focus-visible,dropdown-menu::part(trigger):focus-visible,dropdown-item:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}dropdown-menu::part(panel){position:absolute;top:calc(100% + var(--space-4));left:0;z-index:var(--layer-popover);min-width:12rem;padding:var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);color:var(--color-text);box-shadow:var(--shadow-popover)}dropdown-item{display:block;margin:0;padding:.375rem .5rem;border-radius:var(--radius-sm);cursor:pointer;-webkit-user-select:none;user-select:none}dropdown-item:hover{background:var(--color-interactive-hover)}dropdown-item[selected]{background:var(--color-interactive)}panel-view{display:block}panel-view::part(panel){display:flex;flex-direction:column;gap:var(--space-16);color:var(--color-text)}panel-view::part(header){display:flex;align-items:center;justify-content:space-between;gap:var(--space-12)}panel-view::part(title-group){display:flex;align-items:center;gap:var(--space-8);min-width:0}panel-view::part(title){margin:0;font:inherit;font-size:var(--text-lg);font-weight:600;color:var(--color-text)}panel-view::part(button){display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;margin:0;border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-surface);color:var(--color-text);box-shadow:none;cursor:pointer}panel-view::part(button):hover{background:var(--color-interactive-hover)}panel-view::part(button):focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}panel-view::part(icon){display:inline-flex;align-items:center;justify-content:center;flex:none}panel-view::part(back-icon){transform:rotate(90deg)}modal-overlay{color:inherit}modal-overlay::part(backdrop){position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--layer-modal);display:flex;align-items:center;justify-content:center;padding:var(--space-16);background:var(--color-overlay-backdrop)}*,*:before,*:after{box-sizing:border-box}:root{--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;--font-brand: var(--font-sans);--font-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, monospace;--text-sm: 12px;--text-base: 14px;--text-lg: 16px;--leading-base: 1.5;--space-2: 2px;--space-4: 4px;--space-6: 6px;--space-8: 8px;--space-12: 12px;--space-16: 16px;--radius-sm: .375rem;--radius-md: .5rem;--layer-popover: 10;--layer-modal: 1000;--shadow-popover: 0 12px 32px rgb(0 0 0 / .14);--shadow-modal: 0 24px 64px rgb(0 0 0 / .2);--color-bg: var(--neutral-50);--color-bg-muted: var(--neutral-100);--color-surface: var(--white);--color-surface-muted: var(--neutral-100);--color-interactive: var(--neutral-200);--color-interactive-hover: var(--neutral-300);--color-border: var(--neutral-300);--color-border-muted: var(--neutral-200);--color-text: var(--neutral-900);--color-text-muted: var(--neutral-500);--color-link: inherit;--color-focus-ring: var(--neutral-500);--color-overlay-backdrop: rgb(0 0 0 / .5)}html,body{margin:0;padding:0;width:100%;height:100%}html{color-scheme:light}body{font-family:var(--font-sans);font-size:var(--text-base);line-height:var(--leading-base);color:var(--color-text);background:var(--color-bg)}a{text-underline-offset:.15em;text-decoration-thickness:.08em}button,input,textarea,select{font:inherit;color:inherit}a{color:var(--color-link)}code,pre{font-family:var(--font-mono)}h1,h2,h3,h4,h5,h6{color:var(--color-text)}[data-ui-icon]{display:inline-block;vertical-align:middle}button{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-6);border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg);color:inherit;cursor:pointer}button:hover{background:var(--color-interactive)}button[variant=toolbar]{border:none;background:transparent;color:var(--color-text-muted)}button[size=sm]{min-height:26px;padding:var(--space-2) var(--space-6)}button[size=md]{min-height:32px;padding:var(--space-6) var(--space-12)}:root{--color-bg: var(--neutral-200);--color-border: var(--neutral-300)}
|