@kw-yeh/vibeflow 4.11.34 → 4.11.38
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/vibeflow.mjs +320 -16
- package/dist/web/404/index.html +1 -1
- package/dist/web/404.html +1 -1
- package/dist/web/_next/static/{iybQktKL4OxAZEKjzdSYP → 3LDsWmgCIL5P63CLLw9Ph}/_buildManifest.js +1 -1
- package/dist/web/_next/static/chunks/{6646-4e91d829d8130f2c.js → 5174-9f90ae432131a522.js} +2 -2
- package/dist/web/_next/static/chunks/pages/{_app-8718d90c431152c1.js → _app-ba514e8a4a55baf5.js} +1 -1
- package/dist/web/_next/static/chunks/pages/home-bae9ffb64fa6efa3.js +13 -0
- package/dist/web/_next/static/css/07822becd778a410.css +2 -0
- package/dist/web/home/index.html +1 -1
- package/package.json +1 -1
- package/dist/web/_next/static/chunks/pages/home-0fe9adbbe738c60f.js +0 -13
- package/dist/web/_next/static/css/1b8cc89c93b78db0.css +0 -2
- /package/dist/web/_next/static/{iybQktKL4OxAZEKjzdSYP → 3LDsWmgCIL5P63CLLw9Ph}/_ssgManifest.js +0 -0
package/dist/vibeflow.mjs
CHANGED
|
@@ -494,6 +494,9 @@ var init_tmux_backend = __esm({
|
|
|
494
494
|
write(key, data) {
|
|
495
495
|
this.clients.get(key)?.proc.write(data);
|
|
496
496
|
}
|
|
497
|
+
isAttached(key) {
|
|
498
|
+
return this.clients.has(key);
|
|
499
|
+
}
|
|
497
500
|
resize(key, cols, rows) {
|
|
498
501
|
try {
|
|
499
502
|
this.clients.get(key)?.proc.resize(Math.max(cols, 1), Math.max(rows, 1));
|
|
@@ -543,6 +546,7 @@ function boardEnvPrefix(task, opts, workspacePath) {
|
|
|
543
546
|
if (!board) return "";
|
|
544
547
|
const entries = [
|
|
545
548
|
["VIBEFLOW_TASK_ID", task.id],
|
|
549
|
+
["VIBEFLOW_MASTER_ID", task.masterId],
|
|
546
550
|
["VIBEFLOW_PROJECT_PATH", task.projectPath],
|
|
547
551
|
["VIBEFLOW_BRANCH", task.branch],
|
|
548
552
|
["VIBEFLOW_BASE_BRANCH", task.baseBranch],
|
|
@@ -594,6 +598,26 @@ function buildClaudeSettings(worktreePath) {
|
|
|
594
598
|
function resolveSystemPrompt(custom) {
|
|
595
599
|
return custom && custom.trim() ? custom : "";
|
|
596
600
|
}
|
|
601
|
+
function slaveSystemPrompt(opts) {
|
|
602
|
+
const lines = [
|
|
603
|
+
"\u9019\u5F35\u5361\u7247\u7531 VibeFlow \u7684 Master agent \u6D3E\u5DE5\u4E26\u7D71\u7C4C\uFF08master \u7684 id \u5728 $VIBEFLOW_MASTER_ID\uFF09\uFF1B\u4F7F\u7528\u8005\u4E3B\u8981\u900F\u904E master \u8DDF\u4F60\u5354\u4F5C\u3002",
|
|
604
|
+
'\u4F60\u6536\u5230\u7684 <vibeflow from="\u2026"> \u8A0A\u606F\u4F86\u81EA master \u6216 VibeFlow \u672C\u8EAB\uFF0C\u7167\u5176\u4E2D\u7684\u6307\u793A\u505A\u3002'
|
|
605
|
+
];
|
|
606
|
+
if (!opts.canWrite) {
|
|
607
|
+
lines.push("\u9019\u6B21\u555F\u52D5\u7121\u6CD5\u4F7F\u7528 board CLI\uFF0C\u4F60\u4E0D\u80FD\u4E3B\u52D5\u56DE\u5831\uFF1B\u5B8C\u6210\u6216\u5361\u4F4F\u6642\u76F4\u63A5\u5728 terminal \u5BEB\u6E05\u695A\u7D50\u679C\u3002");
|
|
608
|
+
return lines.join("\n");
|
|
609
|
+
}
|
|
610
|
+
lines.push(
|
|
611
|
+
"",
|
|
612
|
+
...BOARD_CLI_SETUP,
|
|
613
|
+
"",
|
|
614
|
+
"\u56DE\u5831\uFF1A\u4EFB\u52D9\u5B8C\u6210\u3001\u9700\u8981 master \u6C7A\u5B9A\u3001\u6216\u5361\u4F4F\u7121\u6CD5\u7E7C\u7E8C\u6642\uFF0C\u7ACB\u523B\u7528\u9019\u500B\u6307\u4EE4\u56DE\u5831\uFF0C\u7136\u5F8C\u505C\u4E0B\u4F86\u7B49\u4E0B\u4E00\u6B65\u6307\u793A\uFF1A",
|
|
615
|
+
' VF task send --store-path "$VIBEFLOW_STORE_DIR" --task "$VIBEFLOW_MASTER_ID" --text "<\u56DE\u5831\u5167\u5BB9>"',
|
|
616
|
+
"\u56DE\u5831\u5167\u5BB9\u8981\u81EA\u5305\u542B\uFF1A\u505A\u4E86\u4EC0\u9EBC\u3001\u600E\u9EBC\u9A57\u8B49\u3001\u7D50\u679C\uFF1B\u9A57\u6536\u985E\u5DE5\u4F5C\u9010\u9805\u5217\u51FA\u901A\u904E\u8207\u672A\u901A\u904E\u7684\u9805\u76EE\u53CA\u91CD\u73FE\u6B65\u9A5F\uFF1B\u958B\u4E86 PR \u5C31\u9644\u4E0A\u9023\u7D50\u3002",
|
|
617
|
+
"\u6C92\u6709 master \u8981\u6C42\u5C31\u4E0D\u8981\u958B PR\u3002"
|
|
618
|
+
);
|
|
619
|
+
return lines.join("\n");
|
|
620
|
+
}
|
|
597
621
|
function masterSystemPrompt(opts) {
|
|
598
622
|
const lines = [
|
|
599
623
|
"\u4F60\u662F VibeFlow \u7684 Master agent\uFF0C\u4E0D\u5C6C\u65BC\u4EFB\u4F55 repo\uFF0C\u5DE5\u4F5C\u76EE\u9304\u53EA\u662F\u4F60\u7684\u7B46\u8A18\u5340\u3002",
|
|
@@ -608,21 +632,26 @@ function masterSystemPrompt(opts) {
|
|
|
608
632
|
return lines.join("\n");
|
|
609
633
|
}
|
|
610
634
|
lines.push(
|
|
611
|
-
|
|
612
|
-
' VF() { if [ -n "$VIBEFLOW_CLI_LOADER" ]; then node --experimental-strip-types --import "$VIBEFLOW_CLI_LOADER" "$VIBEFLOW_CLI" "$@"; else node "$VIBEFLOW_CLI" "$@"; fi; }',
|
|
635
|
+
...BOARD_CLI_SETUP,
|
|
613
636
|
"",
|
|
614
637
|
"1. \u5224\u65B7\uFF1A\u4E00\u5F35\u5361\u505A\u5F97\u5B8C\u5C31\u53EA\u5EFA\u4E00\u5F35\uFF1B\u6D89\u53CA\u591A\u500B repo \u6216\u53EF\u5E73\u884C\u7684\u7368\u7ACB\u5DE5\u4F5C\u624D\u62C6\u6210\u591A\u5F35\u3002\u6BCF\u5F35\u53EA\u52D5\u4E00\u500B repo\uFF0C\u5404\u81EA\u80FD\u7368\u7ACB\u9A57\u6536\u3002",
|
|
615
638
|
'2. \u6D3E\u5DE5\uFF1AVF task create --store-path "$VIBEFLOW_STORE_DIR" --master "$VIBEFLOW_TASK_ID" --project <repo \u7D55\u5C0D\u8DEF\u5F91> --title <\u6A19\u984C> --prompt <\u5167\u5BB9>',
|
|
616
639
|
" prompt \u5FC5\u9808\u81EA\u5305\u542B\uFF1A\u80CC\u666F\u3001\u7BC4\u570D\u3001\u9A57\u6536\u689D\u4EF6\u3001\u8207\u5176\u4ED6\u5361\u7684\u4ECB\u9762\u7D04\u5B9A\u2014\u2014slave \u770B\u4E0D\u5230\u4F60\u7684\u5C0D\u8A71\u3002",
|
|
640
|
+
" \u6A19\u984C\u8981\u77ED\u3001\u5F7C\u6B64\u4E00\u773C\u5206\u5F97\u51FA\u4F86\uFF1A\u4EE5\u9019\u5F35\u5361\u8CA0\u8CAC\u7684\u90E8\u5206\u958B\u982D\uFF08\u4F8B\u5982\u300C\u5F8C\u7AEF\uFF1A\u2026\u300D\u300C\u9A57\u6536\uFF1A\u2026\u300D\uFF09\uFF0C\u4E0D\u8981\u8B93\u591A\u5F35\u5361\u5171\u7528\u540C\u4E00\u6BB5\u958B\u982D\u3002",
|
|
617
641
|
" \u9700\u8981\u6642\u53EF\u52A0 --agent / --model / --effort / --base-branch\u3002"
|
|
618
642
|
);
|
|
619
643
|
lines.push(
|
|
620
644
|
opts.autoMode ? '3. \u555F\u52D5\uFF1A\u6C92\u6709\u524D\u7F6E\u4F9D\u8CF4\u7684\u5361\u76F4\u63A5 VF task start --store-path "$VIBEFLOW_STORE_DIR" --task <id>\uFF1B\u6709\u4F9D\u8CF4\u7684\u5148\u7559\u5728 Backlog\uFF0C\u524D\u7F6E\u5361\u5B8C\u6210\u5F8C\u518D\u555F\u52D5\u3002' : "3. \u555F\u52D5\uFF1A\u4E0D\u8981\u81EA\u5DF1\u555F\u52D5\u5361\u7247\u3002\u5217\u51FA\u4F60\u5EFA\u4E86\u54EA\u4E9B\u5361\u3001\u5EFA\u8B70\u7684\u555F\u52D5\u9806\u5E8F\uFF0C\u7B49\u4F7F\u7528\u8005\u5728 VibeFlow \u6309\u958B\u59CB\u3002"
|
|
621
645
|
);
|
|
622
646
|
lines.push(
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
647
|
+
"4. \u56DE\u5831\u6703\u81EA\u5DF1\u9001\u4F86\uFF1Aslave \u505A\u5B8C\u3001\u8981\u4F60\u6C7A\u5B9A\u6216\u5361\u4F4F\u6642\u6703\u7528 task send \u56DE\u5831\uFF1Bslave \u5361\u5728\u6B0A\u9650\u78BA\u8A8D\u3001\u555F\u52D5\u5931\u6557\u3001session \u7D50\u675F\u3001\u6216\u56DE\u5408\u7D50\u675F\u537B\u6C92\u56DE\u5831\u6642\uFF0CVibeFlow \u4E5F\u6703\u901A\u77E5\u4F60\u3002",
|
|
648
|
+
' \u9019\u4E9B\u8A0A\u606F\u4EE5 <vibeflow from="\u2026"> \u5305\u4F4F\u3001\u76F4\u63A5\u51FA\u73FE\u5728\u4F60\u7684\u8F38\u5165\u88E1\u3002\u4E0D\u8981\u8F2A\u8A62 task list\uFF1B\u8981\u770B\u7D30\u7BC0\u6642\u624D\u7528 VF task show --store-path "$VIBEFLOW_STORE_DIR" --task <id>\u3002',
|
|
649
|
+
'5. \u8ABF\u5EA6\uFF1A\u7528 VF task send --store-path "$VIBEFLOW_STORE_DIR" --task <id> --text <\u5167\u5BB9> \u5C0D\u81EA\u5DF1\u7684\u5361\u4E0B\u6307\u793A\uFF1B\u5361\u8207\u5361\u4E4B\u9593\u4E0D\u80FD\u76F4\u63A5\u50B3\u8A71\uFF0C\u4E00\u5F8B\u7D93\u904E\u4F60\u3002',
|
|
650
|
+
" \u9700\u8981\u7368\u7ACB\u9A57\u6536\u6642\u53E6\u958B\u4E00\u5F35\u9A57\u6536\u5361\u3002\u9A57\u6536\u56DE\u5831\u554F\u984C\u6642\uFF0C\u628A\u5177\u9AD4\u554F\u984C\u8207\u91CD\u73FE\u6B65\u9A5F\u6574\u7406\u597D\u8F49\u7D66\u8CA0\u8CAC\u958B\u767C\u7684\u5361\u4FEE\u6B63\uFF0C\u4FEE\u5B8C\u518D\u8ACB\u9A57\u6536\u5361\u8907\u9A57\uFF0C\u76F4\u5230\u901A\u904E\u3002",
|
|
651
|
+
" task send \u56DE TARGET_BLOCKED \u4EE3\u8868\u5C0D\u65B9\u5361\u5728\u6B0A\u9650\u78BA\u8A8D\uFF0C\u8ACB\u4F7F\u7528\u8005\u5230\u90A3\u5F35\u5361\u8655\u7406\u3002",
|
|
652
|
+
"6. PR\uFF1A\u9A57\u6536\u901A\u904E\u5F8C\uFF0C\u4EA4\u4EE3\u958B\u767C\u5361\u7528 pr skill \u958B PR\uFF08\u74B0\u5883\u88E1\u6C92\u6709\u9019\u500B skill \u5C31\u7528 gh pr create\uFF09\uFF0C\u4E26\u56DE\u5831 PR \u9023\u7D50\u7D66\u4F60\u3002",
|
|
653
|
+
"7. \u4F7F\u7528\u8005\u4E3B\u8981\u53EA\u8DDF\u4F60\u6E9D\u901A\uFF1A\u4E3B\u52D5\u5411\u4F7F\u7528\u8005\u56DE\u5831\u6574\u9AD4\u9032\u5EA6\u8207\u9700\u8981\u4F7F\u7528\u8005\u6C7A\u5B9A\u7684\u4E8B\u3002\u4F60\u4E0D\u6703\u628A\u5361\u7247\u79FB\u5230 Done\u3001\u4E0D\u6703\u5408\u4F75 PR\uFF1B\u5168\u90E8\u5B8C\u6210\u5F8C\u6574\u7406\u6BCF\u5F35\u5361\u7684\u7D50\u679C\u8207 PR \u9023\u7D50\uFF0C\u4EA4\u7D66\u4F7F\u7528\u8005\u505A\u6700\u5F8C\u78BA\u8A8D\u3002",
|
|
654
|
+
" \u8DDF\u4F7F\u7528\u8005\u63D0\u5230\u4EFB\u4F55\u4E00\u5F35\u5361\u6642\uFF0C\u4E00\u5F8B\u5BEB\u6210 <id>\u300C<\u6A19\u984C>\u300D\u2014\u2014\u5361\u7247\u4E0A\u770B\u5F97\u5230 id\uFF0C\u4F7F\u7528\u8005\u9760\u5B83\u5C0D\u4E0A\u662F\u54EA\u4E00\u5F35\u3002"
|
|
626
655
|
);
|
|
627
656
|
return lines.join("\n");
|
|
628
657
|
}
|
|
@@ -687,7 +716,9 @@ function buildAgentCommand(task, systemPrompt, opts, workspacePath) {
|
|
|
687
716
|
const agent = taskAgent(task);
|
|
688
717
|
const model = taskModel(task);
|
|
689
718
|
const custom = resolveSystemPrompt(systemPrompt);
|
|
690
|
-
const
|
|
719
|
+
const canWrite = Boolean(opts?.boardCli?.cliPath);
|
|
720
|
+
const role = task.role === "master" ? masterSystemPrompt({ canWrite, autoMode: opts?.autoMode === true }) : task.masterId ? slaveSystemPrompt({ canWrite }) : null;
|
|
721
|
+
const sys = role ? [custom, role].filter(Boolean).join("\n\n") : custom;
|
|
691
722
|
const includeTaskPrompt = opts?.includeTaskPrompt !== false;
|
|
692
723
|
const prompt = includeTaskPrompt && !opts?.resume ? buildPrompt(task) : "";
|
|
693
724
|
const sessionId = agent === "claude" && includeTaskPrompt ? executorSessionId(task.id, task.runId) : void 0;
|
|
@@ -703,7 +734,7 @@ function buildAgentCommand(task, systemPrompt, opts, workspacePath) {
|
|
|
703
734
|
workspacePath
|
|
704
735
|
);
|
|
705
736
|
}
|
|
706
|
-
var ARTIFACTS_DIR_SUFFIX, SCRATCH_DIR_NAME, ARTIFACTS_FALLBACK_DIR, AUTO_PERMISSION_MODE, SUBAGENTS_DIR2, PROGRESS_EVENTS_DIR, TODO_TOOLS, AGENT_NAMES, RETIRED_MODELS;
|
|
737
|
+
var ARTIFACTS_DIR_SUFFIX, SCRATCH_DIR_NAME, ARTIFACTS_FALLBACK_DIR, AUTO_PERMISSION_MODE, SUBAGENTS_DIR2, PROGRESS_EVENTS_DIR, TODO_TOOLS, BOARD_CLI_SETUP, AGENT_NAMES, RETIRED_MODELS;
|
|
707
738
|
var init_launch = __esm({
|
|
708
739
|
"packages/core/src/launch.ts"() {
|
|
709
740
|
"use strict";
|
|
@@ -714,6 +745,10 @@ var init_launch = __esm({
|
|
|
714
745
|
SUBAGENTS_DIR2 = ".vibeflow-subagents";
|
|
715
746
|
PROGRESS_EVENTS_DIR = ".vibeflow-events";
|
|
716
747
|
TODO_TOOLS = "TodoWrite|TaskCreate|TaskUpdate";
|
|
748
|
+
BOARD_CLI_SETUP = [
|
|
749
|
+
'\u5148\u5B9A\u7FA9\u9019\u500B shell \u51FD\u5F0F\uFF0C\u4E4B\u5F8C\u6240\u6709\u6307\u4EE4\u90FD\u7528\u5B83\uFF0C\u4E26\u4E14\u4E00\u5F8B\u5E36\u4E0A --store-path "$VIBEFLOW_STORE_DIR"\uFF1A',
|
|
750
|
+
' VF() { if [ -n "$VIBEFLOW_CLI_LOADER" ]; then node --experimental-strip-types --import "$VIBEFLOW_CLI_LOADER" "$VIBEFLOW_CLI" "$@"; else node "$VIBEFLOW_CLI" "$@"; fi; }'
|
|
751
|
+
];
|
|
717
752
|
AGENT_NAMES = {
|
|
718
753
|
claude: "Claude Code",
|
|
719
754
|
codex: "Codex CLI"
|
|
@@ -2579,6 +2614,8 @@ function createBridge(t) {
|
|
|
2579
2614
|
startTask: (taskId) => t.invoke("vibeflow:startTask", taskId),
|
|
2580
2615
|
/** Cards as a master sees them; filter by master or a single card. */
|
|
2581
2616
|
taskSummaries: (filter) => t.invoke("task:summaries", filter),
|
|
2617
|
+
/** Type a message into another card's agent: a master to its cards, a card to its master. */
|
|
2618
|
+
sendMessage: (payload) => t.invoke("vibeflow:sendMessage", payload),
|
|
2582
2619
|
/** Clear prior execution state and prepare a fresh run of this task. */
|
|
2583
2620
|
resetTaskRun: (taskId) => t.invoke("vibeflow:resetTaskRun", taskId),
|
|
2584
2621
|
removeTask: (taskId) => t.invoke("vibeflow:removeTask", taskId),
|
|
@@ -4748,7 +4785,7 @@ function connectToHost(lock) {
|
|
|
4748
4785
|
// packages/cli/src/task-command.ts
|
|
4749
4786
|
var AGENT_IDS = AGENT_CLIS.map((agent) => agent.id);
|
|
4750
4787
|
var STATUSES = ["backlog", "in_progress", "done"];
|
|
4751
|
-
var SUBCOMMANDS = ["create", "update", "start", "list", "show", "artifact"];
|
|
4788
|
+
var SUBCOMMANDS = ["create", "update", "start", "list", "show", "send", "artifact"];
|
|
4752
4789
|
var ROLES = ["slave", "master"];
|
|
4753
4790
|
var MODES = ["existing", "new"];
|
|
4754
4791
|
var AUTO_MODES = ["on", "off"];
|
|
@@ -4761,6 +4798,7 @@ Usage:
|
|
|
4761
4798
|
vibeflow task start --task <id> [options]
|
|
4762
4799
|
vibeflow task list [--master <id>] [options]
|
|
4763
4800
|
vibeflow task show --task <id> [options]
|
|
4801
|
+
vibeflow task send --task <id> --text <text> [options]
|
|
4764
4802
|
vibeflow task artifact add --file <path> [options]
|
|
4765
4803
|
|
|
4766
4804
|
task create options:
|
|
@@ -4769,7 +4807,8 @@ task create options:
|
|
|
4769
4807
|
--project <path> Target project directory (required for a slave)
|
|
4770
4808
|
--work-dir <path> Master only: run in this existing folder (git or not)
|
|
4771
4809
|
instead of one VibeFlow creates
|
|
4772
|
-
--master <id> Dispatch the new card under this master card
|
|
4810
|
+
--master <id> Dispatch the new card under this master card (default: the
|
|
4811
|
+
calling card, when a master runs this from its own shell)
|
|
4773
4812
|
--title <text> Task title (required)
|
|
4774
4813
|
--prompt <text> Task prompt / description (required)
|
|
4775
4814
|
--status <column> ${STATUSES.join(" | ")} (default: backlog)
|
|
@@ -4800,12 +4839,17 @@ task update options:
|
|
|
4800
4839
|
At least one of --title / --prompt / --status / --master is required. Branch,
|
|
4801
4840
|
worktree and project path are provisioned on disk and cannot be changed here.
|
|
4802
4841
|
|
|
4803
|
-
task start / list / show (need the running VibeFlow host):
|
|
4842
|
+
task start / list / show / send (need the running VibeFlow host):
|
|
4804
4843
|
start --task <id> Move a Backlog card to In Progress and start its agent,
|
|
4805
4844
|
the same as dragging it in the app
|
|
4806
4845
|
list [--master <id>] Every card, or one master's cards, with column, whether
|
|
4807
4846
|
its agent is running, todo progress, activity and PR
|
|
4808
4847
|
show --task <id> The same summary for one card
|
|
4848
|
+
send --task <id> --text <text> [--force] [--from <id>]
|
|
4849
|
+
Type a message into that card's agent, tagged with the
|
|
4850
|
+
sender. Only a master and its own cards can message each
|
|
4851
|
+
other. --from defaults to VIBEFLOW_TASK_ID; --force types
|
|
4852
|
+
even into a permission dialog
|
|
4809
4853
|
|
|
4810
4854
|
task artifact add options:
|
|
4811
4855
|
--file <path> Copy a file into the card's user-facing Artifacts folder
|
|
@@ -4884,6 +4928,9 @@ async function taskCommand(argv) {
|
|
|
4884
4928
|
"auto-mode": { type: "string" },
|
|
4885
4929
|
attach: { type: "string", multiple: true },
|
|
4886
4930
|
file: { type: "string" },
|
|
4931
|
+
text: { type: "string" },
|
|
4932
|
+
from: { type: "string" },
|
|
4933
|
+
force: { type: "boolean" },
|
|
4887
4934
|
"store-path": { type: "string" },
|
|
4888
4935
|
profile: { type: "string" },
|
|
4889
4936
|
help: { type: "boolean", short: "h" }
|
|
@@ -4962,11 +5009,13 @@ async function taskCommand(argv) {
|
|
|
4962
5009
|
} catch (err) {
|
|
4963
5010
|
fail("ATTACHMENT_READ_FAILED", `\u7121\u6CD5\u8B80\u53D6\u9644\u4EF6\uFF1A${err.message}`);
|
|
4964
5011
|
}
|
|
5012
|
+
const caller = process.env.VIBEFLOW_TASK_ID ? findTask(process.env.VIBEFLOW_TASK_ID) : void 0;
|
|
5013
|
+
const masterId = values.master ?? (!master && caller && isMasterTask(caller) ? caller.id : void 0);
|
|
4965
5014
|
const { task, storePath: resolvedPath } = await createTaskFromInput({
|
|
4966
5015
|
projectPath: values.project,
|
|
4967
5016
|
role: master ? "master" : void 0,
|
|
4968
5017
|
workDir: values["work-dir"],
|
|
4969
|
-
masterId
|
|
5018
|
+
masterId,
|
|
4970
5019
|
title: values.title,
|
|
4971
5020
|
description: values.prompt,
|
|
4972
5021
|
status: values.status ?? "backlog",
|
|
@@ -4998,9 +5047,13 @@ async function taskCommand(argv) {
|
|
|
4998
5047
|
}
|
|
4999
5048
|
};
|
|
5000
5049
|
}
|
|
5001
|
-
var HOST_COMMANDS = ["start", "list", "show"];
|
|
5050
|
+
var HOST_COMMANDS = ["start", "list", "show", "send"];
|
|
5002
5051
|
async function hostCommand(sub, values, storePath) {
|
|
5003
5052
|
if (sub !== "list" && !values.task) fail("MISSING_ARGUMENT", "Missing required arguments: --task");
|
|
5053
|
+
const from = values.from ?? process.env.VIBEFLOW_TASK_ID;
|
|
5054
|
+
if (sub === "send" && (!values.text || !from)) {
|
|
5055
|
+
fail("MISSING_ARGUMENT", "task send needs --text and --from (or VIBEFLOW_TASK_ID)");
|
|
5056
|
+
}
|
|
5004
5057
|
const lock = liveHost(storePath);
|
|
5005
5058
|
if (!lock) fail("HOST_NOT_RUNNING", `No VibeFlow host is running for ${storePath}. Start it with \`vibeflow\` first.`);
|
|
5006
5059
|
const remote = connectToHost(lock);
|
|
@@ -5009,12 +5062,21 @@ async function hostCommand(sub, values, storePath) {
|
|
|
5009
5062
|
const { task } = await remote.api.startTask(values.task);
|
|
5010
5063
|
return { task: { id: task.id, title: task.title, worktreePath: task.worktreePath ?? null } };
|
|
5011
5064
|
}
|
|
5065
|
+
if (sub === "send") {
|
|
5066
|
+
try {
|
|
5067
|
+
return await remote.api.sendMessage({ from, to: values.task, text: values.text, force: values.force === true });
|
|
5068
|
+
} catch (err) {
|
|
5069
|
+
const e = err;
|
|
5070
|
+
fail(e.code ?? "HOST_ERROR", e.message ?? String(err));
|
|
5071
|
+
}
|
|
5072
|
+
}
|
|
5012
5073
|
if (sub === "show") {
|
|
5013
5074
|
const [task] = await remote.api.taskSummaries({ taskId: values.task });
|
|
5014
5075
|
return { task };
|
|
5015
5076
|
}
|
|
5016
5077
|
return { tasks: await remote.api.taskSummaries(values.master ? { masterId: values.master } : void 0) };
|
|
5017
5078
|
} catch (err) {
|
|
5079
|
+
if (err instanceof CliFailure) throw err;
|
|
5018
5080
|
fail("HOST_ERROR", err.message);
|
|
5019
5081
|
} finally {
|
|
5020
5082
|
remote.close();
|
|
@@ -7199,11 +7261,201 @@ function createProgressTracker(opts) {
|
|
|
7199
7261
|
};
|
|
7200
7262
|
}
|
|
7201
7263
|
|
|
7264
|
+
// packages/core/src/mailbox.ts
|
|
7265
|
+
var PASTE_START = "\x1B[200~";
|
|
7266
|
+
var PASTE_END = "\x1B[201~";
|
|
7267
|
+
var PASTE_GAP_MS = 200;
|
|
7268
|
+
var DEFAULT_QUIET_MS = 3e3;
|
|
7269
|
+
var DEFAULT_TIMEOUT_MS = 12e4;
|
|
7270
|
+
function coded(code2, message) {
|
|
7271
|
+
return Object.assign(new Error(message), { code: code2 });
|
|
7272
|
+
}
|
|
7273
|
+
function isBlocked(activity) {
|
|
7274
|
+
return activity?.state === "waiting" && activity.waitingFor === "permission";
|
|
7275
|
+
}
|
|
7276
|
+
function bracketedPaste(text) {
|
|
7277
|
+
return PASTE_START + text.split(PASTE_END).join("") + PASTE_END;
|
|
7278
|
+
}
|
|
7279
|
+
function frameMessage(from, text) {
|
|
7280
|
+
const sender = from ? `${from.id} ${from.title}`.replace(/["\r\n]/g, " ") : "vibeflow";
|
|
7281
|
+
const body = text.replace(/<(\/?)vibeflow/gi, "\u2039$1vibeflow");
|
|
7282
|
+
return `<vibeflow from="${sender}">
|
|
7283
|
+
${body}
|
|
7284
|
+
</vibeflow>`;
|
|
7285
|
+
}
|
|
7286
|
+
function quietFromEnv() {
|
|
7287
|
+
const n = Number(process.env.VIBEFLOW_QUIET_MS);
|
|
7288
|
+
return Number.isFinite(n) && n >= 0 ? n : DEFAULT_QUIET_MS;
|
|
7289
|
+
}
|
|
7290
|
+
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
7291
|
+
function createMailbox(options) {
|
|
7292
|
+
const lastInput = /* @__PURE__ */ new Map();
|
|
7293
|
+
const held = /* @__PURE__ */ new Map();
|
|
7294
|
+
const turns = /* @__PURE__ */ new Map();
|
|
7295
|
+
async function waitForQuiet(key, started) {
|
|
7296
|
+
const quiet = options.quietMs ?? quietFromEnv();
|
|
7297
|
+
const timeout = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
7298
|
+
for (; ; ) {
|
|
7299
|
+
const left = (lastInput.get(key) ?? 0) + quiet - Date.now();
|
|
7300
|
+
if (left <= 0) return;
|
|
7301
|
+
if (Date.now() - started > timeout) throw coded("TIMEOUT", "the terminal never went quiet");
|
|
7302
|
+
await sleep(Math.min(left, 250));
|
|
7303
|
+
}
|
|
7304
|
+
}
|
|
7305
|
+
async function type(key, text, opts, started) {
|
|
7306
|
+
await waitForQuiet(key, started);
|
|
7307
|
+
if (!opts.force && isBlocked(options.activity(key))) {
|
|
7308
|
+
throw coded("TARGET_BLOCKED", "the agent is on a permission dialog; typing could answer it");
|
|
7309
|
+
}
|
|
7310
|
+
held.set(key, []);
|
|
7311
|
+
try {
|
|
7312
|
+
options.write(key, bracketedPaste(text));
|
|
7313
|
+
await sleep(PASTE_GAP_MS);
|
|
7314
|
+
options.write(key, "\r");
|
|
7315
|
+
} finally {
|
|
7316
|
+
const keys = held.get(key) ?? [];
|
|
7317
|
+
held.delete(key);
|
|
7318
|
+
if (keys.length) {
|
|
7319
|
+
options.write(key, keys.join(""));
|
|
7320
|
+
lastInput.set(key, Date.now());
|
|
7321
|
+
}
|
|
7322
|
+
}
|
|
7323
|
+
return { queuedMs: Date.now() - started };
|
|
7324
|
+
}
|
|
7325
|
+
return {
|
|
7326
|
+
userInput(key, data) {
|
|
7327
|
+
const buffer = held.get(key);
|
|
7328
|
+
if (buffer) {
|
|
7329
|
+
buffer.push(data);
|
|
7330
|
+
return;
|
|
7331
|
+
}
|
|
7332
|
+
lastInput.set(key, Date.now());
|
|
7333
|
+
options.write(key, data);
|
|
7334
|
+
},
|
|
7335
|
+
deliver(key, text, opts = {}) {
|
|
7336
|
+
const started = Date.now();
|
|
7337
|
+
const run3 = (turns.get(key) ?? Promise.resolve()).catch(() => {
|
|
7338
|
+
}).then(() => type(key, text, opts, started));
|
|
7339
|
+
turns.set(key, run3);
|
|
7340
|
+
void run3.finally(() => {
|
|
7341
|
+
if (turns.get(key) === run3) turns.delete(key);
|
|
7342
|
+
}).catch(() => {
|
|
7343
|
+
});
|
|
7344
|
+
return run3;
|
|
7345
|
+
},
|
|
7346
|
+
forget(key) {
|
|
7347
|
+
lastInput.delete(key);
|
|
7348
|
+
held.delete(key);
|
|
7349
|
+
}
|
|
7350
|
+
};
|
|
7351
|
+
}
|
|
7352
|
+
|
|
7353
|
+
// packages/core/src/notifier.ts
|
|
7354
|
+
function describe(kind, id, title, detail) {
|
|
7355
|
+
const card = `\u5361\u7247 ${id}\u300C${title}\u300D`;
|
|
7356
|
+
const look = `\u67E5\u770B\uFF1AVF task show --store-path "$VIBEFLOW_STORE_DIR" --task ${id}`;
|
|
7357
|
+
switch (kind) {
|
|
7358
|
+
case "blocked":
|
|
7359
|
+
return `${card} \u5361\u5728\u6B0A\u9650\u78BA\u8A8D\uFF0C\u7B49\u4F7F\u7528\u8005\u5141\u8A31\u624D\u6703\u7E7C\u7E8C\u3002${look}`;
|
|
7360
|
+
case "launch_failed":
|
|
7361
|
+
return `${card} \u555F\u52D5\u5931\u6557\uFF0C\u5DF2\u9000\u56DE Backlog\uFF1A${detail ?? "\u539F\u56E0\u4E0D\u660E"}\u3002${look}`;
|
|
7362
|
+
case "exited":
|
|
7363
|
+
return `${card} \u7684 agent session \u5DF2\u7D50\u675F\u3002${look}`;
|
|
7364
|
+
case "turn_unreported":
|
|
7365
|
+
return `${card} \u9019\u4E00\u56DE\u5408\u7D50\u675F\u4E86\uFF0C\u4F46\u6C92\u6709\u56DE\u5831\u7D50\u679C\uFF08\u53EF\u80FD\u5728\u7B49\u4EBA\u56DE\u7B54\u554F\u984C\uFF09\u3002${look}`;
|
|
7366
|
+
}
|
|
7367
|
+
}
|
|
7368
|
+
function createNotifier(options) {
|
|
7369
|
+
const states = /* @__PURE__ */ new Map();
|
|
7370
|
+
const inTurn = /* @__PURE__ */ new Set();
|
|
7371
|
+
const reportedThisTurn = /* @__PURE__ */ new Set();
|
|
7372
|
+
const told = /* @__PURE__ */ new Map();
|
|
7373
|
+
const pending = /* @__PURE__ */ new Map();
|
|
7374
|
+
const flushing = /* @__PURE__ */ new Set();
|
|
7375
|
+
function note(taskId, kind, detail) {
|
|
7376
|
+
const card = options.cardOf(taskId);
|
|
7377
|
+
if (!card) return;
|
|
7378
|
+
const seen = told.get(taskId) ?? /* @__PURE__ */ new Set();
|
|
7379
|
+
if (seen.has(kind)) return;
|
|
7380
|
+
seen.add(kind);
|
|
7381
|
+
told.set(taskId, seen);
|
|
7382
|
+
const queue = pending.get(card.masterId) ?? [];
|
|
7383
|
+
queue.push(describe(kind, taskId, card.title, detail));
|
|
7384
|
+
pending.set(card.masterId, queue);
|
|
7385
|
+
schedule(card.masterId);
|
|
7386
|
+
}
|
|
7387
|
+
function schedule(masterId) {
|
|
7388
|
+
setTimeout(() => void flush(masterId), 0);
|
|
7389
|
+
}
|
|
7390
|
+
async function flush(masterId) {
|
|
7391
|
+
if (flushing.has(masterId) || !pending.get(masterId)?.length) return;
|
|
7392
|
+
flushing.add(masterId);
|
|
7393
|
+
try {
|
|
7394
|
+
const can = await options.canReceive(masterId);
|
|
7395
|
+
if (can === "never") {
|
|
7396
|
+
pending.delete(masterId);
|
|
7397
|
+
return;
|
|
7398
|
+
}
|
|
7399
|
+
if (can === "later") return;
|
|
7400
|
+
const batch = pending.get(masterId) ?? [];
|
|
7401
|
+
pending.delete(masterId);
|
|
7402
|
+
try {
|
|
7403
|
+
await options.deliver(masterId, batch.join("\n"));
|
|
7404
|
+
} catch {
|
|
7405
|
+
pending.set(masterId, [...batch, ...pending.get(masterId) ?? []]);
|
|
7406
|
+
}
|
|
7407
|
+
} finally {
|
|
7408
|
+
flushing.delete(masterId);
|
|
7409
|
+
}
|
|
7410
|
+
if (pending.get(masterId)?.length) schedule(masterId);
|
|
7411
|
+
}
|
|
7412
|
+
function turnStarted(taskId) {
|
|
7413
|
+
inTurn.add(taskId);
|
|
7414
|
+
reportedThisTurn.delete(taskId);
|
|
7415
|
+
told.delete(taskId);
|
|
7416
|
+
}
|
|
7417
|
+
return {
|
|
7418
|
+
activity(taskId, activity) {
|
|
7419
|
+
const before = states.get(taskId);
|
|
7420
|
+
states.set(taskId, activity);
|
|
7421
|
+
const wasBlocked = before?.state === "waiting" && before.waitingFor === "permission";
|
|
7422
|
+
if (activity.state === "working") {
|
|
7423
|
+
if (wasBlocked) told.get(taskId)?.delete("blocked");
|
|
7424
|
+
else if (before?.state !== "working") turnStarted(taskId);
|
|
7425
|
+
return;
|
|
7426
|
+
}
|
|
7427
|
+
if (activity.state !== "waiting") return;
|
|
7428
|
+
if (activity.waitingFor === "permission") {
|
|
7429
|
+
note(taskId, "blocked");
|
|
7430
|
+
return;
|
|
7431
|
+
}
|
|
7432
|
+
if (inTurn.delete(taskId) && !reportedThisTurn.has(taskId)) note(taskId, "turn_unreported");
|
|
7433
|
+
},
|
|
7434
|
+
launchFailed(taskId, reason) {
|
|
7435
|
+
note(taskId, "launch_failed", reason);
|
|
7436
|
+
},
|
|
7437
|
+
exited(taskId) {
|
|
7438
|
+
inTurn.delete(taskId);
|
|
7439
|
+
note(taskId, "exited");
|
|
7440
|
+
},
|
|
7441
|
+
reported(taskId) {
|
|
7442
|
+
reportedThisTurn.add(taskId);
|
|
7443
|
+
},
|
|
7444
|
+
retry(masterId) {
|
|
7445
|
+
if (pending.get(masterId)?.length) schedule(masterId);
|
|
7446
|
+
}
|
|
7447
|
+
};
|
|
7448
|
+
}
|
|
7449
|
+
|
|
7202
7450
|
// packages/core/src/service.ts
|
|
7203
7451
|
var InvalidRequestError = class extends Error {
|
|
7204
7452
|
code = "INVALID_REQUEST";
|
|
7205
7453
|
};
|
|
7206
7454
|
var STANDALONE_KEY = /^terminal_[0-9a-f-]{36}$/;
|
|
7455
|
+
var MAX_MESSAGE_LENGTH = 2e4;
|
|
7456
|
+
function coded2(code2, message) {
|
|
7457
|
+
return Object.assign(new Error(message), { code: code2 });
|
|
7458
|
+
}
|
|
7207
7459
|
function invalid(message) {
|
|
7208
7460
|
throw new InvalidRequestError(message);
|
|
7209
7461
|
}
|
|
@@ -7268,7 +7520,11 @@ function createCore({ sessions, bus, version, homeDir, ghRunner, githubAuthStatu
|
|
|
7268
7520
|
const progress = createProgressTracker({
|
|
7269
7521
|
homeDir: home,
|
|
7270
7522
|
codexHomes: () => [path24.join(home, ".codex"), ...libraryCodexHome ? [libraryCodexHome] : []],
|
|
7271
|
-
onUpdate: (taskId, value) =>
|
|
7523
|
+
onUpdate: (taskId, value) => {
|
|
7524
|
+
bus.emit("progress:update", { taskId, progress: value });
|
|
7525
|
+
notifier.activity(taskId, value.activity);
|
|
7526
|
+
notifier.retry(taskId);
|
|
7527
|
+
},
|
|
7272
7528
|
onNotify: (taskId, list) => {
|
|
7273
7529
|
const prefs = resolveNotificationSettings(getSettings());
|
|
7274
7530
|
if (!prefs.enabled) return;
|
|
@@ -7283,6 +7539,27 @@ function createCore({ sessions, bus, version, homeDir, ghRunner, githubAuthStatu
|
|
|
7283
7539
|
bus.emit("progress:notify", { taskId, title: task.title, notifications });
|
|
7284
7540
|
}
|
|
7285
7541
|
});
|
|
7542
|
+
const agentActivity = (key) => progress.isTracking(key) ? progress.snapshot(key)?.activity ?? null : null;
|
|
7543
|
+
const mailbox = createMailbox({
|
|
7544
|
+
write: (key, data) => sessions.write(key, data),
|
|
7545
|
+
activity: agentActivity
|
|
7546
|
+
});
|
|
7547
|
+
const notifier = createNotifier({
|
|
7548
|
+
cardOf: (taskId) => {
|
|
7549
|
+
const task = findTask(taskId);
|
|
7550
|
+
return task?.masterId ? { title: task.title, masterId: task.masterId } : null;
|
|
7551
|
+
},
|
|
7552
|
+
canReceive: async (masterId) => {
|
|
7553
|
+
const master = findTask(masterId);
|
|
7554
|
+
if (!master || !isMasterTask(master) || columnOf(master.id) !== "in_progress") return "never";
|
|
7555
|
+
if (!await sessions.isAlive(master.id)) return "later";
|
|
7556
|
+
return isBlocked(agentActivity(master.id)) ? "later" : "yes";
|
|
7557
|
+
},
|
|
7558
|
+
deliver: async (masterId, text) => {
|
|
7559
|
+
await attachAgent(masterId);
|
|
7560
|
+
await mailbox.deliver(masterId, frameMessage(null, text));
|
|
7561
|
+
}
|
|
7562
|
+
});
|
|
7286
7563
|
function gitWorktree(task) {
|
|
7287
7564
|
return isMasterTask(task) ? void 0 : task.worktreePath;
|
|
7288
7565
|
}
|
|
@@ -7325,6 +7602,7 @@ function createCore({ sessions, bus, version, homeDir, ghRunner, githubAuthStatu
|
|
|
7325
7602
|
standaloneTerminals.delete(key);
|
|
7326
7603
|
terminalDirectories.delete(key);
|
|
7327
7604
|
unwatchSubAgents(key);
|
|
7605
|
+
mailbox.forget(key);
|
|
7328
7606
|
}
|
|
7329
7607
|
function isStandaloneKey(key) {
|
|
7330
7608
|
return standaloneTerminals.has(key) || listTerminals().some((t) => t.sessionKey === key);
|
|
@@ -7451,6 +7729,7 @@ function createCore({ sessions, bus, version, homeDir, ghRunner, githubAuthStatu
|
|
|
7451
7729
|
};
|
|
7452
7730
|
setBoard(next);
|
|
7453
7731
|
bus.emit("state:changed", getState());
|
|
7732
|
+
notifier.launchFailed(taskId, launchError);
|
|
7454
7733
|
}
|
|
7455
7734
|
let folderDialog = null;
|
|
7456
7735
|
const github = createGithubService({
|
|
@@ -7486,7 +7765,10 @@ function createCore({ sessions, bus, version, homeDir, ghRunner, githubAuthStatu
|
|
|
7486
7765
|
cols: typeof p.cols === "number" ? p.cols : void 0,
|
|
7487
7766
|
rows: typeof p.rows === "number" ? p.rows : void 0,
|
|
7488
7767
|
// Session ended (natural exit included), so stop its watcher.
|
|
7489
|
-
onExit: () =>
|
|
7768
|
+
onExit: () => {
|
|
7769
|
+
unwatchSubAgents(key);
|
|
7770
|
+
if (key === task.id) notifier.exited(task.id);
|
|
7771
|
+
}
|
|
7490
7772
|
});
|
|
7491
7773
|
terminalDirectories.set(key, cwd);
|
|
7492
7774
|
watchSubAgents(key, cwd, (subAgents) => {
|
|
@@ -7498,6 +7780,10 @@ function createCore({ sessions, bus, version, homeDir, ghRunner, githubAuthStatu
|
|
|
7498
7780
|
}
|
|
7499
7781
|
return result;
|
|
7500
7782
|
}
|
|
7783
|
+
async function attachAgent(taskId) {
|
|
7784
|
+
const task = findTask(taskId);
|
|
7785
|
+
if (task && sessions.isAttached?.(taskId) === false) await startTaskSession(task, taskId, { taskId });
|
|
7786
|
+
}
|
|
7501
7787
|
async function summarizeTasks(filter) {
|
|
7502
7788
|
const board = getState().board;
|
|
7503
7789
|
const alive = new Set(await sessions.list());
|
|
@@ -7824,12 +8110,30 @@ function createCore({ sessions, bus, version, homeDir, ghRunner, githubAuthStatu
|
|
|
7824
8110
|
// Every card on the board, or one master's cards, as the CLI and a master's
|
|
7825
8111
|
// agent read them.
|
|
7826
8112
|
"task:summaries": (payload) => {
|
|
7827
|
-
const p = payload === void 0 ? {} : obj(payload, "payload");
|
|
8113
|
+
const p = payload === void 0 || payload === null ? {} : obj(payload, "payload");
|
|
7828
8114
|
return summarizeTasks({
|
|
7829
8115
|
masterId: p.masterId === void 0 ? void 0 : requireTask(p.masterId).id,
|
|
7830
8116
|
taskId: p.taskId === void 0 ? void 0 : requireTask(p.taskId).id
|
|
7831
8117
|
});
|
|
7832
8118
|
},
|
|
8119
|
+
// One card's agent talks to another's: a master to its own cards, a card to
|
|
8120
|
+
// its master, nothing else — cards coordinate through their master.
|
|
8121
|
+
"vibeflow:sendMessage": async (payload) => {
|
|
8122
|
+
const p = obj(payload, "payload");
|
|
8123
|
+
const from = findTask(str(p.from, "from"));
|
|
8124
|
+
const to = findTask(str(p.to, "to"));
|
|
8125
|
+
if (!from || !to) throw coded2("UNKNOWN_TASK", `unknown task ${!from ? String(p.from) : String(p.to)}`);
|
|
8126
|
+
const related = isMasterTask(from) && to.masterId === from.id || isMasterTask(to) && from.masterId === to.id;
|
|
8127
|
+
if (!related) throw coded2("NOT_RELATED", "\u53EA\u6709 master \u8207\u5B83\u81EA\u5DF1\u7684\u5361\u7247\u4E4B\u9593\u53EF\u4EE5\u4E92\u50B3\u8A0A\u606F");
|
|
8128
|
+
const text = str(p.text, "text").trim();
|
|
8129
|
+
if (!text) invalid("text must not be empty");
|
|
8130
|
+
if (text.length > MAX_MESSAGE_LENGTH) invalid(`text must be at most ${MAX_MESSAGE_LENGTH} characters`);
|
|
8131
|
+
if (!await sessions.isAlive(to.id)) throw coded2("NOT_RUNNING", `\u5361\u7247 ${to.id} \u7684 agent \u6C92\u6709\u5728\u57F7\u884C`);
|
|
8132
|
+
if (isMasterTask(to)) notifier.reported(from.id);
|
|
8133
|
+
await attachAgent(to.id);
|
|
8134
|
+
const { queuedMs } = await mailbox.deliver(to.id, frameMessage({ id: from.id, title: from.title }, text), { force: p.force === true });
|
|
8135
|
+
return { delivered: true, queuedMs };
|
|
8136
|
+
},
|
|
7833
8137
|
"terminal:start": async (payload) => {
|
|
7834
8138
|
const p = obj(payload, "payload");
|
|
7835
8139
|
const key = str(p.sessionKey, "sessionKey");
|
|
@@ -7913,7 +8217,7 @@ function createCore({ sessions, bus, version, homeDir, ghRunner, githubAuthStatu
|
|
|
7913
8217
|
},
|
|
7914
8218
|
"pty:input": (payload) => {
|
|
7915
8219
|
const p = obj(payload, "payload");
|
|
7916
|
-
|
|
8220
|
+
mailbox.userInput(requireSessionKey(p.sessionKey), str(p.data, "data"));
|
|
7917
8221
|
},
|
|
7918
8222
|
"pty:resize": (payload) => {
|
|
7919
8223
|
const p = obj(payload, "payload");
|
package/dist/web/404/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="icon" href="/favicon.ico" sizes="any" data-next-head=""/><link rel="icon" href="/logo.svg" type="image/svg+xml" data-next-head=""/><link rel="apple-touch-icon" href="/apple-touch-icon.png" data-next-head=""/><link rel="manifest" href="/manifest.webmanifest" data-next-head=""/><meta name="theme-color" content="#0d1117" data-next-head=""/><title data-next-head="">404: This page could not be found</title><link rel="preload" href="/_next/static/css/
|
|
1
|
+
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="icon" href="/favicon.ico" sizes="any" data-next-head=""/><link rel="icon" href="/logo.svg" type="image/svg+xml" data-next-head=""/><link rel="apple-touch-icon" href="/apple-touch-icon.png" data-next-head=""/><link rel="manifest" href="/manifest.webmanifest" data-next-head=""/><meta name="theme-color" content="#0d1117" data-next-head=""/><title data-next-head="">404: This page could not be found</title><link rel="preload" href="/_next/static/css/07822becd778a410.css" as="style"/><link rel="stylesheet" href="/_next/static/css/07822becd778a410.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-9dc72759edb7420f.js" defer=""></script><script src="/_next/static/chunks/framework-b92a367cf1ad4bf7.js" defer=""></script><script src="/_next/static/chunks/main-ec7fd4c371d06729.js" defer=""></script><script src="/_next/static/chunks/pages/_app-ba514e8a4a55baf5.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/3LDsWmgCIL5P63CLLw9Ph/_buildManifest.js" defer=""></script><script src="/_next/static/3LDsWmgCIL5P63CLLw9Ph/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"3LDsWmgCIL5P63CLLw9Ph","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
|
package/dist/web/404.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="icon" href="/favicon.ico" sizes="any" data-next-head=""/><link rel="icon" href="/logo.svg" type="image/svg+xml" data-next-head=""/><link rel="apple-touch-icon" href="/apple-touch-icon.png" data-next-head=""/><link rel="manifest" href="/manifest.webmanifest" data-next-head=""/><meta name="theme-color" content="#0d1117" data-next-head=""/><title data-next-head="">404: This page could not be found</title><link rel="preload" href="/_next/static/css/
|
|
1
|
+
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="icon" href="/favicon.ico" sizes="any" data-next-head=""/><link rel="icon" href="/logo.svg" type="image/svg+xml" data-next-head=""/><link rel="apple-touch-icon" href="/apple-touch-icon.png" data-next-head=""/><link rel="manifest" href="/manifest.webmanifest" data-next-head=""/><meta name="theme-color" content="#0d1117" data-next-head=""/><title data-next-head="">404: This page could not be found</title><link rel="preload" href="/_next/static/css/07822becd778a410.css" as="style"/><link rel="stylesheet" href="/_next/static/css/07822becd778a410.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-9dc72759edb7420f.js" defer=""></script><script src="/_next/static/chunks/framework-b92a367cf1ad4bf7.js" defer=""></script><script src="/_next/static/chunks/main-ec7fd4c371d06729.js" defer=""></script><script src="/_next/static/chunks/pages/_app-ba514e8a4a55baf5.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/3LDsWmgCIL5P63CLLw9Ph/_buildManifest.js" defer=""></script><script src="/_next/static/3LDsWmgCIL5P63CLLw9Ph/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"3LDsWmgCIL5P63CLLw9Ph","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
|
package/dist/web/_next/static/{iybQktKL4OxAZEKjzdSYP → 3LDsWmgCIL5P63CLLw9Ph}/_buildManifest.js
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:0,errorRate:1e-4,numBits:0,numHashes:null,bitArray:[]},__routerFilterDynamic:{numItems:0,errorRate:1e-4,numBits:0,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-8f65b0f8749f42d2.js"],"/home":["static/chunks/
|
|
1
|
+
self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:0,errorRate:1e-4,numBits:0,numHashes:null,bitArray:[]},__routerFilterDynamic:{numItems:0,errorRate:1e-4,numBits:0,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-8f65b0f8749f42d2.js"],"/home":["static/chunks/5174-9f90ae432131a522.js","static/chunks/pages/home-bae9ffb64fa6efa3.js"],sortedPages:["/_app","/_error","/home"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|