ai_co_discuss 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/workflow-creator/SKILL.md +1 -1
- package/README.md +1 -1
- package/backend/free_room.py +40 -16
- package/backend/private_chat.py +6 -3
- package/backend/schema.sql +6 -1
- package/backend/server.py +2714 -2713
- package/docs/runner.md +4 -4
- package/docs/workflow.md +1 -1
- package/package.json +1 -1
- package/runner/adapters/profiles.mjs +4 -3
- package/runner/free_runner.mjs +72 -21
- package/web/app.js +9 -1
- package/web/backup.js +1 -1
- package/web/modern.css +1 -1
- package/web/modern.js +37 -37
package/docs/runner.md
CHANGED
|
@@ -113,16 +113,16 @@ API 成员可以担任专家或主持人。房间指定了项目目录时,它
|
|
|
113
113
|
|
|
114
114
|
## 工作流(可选)
|
|
115
115
|
|
|
116
|
-
|
|
116
|
+
工作流把一种多人协作的做法存下来,供别的房间复用:一份给主持人读的 SKILL.md,加一组 Agent 卡片(每张就是一个专家预设)。工作流在左侧栏“工作流”打开的面板里管理(没打开房间时也能用):查看 SKILL.md、成员卡片和示意图,新建、导入、编辑、删除都在这里。要在房间里用时,在输入框要求主持人启动(打 `/` 选工作流可以直接写好这句请求,权限见下文);主持人此后按说明组织工作。它只带来做法和成员;没画流程时不保证工序,具体怎么做由主持人判断。你随时可以 @ 任何成员。
|
|
117
117
|
|
|
118
118
|
- **内置工作流**:安装包自带“小说剧本连载”(`story-serial`:编剧、写手、两位批评家与记录员逐集接力,附项目模板与状态检查脚本,脚本需要 Python 的 PyYAML)。默认不安装。在终端里运行 `codiscuss setup` 时,选完软件后有一步“安装配置”:先显示概览,按 → 展开,用空格勾选要装的工作流,回车继续;不勾就不装。也可以直接加 `--workflows` 安装全部(`install` 同样适用,非交互运行只认这个选项)。装的时候,已有同名的会覆盖为包里的最新版,原来那份先备份到服务目录的 `backups/workflows/`。选择只对这一次有效,不会记住,不选就不动工作流库。
|
|
119
|
-
-
|
|
120
|
-
-
|
|
119
|
+
- **保存**:点左侧栏“已存档”下面的“工作流”打开工作流面板(手机上先点左上角打开侧栏),点列表上方的“新建或导入”,选“新建”,或导入别人分享的 zip 或文件夹(手机、平板上同样可用)。导入的内容先放上画布预览,点“保存”才写入。复制文件夹路径和删除工作流在说明抽屉底部。编辑页可以“从当前房间成员导入”卡片,提示词保持原文。想让主持人起草,打开下面的“主持人完整权限”。
|
|
120
|
+
- **流程画布**:工作流面板左边是工作流列表,中间是选中工作流的画布,右边是它的 SKILL.md;手机和竖着拿的平板上,工作流排成顶部的一行标签,右端在“画布”和“工作流”(即 SKILL.md)之间切换。每位成员就是一张专家卡片,拖卡片上方的标题栏移动,点卡片翻面设置,× 删除。左上“成员”添加卡片(平台、预设,或当前房间的成员),“主持人”添加主持人节点;也可以从卡片右侧的圆点拖线到空白处,就地选要加的成员并自动连上。名称在右上角直接改,Ctrl+S 保存;列表里每项右边的“…”可以重命名、停用、复制文件夹路径或删除(停用的工作流留在库里,但房间里不能再启用,已启用它的房间改用房间里的设置,随时可以再启用),列表右边缘可以拖动调宽;左上有撤销、重做(Ctrl+Z、Ctrl+Shift+Z),双击空白处复位视图。连线用来示意谁接谁:从「开始」右侧的圆点拖线连到卡片,连回前面的卡片画成金色虚线表示循环,主持人节点表示交回主持人判断。选中一条连线或一个主持人节点,可以写一句说明,如“同时审”“返工”“不等交回”“验收”。同一角色出场两次时,在“成员”菜单底部“已有成员再放一次”里点它。打开时按看得清卡片的大小从“开始”那端显示,双击空白处看全图。用 `workflow-creator` 新建或修改工作流时,AI 会照 SKILL.md 一起画好这张图。连线只帮你看懂工作流,程序不执行它,主持人也看不到;主持人派活按的是 SKILL.md(就在画布右侧,默认显示排好版的内容,点“编辑”修改;面板可以拖宽或收起),顺序、同时做、什么时候交回、要不要返工都写在那里。
|
|
121
121
|
- **让主持人自己建**:建房时(第 3 节“协作方式”)或在“成员与设置 → 协作设置”勾选“主持人完整权限”后,直接对主持人说要什么分工(或“把这个房间的做法存成工作流”),它会自己保存、在本房间启用,并邀请工作流里的成员,接着就按流程派活,不需要你导入或添加成员。之后让它改流程,改动从成员下一次执行起生效。打开这个开关后,也可以在输入框输入 `/` 选一个已保存的工作流,输入框里会写好“启用工作流「名称」(ID),”,补上要做的事发给主持人,它就启用这个工作流并带来成员(没打开时该项灰显)。主持人带来的成员项目权限最高为可写;只有本地软件担任的主持人能这样做,API 主持人不行。
|
|
122
122
|
- **主持人完整权限的其他控制**:同一个开关打开后,主持人会自己处理房间里的问题、持续推进:成员跑偏时插话、卡住时打断或重试、模型不可用时换模型、无法恢复时换人;你也可以直接说“停下写手”“全部停下”“下一个让批评家先说”“请一位 Codex 进来只读评审”“把记录员请出去”“开个 Goal 把剩下几集写完”“暂停讨论”。邀请只用本机已配置的软件,项目权限最高可写;它自己开的 Goal 用你的默认预算(不限时为 8 次续跑、90 分钟)。成员连续 10 分钟没有新输出时,系统会提醒主持人检查;主持人派出长任务时还可以给自己设定时检查(每 5–120 分钟一次,房间空闲后自动结束)。它也能撤回自己派出的活,正在循环的接力会立即停下。以下仍由你决定:对主持人自己操作或更换主持人、批准超出上限的轮数、高于可写的权限或放行工具、改项目目录、撤回你的消息、私聊。API 主持人没有命令行,不能这样做。
|
|
123
123
|
- **分享**:工作流存在本机服务目录的 `workflows` 文件夹,一个工作流一个文件夹;编辑页可复制路径,把整个文件夹(或打成 zip)发给对方即可分享。导入时会列出每张卡片的提示词和项目权限;要求写文件的卡片默认按只读导入,逐张勾选后才放开。
|
|
124
124
|
- **给 API 成员登记命令**:以 API 方式加入的成员没有命令行。工作流文件夹里放一个 `commands.json`(写法见 `workflow-creator` 技能),登记它们能运行的命令(例如检查脚本,脚本也放在工作流文件夹里),随工作流一起分享;启用后 API 成员只能按名字运行这些命令,改不了命令行,只读成员只能运行标为只读的命令。命令以你的身份在本机运行,所以导入别人的工作流时,编辑页会列出每条完整命令,勾选“允许这些命令在本机运行”才会带上;主持人起草或修改工作流时不能增删命令。
|
|
125
|
-
-
|
|
125
|
+
- **修改与结束**:修改工作流会作用于所有启用它的房间,成员下一次执行就按新内容;新增的卡片不会自动进入房间,主持人用到时会自己补上,也可以在右栏工作流一行点刷新图标立即补齐(删掉的卡片,其成员留作普通成员;与库一致时不显示该图标);工作流卡片的提示词只读,在工作流面板的画布上修改。工作流进行中时,主持人只在请求和它的用途相符(或你说按工作流做)时才用,其他请求照常处理。用完在“成员与设置 → 协作设置”的工作流一行点请离成员图标(或逐个让成员离开):工作流带来的成员离开(主持人保留),正在进行的工作随之停止,工作流结束,右栏这一块消失;成员会话保留,下次在输入框打 `/` 选它就把原成员请回来,接着原来的上下文。换工作流时直接选另一个,原来的成员留作普通成员。
|
|
126
126
|
|
|
127
127
|
## 朗读与语音输入(可选)
|
|
128
128
|
|
package/docs/workflow.md
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
- **点名**:`@成员` 后,它在自己的原会话中处理并回复,多位可并行。用界面上显示的昵称点名即可(如 `@Gemini`),输入 `@` 后从列表选择最方便。
|
|
19
19
|
- **未点名的消息**:交给主持人分派;只有一位成员时直接交给它。
|
|
20
20
|
- **主持人派活**:主持人派出的成员做完或失败后都会交回主持人,由它接着安排或汇总;简单问答主持人可以让成员直接回复你,失败时仍交回主持人。程序发现的问题(如成员执行失败)会以“程序通知主持人”卡片交给主持人处理;主持人也可以在回答后要求房间空闲时再被唤醒,自己接着推进。你的一条消息默认最多让主持人推进 10 轮(主持人派活、成员回答、交回汇总为一轮;主持人要求续跑一次也算一轮,程序通知不算),建房时在“推进方式”里或建房后在房间页的“协作设置”里调整(1–100 轮,或勾选“不限”);到上限会停下等你,右栏点“继续”即接着推进。主持人事先知道任务要多少轮(如连写几集)时,会在开始时申请轮数:剩余不够就先停下,右栏显示申请理由,点“批准”后一次跑完,不再中途停下。
|
|
21
|
-
- **依次接力与循环**:几位成员要按固定先后做(写完再审、实现后评审)时,主持人会安排依次接力:一位做完直接交给下一位,最后一位做完才交回主持人,走完一圈算一轮。需要“改完再审”时安排成循环:每走完一圈交回主持人一次,评审要求返工就再走一圈,认可或需要取舍时由主持人验收。互不依赖的几位(如分别审不同问题的评审)可以排在同一棒同时做,这一组全部做完才交给下一位。接力中途还可以设检查点:某一棒做完先交回主持人把关,主持人认可再往下走;也可以只让中间一段循环(如写 ⇄
|
|
21
|
+
- **依次接力与循环**:几位成员要按固定先后做(写完再审、实现后评审)时,主持人会安排依次接力:一位做完直接交给下一位,最后一位做完才交回主持人,走完一圈算一轮。需要“改完再审”时安排成循环:每走完一圈交回主持人一次,评审要求返工就再走一圈,认可或需要取舍时由主持人验收。互不依赖的几位(如分别审不同问题的评审)可以排在同一棒同时做,这一组全部做完才交给下一位。接力中途还可以设检查点:某一棒做完先交回主持人把关,主持人认可再往下走;也可以只让中间一段循环(如写 ⇄ 审到通过,再交记录员)。工作流的 SKILL.md 里写明何时用哪种安排(见 [工作流](runner.md#工作流可选))。右栏发言顺序显示进行到哪一位、第几圈(同时做的成员共用一个序号)。主持人派活时还可以带上一位不必等待的成员,它同时开工,派出的工作结束时不等它,它失败时主持人会收到通知。右栏可拖动调整还没轮到的成员(设了检查点的接力不能调整)。循环圈数受上面的轮数限制,需要多改几轮时把轮数调大。
|
|
22
22
|
- **全体回答**:`@全体成员` 请所有成员各自回答,`@全体依次` 按发言顺序逐个回答。
|
|
23
23
|
- **停止与重发**:处理中卡片或成员菜单可停止该成员当前这一次;右栏“全部停止”停止所有成员并取消还没送达的请求。本机确认进程退出后才显示“已停止”,无法确认时显示“停止未确认”;自己窗口或 App 里的会话停不了时显示“已作废,可能仍在生成”。后续回答不进入记录,只有房主展开“未采纳的回答”时能读取正文。停止未确认或停不了时,新消息等待结束确认、迟到回答或原有 10 分钟期限;继续讨论、主动重发不跳过等待,也不重新计时。被停止的成员下次工作时会被告知。失败卡的“重发”把原用户消息填回输入框,确认后再发送。
|
|
24
24
|
- **撤回与编辑**:还没有成员开始处理的消息可撤回,原文回到输入框;最新一条消息即使已开始处理也可撤回,相当于停止对它的处理并回退到它之前。输入框为空时连按两下 Esc 也可撤回最近一条。已被处理的消息点“编辑”改写后重发:这条消息及之后的记录折叠为“已回退”,AI 不再读到它们,由本机唤醒的 Claude Code、Codex、agy 会话会退回到这条消息之前;手动接入和 App 的会话在各自窗口中,无法回退。成员已改动的文件不会撤销。讨论进行中不能撤回或编辑。
|
package/package.json
CHANGED
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
* the project only through the runner's file tools, running no commands); `limits_directories` (a directory it may
|
|
31
31
|
* only read stays read-only even while it may write elsewhere and run commands: a sandbox or file tools, not rules
|
|
32
32
|
* that a command could bypass); `chat` (the owner's private chat runs as a turn of its own session and its reply is
|
|
33
|
-
* read from the software's output)
|
|
33
|
+
* read from the software's output); `resume` (a stopped turn can go on in the same session, so the owner may pause
|
|
34
|
+
* a room execution from the private chat without ending it; not yet measured on real software).
|
|
34
35
|
* - `session_family`: profiles sharing one session store; switching among them keeps the conversation.
|
|
35
36
|
* - `windows_command`: how its shell names the codiscuss CLI on Windows.
|
|
36
37
|
* - `task_rules(cli, {runs_commands})`: fixed task text this software needs, added by the runner so no member prompt drops it.
|
|
@@ -60,7 +61,7 @@ export const ADAPTER_PROFILES = {
|
|
|
60
61
|
access_hints: { read: '只读沙箱', write: '项目可写的沙箱,命令在沙箱内运行、可联网',
|
|
61
62
|
auto: '沙箱外的操作由模型申请提权,Codex 自动审核代替人工批准', full: '无沙箱、无审批(--dangerously-bypass-approvals-and-sandbox)' },
|
|
62
63
|
client: 'codex', adopt: 'session', host_existing: true, session_family: 'codex',
|
|
63
|
-
capabilities: { delivery: PROCESS, rewind: 'cut', project: true, access_env: true, enforces_read_only: true, limits_directories: true, ripgrep: true, chat: true },
|
|
64
|
+
capabilities: { delivery: PROCESS, rewind: 'cut', project: true, access_env: true, enforces_read_only: true, limits_directories: true, ripgrep: true, chat: true, resume: true },
|
|
64
65
|
},
|
|
65
66
|
codex: {
|
|
66
67
|
platform: 'Codex', label: 'Codex App', kind: 'app', location: 'executable', fields: ['source_thread_id', 'project_id', 'project_name'],
|
|
@@ -77,7 +78,7 @@ export const ADAPTER_PROFILES = {
|
|
|
77
78
|
resume_command: session_id => `claude --resume ${session_id}`,
|
|
78
79
|
// Claude Code runs commands through bash on Windows too, where the npm shim works without .cmd.
|
|
79
80
|
windows_command: 'codiscuss',
|
|
80
|
-
capabilities: { delivery: PROCESS, rewind: 'cut', project: true, access_env: true, chat: true },
|
|
81
|
+
capabilities: { delivery: PROCESS, rewind: 'cut', project: true, access_env: true, chat: true, resume: true },
|
|
81
82
|
},
|
|
82
83
|
antigravity_cli: {
|
|
83
84
|
platform: 'Antigravity', label: 'Antigravity CLI', kind: 'cli', location: 'executable', fields: ['project_id', 'project_name'],
|
package/runner/free_runner.mjs
CHANGED
|
@@ -188,6 +188,15 @@ export function free_task_files(config, member, execution, binding, { session =
|
|
|
188
188
|
profile, ...(workflow_field ? { workflow: { ...workflow_field, skill: host_workflow.skill } } : {}) };
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
+
/**
|
|
192
|
+
* The prompt that resumes an execution the owner paused from the private chat: the same task goes on in the same
|
|
193
|
+
* session, steered by what the owner added. The task file and credentials are written again as at its first delivery.
|
|
194
|
+
*/
|
|
195
|
+
export function resume_prompt(execution_id, texts) {
|
|
196
|
+
return `房主在私聊窗口暂停了你正在做的这次房间任务(执行 #${execution_id},仍在进行,没有结束),并补充了下面的话。`
|
|
197
|
+
+ `按补充调整后接着完成原任务,已经做完的部分不必重做;完成后照常用 codiscuss 提交这次执行的回答。\n\n${texts.join('\n\n')}`;
|
|
198
|
+
}
|
|
199
|
+
|
|
191
200
|
// The fixed opening of a private chat turn: where the words come from and how to answer them; the owner's text follows.
|
|
192
201
|
const CHAT_PREAMBLE = '房主在私聊窗口直接对你说(不在房间消息流里,其他成员看不到)。像在终端里对话一样直接用文字回答,不要用 codiscuss 提交到房间,除非房主明确要求;可以照常按你的权限读写项目文件。';
|
|
193
202
|
|
|
@@ -262,6 +271,8 @@ export class FreeRoomRunner {
|
|
|
262
271
|
this.instance = randomUUID();
|
|
263
272
|
// Execution id -> why its session ended on its own, such as a command refused in unattended mode ('' when unknown).
|
|
264
273
|
this.exited = new Map();
|
|
274
|
+
// Per execution, which delivery is current: a turn stopped by a pause may report its exit after the resumed one began.
|
|
275
|
+
this.generations = new Map();
|
|
265
276
|
// Executions whose software failed before any turn ran, as its adapter reported; safe to deliver again.
|
|
266
277
|
this.not_started = new Set();
|
|
267
278
|
// Executions whose software failed in a way a retry meets again (a used-up limit, a lost login), as its adapter reported.
|
|
@@ -747,7 +758,7 @@ export class FreeRoomRunner {
|
|
|
747
758
|
await this.invoke(member, execution);
|
|
748
759
|
}
|
|
749
760
|
/** Hand the execution to the member's software; only proven non-delivery is released for retry. */
|
|
750
|
-
async invoke(member, execution) {
|
|
761
|
+
async invoke(member, execution, { resume = '' } = {}) {
|
|
751
762
|
const adapter = this.config.participants[member.name];
|
|
752
763
|
const review_request = execution.requests?.find(request => request.review?.phase === 'review');
|
|
753
764
|
if (review_request) {
|
|
@@ -762,13 +773,18 @@ export class FreeRoomRunner {
|
|
|
762
773
|
// The room's other directories this member may write are watched as well; their changes are reported with full paths.
|
|
763
774
|
const extras = member_extra_directories(this.config, adapter).filter(item => item.access === 'write')
|
|
764
775
|
.map(item => ({ directory: item.path, before: workspace_snapshot(item.path) })).filter(item => item.before);
|
|
765
|
-
|
|
776
|
+
// A resumed execution keeps the snapshot of its first delivery, so changes made before the pause are reported too.
|
|
777
|
+
if ((before || extras.length) && !this.snapshots.has(execution.id)) this.snapshots.set(execution.id, { member: member.name, directory, before, extras });
|
|
778
|
+
const generation = (this.generations.get(execution.id) || 0) + 1;
|
|
779
|
+
this.generations.set(execution.id, generation);
|
|
780
|
+
const current = () => this.generations.get(execution.id) === generation;
|
|
766
781
|
const binding = this.store.binding(member.name);
|
|
767
782
|
// A member whose session a rewind restarted is bound to '' and must not fall back to the session it was invited with.
|
|
768
783
|
if (binding.session_id === undefined && adapter.session_id) binding.session_id = adapter.session_id;
|
|
769
784
|
let invoked = false;
|
|
770
785
|
try {
|
|
771
|
-
|
|
786
|
+
// A resumed execution's session was already cut at its first delivery.
|
|
787
|
+
const warning = resume ? '' : await this.cut_rewound(member.name, adapter, binding, execution);
|
|
772
788
|
const session_request = execution.requests?.find(item => item.session_request_id && ['discuss', 'discuss_host'].includes(item.purpose));
|
|
773
789
|
const session = this.room?.session ? { ...this.room.session } : null;
|
|
774
790
|
const scheduler_suggestions = !this.config.scheduler || member.role !== 'host' ? []
|
|
@@ -789,7 +805,7 @@ export class FreeRoomRunner {
|
|
|
789
805
|
invoked = true;
|
|
790
806
|
this.segments.start(execution.id);
|
|
791
807
|
if (warning) this.note(execution.id, warning);
|
|
792
|
-
const result = await this.deliver(review_request ? structuredClone(task.profile) : task.profile, binding, { ...task, room_title: this.room_title,
|
|
808
|
+
const result = await this.deliver(review_request ? structuredClone(task.profile) : task.profile, binding, { ...task, ...(resume ? { prompt: resume } : {}), room_title: this.room_title,
|
|
793
809
|
...(review_request ? { before_model_start: () => this.check_review_delivery(member, review_request) } : {}),
|
|
794
810
|
api_context: { site: this.config.site, room: this.config.room, token: this.config.members[member.name].token,
|
|
795
811
|
home: this.config.api_home, mode: 'free', role: member.role || 'member', execution_id: execution.id,
|
|
@@ -813,11 +829,12 @@ export class FreeRoomRunner {
|
|
|
813
829
|
},
|
|
814
830
|
// A stopped process may report after the next execution started; only its own execution takes the result.
|
|
815
831
|
on_failure: (error, { not_started = false, retryable = true } = {}) => {
|
|
832
|
+
if (!current()) return;
|
|
816
833
|
if (not_started) this.not_started.add(execution.id);
|
|
817
834
|
if (!retryable) this.not_retryable.add(execution.id);
|
|
818
835
|
try { if (this.row(member.name)?.execution_id === execution.id) this.save(member.name, { error }); } catch { /* Store may already be closed at shutdown. */ }
|
|
819
836
|
},
|
|
820
|
-
on_exit: denial => this.exited.set(execution.id, denial || ''),
|
|
837
|
+
on_exit: denial => { if (current()) this.exited.set(execution.id, denial || ''); },
|
|
821
838
|
// Shown beside the answer or failure so the owner can allow them; a lost report only hides the list.
|
|
822
839
|
on_denials: denials => api(this.config, `/executions/${execution.id}`, { action: 'denials', denials }).catch(() => {}),
|
|
823
840
|
});
|
|
@@ -825,7 +842,9 @@ export class FreeRoomRunner {
|
|
|
825
842
|
this.clear_stopped(member.name);
|
|
826
843
|
this.save(member.name, { status: result.status === 'sidecar_pending' ? 'sidecar_pending' : 'running', attempts: 0 });
|
|
827
844
|
if (result.steer) this.steers.set(execution.id, result.steer);
|
|
828
|
-
|
|
845
|
+
const delivery = result.capabilities || capabilities_of(adapter.adapter).delivery;
|
|
846
|
+
await this.report_delivery(execution.id, { ...delivery, steer: Boolean(result.steer),
|
|
847
|
+
resume: Boolean(capabilities_of(adapter.adapter).resume && delivery.stoppable) }, member.name);
|
|
829
848
|
} catch (error) {
|
|
830
849
|
if (review_request && error.delivery_status === 'not_sent') return this.reject_review(member, execution, error.message);
|
|
831
850
|
if (adapter.project_access === 'own') return this.retry_or_fail(member.name, execution, `投递失败:${error.message}`);
|
|
@@ -914,19 +933,24 @@ export class FreeRoomRunner {
|
|
|
914
933
|
}
|
|
915
934
|
// A restart between persisting and invoking cannot prove non-delivery, so it never resends.
|
|
916
935
|
if (row.status === 'delivering') return this.fail(member.name, execution.id, '上次投递结果不明,未自动重发;请核对原会话后重新发送');
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
if (
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
936
|
+
if (execution.paused_at) {
|
|
937
|
+
// A paused turn ending is not a failure: the execution waits, renewed, for the owner's words.
|
|
938
|
+
if (await this.hold_paused(member, row, execution)) return;
|
|
939
|
+
} else {
|
|
940
|
+
// Inherited from a runner that stopped or crashed: once its software processes are gone, no answer can come, so the
|
|
941
|
+
// same execution is delivered again after the retry wait instead of handing the failure to the host.
|
|
942
|
+
if (row.status === 'running' && this.orphan(execution.id)?.alive === false) {
|
|
943
|
+
return this.retry_or_fail(member.name, execution, '本机接入程序重启或异常退出,这次执行的软件进程已结束,未提交回答', { restarted: true });
|
|
944
|
+
}
|
|
945
|
+
if (row.error) return this.retry_or_fail(member.name, execution, row.error);
|
|
946
|
+
if (this.exited.has(execution.id)) {
|
|
947
|
+
const latest = await api(this.config, `/executions/${execution.id}`);
|
|
948
|
+
const denial = this.exited.get(execution.id);
|
|
949
|
+
if (['dispatched', 'started'].includes(latest.status)) return this.fail(member.name, execution.id, denial
|
|
950
|
+
? `${member.name} ${denial},未提交本次回答`
|
|
951
|
+
: `${member.name} 会话已结束,但未提交本次回答;请核对原会话确认是否已有内容`);
|
|
952
|
+
return this.save(member.name, { status: 'idle' });
|
|
953
|
+
}
|
|
930
954
|
}
|
|
931
955
|
// Segments and notes go first, quietly and often, so a renewal in the same tick already shows the notes it announces.
|
|
932
956
|
if (this.segments.due(execution.id, PROGRESS_REPORT_MS)) await this.report_segments(execution.id);
|
|
@@ -940,14 +964,39 @@ export class FreeRoomRunner {
|
|
|
940
964
|
this.save(member.name, { last_renew: Date.now() });
|
|
941
965
|
}
|
|
942
966
|
}
|
|
967
|
+
/**
|
|
968
|
+
* An execution the owner paused from the private chat, or that takes an interjection only by a pause: stop its
|
|
969
|
+
* software turn and keep the execution live; once that turn has ended and the owner's words wait, resume the same
|
|
970
|
+
* execution in the same session with them. Returns true when it resumed, so the caller does nothing more this tick.
|
|
971
|
+
*/
|
|
972
|
+
async hold_paused(member, row, execution) {
|
|
973
|
+
this.steers.delete(execution.id);
|
|
974
|
+
const processes = this.execution_processes.get(execution.id);
|
|
975
|
+
for (const child of processes || []) this.request_stop(child);
|
|
976
|
+
this.exited.delete(execution.id);
|
|
977
|
+
this.not_started.delete(execution.id);
|
|
978
|
+
this.not_retryable.delete(execution.id);
|
|
979
|
+
if (row.error) this.save(member.name, { error: '' });
|
|
980
|
+
if (processes?.size || !execution.interjections?.length) return false;
|
|
981
|
+
this.save(member.name, { status: 'delivering', error: '' });
|
|
982
|
+
await api(this.config, `/executions/${execution.id}`, { action: 'resume' });
|
|
983
|
+
await this.invoke(member, execution, { resume: resume_prompt(execution.id, execution.interjections.map(item => item.text)) });
|
|
984
|
+
if (this.row(member.name)?.status !== 'running') return true;
|
|
985
|
+
for (const interjection of execution.interjections) {
|
|
986
|
+
this.interjecting.set(interjection.id, { status: 'delivered' });
|
|
987
|
+
await api(this.config, `/executions/${execution.id}`, { action: 'interjection', interjection_id: interjection.id, status: 'delivered' })
|
|
988
|
+
.catch(error => this.log(`插话 #${interjection.id} 的结果未能上报:${error.message}`));
|
|
989
|
+
}
|
|
990
|
+
return true;
|
|
991
|
+
}
|
|
943
992
|
/**
|
|
944
993
|
* Tell the site what this delivery can do, as the adapter reported it: whether the runner can stop it and see its
|
|
945
994
|
* progress. Kept locally until the execution ends so a restarted runner still knows whether it could stop it.
|
|
946
995
|
* A lost report is retained for the final stop result; sites and runners must use the same capability protocol.
|
|
947
996
|
*/
|
|
948
|
-
async report_delivery(execution_id, { stoppable, progress, steer = false }, member) {
|
|
997
|
+
async report_delivery(execution_id, { stoppable, progress, steer = false, resume = false }, member) {
|
|
949
998
|
this.store.db.prepare('INSERT OR REPLACE INTO metadata VALUES (?,?)').run(`delivery:${execution_id}`, JSON.stringify({ stoppable, progress, member }));
|
|
950
|
-
await api(this.config, `/executions/${execution_id}`, { action: 'delivery', stoppable, progress, steer })
|
|
999
|
+
await api(this.config, `/executions/${execution_id}`, { action: 'delivery', stoppable, progress, steer, resume })
|
|
951
1000
|
.catch(error => this.log(`执行 #${execution_id} 的投递能力未能上报:${error.message}`));
|
|
952
1001
|
}
|
|
953
1002
|
/** Retry durable stop reports even after the member went idle, left, or started a later execution. */
|
|
@@ -1111,6 +1160,8 @@ export class FreeRoomRunner {
|
|
|
1111
1160
|
const live = new Set(executions.map(item => item.id));
|
|
1112
1161
|
for (const id of this.steers.keys()) if (!live.has(id)) this.steers.delete(id);
|
|
1113
1162
|
for (const execution of executions) {
|
|
1163
|
+
// A paused execution hears its interjections when it resumes (hold_paused).
|
|
1164
|
+
if (execution.paused_at) continue;
|
|
1114
1165
|
for (const interjection of execution.interjections || []) {
|
|
1115
1166
|
// An interjection is handed over once; a lost report is sent again with the same outcome.
|
|
1116
1167
|
let report = this.interjecting.get(interjection.id);
|
package/web/app.js
CHANGED
|
@@ -3079,6 +3079,14 @@ function stop_member_chat(room_id, chat_id) {
|
|
|
3079
3079
|
return request_json(`/api/rooms/${room_id}/chats/${chat_id}`, { action: "stop" });
|
|
3080
3080
|
}
|
|
3081
3081
|
|
|
3082
|
+
/**
|
|
3083
|
+
* Pause a member's running room execution from the private chat without ending it: the runner stops the software's
|
|
3084
|
+
* turn and resumes the same execution in the same session with the owner's next line.
|
|
3085
|
+
*/
|
|
3086
|
+
function pause_execution(room_id, execution_id) {
|
|
3087
|
+
return request_json(`/api/rooms/${room_id}/executions/${execution_id}`, { action: "pause" });
|
|
3088
|
+
}
|
|
3089
|
+
|
|
3082
3090
|
/**
|
|
3083
3091
|
* Describe registered launch choices: the card's choice, else what the member's session last ran with, else what the software's settings select;
|
|
3084
3092
|
* anything unknown is "默认".
|
|
@@ -5015,7 +5023,7 @@ window.discuss_view = { snapshot: view_snapshot, write_field: write_view_field,
|
|
|
5015
5023
|
device: { request: device_request, pair: pair_this_device, take_scanned: take_scanned_pairing, invite: invite_device, renew: renew_this_device, forget: forget_pairing,
|
|
5016
5024
|
label: device_label, prompt_confirm: () => state.device.prompt?.run(), prompt_cancel: () => state.device.prompt?.cancel() },
|
|
5017
5025
|
request: request_json, rewind_plan, identities: IDENTITIES, display_name, mention_handles, mentioned_members, render_room_markdown, sources: SOURCE_LABELS,
|
|
5018
|
-
set_member_access, set_member_model, allow_denials, set_member_adapter, reload_room_models, read_room_files, read_execution_details, interject_execution, read_member_chat, send_member_chat, stop_member_chat, limits_label, stop_reason_label, participant_model, participant_files, participant_session_hint, participant_access,
|
|
5026
|
+
set_member_access, set_member_model, allow_denials, set_member_adapter, reload_room_models, read_room_files, read_execution_details, interject_execution, read_member_chat, send_member_chat, stop_member_chat, pause_execution, limits_label, stop_reason_label, participant_model, participant_files, participant_session_hint, participant_access,
|
|
5019
5027
|
turn_label, turn_guidance, round_groups, limit_rounds, progress_speaker, brief_meta, max_message_length: MAX_MESSAGE_LENGTH, provenance: message_provenance, format_time };
|
|
5020
5028
|
|
|
5021
5029
|
restore_theme();
|
package/web/backup.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var discuss_backup=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t={},n=(function(e,n,r,i,a){var o=new Worker(t[n]||(t[n]=URL.createObjectURL(new Blob([e+`;addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})`],{type:`text/javascript`}))));return o.onmessage=function(e){var t=e.data,n=t.$e$;if(n){var r=Error(n[0]);r.code=n[1],r.stack=n[2],a(r,null)}else a(null,t)},o.postMessage(r,i),o}),r=Uint8Array,i=Uint16Array,a=Int32Array,o=new r([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),s=new r([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),c=new r([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),l=function(e,t){for(var n=new i(31),r=0;r<31;++r)n[r]=t+=1<<e[r-1];for(var o=new a(n[30]),r=1;r<30;++r)for(var s=n[r];s<n[r+1];++s)o[s]=s-n[r]<<5|r;return{b:n,r:o}},u=l(o,2),d=u.b,f=u.r;d[28]=258,f[258]=28;for(var p=l(s,0),m=p.b,h=p.r,g=new i(32768),_=0;_<32768;++_){var v=(_&43690)>>1|(_&21845)<<1;v=(v&52428)>>2|(v&13107)<<2,v=(v&61680)>>4|(v&3855)<<4,g[_]=((v&65280)>>8|(v&255)<<8)>>1}for(var y=(function(e,t,n){for(var r=e.length,a=0,o=new i(t);a<r;++a)e[a]&&++o[e[a]-1];var s=new i(t);for(a=1;a<t;++a)s[a]=s[a-1]+o[a-1]<<1;var c;if(n){c=new i(1<<t);var l=15-t;for(a=0;a<r;++a)if(e[a])for(var u=a<<4|e[a],d=t-e[a],f=s[e[a]-1]++<<d,p=f|(1<<d)-1;f<=p;++f)c[g[f]>>l]=u}else for(c=new i(r),a=0;a<r;++a)e[a]&&(c[a]=g[s[e[a]-1]++]>>15-e[a]);return c}),b=new r(288),_=0;_<144;++_)b[_]=8;for(var _=144;_<256;++_)b[_]=9;for(var _=256;_<280;++_)b[_]=7;for(var _=280;_<288;++_)b[_]=8;for(var x=new r(32),_=0;_<32;++_)x[_]=5;var S=y(b,9,0),C=y(b,9,1),w=y(x,5,0),ee=y(x,5,1),te=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},T=function(e,t,n){var r=t/8|0;return(e[r]|e[r+1]<<8)>>(t&7)&n},E=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)},ne=function(e){return(e+7)/8|0},D=function(e,t,n){return(t==null||t<0)&&(t=0),(n==null||n>e.length)&&(n=e.length),new r(e.subarray(t,n))},O=[`unexpected EOF`,`invalid block type`,`invalid length/literal`,`invalid distance`,`stream finished`,`no stream handler`,,`no callback`,`invalid UTF-8 data`,`extra field too long`,`date not in range 1980-2099`,`filename too long`,`stream finishing`,`invalid zip data`],k=function(e,t,n){var r=Error(t||O[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,k),!n)throw r;return r},A=function(e,t,n,i){var a=e.length,l=i?i.length:0;if(!a||t.f&&!t.l)return n||new r(0);var u=!n,f=u||t.i!=2,p=t.i;u&&(n=new r(a*3));var h=function(e){var t=n.length;if(e>t){var i=new r(Math.max(t*2,e));i.set(n),n=i}},g=t.f||0,_=t.p||0,v=t.b||0,b=t.l,x=t.d,S=t.m,w=t.n,O=a*8;do{if(!b){g=T(e,_,1);var A=T(e,_+1,3);if(_+=3,!A){var j=ne(_)+4,M=e[j-4]|e[j-3]<<8,N=j+M;if(N>a){p&&k(0);break}f&&h(v+M),n.set(e.subarray(j,N),v),t.b=v+=M,t.p=_=N*8,t.f=g;continue}if(A==1)b=C,x=ee,S=9,w=5;else if(A==2){var P=T(e,_,31)+257,re=T(e,_+10,15)+4,F=P+T(e,_+5,31)+1;_+=14;for(var ie=new r(F),I=new r(19),L=0;L<re;++L)I[c[L]]=T(e,_+L*3,7);_+=re*3;for(var R=te(I),ae=(1<<R)-1,z=y(I,R,1),L=0;L<F;){var B=z[T(e,_,ae)];_+=B&15;var j=B>>4;if(j<16)ie[L++]=j;else{var V=0,H=0;for(j==16?(H=3+T(e,_,3),_+=2,V=ie[L-1]):j==17?(H=3+T(e,_,7),_+=3):j==18&&(H=11+T(e,_,127),_+=7);H--;)ie[L++]=V}}var U=ie.subarray(0,P),W=ie.subarray(P);S=te(U),w=te(W),b=y(U,S,1),x=y(W,w,1)}else k(1);if(_>O){p&&k(0);break}}f&&h(v+131072);for(var oe=(1<<S)-1,se=(1<<w)-1,G=_;;G=_){var V=b[E(e,_)&oe],K=V>>4;if(_+=V&15,_>O){p&&k(0);break}if(V||k(2),K<256)n[v++]=K;else if(K==256){G=_,b=null;break}else{var q=K-254;if(K>264){var L=K-257,J=o[L];q=T(e,_,(1<<J)-1)+d[L],_+=J}var Y=x[E(e,_)&se],X=Y>>4;Y||k(3),_+=Y&15;var W=m[X];if(X>3){var J=s[X];W+=E(e,_)&(1<<J)-1,_+=J}if(_>O){p&&k(0);break}f&&h(v+131072);var Z=v+q;if(v<W){var ce=l-W,Q=Math.min(W,Z);for(ce+v<0&&k(3);v<Q;++v)n[v]=i[ce+v]}for(;v<Z;++v)n[v]=n[v-W]}}t.l=b,t.p=G,t.b=v,t.f=g,b&&(g=1,t.m=S,t.d=x,t.n=w)}while(!g);return v!=n.length&&u?D(n,0,v):n.subarray(0,v)},j=function(e,t,n){n<<=t&7;var r=t/8|0;e[r]|=n,e[r+1]|=n>>8},M=function(e,t,n){n<<=t&7;var r=t/8|0;e[r]|=n,e[r+1]|=n>>8,e[r+2]|=n>>16},N=function(e,t){for(var n=[],a=0;a<e.length;++a)e[a]&&n.push({s:a,f:e[a]});var o=n.length,s=n.slice();if(!o)return{t:R,l:0};if(o==1){var c=new r(n[0].s+1);return c[n[0].s]=1,{t:c,l:1}}n.sort(function(e,t){return e.f-t.f}),n.push({s:-1,f:25001});var l=n[0],u=n[1],d=0,f=1,p=2;for(n[0]={s:-1,f:l.f+u.f,l,r:u};f!=o-1;)l=n[n[d].f<n[p].f?d++:p++],u=n[d!=f&&n[d].f<n[p].f?d++:p++],n[f++]={s:-1,f:l.f+u.f,l,r:u};for(var m=s[0].s,a=1;a<o;++a)s[a].s>m&&(m=s[a].s);var h=new i(m+1),g=P(n[f-1],h,0);if(g>t){var a=0,_=0,v=g-t,y=1<<v;for(s.sort(function(e,t){return h[t.s]-h[e.s]||e.f-t.f});a<o;++a){var b=s[a].s;if(h[b]>t)_+=y-(1<<g-h[b]),h[b]=t;else break}for(_>>=v;_>0;){var x=s[a].s;h[x]<t?_-=1<<t-h[x]++-1:++a}for(;a>=0&&_;--a){var S=s[a].s;h[S]==t&&(--h[S],++_)}g=t}return{t:new r(h),l:g}},P=function(e,t,n){return e.s==-1?Math.max(P(e.l,t,n+1),P(e.r,t,n+1)):t[e.s]=n},re=function(e){for(var t=e.length;t&&!e[--t];);for(var n=new i(++t),r=0,a=e[0],o=1,s=function(e){n[r++]=e},c=1;c<=t;++c)if(e[c]==a&&c!=t)++o;else{if(!a&&o>2){for(;o>138;o-=138)s(32754);o>2&&(s(o>10?o-11<<5|28690:o-3<<5|12305),o=0)}else if(o>3){for(s(a),--o;o>6;o-=6)s(8304);o>2&&(s(o-3<<5|8208),o=0)}for(;o--;)s(a);o=1,a=e[c]}return{c:n.subarray(0,r),n:t}},F=function(e,t){for(var n=0,r=0;r<t.length;++r)n+=e[r]*t[r];return n},ie=function(e,t,n){var r=n.length,i=ne(t+2);e[i]=r&255,e[i+1]=r>>8,e[i+2]=e[i]^255,e[i+3]=e[i+1]^255;for(var a=0;a<r;++a)e[i+a+4]=n[a];return(i+4+r)*8},I=function(e,t,n,r,a,l,u,d,f,p,m){j(t,m++,n),++a[256];for(var h=N(a,15),g=h.t,_=h.l,v=N(l,15),C=v.t,ee=v.l,te=re(g),T=te.c,E=te.n,ne=re(C),D=ne.c,O=ne.n,k=new i(19),A=0;A<T.length;++A)++k[T[A]&31];for(var A=0;A<D.length;++A)++k[D[A]&31];for(var P=N(k,7),I=P.t,L=P.l,R=19;R>4&&!I[c[R-1]];--R);var ae=p+5<<3,z=F(a,b)+F(l,x)+u,B=F(a,g)+F(l,C)+u+14+3*R+F(k,I)+2*k[16]+3*k[17]+7*k[18];if(f>=0&&ae<=z&&ae<=B)return ie(t,m,e.subarray(f,f+p));var V,H,U,W;if(j(t,m,1+(B<z)),m+=2,B<z){V=y(g,_,0),H=g,U=y(C,ee,0),W=C;var oe=y(I,L,0);j(t,m,E-257),j(t,m+5,O-1),j(t,m+10,R-4),m+=14;for(var A=0;A<R;++A)j(t,m+3*A,I[c[A]]);m+=3*R;for(var se=[T,D],G=0;G<2;++G)for(var K=se[G],A=0;A<K.length;++A){var q=K[A]&31;j(t,m,oe[q]),m+=I[q],q>15&&(j(t,m,K[A]>>5&127),m+=K[A]>>12)}}else V=S,H=b,U=w,W=x;for(var A=0;A<d;++A){var J=r[A];if(J>255){var q=J>>18&31;M(t,m,V[q+257]),m+=H[q+257],q>7&&(j(t,m,J>>23&31),m+=o[q]);var Y=J&31;M(t,m,U[Y]),m+=W[Y],Y>3&&(M(t,m,J>>5&8191),m+=s[Y])}else M(t,m,V[J]),m+=H[J]}return M(t,m,V[256]),m+H[256]},L=new a([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),R=new r(0),ae=function(e,t,n,c,l,u){var d=u.z||e.length,p=new r(c+d+5*(1+Math.ceil(d/7e3))+l),m=p.subarray(c,p.length-l),g=u.l,_=(u.r||0)&7;if(t){_&&(m[0]=u.r>>3);for(var v=L[t-1],y=v>>13,b=v&8191,x=(1<<n)-1,S=u.p||new i(32768),C=u.h||new i(x+1),w=Math.ceil(n/3),ee=2*w,te=function(t){return(e[t]^e[t+1]<<w^e[t+2]<<ee)&x},T=new a(25e3),E=new i(288),O=new i(32),k=0,A=0,j=u.i||0,M=0,N=u.w||0,P=0;j+2<d;++j){var re=te(j),F=j&32767,R=C[re];if(S[F]=R,C[re]=F,N<=j){var ae=d-j;if((k>7e3||M>24576)&&(ae>423||!g)){_=I(e,m,0,T,E,O,A,M,P,j-P,_),M=k=A=0,P=j;for(var z=0;z<286;++z)E[z]=0;for(var z=0;z<30;++z)O[z]=0}var B=2,V=0,H=b,U=F-R&32767;if(ae>2&&re==te(j-U))for(var W=Math.min(y,ae)-1,oe=Math.min(32767,j),se=Math.min(258,ae);U<=oe&&--H&&F!=R;){if(e[j+B]==e[j+B-U]){for(var G=0;G<se&&e[j+G]==e[j+G-U];++G);if(G>B){if(B=G,V=U,G>W)break;for(var K=Math.min(U,G-2),q=0,z=0;z<K;++z){var J=j-U+z&32767,Y=J-S[J]&32767;Y>q&&(q=Y,R=J)}}}F=R,R=S[F],U+=F-R&32767}if(V){T[M++]=268435456|f[B]<<18|h[V];var X=f[B]&31,Z=h[V]&31;A+=o[X]+s[Z],++E[257+X],++O[Z],N=j+B,++k}else T[M++]=e[j],++E[e[j]]}}for(j=Math.max(j,N);j<d;++j)T[M++]=e[j],++E[e[j]];_=I(e,m,g,T,E,O,A,M,P,j-P,_),g||(u.r=_&7|m[_/8|0]<<3,_-=7,u.h=C,u.p=S,u.i=j,u.w=N)}else{for(var j=u.w||0;j<d+g;j+=65535){var ce=j+65535;ce>=d&&(m[_/8|0]=g,ce=d),_=ie(m,_+1,e.subarray(j,ce))}u.i=d}return D(p,0,c+ne(_)+l)},z=(function(){for(var e=new Int32Array(256),t=0;t<256;++t){for(var n=t,r=9;--r;)n=(n&1&&-306674912)^n>>>1;e[t]=n}return e})(),B=function(){var e=-1;return{p:function(t){for(var n=e,r=0;r<t.length;++r)n=z[n&255^t[r]]^n>>>8;e=n},d:function(){return~e}}},V=function(e,t,n,i,a){if(!a&&(a={l:1},t.dictionary)){var o=t.dictionary.subarray(-32768),s=new r(o.length+e.length);s.set(o),s.set(e,o.length),e=s,a.w=o.length}return ae(e,t.level==null?6:t.level,t.mem==null?a.l?Math.ceil(Math.max(8,Math.min(13,Math.log(e.length)))*1.5):20:12+t.mem,n,i,a)},H=function(e,t){var n={};for(var r in e)n[r]=e[r];for(var r in t)n[r]=t[r];return n},U=function(e,t,n){for(var r=e(),i=e.toString(),a=i.slice(i.indexOf(`[`)+1,i.lastIndexOf(`]`)).replace(/\s+/g,``).split(`,`),o=0;o<r.length;++o){var s=r[o],c=a[o];if(typeof s==`function`){t+=`;`+c+`=`;var l=s.toString();if(s.prototype){if(l.indexOf(`[native code]`)!=-1){var u=l.indexOf(` `,8)+1;t+=l.slice(u,l.indexOf(`(`,u))}else for(var d in t+=l,s.prototype)t+=`;`+c+`.prototype.`+d+`=`+s.prototype[d].toString()}else t+=l}else n[c]=s}return t},W=[],oe=function(e){var t=[];for(var n in e)e[n].buffer&&t.push((e[n]=new e[n].constructor(e[n])).buffer);return t},se=function(e,t,r,i){if(!W[r]){for(var a=``,o={},s=e.length-1,c=0;c<s;++c)a=U(e[c],a,o);W[r]={c:U(e[s],a,o),e:o}}var l=H({},W[r].e);return n(W[r].c+`;onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=`+t.toString()+`}`,r,l,oe(l),i)},G=function(){return[r,i,a,o,s,c,d,m,C,ee,g,O,y,te,T,E,ne,D,k,A,fe,q,J]},K=function(){return[r,i,a,o,s,c,f,h,S,b,w,x,g,L,R,y,j,M,N,P,re,F,ie,I,ne,D,ae,V,ue,q]},q=function(e){return postMessage(e,[e.buffer])},J=function(e){return e&&{out:e.size&&new r(e.size),dictionary:e.dictionary}},Y=function(e,t,n,r,i,a){var o=se(n,r,i,function(e,t){o.terminate(),a(e,t)});return o.postMessage([e,t],t.consume?[e.buffer]:[]),function(){o.terminate()}},X=function(e,t){return e[t]|e[t+1]<<8},Z=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},ce=function(e,t){return Z(e,t)+Z(e,t+4)*4294967296},Q=function(e,t,n){for(;n;++t)e[t]=n,n>>>=8};function le(e,t,n){return n||(n=t,t={}),typeof n!=`function`&&k(7),Y(e,t,[K],function(e){return q(ue(e.data[0],e.data[1]))},0,n)}function ue(e,t){return V(e,t||{},0,0)}function de(e,t,n){return n||(n=t,t={}),typeof n!=`function`&&k(7),Y(e,t,[G],function(e){return q(fe(e.data[0],J(e.data[1])))},1,n)}function fe(e,t){return A(e,{i:2},t&&t.out,t&&t.dictionary)}var pe=function(e,t,n,i){for(var a in e){var o=e[a],s=t+a,c=i;Array.isArray(o)&&(c=H(i,o[1]),o=o[0]),ArrayBuffer.isView(o)?n[s]=[o,c]:(n[s+=`/`]=[new r(0),c],pe(o,s,n,i))}},me=typeof TextEncoder<`u`&&new TextEncoder,he=typeof TextDecoder<`u`&&new TextDecoder;try{he.decode(R,{stream:!0})}catch{}var ge=function(e){for(var t=``,n=0;;){var r=e[n++],i=(r>127)+(r>223)+(r>239);if(n+i>e.length)return{s:t,r:D(e,n-1)};i?i==3?(r=((r&15)<<18|(e[n++]&63)<<12|(e[n++]&63)<<6|e[n++]&63)-65536,t+=String.fromCharCode(55296|r>>10,56320|r&1023)):i&1?t+=String.fromCharCode((r&31)<<6|e[n++]&63):t+=String.fromCharCode((r&15)<<12|(e[n++]&63)<<6|e[n++]&63):t+=String.fromCharCode(r)}};function _e(e,t){if(t){for(var n=new r(e.length),i=0;i<e.length;++i)n[i]=e.charCodeAt(i);return n}if(me)return me.encode(e);for(var a=e.length,o=new r(e.length+(e.length>>1)),s=0,c=function(e){o[s++]=e},i=0;i<a;++i){if(s+5>o.length){var l=new r(s+8+(a-i<<1));l.set(o),o=l}var u=e.charCodeAt(i);u<128||t?c(u):u<2048?(c(192|u>>6),c(128|u&63)):u>55295&&u<57344?(u=65536+(u&1047552)|e.charCodeAt(++i)&1023,c(240|u>>18),c(128|u>>12&63),c(128|u>>6&63),c(128|u&63)):(c(224|u>>12),c(128|u>>6&63),c(128|u&63))}return D(o,0,s)}function ve(e,t){if(t){for(var n=``,r=0;r<e.length;r+=16384)n+=String.fromCharCode.apply(null,e.subarray(r,r+16384));return n}if(he)return he.decode(e);var i=ge(e),a=i.s,n=i.r;return n.length&&k(8),a}var ye=function(e,t){return t+30+X(e,t+26)+X(e,t+28)},be=function(e,t,n){var r=X(e,t+28),i=X(e,t+30),a=ve(e.subarray(t+46,t+46+r),!(X(e,t+8)&2048)),o=t+46+r,s=xe(e,o,i,n,Z(e,t+20),Z(e,t+24),Z(e,t+42)),c=s[0],l=s[1],u=s[2];return[X(e,t+10),c,l,a,o+i+X(e,t+32),u]},xe=function(e,t,n,r,i,a,o){var s=i==4294967295,c=a==4294967295,l=o==4294967295,u=t+n,d=s+c+l;if(r&&d){for(;t+4<u;t+=4+X(e,t+2))if(X(e,t)==1)return[s?ce(e,t+4+8*c):i,c?ce(e,t+4):a,l?ce(e,t+4+8*(c+s)):o,1];r<2&&k(13)}return[i,a,o,0]},Se=function(e){var t=0;if(e)for(var n in e){var r=e[n].length;r>65535&&k(9),t+=r+4}return t},Ce=function(e,t,n,r,i,a,o,s){var c=r.length,l=n.extra,u=s&&s.length,d=Se(l);Q(e,t,o==null?67324752:33639248),t+=4,o!=null&&(e[t++]=20,e[t++]=n.os),e[t]=20,t+=2,e[t++]=n.flag<<1|(a<0&&8),e[t++]=i&&8,e[t++]=n.compression&255,e[t++]=n.compression>>8;var f=new Date(n.mtime==null?Date.now():n.mtime),p=f.getFullYear()-1980;if((p<0||p>119)&&k(10),Q(e,t,p<<25|f.getMonth()+1<<21|f.getDate()<<16|f.getHours()<<11|f.getMinutes()<<5|f.getSeconds()>>1),t+=4,a!=-1&&(Q(e,t,n.crc),Q(e,t+4,a<0?-a-2:a),Q(e,t+8,n.size)),Q(e,t+12,c),Q(e,t+14,d),t+=16,o!=null&&(Q(e,t,u),Q(e,t+6,n.attrs),Q(e,t+10,o),t+=14),e.set(r,t),t+=c,d)for(var m in l){var h=l[m],g=h.length;Q(e,t,+m),Q(e,t+2,g),e.set(h,t+4),t+=4+g}return u&&(e.set(s,t),t+=u),t},we=function(e,t,n,r,i){Q(e,t,101010256),Q(e,t+8,n),Q(e,t+10,n),Q(e,t+12,r),Q(e,t+16,i)};function Te(e,t,n){n||(n=t,t={}),typeof n!=`function`&&k(7);var i={};pe(e,``,i,t);var a=Object.keys(i),o=a.length,s=0,c=0,l=o,u=Array(o),d=[],f=function(){for(var e=0;e<d.length;++e)d[e]()},p=function(e,t){Ee(function(){n(e,t)})};Ee(function(){p=n});var m=function(){var e=new r(c+22),t=s,n=c-s;c=0;for(var i=0;i<l;++i){var a=u[i];try{var o=a.c.length;Ce(e,c,a,a.f,a.u,o);var d=30+a.f.length+Se(a.extra),f=c+d;e.set(a.c,f),Ce(e,s,a,a.f,a.u,o,c,a.m),s+=16+d+(a.m?a.m.length:0),c=f+o}catch(e){return p(e,null)}}we(e,s,u.length,n,t),p(null,e)};o||m();for(var h=function(e){var t=a[e],n=i[t],r=n[0],l=n[1],h=B(),g=r.length;h.p(r);var _=_e(t),v=_.length,y=l.comment,b=y&&_e(y),x=b&&b.length,S=Se(l.extra),C=l.level==0?0:8,w=function(n,r){if(n)f(),p(n,null);else{var i=r.length;u[e]=H(l,{size:g,crc:h.d(),c:r,f:_,m:b,u:v!=t.length||b&&y.length!=x,compression:C}),s+=30+v+S+i,c+=76+2*(v+S)+(x||0)+i,--o||m()}};if(v>65535&&w(k(11,0,1),null),!C)w(null,r);else if(g<16e4)try{w(null,ue(r,l))}catch(e){w(e,null)}else d.push(le(r,l,w))},g=0;g<l;++g)h(g);return f}var Ee=typeof queueMicrotask==`function`?queueMicrotask:typeof setTimeout==`function`?setTimeout:function(e){e()};function De(e,t,n){n||(n=t,t={}),typeof n!=`function`&&k(7);var i=[],a=function(){for(var e=0;e<i.length;++e)i[e]()},o={},s=function(e,t){Ee(function(){n(e,t)})};Ee(function(){s=n});for(var c=e.length-22;Z(e,c)!=101010256;--c)if(!c||e.length-c>65558)return s(k(13,0,1),null),a;var l=X(e,c+8);if(l){var u=l,d=Z(e,c+16),f=Z(e,c-20)==117853008;if(f){var p=Z(e,c-12);f=Z(e,p)==101075792,f&&(u=l=Z(e,p+32),d=Z(e,p+48))}for(var m=t&&t.filter,h=function(t){var n=be(e,d,f),c=n[0],u=n[1],p=n[2],h=n[3],g=n[4],_=n[5],v=ye(e,_);d=g;var y=function(e,t){e?(a(),s(e,null)):(t&&(o[h]=t),--l||s(null,o))};if(!m||m({name:h,size:u,originalSize:p,compression:c})){if(!c)y(null,D(e,v,v+u));else if(c==8){var b=e.subarray(v,v+u);if(p<524288||u>.8*p)try{y(null,fe(b,{out:new r(p)}))}catch(e){y(e,null)}else i.push(de(b,{size:p},y))}else y(k(14,`unknown compression type `+c,1),null)}else y(null,null)},g=0;g<u;++g)h(g)}else s(null,{});return a}var Oe=[`read`,`write`,`auto`,`full`],ke={stoppable:!0,progress:!0},Ae={stoppable:!1,progress:!1},je={codex_cli:{platform:`Codex`,label:`Codex CLI`,kind:`cli`,location:`executable`,fields:[`project_id`,`project_name`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`,`ultra`],models:!0,access_levels:Oe,per_tool_allow:!1,access_hints:{read:`只读沙箱`,write:`项目可写的沙箱,命令在沙箱内运行、可联网`,auto:`沙箱外的操作由模型申请提权,Codex 自动审核代替人工批准`,full:`无沙箱、无审批(--dangerously-bypass-approvals-and-sandbox)`},client:`codex`,adopt:`session`,host_existing:!0,session_family:`codex`,capabilities:{delivery:ke,rewind:`cut`,project:!0,access_env:!0,enforces_read_only:!0,limits_directories:!0,ripgrep:!0,chat:!0}},codex:{platform:`Codex`,label:`Codex App`,kind:`app`,location:`executable`,fields:[`source_thread_id`,`project_id`,`project_name`],efforts:null,models:!1,access_levels:null,per_tool_allow:!1,client:`codex`,adopt:`session`,host_existing:!0,session_family:`codex`,capabilities:{delivery:Ae,rewind:`cut`,project:!0,chat:!0}},claude:{platform:`Claude`,label:`Claude Code`,kind:`cli`,location:`executable`,fields:[`allowed_tools`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`],models:!0,access_levels:Oe,per_tool_allow:!0,access_hints:{read:`只放行网站命令与草稿,不改项目文件、不跑其他命令`,write:`可改项目文件,Bash / PowerShell 命令全部放行(无沙箱)`,auto:`Claude auto 模式:由分类器判断,实测项目外写入和联网都会放行`,full:`bypassPermissions:跳过全部权限检查`},client:`claude`,adopt:`own_cwd`,host_existing:!0,restore_manual:!0,resume_command:e=>`claude --resume ${e}`,windows_command:`codiscuss`,capabilities:{delivery:ke,rewind:`cut`,project:!0,access_env:!0,chat:!0}},antigravity_cli:{platform:`Antigravity`,label:`Antigravity CLI`,kind:`cli`,location:`executable`,fields:[`project_id`,`project_name`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`],efforts_per_model:!0,models:!0,defaults_by_query:!0,access_levels:[`read`,`write`,`full`],per_tool_allow:!0,access_hints:{read:`只放行网站命令;碰到未放行的命令会直接结束本轮`,write:`可写项目,命令全部放行(在 agy 沙箱内)`,full:`跳过全部权限确认(--dangerously-skip-permissions),并放开沙箱外命令与 MCP 工具`},unsupported_hints:{auto:`agy 只在交互窗口提供自动模式,后台运行(-p)不支持`},client:`antigravity`,adopt:`session`,host_existing:!1,own_project_when_bound:!0,capabilities:{delivery:ke,rewind:`cut`,project:!0,access_env:!0,chat:!0},task_rules:(e,{runs_commands:t})=>(t?``:`无人值守下 run_command 只能运行 ${e} 的 subcommands 子命令,其他命令会被自动拒绝并使会话直接结束;列目录、搜索或读取文件用 list_dir、find_by_name、grep_search、view_file。`)+`多步任务中,在关键转折处用一句话写出进展再继续:agy 不输出思考过程,网页只能靠这些话显示你做到哪一步。`},antigravity:{platform:`Antigravity`,label:`Antigravity App`,kind:`app`,location:`ipc_directory`,fields:[`project_id`,`project_name`],efforts:null,models:!1,access_levels:null,per_tool_allow:!1,client:`antigravity`,adopt:`session`,host_existing:!0,capabilities:{delivery:Ae,rewind:`kept`,project:!0,chat:!0}},api:{platform:``,label:`模型 API`,kind:`api`,location:``,fields:[`base_url`,`api_protocol`,`api_key_ref`],efforts:null,models:!1,access_levels:[`read`,`write`],per_tool_allow:!1,adopt:``,host_existing:!1,access_hints:{read:`用接入程序的文件工具读取、搜索项目文件,可运行工作流登记的只读命令`,write:`还可新建、覆盖、局部编辑项目文件,可运行工作流登记的全部命令;没有通用命令行`},unsupported_hints:{auto:`API 成员没有通用命令行,没有需要软件审批的操作`,full:`API 成员没有通用命令行,没有需要软件审批的操作`},capabilities:{delivery:ke,rewind:`fresh`,project:!0,file_tools:!0,limits_directories:!0,chat:!0}}};Object.keys(je);function Me(e){let t=je[e];return t?{id:e,session_family:e,windows_command:`codiscuss.cmd`,...t}:null}var Ne=6e4,Pe=80,Fe=`AI CoDiscuss 聊天室备份
|
|
1
|
+
var discuss_backup=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t={},n=(function(e,n,r,i,a){var o=new Worker(t[n]||(t[n]=URL.createObjectURL(new Blob([e+`;addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})`],{type:`text/javascript`}))));return o.onmessage=function(e){var t=e.data,n=t.$e$;if(n){var r=Error(n[0]);r.code=n[1],r.stack=n[2],a(r,null)}else a(null,t)},o.postMessage(r,i),o}),r=Uint8Array,i=Uint16Array,a=Int32Array,o=new r([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),s=new r([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),c=new r([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),l=function(e,t){for(var n=new i(31),r=0;r<31;++r)n[r]=t+=1<<e[r-1];for(var o=new a(n[30]),r=1;r<30;++r)for(var s=n[r];s<n[r+1];++s)o[s]=s-n[r]<<5|r;return{b:n,r:o}},u=l(o,2),d=u.b,f=u.r;d[28]=258,f[258]=28;for(var p=l(s,0),m=p.b,h=p.r,g=new i(32768),_=0;_<32768;++_){var v=(_&43690)>>1|(_&21845)<<1;v=(v&52428)>>2|(v&13107)<<2,v=(v&61680)>>4|(v&3855)<<4,g[_]=((v&65280)>>8|(v&255)<<8)>>1}for(var y=(function(e,t,n){for(var r=e.length,a=0,o=new i(t);a<r;++a)e[a]&&++o[e[a]-1];var s=new i(t);for(a=1;a<t;++a)s[a]=s[a-1]+o[a-1]<<1;var c;if(n){c=new i(1<<t);var l=15-t;for(a=0;a<r;++a)if(e[a])for(var u=a<<4|e[a],d=t-e[a],f=s[e[a]-1]++<<d,p=f|(1<<d)-1;f<=p;++f)c[g[f]>>l]=u}else for(c=new i(r),a=0;a<r;++a)e[a]&&(c[a]=g[s[e[a]-1]++]>>15-e[a]);return c}),b=new r(288),_=0;_<144;++_)b[_]=8;for(var _=144;_<256;++_)b[_]=9;for(var _=256;_<280;++_)b[_]=7;for(var _=280;_<288;++_)b[_]=8;for(var x=new r(32),_=0;_<32;++_)x[_]=5;var S=y(b,9,0),C=y(b,9,1),w=y(x,5,0),ee=y(x,5,1),te=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},T=function(e,t,n){var r=t/8|0;return(e[r]|e[r+1]<<8)>>(t&7)&n},E=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)},ne=function(e){return(e+7)/8|0},D=function(e,t,n){return(t==null||t<0)&&(t=0),(n==null||n>e.length)&&(n=e.length),new r(e.subarray(t,n))},O=[`unexpected EOF`,`invalid block type`,`invalid length/literal`,`invalid distance`,`stream finished`,`no stream handler`,,`no callback`,`invalid UTF-8 data`,`extra field too long`,`date not in range 1980-2099`,`filename too long`,`stream finishing`,`invalid zip data`],k=function(e,t,n){var r=Error(t||O[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,k),!n)throw r;return r},A=function(e,t,n,i){var a=e.length,l=i?i.length:0;if(!a||t.f&&!t.l)return n||new r(0);var u=!n,f=u||t.i!=2,p=t.i;u&&(n=new r(a*3));var h=function(e){var t=n.length;if(e>t){var i=new r(Math.max(t*2,e));i.set(n),n=i}},g=t.f||0,_=t.p||0,v=t.b||0,b=t.l,x=t.d,S=t.m,w=t.n,O=a*8;do{if(!b){g=T(e,_,1);var A=T(e,_+1,3);if(_+=3,!A){var j=ne(_)+4,M=e[j-4]|e[j-3]<<8,N=j+M;if(N>a){p&&k(0);break}f&&h(v+M),n.set(e.subarray(j,N),v),t.b=v+=M,t.p=_=N*8,t.f=g;continue}if(A==1)b=C,x=ee,S=9,w=5;else if(A==2){var P=T(e,_,31)+257,re=T(e,_+10,15)+4,F=P+T(e,_+5,31)+1;_+=14;for(var ie=new r(F),I=new r(19),L=0;L<re;++L)I[c[L]]=T(e,_+L*3,7);_+=re*3;for(var R=te(I),ae=(1<<R)-1,z=y(I,R,1),L=0;L<F;){var B=z[T(e,_,ae)];_+=B&15;var j=B>>4;if(j<16)ie[L++]=j;else{var V=0,H=0;for(j==16?(H=3+T(e,_,3),_+=2,V=ie[L-1]):j==17?(H=3+T(e,_,7),_+=3):j==18&&(H=11+T(e,_,127),_+=7);H--;)ie[L++]=V}}var U=ie.subarray(0,P),W=ie.subarray(P);S=te(U),w=te(W),b=y(U,S,1),x=y(W,w,1)}else k(1);if(_>O){p&&k(0);break}}f&&h(v+131072);for(var oe=(1<<S)-1,se=(1<<w)-1,G=_;;G=_){var V=b[E(e,_)&oe],K=V>>4;if(_+=V&15,_>O){p&&k(0);break}if(V||k(2),K<256)n[v++]=K;else if(K==256){G=_,b=null;break}else{var q=K-254;if(K>264){var L=K-257,J=o[L];q=T(e,_,(1<<J)-1)+d[L],_+=J}var Y=x[E(e,_)&se],X=Y>>4;Y||k(3),_+=Y&15;var W=m[X];if(X>3){var J=s[X];W+=E(e,_)&(1<<J)-1,_+=J}if(_>O){p&&k(0);break}f&&h(v+131072);var Z=v+q;if(v<W){var ce=l-W,Q=Math.min(W,Z);for(ce+v<0&&k(3);v<Q;++v)n[v]=i[ce+v]}for(;v<Z;++v)n[v]=n[v-W]}}t.l=b,t.p=G,t.b=v,t.f=g,b&&(g=1,t.m=S,t.d=x,t.n=w)}while(!g);return v!=n.length&&u?D(n,0,v):n.subarray(0,v)},j=function(e,t,n){n<<=t&7;var r=t/8|0;e[r]|=n,e[r+1]|=n>>8},M=function(e,t,n){n<<=t&7;var r=t/8|0;e[r]|=n,e[r+1]|=n>>8,e[r+2]|=n>>16},N=function(e,t){for(var n=[],a=0;a<e.length;++a)e[a]&&n.push({s:a,f:e[a]});var o=n.length,s=n.slice();if(!o)return{t:R,l:0};if(o==1){var c=new r(n[0].s+1);return c[n[0].s]=1,{t:c,l:1}}n.sort(function(e,t){return e.f-t.f}),n.push({s:-1,f:25001});var l=n[0],u=n[1],d=0,f=1,p=2;for(n[0]={s:-1,f:l.f+u.f,l,r:u};f!=o-1;)l=n[n[d].f<n[p].f?d++:p++],u=n[d!=f&&n[d].f<n[p].f?d++:p++],n[f++]={s:-1,f:l.f+u.f,l,r:u};for(var m=s[0].s,a=1;a<o;++a)s[a].s>m&&(m=s[a].s);var h=new i(m+1),g=P(n[f-1],h,0);if(g>t){var a=0,_=0,v=g-t,y=1<<v;for(s.sort(function(e,t){return h[t.s]-h[e.s]||e.f-t.f});a<o;++a){var b=s[a].s;if(h[b]>t)_+=y-(1<<g-h[b]),h[b]=t;else break}for(_>>=v;_>0;){var x=s[a].s;h[x]<t?_-=1<<t-h[x]++-1:++a}for(;a>=0&&_;--a){var S=s[a].s;h[S]==t&&(--h[S],++_)}g=t}return{t:new r(h),l:g}},P=function(e,t,n){return e.s==-1?Math.max(P(e.l,t,n+1),P(e.r,t,n+1)):t[e.s]=n},re=function(e){for(var t=e.length;t&&!e[--t];);for(var n=new i(++t),r=0,a=e[0],o=1,s=function(e){n[r++]=e},c=1;c<=t;++c)if(e[c]==a&&c!=t)++o;else{if(!a&&o>2){for(;o>138;o-=138)s(32754);o>2&&(s(o>10?o-11<<5|28690:o-3<<5|12305),o=0)}else if(o>3){for(s(a),--o;o>6;o-=6)s(8304);o>2&&(s(o-3<<5|8208),o=0)}for(;o--;)s(a);o=1,a=e[c]}return{c:n.subarray(0,r),n:t}},F=function(e,t){for(var n=0,r=0;r<t.length;++r)n+=e[r]*t[r];return n},ie=function(e,t,n){var r=n.length,i=ne(t+2);e[i]=r&255,e[i+1]=r>>8,e[i+2]=e[i]^255,e[i+3]=e[i+1]^255;for(var a=0;a<r;++a)e[i+a+4]=n[a];return(i+4+r)*8},I=function(e,t,n,r,a,l,u,d,f,p,m){j(t,m++,n),++a[256];for(var h=N(a,15),g=h.t,_=h.l,v=N(l,15),C=v.t,ee=v.l,te=re(g),T=te.c,E=te.n,ne=re(C),D=ne.c,O=ne.n,k=new i(19),A=0;A<T.length;++A)++k[T[A]&31];for(var A=0;A<D.length;++A)++k[D[A]&31];for(var P=N(k,7),I=P.t,L=P.l,R=19;R>4&&!I[c[R-1]];--R);var ae=p+5<<3,z=F(a,b)+F(l,x)+u,B=F(a,g)+F(l,C)+u+14+3*R+F(k,I)+2*k[16]+3*k[17]+7*k[18];if(f>=0&&ae<=z&&ae<=B)return ie(t,m,e.subarray(f,f+p));var V,H,U,W;if(j(t,m,1+(B<z)),m+=2,B<z){V=y(g,_,0),H=g,U=y(C,ee,0),W=C;var oe=y(I,L,0);j(t,m,E-257),j(t,m+5,O-1),j(t,m+10,R-4),m+=14;for(var A=0;A<R;++A)j(t,m+3*A,I[c[A]]);m+=3*R;for(var se=[T,D],G=0;G<2;++G)for(var K=se[G],A=0;A<K.length;++A){var q=K[A]&31;j(t,m,oe[q]),m+=I[q],q>15&&(j(t,m,K[A]>>5&127),m+=K[A]>>12)}}else V=S,H=b,U=w,W=x;for(var A=0;A<d;++A){var J=r[A];if(J>255){var q=J>>18&31;M(t,m,V[q+257]),m+=H[q+257],q>7&&(j(t,m,J>>23&31),m+=o[q]);var Y=J&31;M(t,m,U[Y]),m+=W[Y],Y>3&&(M(t,m,J>>5&8191),m+=s[Y])}else M(t,m,V[J]),m+=H[J]}return M(t,m,V[256]),m+H[256]},L=new a([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),R=new r(0),ae=function(e,t,n,c,l,u){var d=u.z||e.length,p=new r(c+d+5*(1+Math.ceil(d/7e3))+l),m=p.subarray(c,p.length-l),g=u.l,_=(u.r||0)&7;if(t){_&&(m[0]=u.r>>3);for(var v=L[t-1],y=v>>13,b=v&8191,x=(1<<n)-1,S=u.p||new i(32768),C=u.h||new i(x+1),w=Math.ceil(n/3),ee=2*w,te=function(t){return(e[t]^e[t+1]<<w^e[t+2]<<ee)&x},T=new a(25e3),E=new i(288),O=new i(32),k=0,A=0,j=u.i||0,M=0,N=u.w||0,P=0;j+2<d;++j){var re=te(j),F=j&32767,R=C[re];if(S[F]=R,C[re]=F,N<=j){var ae=d-j;if((k>7e3||M>24576)&&(ae>423||!g)){_=I(e,m,0,T,E,O,A,M,P,j-P,_),M=k=A=0,P=j;for(var z=0;z<286;++z)E[z]=0;for(var z=0;z<30;++z)O[z]=0}var B=2,V=0,H=b,U=F-R&32767;if(ae>2&&re==te(j-U))for(var W=Math.min(y,ae)-1,oe=Math.min(32767,j),se=Math.min(258,ae);U<=oe&&--H&&F!=R;){if(e[j+B]==e[j+B-U]){for(var G=0;G<se&&e[j+G]==e[j+G-U];++G);if(G>B){if(B=G,V=U,G>W)break;for(var K=Math.min(U,G-2),q=0,z=0;z<K;++z){var J=j-U+z&32767,Y=J-S[J]&32767;Y>q&&(q=Y,R=J)}}}F=R,R=S[F],U+=F-R&32767}if(V){T[M++]=268435456|f[B]<<18|h[V];var X=f[B]&31,Z=h[V]&31;A+=o[X]+s[Z],++E[257+X],++O[Z],N=j+B,++k}else T[M++]=e[j],++E[e[j]]}}for(j=Math.max(j,N);j<d;++j)T[M++]=e[j],++E[e[j]];_=I(e,m,g,T,E,O,A,M,P,j-P,_),g||(u.r=_&7|m[_/8|0]<<3,_-=7,u.h=C,u.p=S,u.i=j,u.w=N)}else{for(var j=u.w||0;j<d+g;j+=65535){var ce=j+65535;ce>=d&&(m[_/8|0]=g,ce=d),_=ie(m,_+1,e.subarray(j,ce))}u.i=d}return D(p,0,c+ne(_)+l)},z=(function(){for(var e=new Int32Array(256),t=0;t<256;++t){for(var n=t,r=9;--r;)n=(n&1&&-306674912)^n>>>1;e[t]=n}return e})(),B=function(){var e=-1;return{p:function(t){for(var n=e,r=0;r<t.length;++r)n=z[n&255^t[r]]^n>>>8;e=n},d:function(){return~e}}},V=function(e,t,n,i,a){if(!a&&(a={l:1},t.dictionary)){var o=t.dictionary.subarray(-32768),s=new r(o.length+e.length);s.set(o),s.set(e,o.length),e=s,a.w=o.length}return ae(e,t.level==null?6:t.level,t.mem==null?a.l?Math.ceil(Math.max(8,Math.min(13,Math.log(e.length)))*1.5):20:12+t.mem,n,i,a)},H=function(e,t){var n={};for(var r in e)n[r]=e[r];for(var r in t)n[r]=t[r];return n},U=function(e,t,n){for(var r=e(),i=e.toString(),a=i.slice(i.indexOf(`[`)+1,i.lastIndexOf(`]`)).replace(/\s+/g,``).split(`,`),o=0;o<r.length;++o){var s=r[o],c=a[o];if(typeof s==`function`){t+=`;`+c+`=`;var l=s.toString();if(s.prototype){if(l.indexOf(`[native code]`)!=-1){var u=l.indexOf(` `,8)+1;t+=l.slice(u,l.indexOf(`(`,u))}else for(var d in t+=l,s.prototype)t+=`;`+c+`.prototype.`+d+`=`+s.prototype[d].toString()}else t+=l}else n[c]=s}return t},W=[],oe=function(e){var t=[];for(var n in e)e[n].buffer&&t.push((e[n]=new e[n].constructor(e[n])).buffer);return t},se=function(e,t,r,i){if(!W[r]){for(var a=``,o={},s=e.length-1,c=0;c<s;++c)a=U(e[c],a,o);W[r]={c:U(e[s],a,o),e:o}}var l=H({},W[r].e);return n(W[r].c+`;onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=`+t.toString()+`}`,r,l,oe(l),i)},G=function(){return[r,i,a,o,s,c,d,m,C,ee,g,O,y,te,T,E,ne,D,k,A,fe,q,J]},K=function(){return[r,i,a,o,s,c,f,h,S,b,w,x,g,L,R,y,j,M,N,P,re,F,ie,I,ne,D,ae,V,ue,q]},q=function(e){return postMessage(e,[e.buffer])},J=function(e){return e&&{out:e.size&&new r(e.size),dictionary:e.dictionary}},Y=function(e,t,n,r,i,a){var o=se(n,r,i,function(e,t){o.terminate(),a(e,t)});return o.postMessage([e,t],t.consume?[e.buffer]:[]),function(){o.terminate()}},X=function(e,t){return e[t]|e[t+1]<<8},Z=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},ce=function(e,t){return Z(e,t)+Z(e,t+4)*4294967296},Q=function(e,t,n){for(;n;++t)e[t]=n,n>>>=8};function le(e,t,n){return n||(n=t,t={}),typeof n!=`function`&&k(7),Y(e,t,[K],function(e){return q(ue(e.data[0],e.data[1]))},0,n)}function ue(e,t){return V(e,t||{},0,0)}function de(e,t,n){return n||(n=t,t={}),typeof n!=`function`&&k(7),Y(e,t,[G],function(e){return q(fe(e.data[0],J(e.data[1])))},1,n)}function fe(e,t){return A(e,{i:2},t&&t.out,t&&t.dictionary)}var pe=function(e,t,n,i){for(var a in e){var o=e[a],s=t+a,c=i;Array.isArray(o)&&(c=H(i,o[1]),o=o[0]),ArrayBuffer.isView(o)?n[s]=[o,c]:(n[s+=`/`]=[new r(0),c],pe(o,s,n,i))}},me=typeof TextEncoder<`u`&&new TextEncoder,he=typeof TextDecoder<`u`&&new TextDecoder;try{he.decode(R,{stream:!0})}catch{}var ge=function(e){for(var t=``,n=0;;){var r=e[n++],i=(r>127)+(r>223)+(r>239);if(n+i>e.length)return{s:t,r:D(e,n-1)};i?i==3?(r=((r&15)<<18|(e[n++]&63)<<12|(e[n++]&63)<<6|e[n++]&63)-65536,t+=String.fromCharCode(55296|r>>10,56320|r&1023)):i&1?t+=String.fromCharCode((r&31)<<6|e[n++]&63):t+=String.fromCharCode((r&15)<<12|(e[n++]&63)<<6|e[n++]&63):t+=String.fromCharCode(r)}};function _e(e,t){if(t){for(var n=new r(e.length),i=0;i<e.length;++i)n[i]=e.charCodeAt(i);return n}if(me)return me.encode(e);for(var a=e.length,o=new r(e.length+(e.length>>1)),s=0,c=function(e){o[s++]=e},i=0;i<a;++i){if(s+5>o.length){var l=new r(s+8+(a-i<<1));l.set(o),o=l}var u=e.charCodeAt(i);u<128||t?c(u):u<2048?(c(192|u>>6),c(128|u&63)):u>55295&&u<57344?(u=65536+(u&1047552)|e.charCodeAt(++i)&1023,c(240|u>>18),c(128|u>>12&63),c(128|u>>6&63),c(128|u&63)):(c(224|u>>12),c(128|u>>6&63),c(128|u&63))}return D(o,0,s)}function ve(e,t){if(t){for(var n=``,r=0;r<e.length;r+=16384)n+=String.fromCharCode.apply(null,e.subarray(r,r+16384));return n}if(he)return he.decode(e);var i=ge(e),a=i.s,n=i.r;return n.length&&k(8),a}var ye=function(e,t){return t+30+X(e,t+26)+X(e,t+28)},be=function(e,t,n){var r=X(e,t+28),i=X(e,t+30),a=ve(e.subarray(t+46,t+46+r),!(X(e,t+8)&2048)),o=t+46+r,s=xe(e,o,i,n,Z(e,t+20),Z(e,t+24),Z(e,t+42)),c=s[0],l=s[1],u=s[2];return[X(e,t+10),c,l,a,o+i+X(e,t+32),u]},xe=function(e,t,n,r,i,a,o){var s=i==4294967295,c=a==4294967295,l=o==4294967295,u=t+n,d=s+c+l;if(r&&d){for(;t+4<u;t+=4+X(e,t+2))if(X(e,t)==1)return[s?ce(e,t+4+8*c):i,c?ce(e,t+4):a,l?ce(e,t+4+8*(c+s)):o,1];r<2&&k(13)}return[i,a,o,0]},Se=function(e){var t=0;if(e)for(var n in e){var r=e[n].length;r>65535&&k(9),t+=r+4}return t},Ce=function(e,t,n,r,i,a,o,s){var c=r.length,l=n.extra,u=s&&s.length,d=Se(l);Q(e,t,o==null?67324752:33639248),t+=4,o!=null&&(e[t++]=20,e[t++]=n.os),e[t]=20,t+=2,e[t++]=n.flag<<1|(a<0&&8),e[t++]=i&&8,e[t++]=n.compression&255,e[t++]=n.compression>>8;var f=new Date(n.mtime==null?Date.now():n.mtime),p=f.getFullYear()-1980;if((p<0||p>119)&&k(10),Q(e,t,p<<25|f.getMonth()+1<<21|f.getDate()<<16|f.getHours()<<11|f.getMinutes()<<5|f.getSeconds()>>1),t+=4,a!=-1&&(Q(e,t,n.crc),Q(e,t+4,a<0?-a-2:a),Q(e,t+8,n.size)),Q(e,t+12,c),Q(e,t+14,d),t+=16,o!=null&&(Q(e,t,u),Q(e,t+6,n.attrs),Q(e,t+10,o),t+=14),e.set(r,t),t+=c,d)for(var m in l){var h=l[m],g=h.length;Q(e,t,+m),Q(e,t+2,g),e.set(h,t+4),t+=4+g}return u&&(e.set(s,t),t+=u),t},we=function(e,t,n,r,i){Q(e,t,101010256),Q(e,t+8,n),Q(e,t+10,n),Q(e,t+12,r),Q(e,t+16,i)};function Te(e,t,n){n||(n=t,t={}),typeof n!=`function`&&k(7);var i={};pe(e,``,i,t);var a=Object.keys(i),o=a.length,s=0,c=0,l=o,u=Array(o),d=[],f=function(){for(var e=0;e<d.length;++e)d[e]()},p=function(e,t){Ee(function(){n(e,t)})};Ee(function(){p=n});var m=function(){var e=new r(c+22),t=s,n=c-s;c=0;for(var i=0;i<l;++i){var a=u[i];try{var o=a.c.length;Ce(e,c,a,a.f,a.u,o);var d=30+a.f.length+Se(a.extra),f=c+d;e.set(a.c,f),Ce(e,s,a,a.f,a.u,o,c,a.m),s+=16+d+(a.m?a.m.length:0),c=f+o}catch(e){return p(e,null)}}we(e,s,u.length,n,t),p(null,e)};o||m();for(var h=function(e){var t=a[e],n=i[t],r=n[0],l=n[1],h=B(),g=r.length;h.p(r);var _=_e(t),v=_.length,y=l.comment,b=y&&_e(y),x=b&&b.length,S=Se(l.extra),C=l.level==0?0:8,w=function(n,r){if(n)f(),p(n,null);else{var i=r.length;u[e]=H(l,{size:g,crc:h.d(),c:r,f:_,m:b,u:v!=t.length||b&&y.length!=x,compression:C}),s+=30+v+S+i,c+=76+2*(v+S)+(x||0)+i,--o||m()}};if(v>65535&&w(k(11,0,1),null),!C)w(null,r);else if(g<16e4)try{w(null,ue(r,l))}catch(e){w(e,null)}else d.push(le(r,l,w))},g=0;g<l;++g)h(g);return f}var Ee=typeof queueMicrotask==`function`?queueMicrotask:typeof setTimeout==`function`?setTimeout:function(e){e()};function De(e,t,n){n||(n=t,t={}),typeof n!=`function`&&k(7);var i=[],a=function(){for(var e=0;e<i.length;++e)i[e]()},o={},s=function(e,t){Ee(function(){n(e,t)})};Ee(function(){s=n});for(var c=e.length-22;Z(e,c)!=101010256;--c)if(!c||e.length-c>65558)return s(k(13,0,1),null),a;var l=X(e,c+8);if(l){var u=l,d=Z(e,c+16),f=Z(e,c-20)==117853008;if(f){var p=Z(e,c-12);f=Z(e,p)==101075792,f&&(u=l=Z(e,p+32),d=Z(e,p+48))}for(var m=t&&t.filter,h=function(t){var n=be(e,d,f),c=n[0],u=n[1],p=n[2],h=n[3],g=n[4],_=n[5],v=ye(e,_);d=g;var y=function(e,t){e?(a(),s(e,null)):(t&&(o[h]=t),--l||s(null,o))};if(!m||m({name:h,size:u,originalSize:p,compression:c})){if(!c)y(null,D(e,v,v+u));else if(c==8){var b=e.subarray(v,v+u);if(p<524288||u>.8*p)try{y(null,fe(b,{out:new r(p)}))}catch(e){y(e,null)}else i.push(de(b,{size:p},y))}else y(k(14,`unknown compression type `+c,1),null)}else y(null,null)},g=0;g<u;++g)h(g)}else s(null,{});return a}var Oe=[`read`,`write`,`auto`,`full`],ke={stoppable:!0,progress:!0},Ae={stoppable:!1,progress:!1},je={codex_cli:{platform:`Codex`,label:`Codex CLI`,kind:`cli`,location:`executable`,fields:[`project_id`,`project_name`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`,`ultra`],models:!0,access_levels:Oe,per_tool_allow:!1,access_hints:{read:`只读沙箱`,write:`项目可写的沙箱,命令在沙箱内运行、可联网`,auto:`沙箱外的操作由模型申请提权,Codex 自动审核代替人工批准`,full:`无沙箱、无审批(--dangerously-bypass-approvals-and-sandbox)`},client:`codex`,adopt:`session`,host_existing:!0,session_family:`codex`,capabilities:{delivery:ke,rewind:`cut`,project:!0,access_env:!0,enforces_read_only:!0,limits_directories:!0,ripgrep:!0,chat:!0,resume:!0}},codex:{platform:`Codex`,label:`Codex App`,kind:`app`,location:`executable`,fields:[`source_thread_id`,`project_id`,`project_name`],efforts:null,models:!1,access_levels:null,per_tool_allow:!1,client:`codex`,adopt:`session`,host_existing:!0,session_family:`codex`,capabilities:{delivery:Ae,rewind:`cut`,project:!0,chat:!0}},claude:{platform:`Claude`,label:`Claude Code`,kind:`cli`,location:`executable`,fields:[`allowed_tools`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`],models:!0,access_levels:Oe,per_tool_allow:!0,access_hints:{read:`只放行网站命令与草稿,不改项目文件、不跑其他命令`,write:`可改项目文件,Bash / PowerShell 命令全部放行(无沙箱)`,auto:`Claude auto 模式:由分类器判断,实测项目外写入和联网都会放行`,full:`bypassPermissions:跳过全部权限检查`},client:`claude`,adopt:`own_cwd`,host_existing:!0,restore_manual:!0,resume_command:e=>`claude --resume ${e}`,windows_command:`codiscuss`,capabilities:{delivery:ke,rewind:`cut`,project:!0,access_env:!0,chat:!0,resume:!0}},antigravity_cli:{platform:`Antigravity`,label:`Antigravity CLI`,kind:`cli`,location:`executable`,fields:[`project_id`,`project_name`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`],efforts_per_model:!0,models:!0,defaults_by_query:!0,access_levels:[`read`,`write`,`full`],per_tool_allow:!0,access_hints:{read:`只放行网站命令;碰到未放行的命令会直接结束本轮`,write:`可写项目,命令全部放行(在 agy 沙箱内)`,full:`跳过全部权限确认(--dangerously-skip-permissions),并放开沙箱外命令与 MCP 工具`},unsupported_hints:{auto:`agy 只在交互窗口提供自动模式,后台运行(-p)不支持`},client:`antigravity`,adopt:`session`,host_existing:!1,own_project_when_bound:!0,capabilities:{delivery:ke,rewind:`cut`,project:!0,access_env:!0,chat:!0},task_rules:(e,{runs_commands:t})=>(t?``:`无人值守下 run_command 只能运行 ${e} 的 subcommands 子命令,其他命令会被自动拒绝并使会话直接结束;列目录、搜索或读取文件用 list_dir、find_by_name、grep_search、view_file。`)+`多步任务中,在关键转折处用一句话写出进展再继续:agy 不输出思考过程,网页只能靠这些话显示你做到哪一步。`},antigravity:{platform:`Antigravity`,label:`Antigravity App`,kind:`app`,location:`ipc_directory`,fields:[`project_id`,`project_name`],efforts:null,models:!1,access_levels:null,per_tool_allow:!1,client:`antigravity`,adopt:`session`,host_existing:!0,capabilities:{delivery:Ae,rewind:`kept`,project:!0,chat:!0}},api:{platform:``,label:`模型 API`,kind:`api`,location:``,fields:[`base_url`,`api_protocol`,`api_key_ref`],efforts:null,models:!1,access_levels:[`read`,`write`],per_tool_allow:!1,adopt:``,host_existing:!1,access_hints:{read:`用接入程序的文件工具读取、搜索项目文件,可运行工作流登记的只读命令`,write:`还可新建、覆盖、局部编辑项目文件,可运行工作流登记的全部命令;没有通用命令行`},unsupported_hints:{auto:`API 成员没有通用命令行,没有需要软件审批的操作`,full:`API 成员没有通用命令行,没有需要软件审批的操作`},capabilities:{delivery:ke,rewind:`fresh`,project:!0,file_tools:!0,limits_directories:!0,chat:!0}}};Object.keys(je);function Me(e){let t=je[e];return t?{id:e,session_family:e,windows_command:`codiscuss.cmd`,...t}:null}var Ne=6e4,Pe=80,Fe=`AI CoDiscuss 聊天室备份
|
|
2
2
|
|
|
3
3
|
完整数据.json:指定聊天室在导出时的数据库快照,保留全部原始字段、编号和关联。
|
|
4
4
|
讨论记录.md:便于离线阅读的资料、消息原文与发言安排,正文以文本块原样保留。
|