jeopi-cli 16.2.25 → 16.2.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/README.md +1 -1
- package/dist/cli.js +2928 -2937
- package/dist/types/commands/install.d.ts +1 -1
- package/dist/types/discovery/helpers.d.ts +1 -1
- package/dist/types/export/html/index.d.ts +2 -2
- package/dist/types/export/html/web-palette.d.ts +2 -2
- package/dist/types/tiny/text.d.ts +9 -2
- package/dist/types/tools/report-tool-issue.d.ts +1 -1
- package/package.json +12 -12
- package/scripts/generate-share-viewer.ts +5 -5
- package/scripts/jeopi +4 -4
- package/scripts/{omp.ts → jeopi-preload.ts} +4 -4
- package/src/commands/install.ts +1 -1
- package/src/debug/report-bundle.ts +1 -1
- package/src/debug/system-info.ts +2 -2
- package/src/discovery/builtin.ts +4 -4
- package/src/discovery/helpers.ts +2 -2
- package/src/discovery/omp-plugins.ts +3 -3
- package/src/discovery/ssh.ts +1 -1
- package/src/export/html/index.ts +2 -2
- package/src/export/html/share-loader.js +5 -5
- package/src/export/html/template.css +2 -2
- package/src/export/html/template.js +5 -5
- package/src/export/html/tool-views.generated.js +2 -2
- package/src/export/html/web-palette.ts +2 -2
- package/src/export/share.ts +1 -1
- package/src/internal-urls/docs-index.generated.txt +1 -1
- package/src/memories/index.ts +23 -1
- package/src/modes/acp/acp-agent.ts +12 -6
- package/src/modes/controllers/selector-controller.ts +16 -2
- package/src/prompts/advisor/system.md +1 -1
- package/src/prompts/system/interrupted-thinking.md +2 -3
- package/src/session/agent-session.ts +78 -15
- package/src/tiny/text.ts +11 -8
- package/src/tools/image-gen.ts +2 -4
- package/src/tools/report-tool-issue.ts +1 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* `jeopi install <target>` — top-level convenience over `jeopi plugin install` /
|
|
3
3
|
* `jeopi plugin link`.
|
|
4
4
|
*
|
|
5
|
-
* The docs (omp.
|
|
5
|
+
* The docs (docs/extensions.md, or `jeopi read omp://extensions.md`) advertise
|
|
6
6
|
*
|
|
7
7
|
* jeopi install ./my-extension
|
|
8
8
|
*
|
|
@@ -155,7 +155,7 @@ export declare function calculateDepth(cwd: string, targetDir: string, separator
|
|
|
155
155
|
* Discovery rules:
|
|
156
156
|
* 1. Direct files: `extensions/*.ts` or `*.js` → load
|
|
157
157
|
* 2. Subdirectory with index: `extensions/<ext>/index.ts` or `index.js` → load
|
|
158
|
-
* 3. Subdirectory with package.json: `extensions/<ext>/package.json` with "
|
|
158
|
+
* 3. Subdirectory with package.json: `extensions/<ext>/package.json` with "jeopi"/"pi" field → load declared paths
|
|
159
159
|
*
|
|
160
160
|
* No recursion beyond one level. Complex packages must use package.json manifest.
|
|
161
161
|
* Uses native glob for fast filesystem scanning with gitignore support.
|
|
@@ -7,7 +7,7 @@ export interface ExportOptions {
|
|
|
7
7
|
outputPath?: string;
|
|
8
8
|
/**
|
|
9
9
|
* Which color palette the export ships with.
|
|
10
|
-
* - `"web"` (default) — the
|
|
10
|
+
* - `"web"` (default) — the jeopi brand identity (collab-web pink/purple),
|
|
11
11
|
* so public HTML exports and the `/s/<id>` share viewer match the live
|
|
12
12
|
* `my.omp.sh` client. See `web-palette.ts`.
|
|
13
13
|
* - `"theme"` — derive from `themeName` (or the active TUI theme), preserving
|
|
@@ -27,7 +27,7 @@ export interface ExportOptions {
|
|
|
27
27
|
*
|
|
28
28
|
* Two call shapes:
|
|
29
29
|
* • `generateThemeVars("web" | "theme", themeName?)` — explicit palette.
|
|
30
|
-
* `"web"` (the default for public artifacts) returns the fixed
|
|
30
|
+
* `"web"` (the default for public artifacts) returns the fixed jeopi brand
|
|
31
31
|
* palette from `web-palette.ts` — collab-web pink/purple identity, shared
|
|
32
32
|
* with the live `my.omp.sh` client, so exports and the share viewer render
|
|
33
33
|
* identically to it. `"theme"` derives from the TUI theme via
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Web/export palette — the
|
|
2
|
+
* Web/export palette — the jeopi brand identity shared by the collab-web live
|
|
3
3
|
* client (`my.omp.sh/`) and every public HTML export / share viewer (`/s/<id>`).
|
|
4
4
|
*
|
|
5
5
|
* Why this exists separately from `modes/theme/dark.json`: the `dark` theme is
|
|
6
6
|
* the **default TUI theme** — its amber accent (`#febc38`) drives the terminal
|
|
7
7
|
* status line, syntax highlighting, thinking levels, and bash/python mode
|
|
8
|
-
* colors for every
|
|
8
|
+
* colors for every jeopi user. The public web artifacts want the collab-web
|
|
9
9
|
* pink/purple identity instead, so they pin this palette rather than inheriting
|
|
10
10
|
* the TUI's. Editing `dark.json` to repurpose it for the web would repaint
|
|
11
11
|
* every terminal; this file keeps the two surfaces decoupled.
|
|
@@ -20,9 +20,16 @@ export declare function formatTitleUserMessage(message: string): string;
|
|
|
20
20
|
export interface TitleConversationTurn {
|
|
21
21
|
role: "user" | "assistant";
|
|
22
22
|
text?: string;
|
|
23
|
-
thinking?: string;
|
|
24
23
|
}
|
|
25
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* Format recent user/assistant context for title generation after a todo
|
|
26
|
+
* replan. Assistant `thinking` is intentionally never included: the
|
|
27
|
+
* replan-refresh title model falls back to the session's own current model
|
|
28
|
+
* when no `tiny`/`commit`/`smol` role is configured, so replaying prior
|
|
29
|
+
* reasoning as plaintext here is a `reasoning_extraction` classifier-refusal
|
|
30
|
+
* trigger on Anthropic targets (mirrors the thinking-drop in compaction,
|
|
31
|
+
* memories, and the hindsight transcript extractor).
|
|
32
|
+
*/
|
|
26
33
|
export declare function formatTitleConversationContext(turns: readonly TitleConversationTurn[]): string;
|
|
27
34
|
/**
|
|
28
35
|
* True when a first user message is too low-signal to title (greeting, ack,
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* (including from subagents) read the cached decision without prompting.
|
|
14
14
|
*
|
|
15
15
|
* When the user grants consent, push is automatically active against the
|
|
16
|
-
* bundled endpoint (`dev.autoqaPush.endpoint`, default `qa.
|
|
16
|
+
* bundled endpoint (`dev.autoqaPush.endpoint`, default `qa.jeopi.sh`). Each
|
|
17
17
|
* insert schedules a background flush that POSTs pending rows and deletes
|
|
18
18
|
* them on HTTP 2xx. `PI_AUTO_QA_PUSH=1` forces push in non-interactive
|
|
19
19
|
* environments where the consent dialog never fires. Tool execution is
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "jeopi-cli",
|
|
4
|
-
"version": "16.2.
|
|
4
|
+
"version": "16.2.27",
|
|
5
5
|
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
|
|
6
6
|
"homepage": "https://github.com/akillness/jeopi",
|
|
7
7
|
"author": "Can Boluk",
|
|
@@ -56,17 +56,17 @@
|
|
|
56
56
|
"@agentclientprotocol/sdk": "0.25.0",
|
|
57
57
|
"@babel/parser": "^7.29.7",
|
|
58
58
|
"@mozilla/readability": "^0.6.0",
|
|
59
|
-
"jeopi-hashline": "16.2.
|
|
60
|
-
"jeopi-stats": "16.2.
|
|
61
|
-
"jeopi-agent-core": "16.2.
|
|
62
|
-
"jeopi-ai": "16.2.
|
|
63
|
-
"jeopi-catalog": "16.2.
|
|
64
|
-
"jeopi-mnemopi": "16.2.
|
|
65
|
-
"jeopi-natives": "16.2.
|
|
66
|
-
"jeopi-tui": "16.2.
|
|
67
|
-
"jeopi-utils": "16.2.
|
|
68
|
-
"jeopi-wire": "16.2.
|
|
69
|
-
"jeopi-snapcompact": "16.2.
|
|
59
|
+
"jeopi-hashline": "16.2.27",
|
|
60
|
+
"jeopi-stats": "16.2.27",
|
|
61
|
+
"jeopi-agent-core": "16.2.27",
|
|
62
|
+
"jeopi-ai": "16.2.27",
|
|
63
|
+
"jeopi-catalog": "16.2.27",
|
|
64
|
+
"jeopi-mnemopi": "16.2.27",
|
|
65
|
+
"jeopi-natives": "16.2.27",
|
|
66
|
+
"jeopi-tui": "16.2.27",
|
|
67
|
+
"jeopi-utils": "16.2.27",
|
|
68
|
+
"jeopi-wire": "16.2.27",
|
|
69
|
+
"jeopi-snapcompact": "16.2.27",
|
|
70
70
|
"@opentelemetry/api": "^1.9.1",
|
|
71
71
|
"@opentelemetry/context-async-hooks": "^2.7.1",
|
|
72
72
|
"@opentelemetry/exporter-trace-otlp-proto": "^0.218.0",
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
/**
|
|
3
|
-
* Build the standalone share-viewer page the
|
|
3
|
+
* Build the standalone share-viewer page the jeopi relay serves at `GET /s/<id>`.
|
|
4
4
|
*
|
|
5
5
|
* Same template as HTML exports, but with no embedded session: share-loader.js
|
|
6
6
|
* (injected right after the empty #session-data tag) fetches the sealed blob
|
|
7
7
|
* (gist or relay store), decrypts it with the `#<key>` fragment in-browser, and
|
|
8
|
-
* hands the JSON to template.js via `window.
|
|
8
|
+
* hands the JSON to template.js via `window.__JEOPI_SESSION_DATA__`.
|
|
9
9
|
*
|
|
10
10
|
* The relay repo's build script runs this and embeds the output via go:embed.
|
|
11
11
|
*/
|
|
@@ -19,18 +19,18 @@ if (!outPath) {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
const loaderJs = await Bun.file(new URL("../src/export/html/share-loader.js", import.meta.url).pathname).text();
|
|
22
|
-
// Pin the
|
|
22
|
+
// Pin the jeopi brand palette (collab-web pink/purple identity) — the viewer is
|
|
23
23
|
// a public artifact matching the live my.omp.sh client, not a per-user export
|
|
24
24
|
// that should mirror the host's terminal theme.
|
|
25
25
|
const themeVars = await generateThemeVars("web");
|
|
26
26
|
|
|
27
27
|
const html = getTemplate()
|
|
28
28
|
.replace("<theme-vars/>", () => `<style>:root { ${themeVars} }</style>`)
|
|
29
|
-
.replace("<title>Session Export</title>", () => "<title>
|
|
29
|
+
.replace("<title>Session Export</title>", () => "<title>jeopi session</title>")
|
|
30
30
|
.replace("{{SESSION_DATA}}</script>", () => `</script>\n <script>${loaderJs}</script>`);
|
|
31
31
|
|
|
32
32
|
if (html.includes("{{SESSION_DATA}}")) throw new Error("session-data placeholder survived substitution");
|
|
33
|
-
if (!html.includes("
|
|
33
|
+
if (!html.includes("__JEOPI_SESSION_DATA__")) throw new Error("share loader not injected");
|
|
34
34
|
|
|
35
35
|
await Bun.write(outPath, html);
|
|
36
36
|
console.log(`Generated ${path.resolve(outPath)} (${(html.length / 1024).toFixed(0)} KB)`);
|
package/scripts/jeopi
CHANGED
|
@@ -27,14 +27,14 @@ while [ -L "$self" ]; do
|
|
|
27
27
|
done
|
|
28
28
|
scripts_dir=$(CDPATH= cd -- "$(dirname -- "$self")" && pwd -P)
|
|
29
29
|
cli=$scripts_dir/../src/cli.ts
|
|
30
|
-
preload=$scripts_dir/
|
|
30
|
+
preload=$scripts_dir/jeopi-preload.ts
|
|
31
31
|
timing_preload=$scripts_dir/../../utils/src/module-timer.ts
|
|
32
32
|
|
|
33
|
-
launch_dir=${
|
|
33
|
+
launch_dir=${JEOPI_DEV_LAUNCH_DIR:-${HOME}/.jeopi/.dev-cwd}
|
|
34
34
|
mkdir -p "$launch_dir"
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
export
|
|
36
|
+
JEOPI_LAUNCH_CWD=$PWD
|
|
37
|
+
export JEOPI_LAUNCH_CWD
|
|
38
38
|
cd "$launch_dir"
|
|
39
39
|
if [ -n "${PI_TIMING:-}" ]; then
|
|
40
40
|
exec bun --preload "$preload" --preload "$timing_preload" "$cli" "$@"
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Bun `--preload` shim for the
|
|
2
|
+
* Bun `--preload` shim for the jeopi dev launcher (`scripts/jeopi`).
|
|
3
3
|
*
|
|
4
4
|
* The launcher starts Bun from an empty, bunfig-free directory so a foreign
|
|
5
|
-
* project's `bunfig.toml` `preload` cannot run inside the
|
|
5
|
+
* project's `bunfig.toml` `preload` cannot run inside the jeopi CLI: Bun reads
|
|
6
6
|
* `bunfig.toml` from the *current working directory* on startup and evaluates
|
|
7
7
|
* its `preload` entries before the entrypoint, so a bun-shebang bin inherits
|
|
8
8
|
* whatever `preload` the directory you launched from declares (and crashes if
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
* imports run, so it restores the user's real working directory in time for
|
|
11
11
|
* import-time snapshots (e.g. `getProjectDir()` in `jeopi-utils/dirs`).
|
|
12
12
|
*/
|
|
13
|
-
const launchCwd = process.env.
|
|
13
|
+
const launchCwd = process.env.JEOPI_LAUNCH_CWD;
|
|
14
14
|
if (launchCwd) {
|
|
15
|
-
delete process.env.
|
|
15
|
+
delete process.env.JEOPI_LAUNCH_CWD;
|
|
16
16
|
try {
|
|
17
17
|
process.chdir(launchCwd);
|
|
18
18
|
} catch {}
|
package/src/commands/install.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* `jeopi install <target>` — top-level convenience over `jeopi plugin install` /
|
|
3
3
|
* `jeopi plugin link`.
|
|
4
4
|
*
|
|
5
|
-
* The docs (omp.
|
|
5
|
+
* The docs (docs/extensions.md, or `jeopi read omp://extensions.md`) advertise
|
|
6
6
|
*
|
|
7
7
|
* jeopi install ./my-extension
|
|
8
8
|
*
|
|
@@ -85,7 +85,7 @@ export async function createReportBundle(options: ReportBundleOptions): Promise<
|
|
|
85
85
|
await fs.mkdir(reportsDir, { recursive: true });
|
|
86
86
|
|
|
87
87
|
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
88
|
-
const outputPath = path.join(reportsDir, `
|
|
88
|
+
const outputPath = path.join(reportsDir, `jeopi-report-${timestamp}.tar.gz`);
|
|
89
89
|
|
|
90
90
|
const data: Record<string, string> = {};
|
|
91
91
|
const files: string[] = [];
|
package/src/debug/system-info.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import * as os from "node:os";
|
|
6
|
-
import { formatBytes, getProjectDir, VERSION } from "jeopi-utils";
|
|
6
|
+
import { APP_NAME, formatBytes, getProjectDir, VERSION } from "jeopi-utils";
|
|
7
7
|
|
|
8
8
|
export interface SystemInfo {
|
|
9
9
|
os: string;
|
|
@@ -86,7 +86,7 @@ export function formatSystemInfo(info: SystemInfo): string {
|
|
|
86
86
|
`CPU: ${info.cpu}`,
|
|
87
87
|
`Memory: ${formatBytes(info.memory.total)} (${formatBytes(info.memory.free)} free)`,
|
|
88
88
|
`Bun: ${info.versions.bun}`,
|
|
89
|
-
`App:
|
|
89
|
+
`App: ${APP_NAME} ${info.versions.app}`,
|
|
90
90
|
`Node: ${info.versions.node} (compat)`,
|
|
91
91
|
`CWD: ${info.cwd}`,
|
|
92
92
|
`Shell: ${info.shell}`,
|
package/src/discovery/builtin.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Builtin Provider (.jeopi)
|
|
3
3
|
*
|
|
4
|
-
* Primary provider for
|
|
4
|
+
* Primary provider for jeopi native configs. Supports all capabilities.
|
|
5
5
|
*/
|
|
6
6
|
import * as path from "node:path";
|
|
7
7
|
import { YAML } from "bun";
|
|
@@ -36,8 +36,8 @@ import {
|
|
|
36
36
|
} from "./helpers";
|
|
37
37
|
|
|
38
38
|
const PROVIDER_ID = "native";
|
|
39
|
-
const DISPLAY_NAME = "
|
|
40
|
-
const DESCRIPTION = "Native
|
|
39
|
+
const DISPLAY_NAME = "jeopi";
|
|
40
|
+
const DESCRIPTION = "Native jeopi configuration from ~/.jeopi and .jeopi/";
|
|
41
41
|
const PRIORITY = 100;
|
|
42
42
|
|
|
43
43
|
const PATHS = SOURCE_PATHS.native;
|
|
@@ -375,7 +375,7 @@ async function loadRules(ctx: LoadContext): Promise<LoadResult<Rule>> {
|
|
|
375
375
|
}
|
|
376
376
|
|
|
377
377
|
// Top-level RULES.md is a sticky always-apply rule. Documented in
|
|
378
|
-
//
|
|
378
|
+
// docs/context-files.md (or `jeopi read omp://context-files.md`) as the file that gets "re-injected near
|
|
379
379
|
// the current turn so they keep hold across long conversations".
|
|
380
380
|
// User scope: ~/.jeopi/agent/RULES.md
|
|
381
381
|
// Project scope: nearest .jeopi/RULES.md walking up from cwd to repoRoot
|
package/src/discovery/helpers.ts
CHANGED
|
@@ -567,7 +567,7 @@ async function readExtensionModuleManifest(
|
|
|
567
567
|
* Discovery rules:
|
|
568
568
|
* 1. Direct files: `extensions/*.ts` or `*.js` → load
|
|
569
569
|
* 2. Subdirectory with index: `extensions/<ext>/index.ts` or `index.js` → load
|
|
570
|
-
* 3. Subdirectory with package.json: `extensions/<ext>/package.json` with "
|
|
570
|
+
* 3. Subdirectory with package.json: `extensions/<ext>/package.json` with "jeopi"/"pi" field → load declared paths
|
|
571
571
|
*
|
|
572
572
|
* No recursion beyond one level. Complex packages must use package.json manifest.
|
|
573
573
|
* Uses native glob for fast filesystem scanning with gitignore support.
|
|
@@ -940,7 +940,7 @@ export async function listClaudePluginRoots(
|
|
|
940
940
|
}
|
|
941
941
|
}
|
|
942
942
|
} else {
|
|
943
|
-
warnings.push(`Failed to parse
|
|
943
|
+
warnings.push(`Failed to parse jeopi plugin registry: ${ompRegistryPath}`);
|
|
944
944
|
}
|
|
945
945
|
}
|
|
946
946
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* jeopi extension-package sub-discovery provider.
|
|
3
3
|
*
|
|
4
4
|
* When a user configures an extension via `extensions:` (in settings) or
|
|
5
5
|
* `--extension`/`-e` (on the CLI), the docs promise that the package's
|
|
6
6
|
* sibling directories — `skills/`, `hooks/pre|post/`, `tools/`, `commands/`,
|
|
7
|
-
* `rules/`, `prompts/`, and `.mcp.json` — are picked up by
|
|
7
|
+
* `rules/`, `prompts/`, and `.mcp.json` — are picked up by jeopi's standard
|
|
8
8
|
* discovery surfaces. The native `jeopi` provider in `builtin.ts` only walks
|
|
9
9
|
* `.jeopi/` and `~/.jeopi/agent/`, so without this provider those sub-trees are
|
|
10
10
|
* silently ignored.
|
|
@@ -32,7 +32,7 @@ import { buildRuleFromMarkdown, createSourceMeta, loadFilesFromDir, scanSkillsFr
|
|
|
32
32
|
import { listOmpExtensionRoots, type OmpExtensionRoot } from "./omp-extension-roots";
|
|
33
33
|
|
|
34
34
|
const PROVIDER_ID = "omp-plugins";
|
|
35
|
-
const DISPLAY_NAME = "
|
|
35
|
+
const DISPLAY_NAME = "jeopi Extension Packages";
|
|
36
36
|
const DESCRIPTION =
|
|
37
37
|
"Sub-discovery (skills, hooks, tools, commands, rules, prompts, .mcp.json) inside extension packages";
|
|
38
38
|
const PRIORITY = 90;
|
package/src/discovery/ssh.ts
CHANGED
|
@@ -147,7 +147,7 @@ async function load(ctx: LoadContext): Promise<LoadResult<SSHHost>> {
|
|
|
147
147
|
registerProvider(sshCapability.id, {
|
|
148
148
|
id: PROVIDER_ID,
|
|
149
149
|
displayName: DISPLAY_NAME,
|
|
150
|
-
description: "Load SSH hosts from managed
|
|
150
|
+
description: "Load SSH hosts from managed jeopi paths and legacy ssh.json/.ssh.json files",
|
|
151
151
|
priority: 5,
|
|
152
152
|
load,
|
|
153
153
|
});
|
package/src/export/html/index.ts
CHANGED
|
@@ -39,7 +39,7 @@ export interface ExportOptions {
|
|
|
39
39
|
outputPath?: string;
|
|
40
40
|
/**
|
|
41
41
|
* Which color palette the export ships with.
|
|
42
|
-
* - `"web"` (default) — the
|
|
42
|
+
* - `"web"` (default) — the jeopi brand identity (collab-web pink/purple),
|
|
43
43
|
* so public HTML exports and the `/s/<id>` share viewer match the live
|
|
44
44
|
* `my.omp.sh` client. See `web-palette.ts`.
|
|
45
45
|
* - `"theme"` — derive from `themeName` (or the active TUI theme), preserving
|
|
@@ -120,7 +120,7 @@ function deriveExportColors(baseColor: string): { pageBg: string; cardBg: string
|
|
|
120
120
|
*
|
|
121
121
|
* Two call shapes:
|
|
122
122
|
* • `generateThemeVars("web" | "theme", themeName?)` — explicit palette.
|
|
123
|
-
* `"web"` (the default for public artifacts) returns the fixed
|
|
123
|
+
* `"web"` (the default for public artifacts) returns the fixed jeopi brand
|
|
124
124
|
* palette from `web-palette.ts` — collab-web pink/purple identity, shared
|
|
125
125
|
* with the live `my.omp.sh` client, so exports and the share viewer render
|
|
126
126
|
* identically to it. `"theme"` derives from the TUI theme via
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
// SHARE VIEWER BOOTSTRAP
|
|
6
6
|
// ============================================================
|
|
7
7
|
//
|
|
8
|
-
// Served by the
|
|
8
|
+
// Served by the jeopi relay at /s/<id>; the AES-256-GCM key rides in the
|
|
9
9
|
// URL fragment and never leaves the browser. Resolves the session JSON
|
|
10
|
-
// and hands it to template.js via `window.
|
|
10
|
+
// and hands it to template.js via `window.__JEOPI_SESSION_DATA__`:
|
|
11
11
|
// 1. hex ids -> secret GitHub gist holding base64(sealed blob)
|
|
12
12
|
// 2. anything else -> relay blob store at /s/<id>/raw
|
|
13
13
|
// Sealed layout: [12B IV][AES-256-GCM(gzip(session JSON))].
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
if (!res.ok) throw new Error('Gist fetch failed: HTTP ' + res.status);
|
|
37
37
|
var gist = await res.json();
|
|
38
38
|
var files = Object.values(gist.files || {});
|
|
39
|
-
var file = files.find(function(f) { return /\.
|
|
39
|
+
var file = files.find(function(f) { return /\.jeopishare\.txt$/.test(f.filename); }) || files[0];
|
|
40
40
|
if (!file) throw new Error('Gist has no files.');
|
|
41
41
|
var text = file.content;
|
|
42
42
|
if (!text || file.truncated) {
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
new Blob([plain]).stream().pipeThrough(new DecompressionStream('gzip'))
|
|
90
90
|
).json();
|
|
91
91
|
if (data && data.header && data.header.title) {
|
|
92
|
-
document.title = data.header.title + ' —
|
|
92
|
+
document.title = data.header.title + ' — jeopi session';
|
|
93
93
|
}
|
|
94
94
|
return data;
|
|
95
95
|
}
|
|
@@ -98,5 +98,5 @@
|
|
|
98
98
|
// template.js surfaces the failure in-page; swallow the duplicate here
|
|
99
99
|
// so the console does not report an unhandled rejection.
|
|
100
100
|
pending.catch(function() {});
|
|
101
|
-
window.
|
|
101
|
+
window.__JEOPI_SESSION_DATA__ = pending;
|
|
102
102
|
})();
|
|
@@ -697,9 +697,9 @@
|
|
|
697
697
|
margin-left: 10px;
|
|
698
698
|
}
|
|
699
699
|
|
|
700
|
-
/* Tool calls render inside the <
|
|
700
|
+
/* Tool calls render inside the <jeopi-tool-view> web component, which draws
|
|
701
701
|
its own card chrome; the host box collapses to a plain block. */
|
|
702
|
-
|
|
702
|
+
jeopi-tool-view.tool-execution {
|
|
703
703
|
display: block;
|
|
704
704
|
padding: 0;
|
|
705
705
|
background: none;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
//
|
|
8
8
|
// Two boot paths share this template:
|
|
9
9
|
// - Static export: session JSON rides base64-embedded in #session-data.
|
|
10
|
-
// - Share viewer: share-loader.js sets `window.
|
|
10
|
+
// - Share viewer: share-loader.js sets `window.__JEOPI_SESSION_DATA__` to
|
|
11
11
|
// a promise resolving to the session JSON (fetched + decrypted).
|
|
12
12
|
// The entire app lives in bootSession(); its body keeps the original
|
|
13
13
|
// one-level indentation to avoid a whole-file reindent.
|
|
@@ -721,13 +721,13 @@
|
|
|
721
721
|
// TOOL CALL RENDERING
|
|
722
722
|
// ============================================================
|
|
723
723
|
//
|
|
724
|
-
// Tool calls render through the bundled <
|
|
724
|
+
// Tool calls render through the bundled <jeopi-tool-view> web component
|
|
725
725
|
// (tool-views.generated.js — the same React renderers collab-web uses).
|
|
726
726
|
// Payloads are handed over via a global store keyed by data-key, which
|
|
727
727
|
// survives innerHTML serialization and cloneNode round trips.
|
|
728
728
|
|
|
729
729
|
const TOOL_VIEW_DATA = new Map();
|
|
730
|
-
globalThis.
|
|
730
|
+
globalThis.__JEOPI_TOOL_VIEW_DATA = TOOL_VIEW_DATA;
|
|
731
731
|
let toolViewSeq = 0;
|
|
732
732
|
|
|
733
733
|
function renderToolCall(call, sctx) {
|
|
@@ -743,7 +743,7 @@
|
|
|
743
743
|
openAgent: (id) => openSubSession(joinKey(sctx.prefix, id)),
|
|
744
744
|
},
|
|
745
745
|
});
|
|
746
|
-
return '<
|
|
746
|
+
return '<jeopi-tool-view class="tool-execution ' + statusClass + '" data-key="' + key + '" open></jeopi-tool-view>';
|
|
747
747
|
}
|
|
748
748
|
|
|
749
749
|
// ============================================================
|
|
@@ -1619,7 +1619,7 @@
|
|
|
1619
1619
|
messages.appendChild(div);
|
|
1620
1620
|
}
|
|
1621
1621
|
|
|
1622
|
-
const pending = window.
|
|
1622
|
+
const pending = window.__JEOPI_SESSION_DATA__;
|
|
1623
1623
|
if (pending && typeof pending.then === 'function') {
|
|
1624
1624
|
pending.then(bootSession, showLoadError);
|
|
1625
1625
|
} else {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Auto-generated by packages/collab-web/scripts/build-tool-views.ts - DO NOT EDIT
|
|
2
|
-
(()=>{var s=document.createElement("style");s.dataset.
|
|
2
|
+
(()=>{var s=document.createElement("style");s.dataset.jeopiToolViews="";s.textContent=".tv-card{--tv-fg:var(--fg,var(--text,oklch(.92 .01 307)));--tv-muted:var(--fg-muted,var(--muted,oklch(.71 .016 307)));--tv-faint:var(--fg-faint,var(--dim,oklch(.53 .018 307)));--tv-accent:var(--accent,oklch(.674 .23 341));--tv-ok:var(--ok,var(--success,oklch(.76 .14 150)));--tv-err:var(--err,var(--error,oklch(.66 .19 25)));--tv-warn:var(--warn,var(--warning,oklch(.79 .14 85)));--tv-border:var(--border,oklch(1 0 0/9%));--tv-inset:var(--bg-inset,var(--info-bg,oklch(0 0 0/22%)));--tv-raised:var(--bg-raised,var(--container-bg,oklch(1 0 0/4%)));--tv-ring:var(--ring,oklch(.817 .112 205/70%));--tv-mono:var(--font-mono,ui-monospace,\"SF Mono\",\"Cascadia Mono\",Menlo,Consolas,monospace);border:1px solid var(--tv-border);font-family:var(--tv-mono);color:var(--tv-fg);isolation:isolate;overflow:hidden;border-radius:6px;font-size:12px;line-height:1.5}.tv-card--error{border-color:color-mix(in oklch,var(--tv-err)40%,var(--tv-border))}.tv-head{display:flex;font:inherit;color:inherit;text-align:left;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;align-items: center;gap:8px;width:100%;padding:5px 10px}.tv-head:hover{background:color-mix(in oklch,var(--tv-fg)4%,transparent)}.tv-head:focus-visible{outline:2px solid var(--tv-ring);outline-offset:-2px}.tv-status{border-radius:50%;flex:none;width:7px;height:7px}.tv-status--ok{background:var(--tv-ok)}.tv-status--err{background:var(--tv-err)}.tv-status--pending{background:var(--tv-faint)}.tv-spin{border:1.5px solid color-mix(in oklch,var(--tv-faint)50%,transparent);border-top-color:var(--tv-accent);animation:tv-rot .7s linear infinite;border-radius:50%;flex:none;width:9px;height:9px}.tv-name{letter-spacing:.02em;color:var(--tv-muted);flex:none;font-size:11px;font-weight:600}.tv-sum{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--tv-muted);flex:1;min-width:0;font-size:11.5px}.tv-sum>*{white-space:nowrap}.tv-chev{border-right:1.5px solid var(--tv-faint);border-bottom:1.5px solid var(--tv-faint);flex:none;width:7px;height:7px;margin-left:2px;transition:transform .15s;transform:rotate(-45deg)translateY(-1px)}.tv-head[aria-expanded=true] .tv-chev{transform:rotate(45deg)}.tv-body{display:flex;border-top:1px solid var(--tv-border);flex-direction:column;gap:8px;padding:8px 10px 10px}.tv-intent{color:var(--tv-faint);font-size:11px;font-style:italic}.tv-partial{border-top:1px solid var(--tv-border);color:var(--tv-faint);white-space:pre-wrap;overflow-wrap:anywhere;overflow-y:auto;max-height:160px;margin:0;padding:6px 10px;font-size:11px;line-height:1.45}.tv-badge{display:inline-block;background:var(--tv-raised);color:var(--tv-muted);vertical-align:1px;border-radius:3px;padding:0 5px;font-size:10px;line-height:16px}.tv-badge--accent{background:color-mix(in oklch,var(--tv-accent)16%,transparent);color:color-mix(in oklch,var(--tv-accent)80%,var(--tv-fg))}.tv-badge--ok{background:color-mix(in oklch,var(--tv-ok)14%,transparent);color:var(--tv-ok)}.tv-badge--err{background:color-mix(in oklch,var(--tv-err)14%,transparent);color:var(--tv-err)}.tv-badge--warn{background:color-mix(in oklch,var(--tv-warn)14%,transparent);color:var(--tv-warn)}.tv-badges{display:inline-flex;flex-wrap:wrap;gap:4px}.tv-path{color:var(--tv-fg)}.tv-lines{color:var(--tv-faint)}.tv-pattern{color:color-mix(in oklch,var(--tv-accent)75%,var(--tv-fg))}.tv-muted{color:var(--tv-muted)}.tv-faint{color:var(--tv-faint)}.tv-err-text{color:var(--tv-err)}.tv-ok-text{color:var(--tv-ok)}.tv-agent-link{font:inherit;cursor:pointer;border:0;font-size:10px}.tv-agent-link:hover{background:color-mix(in oklch,var(--tv-accent)26%,transparent);text-decoration:underline}.tv-agent-link:focus-visible{outline:2px solid var(--tv-ring);outline-offset:1px}.tv-agent-link-arrow{opacity:.7}.tv-warn-text{color:var(--tv-warn)}.tv-trunc{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tv-kv{display:grid;grid-template-columns:max-content 1fr;gap:2px 10px;font-size:11.5px}.tv-kv-key{color:var(--tv-faint)}.tv-kv-val{color:var(--tv-fg);overflow-wrap:anywhere;min-width:0}.tv-out{display:flex;flex-direction:column;min-width:0}.tv-pre{background:var(--tv-inset);font-family:var(--tv-mono);overflow-x:auto;tab-size:3;border-radius:4px;margin:0;padding:7px 9px;font-size:11.5px;line-height:1.5}.tv-pre--wrap{white-space:pre-wrap;overflow-wrap:anywhere}.tv-pre--bare{background:0 0;padding:0 1px}.tv-pre--error{color:var(--tv-err)}.tv-out-title{letter-spacing:.05em;text-transform:uppercase;color:var(--tv-faint);padding:0 1px 3px;font-size:10px}.tv-expand{font-family:var(--tv-mono);color:var(--tv-faint);cursor:pointer;background:0 0;border:0;align-self: flex-start;margin-top:3px;padding:0 1px;font-size:10.5px}.tv-expand:hover{color:var(--tv-fg);text-decoration:underline}.tv-expand:focus-visible{outline:2px solid var(--tv-ring);outline-offset:1px;border-radius:2px}.tv-cmd{display:flex;gap:7px;font-size:11.5px}.tv-cmd-prompt{color:var(--tv-accent);user-select:none;flex:none}.tv-cmd-text{white-space:pre-wrap;overflow-wrap:anywhere;min-width:0}.tv-cmd-env{color:var(--tv-faint)}.tv-diff{background:var(--tv-inset);overflow-x:auto;border-radius:4px;margin:0;padding:5px 0;font-size:11.5px;line-height:1.5}.tv-diff-row{white-space:pre;padding:0 9px}.tv-diff-row--add{background:color-mix(in oklch,var(--tv-ok)11%,transparent);color:color-mix(in oklch,var(--tv-ok)70%,var(--tv-fg))}.tv-diff-row--del{background:color-mix(in oklch,var(--tv-err)11%,transparent);color:color-mix(in oklch,var(--tv-err)70%,var(--tv-fg))}.tv-diff-row--hunk{color:var(--tv-faint)}.tv-diff-row--gap{color:var(--tv-faint);user-select:none}.tv-cells{display:flex;flex-direction:column;gap:8px}.tv-cell{display:flex;flex-direction:column;min-width:0}.tv-cell-title{letter-spacing:.05em;text-transform:uppercase;color:var(--tv-faint);padding:0 1px 3px;font-size:10px}.tv-list{display:flex;flex-direction:column;gap:3px;font-size:11.5px}.tv-row{display:flex;gap:7px;min-width:0}.tv-row-key{color:var(--tv-faint);flex:none}.tv-row-val{overflow-wrap:anywhere;min-width:0}.tv-todo{display:flex;flex-direction:column;gap:2px;font-size:11.5px}.tv-todo-phase{color:var(--tv-muted);letter-spacing:.04em;text-transform:uppercase;margin-top:4px;font-size:10.5px;font-weight:600}.tv-todo-phase:first-child{margin-top:0}.tv-task{display:flex;color:var(--tv-fg);gap:7px}.tv-task-icon{text-align:center;color:var(--tv-faint);flex:none;width:12px}.tv-task--completed{color:var(--tv-faint)}.tv-task--completed .tv-task-icon{color:var(--tv-ok)}.tv-task--in_progress .tv-task-icon{color:var(--tv-accent)}.tv-task--in_progress{color:var(--tv-fg)}.tv-task--abandoned{color:var(--tv-faint);text-decoration:line-through}.tv-note{background:var(--tv-raised);color:var(--tv-muted);overflow-wrap:anywhere;border-radius:4px;padding:6px 9px;font-size:11.5px}.tv-note--err{background:color-mix(in oklch,var(--tv-err)10%,transparent);color:var(--tv-err)}.tv-note--warn{background:color-mix(in oklch,var(--tv-warn)10%,transparent);color:var(--tv-warn)}.tv-note--ok{background:color-mix(in oklch,var(--tv-ok)10%,transparent);color:var(--tv-ok)}.tv-imgs{display:flex;flex-wrap:wrap;gap:6px}.tv-img{border:1px solid var(--tv-border);cursor:zoom-in;background:var(--tv-inset);border-radius:4px;max-width:100%;max-height:180px}.tv-prose{color:var(--tv-fg);white-space:pre-wrap;overflow-wrap:anywhere;font-size:11.5px;line-height:1.55}.tv-pre .hljs-comment,.tv-pre .hljs-quote{color:var(--tv-faint);font-style:italic}.tv-pre .hljs-keyword,.tv-pre .hljs-selector-tag,.tv-pre .hljs-section,.tv-pre .hljs-name,.tv-pre .hljs-tag{color:color-mix(in oklch,var(--tv-accent)72%,var(--tv-fg))}.tv-pre .hljs-string,.tv-pre .hljs-regexp,.tv-pre .hljs-addition{color:var(--tv-ok)}.tv-pre .hljs-number,.tv-pre .hljs-literal,.tv-pre .hljs-symbol,.tv-pre .hljs-bullet,.tv-pre .hljs-link,.tv-pre .hljs-meta{color:var(--tv-warn)}.tv-pre .hljs-title,.tv-pre .hljs-attr,.tv-pre .hljs-attribute,.tv-pre .hljs-selector-id,.tv-pre .hljs-selector-class,.tv-pre .hljs-type,.tv-pre .hljs-built_in{color:color-mix(in oklch,var(--tv-fg)80%,var(--tv-accent))}.tv-pre .hljs-deletion{color:var(--tv-err)}.tv-pre .hljs-emphasis{font-style:italic}.tv-pre .hljs-strong{font-weight:600}@keyframes tv-rot{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.tv-spin{animation:tv-pulse 1.4s ease-in-out infinite}.tv-chev{transition:none}@keyframes tv-pulse{50%{opacity:.35}}}";(document.head||document.documentElement).appendChild(s);})();
|
|
3
3
|
(()=>{var VA=Object.create;var{getPrototypeOf:OA,defineProperty:U8,getOwnPropertyNames:FA}=Object;var NA=Object.prototype.hasOwnProperty;function IA(Y){return this[Y]}var TA,KA,K=(Y,Z,X)=>{var f=Y!=null&&typeof Y==="object";if(f){var G=Z?TA??=new WeakMap:KA??=new WeakMap,z=G.get(Y);if(z)return z}X=Y!=null?VA(OA(Y)):{};let J=Z||!Y||!Y.__esModule?U8(X,"default",{value:Y,enumerable:!0}):X;for(let U of FA(Y))if(!NA.call(J,U))U8(J,U,{get:IA.bind(Y,U),enumerable:!0});if(f)G.set(Y,J);return J};var n7=(Y,Z)=>()=>(Z||Y((Z={exports:{}}).exports,Z),Z.exports);var _8=n7(($0)=>{function Q1(Y,Z){var X=Y.length;Y.push(Z);Y:for(;0<X;){var f=X-1>>>1,G=Y[f];if(0<kX(G,Z))Y[f]=Z,Y[X]=G,X=f;else break Y}}function r7(Y){return Y.length===0?null:Y[0]}function vX(Y){if(Y.length===0)return null;var Z=Y[0],X=Y.pop();if(X!==Z){Y[0]=X;Y:for(var f=0,G=Y.length,z=G>>>1;f<z;){var J=2*(f+1)-1,U=Y[J],H=J+1,W=Y[H];if(0>kX(U,X))H<G&&0>kX(W,U)?(Y[f]=W,Y[H]=X,f=H):(Y[f]=U,Y[J]=X,f=J);else if(H<G&&0>kX(W,X))Y[f]=W,Y[H]=X,f=H;else break Y}}return Z}function kX(Y,Z){var X=Y.sortIndex-Z.sortIndex;return X!==0?X:Y.id-Z.id}$0.unstable_now=void 0;if(typeof performance==="object"&&typeof performance.now==="function")M1=performance,$0.unstable_now=function(){return M1.now()};else bX=Date,_1=bX.now(),$0.unstable_now=function(){return bX.now()-_1};var M1,bX,_1,f6=[],K6=[],$A=1,E7=null,J7=3,R1=!1,VZ=!1,OZ=!1,L1=!1,A8=typeof setTimeout==="function"?setTimeout:null,W8=typeof clearTimeout==="function"?clearTimeout:null,H8=typeof setImmediate<"u"?setImmediate:null;function PX(Y){for(var Z=r7(K6);Z!==null;){if(Z.callback===null)vX(K6);else if(Z.startTime<=Y)vX(K6),Z.sortIndex=Z.expirationTime,Q1(f6,Z);else break;Z=r7(K6)}}function D1(Y){if(OZ=!1,PX(Y),!VZ)if(r7(f6)!==null)VZ=!0,KY||(KY=!0,TY());else{var Z=r7(K6);Z!==null&&B1(D1,Z.startTime-Y)}}var KY=!1,FZ=-1,q8=5,Q8=-1;function M8(){return L1?!0:$0.unstable_now()-Q8<q8?!1:!0}function q1(){if(L1=!1,KY){var Y=$0.unstable_now();Q8=Y;var Z=!0;try{Y:{VZ=!1,OZ&&(OZ=!1,W8(FZ),FZ=-1),R1=!0;var X=J7;try{Z:{PX(Y);for(E7=r7(f6);E7!==null&&!(E7.expirationTime>Y&&M8());){var f=E7.callback;if(typeof f==="function"){E7.callback=null,J7=E7.priorityLevel;var G=f(E7.expirationTime<=Y);if(Y=$0.unstable_now(),typeof G==="function"){E7.callback=G,PX(Y),Z=!0;break Z}E7===r7(f6)&&vX(f6),PX(Y)}else vX(f6);E7=r7(f6)}if(E7!==null)Z=!0;else{var z=r7(K6);z!==null&&B1(D1,z.startTime-Y),Z=!1}}break Y}finally{E7=null,J7=X,R1=!1}Z=void 0}}finally{Z?TY():KY=!1}}}var TY;if(typeof H8==="function")TY=function(){H8(q1)};else if(typeof MessageChannel<"u")EX=new MessageChannel,w1=EX.port2,EX.port1.onmessage=q1,TY=function(){w1.postMessage(null)};else TY=function(){A8(q1,0)};var EX,w1;function B1(Y,Z){FZ=A8(function(){Y($0.unstable_now())},Z)}$0.unstable_IdlePriority=5;$0.unstable_ImmediatePriority=1;$0.unstable_LowPriority=4;$0.unstable_NormalPriority=3;$0.unstable_Profiling=null;$0.unstable_UserBlockingPriority=2;$0.unstable_cancelCallback=function(Y){Y.callback=null};$0.unstable_forceFrameRate=function(Y){0>Y||125<Y?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):q8=0<Y?Math.floor(1000/Y):5};$0.unstable_getCurrentPriorityLevel=function(){return J7};$0.unstable_next=function(Y){switch(J7){case 1:case 2:case 3:var Z=3;break;default:Z=J7}var X=J7;J7=Z;try{return Y()}finally{J7=X}};$0.unstable_requestPaint=function(){L1=!0};$0.unstable_runWithPriority=function(Y,Z){switch(Y){case 1:case 2:case 3:case 4:case 5:break;default:Y=3}var X=J7;J7=Y;try{return Z()}finally{J7=X}};$0.unstable_scheduleCallback=function(Y,Z,X){var f=$0.unstable_now();switch(typeof X==="object"&&X!==null?(X=X.delay,X=typeof X==="number"&&0<X?f+X:f):X=f,Y){case 1:var G=-1;break;case 2:G=250;break;case 5:G=1073741823;break;case 4:G=1e4;break;default:G=5000}return G=X+G,Y={id:$A++,callback:Z,priorityLevel:Y,startTime:X,expirationTime:G,sortIndex:-1},X>f?(Y.sortIndex=X,Q1(K6,Y),r7(f6)===null&&Y===r7(K6)&&(OZ?(W8(FZ),FZ=-1):OZ=!0,B1(D1,X-f))):(Y.sortIndex=G,Q1(f6,Y),VZ||R1||(VZ=!0,KY||(KY=!0,TY()))),Y};$0.unstable_shouldYield=M8;$0.unstable_wrapCallback=function(Y){var Z=J7;return function(){var X=J7;J7=Z;try{return Y.apply(this,arguments)}finally{J7=X}}}});var w8=n7((MM,R8)=>{R8.exports=_8()});var $8=n7((l)=>{var F1=Symbol.for("react.transitional.element"),SA=Symbol.for("react.portal"),CA=Symbol.for("react.fragment"),kA=Symbol.for("react.strict_mode"),bA=Symbol.for("react.profiler"),PA=Symbol.for("react.consumer"),EA=Symbol.for("react.context"),vA=Symbol.for("react.forward_ref"),hA=Symbol.for("react.suspense"),jA=Symbol.for("react.memo"),O8=Symbol.for("react.lazy"),xA=Symbol.for("react.activity"),L8=Symbol.iterator;function yA(Y){if(Y===null||typeof Y!=="object")return null;return Y=L8&&Y[L8]||Y["@@iterator"],typeof Y==="function"?Y:null}var F8={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},N8=Object.assign,I8={};function SY(Y,Z,X){this.props=Y,this.context=Z,this.refs=I8,this.updater=X||F8}SY.prototype.isReactComponent={};SY.prototype.setState=function(Y,Z){if(typeof Y!=="object"&&typeof Y!=="function"&&Y!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,Y,Z,"setState")};SY.prototype.forceUpdate=function(Y){this.updater.enqueueForceUpdate(this,Y,"forceUpdate")};function T8(){}T8.prototype=SY.prototype;function N1(Y,Z,X){this.props=Y,this.context=Z,this.refs=I8,this.updater=X||F8}var I1=N1.prototype=new T8;I1.constructor=N1;N8(I1,SY.prototype);I1.isPureReactComponent=!0;var D8=Array.isArray;function O1(){}var F0={H:null,A:null,T:null,S:null},K8=Object.prototype.hasOwnProperty;function T1(Y,Z,X){var f=X.ref;return{$$typeof:F1,type:Y,key:Z,ref:f!==void 0?f:null,props:X}}function gA(Y,Z){return T1(Y.type,Z,Y.props)}function K1(Y){return typeof Y==="object"&&Y!==null&&Y.$$typeof===F1}function mA(Y){var Z={"=":"=0",":":"=2"};return"$"+Y.replace(/[=:]/g,function(X){return Z[X]})}var B8=/\/+/g;function V1(Y,Z){return typeof Y==="object"&&Y!==null&&Y.key!=null?mA(""+Y.key):Z.toString(36)}function uA(Y){switch(Y.status){case"fulfilled":return Y.value;case"rejected":throw Y.reason;default:switch(typeof Y.status==="string"?Y.then(O1,O1):(Y.status="pending",Y.then(function(Z){Y.status==="pending"&&(Y.status="fulfilled",Y.value=Z)},function(Z){Y.status==="pending"&&(Y.status="rejected",Y.reason=Z)})),Y.status){case"fulfilled":return Y.value;case"rejected":throw Y.reason}}throw Y}function $Y(Y,Z,X,f,G){var z=typeof Y;if(z==="undefined"||z==="boolean")Y=null;var J=!1;if(Y===null)J=!0;else switch(z){case"bigint":case"string":case"number":J=!0;break;case"object":switch(Y.$$typeof){case F1:case SA:J=!0;break;case O8:return J=Y._init,$Y(J(Y._payload),Z,X,f,G)}}if(J)return G=G(Y),J=f===""?"."+V1(Y,0):f,D8(G)?(X="",J!=null&&(X=J.replace(B8,"$&/")+"/"),$Y(G,Z,X,"",function(W){return W})):G!=null&&(K1(G)&&(G=gA(G,X+(G.key==null||Y&&Y.key===G.key?"":(""+G.key).replace(B8,"$&/")+"/")+J)),Z.push(G)),1;J=0;var U=f===""?".":f+":";if(D8(Y))for(var H=0;H<Y.length;H++)f=Y[H],z=U+V1(f,H),J+=$Y(f,Z,X,z,G);else if(H=yA(Y),typeof H==="function")for(Y=H.call(Y),H=0;!(f=Y.next()).done;)f=f.value,z=U+V1(f,H++),J+=$Y(f,Z,X,z,G);else if(z==="object"){if(typeof Y.then==="function")return $Y(uA(Y),Z,X,f,G);throw Z=String(Y),Error("Objects are not valid as a React child (found: "+(Z==="[object Object]"?"object with keys {"+Object.keys(Y).join(", ")+"}":Z)+"). If you meant to render a collection of children, use an array instead.")}return J}function hX(Y,Z,X){if(Y==null)return Y;var f=[],G=0;return $Y(Y,f,"","",function(z){return Z.call(X,z,G++)}),f}function cA(Y){if(Y._status===-1){var Z=Y._result;Z=Z(),Z.then(function(X){if(Y._status===0||Y._status===-1)Y._status=1,Y._result=X},function(X){if(Y._status===0||Y._status===-1)Y._status=2,Y._result=X}),Y._status===-1&&(Y._status=0,Y._result=Z)}if(Y._status===1)return Y._result.default;throw Y._result}var V8=typeof reportError==="function"?reportError:function(Y){if(typeof window==="object"&&typeof window.ErrorEvent==="function"){var Z=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof Y==="object"&&Y!==null&&typeof Y.message==="string"?String(Y.message):String(Y),error:Y});if(!window.dispatchEvent(Z))return}else if(typeof process==="object"&&typeof process.emit==="function"){process.emit("uncaughtException",Y);return}console.error(Y)},dA={map:hX,forEach:function(Y,Z,X){hX(Y,function(){Z.apply(this,arguments)},X)},count:function(Y){var Z=0;return hX(Y,function(){Z++}),Z},toArray:function(Y){return hX(Y,function(Z){return Z})||[]},only:function(Y){if(!K1(Y))throw Error("React.Children.only expected to receive a single React element child.");return Y}};l.Activity=xA;l.Children=dA;l.Component=SY;l.Fragment=CA;l.Profiler=bA;l.PureComponent=N1;l.StrictMode=kA;l.Suspense=hA;l.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=F0;l.__COMPILER_RUNTIME={__proto__:null,c:function(Y){return F0.H.useMemoCache(Y)}};l.cache=function(Y){return function(){return Y.apply(null,arguments)}};l.cacheSignal=function(){return null};l.cloneElement=function(Y,Z,X){if(Y===null||Y===void 0)throw Error("The argument must be a React element, but you passed "+Y+".");var f=N8({},Y.props),G=Y.key;if(Z!=null)for(z in Z.key!==void 0&&(G=""+Z.key),Z)!K8.call(Z,z)||z==="key"||z==="__self"||z==="__source"||z==="ref"&&Z.ref===void 0||(f[z]=Z[z]);var z=arguments.length-2;if(z===1)f.children=X;else if(1<z){for(var J=Array(z),U=0;U<z;U++)J[U]=arguments[U+2];f.children=J}return T1(Y.type,G,f)};l.createContext=function(Y){return Y={$$typeof:EA,_currentValue:Y,_currentValue2:Y,_threadCount:0,Provider:null,Consumer:null},Y.Provider=Y,Y.Consumer={$$typeof:PA,_context:Y},Y};l.createElement=function(Y,Z,X){var f,G={},z=null;if(Z!=null)for(f in Z.key!==void 0&&(z=""+Z.key),Z)K8.call(Z,f)&&f!=="key"&&f!=="__self"&&f!=="__source"&&(G[f]=Z[f]);var J=arguments.length-2;if(J===1)G.children=X;else if(1<J){for(var U=Array(J),H=0;H<J;H++)U[H]=arguments[H+2];G.children=U}if(Y&&Y.defaultProps)for(f in J=Y.defaultProps,J)G[f]===void 0&&(G[f]=J[f]);return T1(Y,z,G)};l.createRef=function(){return{current:null}};l.forwardRef=function(Y){return{$$typeof:vA,render:Y}};l.isValidElement=K1;l.lazy=function(Y){return{$$typeof:O8,_payload:{_status:-1,_result:Y},_init:cA}};l.memo=function(Y,Z){return{$$typeof:jA,type:Y,compare:Z===void 0?null:Z}};l.startTransition=function(Y){var Z=F0.T,X={};F0.T=X;try{var f=Y(),G=F0.S;G!==null&&G(X,f),typeof f==="object"&&f!==null&&typeof f.then==="function"&&f.then(O1,V8)}catch(z){V8(z)}finally{Z!==null&&X.types!==null&&(Z.types=X.types),F0.T=Z}};l.unstable_useCacheRefresh=function(){return F0.H.useCacheRefresh()};l.use=function(Y){return F0.H.use(Y)};l.useActionState=function(Y,Z,X){return F0.H.useActionState(Y,Z,X)};l.useCallback=function(Y,Z){return F0.H.useCallback(Y,Z)};l.useContext=function(Y){return F0.H.useContext(Y)};l.useDebugValue=function(){};l.useDeferredValue=function(Y,Z){return F0.H.useDeferredValue(Y,Z)};l.useEffect=function(Y,Z){return F0.H.useEffect(Y,Z)};l.useEffectEvent=function(Y){return F0.H.useEffectEvent(Y)};l.useId=function(){return F0.H.useId()};l.useImperativeHandle=function(Y,Z,X){return F0.H.useImperativeHandle(Y,Z,X)};l.useInsertionEffect=function(Y,Z){return F0.H.useInsertionEffect(Y,Z)};l.useLayoutEffect=function(Y,Z){return F0.H.useLayoutEffect(Y,Z)};l.useMemo=function(Y,Z){return F0.H.useMemo(Y,Z)};l.useOptimistic=function(Y,Z){return F0.H.useOptimistic(Y,Z)};l.useReducer=function(Y,Z,X){return F0.H.useReducer(Y,Z,X)};l.useRef=function(Y){return F0.H.useRef(Y)};l.useState=function(Y){return F0.H.useState(Y)};l.useSyncExternalStore=function(Y,Z,X){return F0.H.useSyncExternalStore(Y,Z,X)};l.useTransition=function(){return F0.H.useTransition()};l.version="19.2.7"});var NZ=n7((RM,S8)=>{S8.exports=$8()});var k8=n7((A7)=>{var lA=NZ();function C8(Y){var Z="https://react.dev/errors/"+Y;if(1<arguments.length){Z+="?args[]="+encodeURIComponent(arguments[1]);for(var X=2;X<arguments.length;X++)Z+="&args[]="+encodeURIComponent(arguments[X])}return"Minified React error #"+Y+"; visit "+Z+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function $6(){}var H7={d:{f:$6,r:function(){throw Error(C8(522))},D:$6,C:$6,L:$6,m:$6,X:$6,S:$6,M:$6},p:0,findDOMNode:null},pA=Symbol.for("react.portal");function iA(Y,Z,X){var f=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:pA,key:f==null?null:""+f,children:Y,containerInfo:Z,implementation:X}}var IZ=lA.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function jX(Y,Z){if(Y==="font")return"";if(typeof Z==="string")return Z==="use-credentials"?Z:""}A7.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=H7;A7.createPortal=function(Y,Z){var X=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!Z||Z.nodeType!==1&&Z.nodeType!==9&&Z.nodeType!==11)throw Error(C8(299));return iA(Y,Z,null,X)};A7.flushSync=function(Y){var Z=IZ.T,X=H7.p;try{if(IZ.T=null,H7.p=2,Y)return Y()}finally{IZ.T=Z,H7.p=X,H7.d.f()}};A7.preconnect=function(Y,Z){typeof Y==="string"&&(Z?(Z=Z.crossOrigin,Z=typeof Z==="string"?Z==="use-credentials"?Z:"":void 0):Z=null,H7.d.C(Y,Z))};A7.prefetchDNS=function(Y){typeof Y==="string"&&H7.d.D(Y)};A7.preinit=function(Y,Z){if(typeof Y==="string"&&Z&&typeof Z.as==="string"){var X=Z.as,f=jX(X,Z.crossOrigin),G=typeof Z.integrity==="string"?Z.integrity:void 0,z=typeof Z.fetchPriority==="string"?Z.fetchPriority:void 0;X==="style"?H7.d.S(Y,typeof Z.precedence==="string"?Z.precedence:void 0,{crossOrigin:f,integrity:G,fetchPriority:z}):X==="script"&&H7.d.X(Y,{crossOrigin:f,integrity:G,fetchPriority:z,nonce:typeof Z.nonce==="string"?Z.nonce:void 0})}};A7.preinitModule=function(Y,Z){if(typeof Y==="string")if(typeof Z==="object"&&Z!==null){if(Z.as==null||Z.as==="script"){var X=jX(Z.as,Z.crossOrigin);H7.d.M(Y,{crossOrigin:X,integrity:typeof Z.integrity==="string"?Z.integrity:void 0,nonce:typeof Z.nonce==="string"?Z.nonce:void 0})}}else Z==null&&H7.d.M(Y)};A7.preload=function(Y,Z){if(typeof Y==="string"&&typeof Z==="object"&&Z!==null&&typeof Z.as==="string"){var X=Z.as,f=jX(X,Z.crossOrigin);H7.d.L(Y,X,{crossOrigin:f,integrity:typeof Z.integrity==="string"?Z.integrity:void 0,nonce:typeof Z.nonce==="string"?Z.nonce:void 0,type:typeof Z.type==="string"?Z.type:void 0,fetchPriority:typeof Z.fetchPriority==="string"?Z.fetchPriority:void 0,referrerPolicy:typeof Z.referrerPolicy==="string"?Z.referrerPolicy:void 0,imageSrcSet:typeof Z.imageSrcSet==="string"?Z.imageSrcSet:void 0,imageSizes:typeof Z.imageSizes==="string"?Z.imageSizes:void 0,media:typeof Z.media==="string"?Z.media:void 0})}};A7.preloadModule=function(Y,Z){if(typeof Y==="string")if(Z){var X=jX(Z.as,Z.crossOrigin);H7.d.m(Y,{as:typeof Z.as==="string"&&Z.as!=="script"?Z.as:void 0,crossOrigin:X,integrity:typeof Z.integrity==="string"?Z.integrity:void 0})}else H7.d.m(Y)};A7.requestFormReset=function(Y){H7.d.r(Y)};A7.unstable_batchedUpdates=function(Y,Z){return Y(Z)};A7.useFormState=function(Y,Z,X){return IZ.H.useFormState(Y,Z,X)};A7.useFormStatus=function(){return IZ.H.useHostTransitionStatus()};A7.version="19.2.7"});var E8=n7((LM,P8)=>{function b8(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(b8)}catch(Y){console.error(Y)}}b8(),P8.exports=k8()});var dU=n7((z1)=>{var i0=w8(),fJ=NZ(),oA=E8();function F(Y){var Z="https://react.dev/errors/"+Y;if(1<arguments.length){Z+="?args[]="+encodeURIComponent(arguments[1]);for(var X=2;X<arguments.length;X++)Z+="&args[]="+encodeURIComponent(arguments[X])}return"Minified React error #"+Y+"; visit "+Z+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function GJ(Y){return!(!Y||Y.nodeType!==1&&Y.nodeType!==9&&Y.nodeType!==11)}function MX(Y){var Z=Y,X=Y;if(Y.alternate)for(;Z.return;)Z=Z.return;else{Y=Z;do Z=Y,(Z.flags&4098)!==0&&(X=Z.return),Y=Z.return;while(Y)}return Z.tag===3?X:null}function zJ(Y){if(Y.tag===13){var Z=Y.memoizedState;if(Z===null&&(Y=Y.alternate,Y!==null&&(Z=Y.memoizedState)),Z!==null)return Z.dehydrated}return null}function JJ(Y){if(Y.tag===31){var Z=Y.memoizedState;if(Z===null&&(Y=Y.alternate,Y!==null&&(Z=Y.memoizedState)),Z!==null)return Z.dehydrated}return null}function v8(Y){if(MX(Y)!==Y)throw Error(F(188))}function nA(Y){var Z=Y.alternate;if(!Z){if(Z=MX(Y),Z===null)throw Error(F(188));return Z!==Y?null:Y}for(var X=Y,f=Z;;){var G=X.return;if(G===null)break;var z=G.alternate;if(z===null){if(f=G.return,f!==null){X=f;continue}break}if(G.child===z.child){for(z=G.child;z;){if(z===X)return v8(G),Y;if(z===f)return v8(G),Z;z=z.sibling}throw Error(F(188))}if(X.return!==f.return)X=G,f=z;else{for(var J=!1,U=G.child;U;){if(U===X){J=!0,X=G,f=z;break}if(U===f){J=!0,f=G,X=z;break}U=U.sibling}if(!J){for(U=z.child;U;){if(U===X){J=!0,X=z,f=G;break}if(U===f){J=!0,f=z,X=G;break}U=U.sibling}if(!J)throw Error(F(189))}}if(X.alternate!==f)throw Error(F(190))}if(X.tag!==3)throw Error(F(188));return X.stateNode.current===X?Y:Z}function UJ(Y){var Z=Y.tag;if(Z===5||Z===26||Z===27||Z===6)return Y;for(Y=Y.child;Y!==null;){if(Z=UJ(Y),Z!==null)return Z;Y=Y.sibling}return null}var T0=Object.assign,rA=Symbol.for("react.element"),xX=Symbol.for("react.transitional.element"),bZ=Symbol.for("react.portal"),vY=Symbol.for("react.fragment"),HJ=Symbol.for("react.strict_mode"),z4=Symbol.for("react.profiler"),AJ=Symbol.for("react.consumer"),q6=Symbol.for("react.context"),XG=Symbol.for("react.forward_ref"),J4=Symbol.for("react.suspense"),U4=Symbol.for("react.suspense_list"),fG=Symbol.for("react.memo"),S6=Symbol.for("react.lazy"),H4=Symbol.for("react.activity"),aA=Symbol.for("react.memo_cache_sentinel"),h8=Symbol.iterator;function TZ(Y){if(Y===null||typeof Y!=="object")return null;return Y=h8&&Y[h8]||Y["@@iterator"],typeof Y==="function"?Y:null}var sA=Symbol.for("react.client.reference");function A4(Y){if(Y==null)return null;if(typeof Y==="function")return Y.$$typeof===sA?null:Y.displayName||Y.name||null;if(typeof Y==="string")return Y;switch(Y){case vY:return"Fragment";case z4:return"Profiler";case HJ:return"StrictMode";case J4:return"Suspense";case U4:return"SuspenseList";case H4:return"Activity"}if(typeof Y==="object")switch(Y.$$typeof){case bZ:return"Portal";case q6:return Y.displayName||"Context";case AJ:return(Y._context.displayName||"Context")+".Consumer";case XG:var Z=Y.render;return Y=Y.displayName,Y||(Y=Z.displayName||Z.name||"",Y=Y!==""?"ForwardRef("+Y+")":"ForwardRef"),Y;case fG:return Z=Y.displayName||null,Z!==null?Z:A4(Y.type)||"Memo";case S6:Z=Y._payload,Y=Y._init;try{return A4(Y(Z))}catch(X){}}return null}var PZ=Array.isArray,c=fJ.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,A0=oA.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,AY={pending:!1,data:null,method:null,action:null},W4=[],hY=-1;function Y6(Y){return{current:Y}}function a0(Y){0>hY||(Y.current=W4[hY],W4[hY]=null,hY--)}function V0(Y,Z){hY++,W4[hY]=Y.current,Y.current=Z}var e7=Y6(null),eZ=Y6(null),g6=Y6(null),Mf=Y6(null);function _f(Y,Z){switch(V0(g6,Z),V0(eZ,Y),V0(e7,null),Z.nodeType){case 9:case 11:Y=(Y=Z.documentElement)?(Y=Y.namespaceURI)?mz(Y):0:0;break;default:if(Y=Z.tagName,Z=Z.namespaceURI)Z=mz(Z),Y=CU(Z,Y);else switch(Y){case"svg":Y=1;break;case"math":Y=2;break;default:Y=0}}a0(e7),V0(e7,Y)}function eY(){a0(e7),a0(eZ),a0(g6)}function q4(Y){Y.memoizedState!==null&&V0(Mf,Y);var Z=e7.current,X=CU(Z,Y.type);Z!==X&&(V0(eZ,Y),V0(e7,X))}function Rf(Y){eZ.current===Y&&(a0(e7),a0(eZ)),Mf.current===Y&&(a0(Mf),WX._currentValue=AY)}var $1,j8;function GY(Y){if($1===void 0)try{throw Error()}catch(X){var Z=X.stack.trim().match(/\n( *(at )?)/);$1=Z&&Z[1]||"",j8=-1<X.stack.indexOf(`
|
|
4
4
|
at`)?" (<anonymous>)":-1<X.stack.indexOf("@")?"@unknown:0:0":""}return`
|
|
5
5
|
`+$1+Y+j8}var S1=!1;function C1(Y,Z){if(!Y||S1)return"";S1=!0;var X=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var f={DetermineComponentFrameRoot:function(){try{if(Z){var R=function(){throw Error()};if(Object.defineProperty(R.prototype,"props",{set:function(){throw Error()}}),typeof Reflect==="object"&&Reflect.construct){try{Reflect.construct(R,[])}catch(M){var q=M}Reflect.construct(Y,[],R)}else{try{R.call()}catch(M){q=M}Y.call(R.prototype)}}else{try{throw Error()}catch(M){q=M}(R=Y())&&typeof R.catch==="function"&&R.catch(function(){})}}catch(M){if(M&&q&&typeof M.stack==="string")return[M.stack,q.stack]}return[null,null]}};f.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var G=Object.getOwnPropertyDescriptor(f.DetermineComponentFrameRoot,"name");G&&G.configurable&&Object.defineProperty(f.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var z=f.DetermineComponentFrameRoot(),J=z[0],U=z[1];if(J&&U){var H=J.split(`
|
|
@@ -34,4 +34,4 @@ Error generating stack: `+f.message+`
|
|
|
34
34
|
`)?"":Z}function g2({args:Y}){let Z=A(Y.host),X=A(Y.command);return g0.jsxs(g0.Fragment,{children:[g0.jsx(D,{tone:"accent",children:Z??"…"})," ",X!==null?T(b(X),80):Y.command!==void 0&&g0.jsx(h,{what:"command"})]})}function m2({args:Y,result:Z}){let X=A(Y.host),f=A(Y.command),G=A(Y.cwd),z=O(Y.timeout),J=x2(Z),U=J!==null&&Z?.isError!==!0?y2(o0(Z).trim()):null;return g0.jsxs(g0.Fragment,{children:[g0.jsx(o,{items:[X!==null?g0.jsx(D,{tone:"accent",children:X}):g0.jsx(h,{what:"host"}),G!==null&&g0.jsxs(D,{children:["cwd ",w0(G)]}),z!==null&&g0.jsxs(D,{children:["timeout ",z,"s"]})]}),f!==null?g0.jsxs("div",{className:"tv-cmd",children:[g0.jsx("span",{className:"tv-cmd-prompt",children:"$"}),g0.jsx("span",{className:"tv-cmd-text",children:N6(f)})]}):g0.jsx(h,{what:"command"}),U!==null?U!==""&&g0.jsx(n,{text:U,maxLines:12}):g0.jsx(S,{result:Z,maxLines:12}),J!==null&&g0.jsxs(p,{tone:"warn",children:["Output truncated",J.outputLines!==null&&J.totalLines!==null&&` — showing ${J.outputLines} of ${J.totalLines} lines`,J.artifactId!==null&&` · full output at artifact://${J.artifactId}`]})]})}var XA={Summary:g2,Body:m2};var g=K($(),1),u2="SYSTEM WARNING: Subagent exited without calling yield tool";function fA(Y){let Z=Y.tasks;if(Array.isArray(Z)){let f=[];for(let G of Z){if(!I(G))continue;f.push({id:A(G.id),description:A(G.description),assignment:A(G.assignment),isolated:G.isolated===!0})}return f}let X={id:A(Y.id),description:A(Y.description),assignment:A(Y.assignment),isolated:Y.isolated===!0};return X.id||X.description||X.assignment?[X]:[]}function z8(Y){return Y.includes(".")?Y.split(".").join(">"):Y}function J8(Y){if(Y<1000)return`${Math.round(Y)}ms`;let Z=Y/1000;if(Z<60)return`${Z<10?Z.toFixed(1):Math.round(Z)}s`;return`${Math.floor(Z/60)}m ${Math.round(Z%60)}s`}function GA(Y){return Y>=1000?`${(Y/1000).toFixed(1)}k`:String(Y)}function zA(Y){if(Y.aborted===!0)return{label:"aborted",tone:"err"};if(O(Y.exitCode)===0)return A(Y.error)?{label:"merge failed",tone:"warn"}:{label:"done",tone:"ok"};return{label:"failed",tone:"err"}}function c2({args:Y}){let Z=A(Y.agent),X=A(Y.resume),f=fA(Y),G=f.length>0?f[0]:null,z=G?G.description??G.id:null;return g.jsxs(g.Fragment,{children:[Z&&g.jsx(D,{tone:"accent",children:Z}),!Z&&X&&g.jsxs(D,{children:["resume ",X]}),z&&g.jsx("span",{className:"tv-muted",children:T(b(z),72)}),f.length>1&&g.jsxs(D,{children:[f.length," tasks"]})]})}function d2({res:Y,host:Z}){let{label:X,tone:f}=zA(Y),G=A(Y.id)??"agent",z=A(Y.description),J=[],U=O(Y.tokens);if(U)J.push(`${GA(U)} tok`);let H=O(Y.requests);if(H)J.push(`${H} req`);let W=O(Y.durationMs);if(W!=null)J.push(J8(W));let Q=A(Y.resolvedModel);if(Q)J.push(Q);let R=A(Y.output)??"",q=null,M=R.indexOf(`
|
|
35
35
|
`),B=(M===-1?R:R.slice(0,M)).trim();if(B.startsWith(u2))q=B,R=M===-1?"":R.slice(M+1).replace(/^\s*\n+/,"");let N=A(Y.error),u=Y.aborted===!0,w=A(Y.abortReason),_=A(Y.patchPath),L=A(Y.branchName);return g.jsxs(g.Fragment,{children:[g.jsxs(m,{k:g.jsx(A1,{id:G,host:Z,children:z8(G)}),children:[g.jsx(D,{tone:f,children:X})," ",Y.truncated===!0&&g.jsx(D,{tone:"warn",children:"truncated"})," ",z&&g.jsx("span",{children:T(b(z),96)})," ",J.length>0&&g.jsx("span",{className:"tv-faint",children:J.join(" · ")})]}),q&&g.jsx(p,{tone:"warn",children:q}),u&&w&&g.jsx(p,{tone:"err",children:w}),R.trim()!==""&&g.jsx(n,{text:R,maxLines:6,error:f==="err"}),N&&!u&&N!==w&&g.jsx(p,{tone:f==="warn"?"warn":"err",children:N}),_&&g.jsxs("div",{className:"tv-faint",children:["patch: ",_]}),!_&&L&&g.jsxs("div",{className:"tv-faint",children:["branch: ",L]})]})}function l2({p:Y,host:Z}){let X=A(Y.status)??"running",f=X==="completed"?"ok":X==="failed"||X==="aborted"?"err":X==="running"?"accent":void 0,G=A(Y.id)??"agent",z=A(Y.description),J=A(Y.lastIntent)??A(Y.currentTool),U=[],H=O(Y.toolCount);if(H)U.push(`${H} tools`);let W=O(Y.tokens);if(W)U.push(`${GA(W)} tok`);let Q=O(Y.durationMs);if(Q)U.push(J8(Q));return g.jsxs(m,{k:g.jsx(A1,{id:G,host:Z,children:z8(G)}),children:[g.jsx(D,{tone:f,children:X})," ",z&&g.jsx("span",{children:T(b(z),96)})," ",J&&g.jsx("span",{className:"tv-muted",children:T(b(J),64)})," ",U.length>0&&g.jsx("span",{className:"tv-faint",children:U.join(" · ")})]})}function p2({args:Y,result:Z,host:X}){let f=A(Y.resume),G=A(Y.context),z=fA(Y),J=P(Z),U=J&&Array.isArray(J.results)?J.results.filter(I):[],H=J&&Array.isArray(J.progress)?J.progress.filter(I):[],W=U.length===0&&H.length>0,Q=null;if(U.length>0){let q=0,M=0,B=0,N=0;for(let w of U){let{label:_}=zA(w);if(_==="done")q++;else if(_==="merge failed")M++;else if(_==="aborted")B++;else N++}let u=J?O(J.totalDurationMs):null;Q=g.jsxs(m,{children:[q>0&&g.jsxs(D,{tone:"ok",children:[q," succeeded"]})," ",M>0&&g.jsxs(D,{tone:"warn",children:[M," merge failed"]})," ",N>0&&g.jsxs(D,{tone:"err",children:[N," failed"]})," ",B>0&&g.jsxs(D,{tone:"err",children:[B," aborted"]})," ",u!=null&&g.jsx("span",{className:"tv-faint",children:J8(u)})]})}let R=[...U].sort((q,M)=>(O(q.durationMs)??0)-(O(M.durationMs)??0)||(O(q.index)??0)-(O(M.index)??0));return g.jsxs(g.Fragment,{children:[f&&g.jsxs(D,{children:["resume ",f]}),G&&g.jsx(n,{text:G,maxLines:4,title:"context"}),z.length>0&&g.jsx("div",{className:"tv-list",children:z.map((q,M)=>g.jsxs("div",{children:[g.jsxs(m,{k:q.id?g.jsx(A1,{id:q.id,host:X,children:z8(q.id)}):g.jsx(D,{tone:"accent",children:`#${M+1}`}),children:[q.isolated&&g.jsx(D,{children:"isolated"})," ",q.description&&g.jsx("span",{children:T(b(q.description),120)})]}),q.assignment&&g.jsx(n,{text:q.assignment,maxLines:6,title:"assignment"})]},q.id??M))}),R.length>0&&g.jsxs("div",{className:"tv-list",children:[R.map((q,M)=>g.jsx(d2,{res:q,host:X},A(q.id)??M)),Q]}),W&&g.jsx("div",{className:"tv-list",children:H.map((q,M)=>g.jsx(l2,{p:q,host:X},A(q.id)??M))}),R.length===0&&!W&&g.jsx(S,{result:Z,maxLines:12})]})}var JA={Summary:c2,Body:p2};var t0=K($(),1),i2={completed:"✓",in_progress:"→",abandoned:"✕",pending:"○"},o2=[[1000,"M"],[900,"CM"],[500,"D"],[400,"CD"],[100,"C"],[90,"XC"],[50,"L"],[40,"XL"],[10,"X"],[9,"IX"],[5,"V"],[4,"IV"],[1,"I"]];function n2(Y){if(Y<=0)return"";let Z="",X=Y;for(let[f,G]of o2)while(X>=f)Z+=G,X-=f;return Z}function UA(Y){if(Array.isArray(Y.ops))return Y.ops;return typeof Y.op==="string"?[Y]:[]}function r2({args:Y}){let Z=UA(Y),X={},f=[],G=null;for(let J of Z){if(!I(J))continue;let U=A(J.op)??"update";if(X[U]===void 0)X[U]=0,f.push(U);if(X[U]++,G===null){if(G=A(J.task)??A(J.phase),G===null&&Array.isArray(J.list)){let H=J.list.find(I);if(H&&Array.isArray(H.items))G=A(H.items[0])}}}let z=f.map((J)=>X[J]>1?`${J}×${X[J]}`:J);return t0.jsxs(t0.Fragment,{children:[t0.jsx(o,{items:z.length>0?z:["update"]}),G!==null&&t0.jsxs("span",{children:[" ",T(b(G),60)]})]})}function a2(Y,Z){if(!I(Y))return null;let X=[],f=A(Y.task),G=A(Y.phase);if(f!==null)X.push(f);if(G!==null)X.push(G);if(Array.isArray(Y.items)&&Y.items.length>0)X.push(`${Y.items.length} item${Y.items.length===1?"":"s"}`);if(Array.isArray(Y.list)&&Y.list.length>0){let z=0;for(let J of Y.list)if(I(J)&&Array.isArray(J.items))z+=J.items.length;X.push(`${Y.list.length} phase${Y.list.length===1?"":"s"} · ${z} tasks`)}return t0.jsx(m,{k:A(Y.op)??"update",children:T(b(X.join(" · ")),160)},Z)}function s2({phases:Y}){let Z=[];for(let X=0;X<Y.length;X++){let f=Y[X];if(!I(f))continue;if(Z.push(t0.jsxs("div",{className:"tv-todo-phase",children:[n2(X+1),". ",A(f.name)??""]},`p${X}`)),!Array.isArray(f.tasks))continue;for(let G=0;G<f.tasks.length;G++){let z=f.tasks[G];if(!I(z))continue;let J=z.status,U=J==="completed"||J==="in_progress"||J==="abandoned"?J:"pending";Z.push(t0.jsxs("div",{className:`tv-task tv-task--${U}`,children:[t0.jsx("span",{className:"tv-task-icon",children:i2[U]}),t0.jsx("span",{children:A(z.content)??""})]},`p${X}t${G}`))}}if(Z.length===0)return null;return t0.jsx("div",{className:"tv-todo",children:Z})}function t2({args:Y,result:Z}){let X=UA(Y),f=P(Z),G=f&&Array.isArray(f.phases)&&!Z?.isError?f.phases:null;return t0.jsxs(t0.Fragment,{children:[X.length>0&&t0.jsx("div",{className:"tv-list",children:X.map(a2)}),G!==null?t0.jsx(s2,{phases:G}):t0.jsx(S,{result:Z,maxLines:8})]})}var HA={Summary:r2,Body:t2};var P0=K($(),1);function e2(Y){try{return new URL(Y).hostname.replace(/^www\./,"")}catch{return""}}function YM(Y){let Z=O(Y);if(Z===null||Z<0)return"";let X=Math.floor(Z/60);if(X<60)return`${X}m ago`;let f=Math.floor(X/60);if(f<24)return`${f}h ago`;let G=Math.floor(f/24);if(G<365)return`${G}d ago`;return`${Math.floor(G/365)}y ago`}function ZM({args:Y}){let Z=A(Y.query),X=A(Y.recency);return P0.jsxs(P0.Fragment,{children:[Z===null?P0.jsx(h,{what:"query"}):P0.jsx("span",{className:"tv-pattern",children:T(b(Z),80)}),X&&P0.jsx(D,{children:X})]})}function XM({source:Y,index:Z}){let X=A(Y.url)??"",f=A(Y.title)?.trim()||X||"Untitled",G=X?e2(X):"",z=YM(Y.ageSeconds)||(A(Y.publishedDate)??"");return P0.jsxs(m,{k:String(Z+1),children:[X?P0.jsx("a",{href:X,rel:"noreferrer",target:"_blank",children:f}):f,G&&P0.jsxs("span",{className:"tv-faint",children:[" (",G,")"]}),z&&P0.jsxs("span",{className:"tv-muted",children:[" · ",z]})]})}function fM({args:Y,result:Z}){let X=A(Y.query),f=A(Y.recency),G=O(Y.limit),z=O(Y.num_search_results),J=P(Z),U=J&&I(J.response)?J.response:null,H=J?A(J.error):null,W=U?A(U.provider):null,Q=U?A(U.model):null,R=U?A(U.authMode):null,q=U&&Array.isArray(U.sources)?U.sources.filter(I):[],M=Q&&W?`${Q} @ ${W}`:Q??W??"";if(M&&R)M+=` (${R==="oauth"?"OAuth":R==="api_key"?"API":R})`;let B=U&&I(U.usage)?U.usage:null,N=[];if(B){let u=O(B.inputTokens),w=O(B.outputTokens),_=O(B.totalTokens),L=O(B.searchRequests);if(u!==null)N.push(`in ${u}`);if(w!==null)N.push(`out ${w}`);if(_!==null)N.push(`total ${_}`);if(L!==null)N.push(`search ${L}`)}return P0.jsxs(P0.Fragment,{children:[P0.jsx(o,{items:[f&&`recency=${f}`,G!==null&&`limit=${G}`,z!==null&&`results=${z}`,U&&`${q.length} source${q.length===1?"":"s"}`]}),(X!==null||M||N.length>0)&&P0.jsxs(O0,{children:[X!==null&&P0.jsx(E,{k:"query",children:X}),M&&P0.jsx(E,{k:"provider",children:M}),N.length>0&&P0.jsx(E,{k:"usage",children:N.join(" · ")})]}),H&&!o0(Z)&&P0.jsx(p,{tone:"err",children:H}),P0.jsx(S,{result:Z,maxLines:14,lang:"markdown"}),q.length>0&&P0.jsx("div",{className:"tv-list",children:q.map((u,w)=>P0.jsx(XM,{source:u,index:w},A(u.url)??w))})]})}var AA={Summary:ZM,Body:fM};var l0=K($(),1);function GM(Y){if(!Y||!I(Y.diagnostics))return null;let Z=Y.diagnostics,X=[];if(Array.isArray(Z.messages)){for(let G of Z.messages)if(typeof G==="string")X.push(G)}let f=A(Z.summary);if(X.length===0&&!f)return null;return{server:A(Z.server)??void 0,messages:X,summary:f,errored:Z.errored===!0}}function zM({args:Y}){let Z=A(Y.file_path??Y.path),X=A(Y.content),f=X?X.split(`
|
|
36
36
|
`).length:0;return l0.jsxs(l0.Fragment,{children:[Z===null?l0.jsx(h,{what:"path"}):l0.jsx(Z0,{path:Z}),f>1&&l0.jsxs(l0.Fragment,{children:[" ",l0.jsxs(D,{children:[f," lines"]})]})]})}function JM({args:Y,result:Z}){let X=A(Y.file_path??Y.path),f=A(Y.content),G=P(Z),z=GM(G);return l0.jsxs(l0.Fragment,{children:[l0.jsx(o,{items:[G?.madeExecutable===!0&&l0.jsx(D,{tone:"ok",children:"made executable"}),z?.summary&&l0.jsxs(D,{tone:z.errored?"err":"warn",children:[z.server?`${z.server}: `:"",z.summary]})]}),f===null?l0.jsxs(p,{tone:"err",children:[l0.jsx(h,{what:"content"})," — expected string"]}):f&&l0.jsx(O7,{code:f,lang:X?LZ(X):null,maxLines:12}),l0.jsx(S,{result:Z,maxLines:4}),z&&z.messages.length>0&&l0.jsx(n,{text:z.messages.join(`
|
|
37
|
-
`),title:"diagnostics",error:z.errored,maxLines:8})]})}var WA={Summary:zM,Body:JM};var XY=K($(),1);function UM({args:Y}){return XY.jsx("span",{children:DZ(Y.data??Y)})}function HM({args:Y,result:Z}){let X="";if(Y.data!==void 0)try{X=JSON.stringify(Y.data,null,2)??""}catch{X=String(Y.data)}return XY.jsxs(XY.Fragment,{children:[X&&XY.jsx(n,{text:X,lang:"json",variant:"code",maxLines:12}),XY.jsx(S,{result:Z,maxLines:6})]})}var qA={Summary:UM,Body:HM};var AM={ask:XH,ast_edit:zH,ast_grep:HH,bash:AH,browser:eG,puppeteer:eG,debug:qH,edit:Y8,apply_patch:Y8,eval:$X,js:$X,python:$X,notebook:$X,fetch:DH,glob:X8,find:X8,generate_image:BH,github:IH,goal:SH,inspect_image:PH,irc:jH,job:CX,await:CX,poll:CX,cancel_job:CX,lsp:cH,recall:lH,reflect:pH,retain:oH,read:rH,report_finding:sH,report_tool_issue:tH,resolve:eH,grep:f8,search:f8,search_tool_bm25:ZA,ssh:XA,task:JA,todo:HA,web_search:AA,write:WA,yield:qA};function QA(Y){return AM[Y]??sU}var F7=K($(),1);function WM(Y){if(!I(Y))return{args:{},intent:void 0};let Z=typeof Y[TX]==="string"?Y[TX].trim():void 0;if(!(TX in Y))return{args:Y,intent:Z};let X={};for(let f in Y)if(f!==TX)X[f]=Y[f];return{args:X,intent:Z}}function _A(Y){let[Z,X]=MA.useState(Y.defaultOpen??!1),{args:f,intent:G}=WM(Y.args),z=Y.intent?.trim()||G,J=QA(Y.name),U={name:Y.name,args:f,result:Y.result,running:Y.running,host:Y.host},H=Y.result?.isError===!0,W=Y.running?"run":H?"err":Y.result?"ok":"pending",Q=Y.running&&!Y.result&&Y.partial?KX(N6(Y.partial)):"";return F7.jsxs("div",{className:`tv-card${H?" tv-card--error":""}`,children:[F7.jsxs("button",{type:"button",className:"tv-head","aria-expanded":Z,onClick:()=>X((R)=>!R),title:z||void 0,children:[W==="run"?F7.jsx("span",{className:"tv-spin","aria-label":"running"}):F7.jsx("span",{className:`tv-status tv-status--${W}`,"aria-hidden":"true"}),F7.jsx("span",{className:"tv-name",children:Y.name}),F7.jsx("span",{className:"tv-sum",children:F7.jsx(J.Summary,{...U})}),F7.jsx("span",{className:"tv-chev","aria-hidden":"true"})]}),Z&&F7.jsxs("div",{className:"tv-body",children:[z&&F7.jsx("div",{className:"tv-intent",children:z}),J.Body?F7.jsx(J.Body,{...U}):null]}),Q&&F7.jsx("pre",{className:"tv-partial",children:Q.length>2048?`…${Q.slice(-2048)}`:Q})]})}var DA=K($(),1);class wA extends HTMLElement{#Y=null;#Z=null;set data(Y){this.#Z=Y,this.#X()}connectedCallback(){this.#X()}disconnectedCallback(){let Y=this.#Y;if(this.#Y=null,Y)queueMicrotask(()=>Y.unmount())}#f(){if(this.#Z)return this.#Z;let Y=this.getAttribute("data-key");if(Y){let f=globalThis.
|
|
37
|
+
`),title:"diagnostics",error:z.errored,maxLines:8})]})}var WA={Summary:zM,Body:JM};var XY=K($(),1);function UM({args:Y}){return XY.jsx("span",{children:DZ(Y.data??Y)})}function HM({args:Y,result:Z}){let X="";if(Y.data!==void 0)try{X=JSON.stringify(Y.data,null,2)??""}catch{X=String(Y.data)}return XY.jsxs(XY.Fragment,{children:[X&&XY.jsx(n,{text:X,lang:"json",variant:"code",maxLines:12}),XY.jsx(S,{result:Z,maxLines:6})]})}var qA={Summary:UM,Body:HM};var AM={ask:XH,ast_edit:zH,ast_grep:HH,bash:AH,browser:eG,puppeteer:eG,debug:qH,edit:Y8,apply_patch:Y8,eval:$X,js:$X,python:$X,notebook:$X,fetch:DH,glob:X8,find:X8,generate_image:BH,github:IH,goal:SH,inspect_image:PH,irc:jH,job:CX,await:CX,poll:CX,cancel_job:CX,lsp:cH,recall:lH,reflect:pH,retain:oH,read:rH,report_finding:sH,report_tool_issue:tH,resolve:eH,grep:f8,search:f8,search_tool_bm25:ZA,ssh:XA,task:JA,todo:HA,web_search:AA,write:WA,yield:qA};function QA(Y){return AM[Y]??sU}var F7=K($(),1);function WM(Y){if(!I(Y))return{args:{},intent:void 0};let Z=typeof Y[TX]==="string"?Y[TX].trim():void 0;if(!(TX in Y))return{args:Y,intent:Z};let X={};for(let f in Y)if(f!==TX)X[f]=Y[f];return{args:X,intent:Z}}function _A(Y){let[Z,X]=MA.useState(Y.defaultOpen??!1),{args:f,intent:G}=WM(Y.args),z=Y.intent?.trim()||G,J=QA(Y.name),U={name:Y.name,args:f,result:Y.result,running:Y.running,host:Y.host},H=Y.result?.isError===!0,W=Y.running?"run":H?"err":Y.result?"ok":"pending",Q=Y.running&&!Y.result&&Y.partial?KX(N6(Y.partial)):"";return F7.jsxs("div",{className:`tv-card${H?" tv-card--error":""}`,children:[F7.jsxs("button",{type:"button",className:"tv-head","aria-expanded":Z,onClick:()=>X((R)=>!R),title:z||void 0,children:[W==="run"?F7.jsx("span",{className:"tv-spin","aria-label":"running"}):F7.jsx("span",{className:`tv-status tv-status--${W}`,"aria-hidden":"true"}),F7.jsx("span",{className:"tv-name",children:Y.name}),F7.jsx("span",{className:"tv-sum",children:F7.jsx(J.Summary,{...U})}),F7.jsx("span",{className:"tv-chev","aria-hidden":"true"})]}),Z&&F7.jsxs("div",{className:"tv-body",children:[z&&F7.jsx("div",{className:"tv-intent",children:z}),J.Body?F7.jsx(J.Body,{...U}):null]}),Q&&F7.jsx("pre",{className:"tv-partial",children:Q.length>2048?`…${Q.slice(-2048)}`:Q})]})}var DA=K($(),1);class wA extends HTMLElement{#Y=null;#Z=null;set data(Y){this.#Z=Y,this.#X()}connectedCallback(){this.#X()}disconnectedCallback(){let Y=this.#Y;if(this.#Y=null,Y)queueMicrotask(()=>Y.unmount())}#f(){if(this.#Z)return this.#Z;let Y=this.getAttribute("data-key");if(Y){let f=globalThis.__JEOPI_TOOL_VIEW_DATA?.get(Y);if(f)return f}let Z=this.getAttribute("payload");if(Z)try{let X=JSON.parse(Z);if(X&&typeof X==="object")return X}catch{}return null}#X(){if(!this.isConnected)return;let Y=this.#f();if(!Y||typeof Y.name!=="string")return;this.#Y??=RA.createRoot(this),this.#Y.render(DA.jsx(_A,{...Y,defaultOpen:Y.defaultOpen??this.hasAttribute("open")}))}}function LA(Y="jeopi-tool-view"){if(!customElements.get(Y))customElements.define(Y,wA)}LA();})();
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Web/export palette — the
|
|
2
|
+
* Web/export palette — the jeopi brand identity shared by the collab-web live
|
|
3
3
|
* client (`my.omp.sh/`) and every public HTML export / share viewer (`/s/<id>`).
|
|
4
4
|
*
|
|
5
5
|
* Why this exists separately from `modes/theme/dark.json`: the `dark` theme is
|
|
6
6
|
* the **default TUI theme** — its amber accent (`#febc38`) drives the terminal
|
|
7
7
|
* status line, syntax highlighting, thinking levels, and bash/python mode
|
|
8
|
-
* colors for every
|
|
8
|
+
* colors for every jeopi user. The public web artifacts want the collab-web
|
|
9
9
|
* pink/purple identity instead, so they pin this palette rather than inheriting
|
|
10
10
|
* the TUI's. Editing `dark.json` to repurpose it for the web would repaint
|
|
11
11
|
* every terminal; this file keeps the two surfaces decoupled.
|
package/src/export/share.ts
CHANGED
|
@@ -40,7 +40,7 @@ const GIST_MAX_SEALED_BYTES = 5_000_000;
|
|
|
40
40
|
const IV_LENGTH = 12;
|
|
41
41
|
const SHARE_KEY_BYTES = 32;
|
|
42
42
|
/** The viewer picks the gist file by this suffix. */
|
|
43
|
-
const GIST_FILENAME = "session.
|
|
43
|
+
const GIST_FILENAME = "session.jeopishare.txt";
|
|
44
44
|
/** Gist ids are hex; the relay never issues pure-hex ids, so the viewer can route on shape. */
|
|
45
45
|
const GIST_ID_RE = /^[0-9a-f]{20,64}$/;
|
|
46
46
|
|