@apprun/shiqu 0.7.0 → 0.8.6
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/.env.example +13 -2
- package/NOTICE +2 -2
- package/README.md +71 -163
- package/dist/client/assets/{es-DlNSYSrl.js → es-CBsgoCHl.js} +1 -1
- package/dist/client/assets/index-BPiTaaCR.js +17 -0
- package/dist/client/assets/index-egRwTEU4.css +1 -0
- package/dist/client/assets/{reader-pdf-Dcx6AQ3i.js → reader-pdf-CXa9cNDj.js} +3 -3
- package/dist/client/assets/reader-png-CPdbjfTu.js +1 -0
- package/dist/client/assets/{reader-zip-hDWZbXX9.js → reader-zip-CdfYnjh_.js} +5 -5
- package/dist/client/index.html +2 -2
- package/dist/client/offline.html +3 -1
- package/dist/client/sw.js +1 -1
- package/dist/server/cli.js +2255 -1583
- package/docker/seed.sql +1 -5
- package/drizzle/0018_consolidate_story_storage.sql +13 -0
- package/drizzle/0019_refuse_pre_consolidation_apps.sql +9 -0
- package/drizzle/0020_blocked_revision_faults.sql +25 -0
- package/package.json +1 -1
- package/skills/shiqu/SKILL.md +11 -0
- package/dist/client/assets/index-BBpP1F_U.js +0 -17
- package/dist/client/assets/index-BOFTbC7e.css +0 -1
- package/dist/client/assets/reader-png-B6Cj2Di0.js +0 -1
package/docker/seed.sql
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
-- Initialize book metadata only. New libraries contain no finished stories.
|
|
2
|
-
INSERT INTO books (id,title,author,era,source_url,excerpt,note) VALUES ('liaozhai','聊斋志异','蒲松龄','清','
|
|
3
|
-
|
|
4
|
-
肆中傭保者,見喋聒不堪,遂出錢市一枚,付道士,道士拜謝,謂眾曰:「出家人不解吝惜,我有佳梨,請出供客。」或曰:「既有之,何不自食?」曰:「吾特需此核作種。」於是掬梨大啗,且盡,把核於手,解肩上鑱坎地上深數寸,納之,而覆以土,向市人索湯沃灌。好事者,於臨路店,索得沸瀋,道士接浸坎處。萬目攢視,見有勾萌出,漸大,俄成樹,枝葉扶疏,倏而花,倏而實,碩大芳馥,纍纍滿樹。道人乃即樹頭,摘賜觀者,頃刻而盡,已乃以鑱伐樹,丁丁良久乃斷,帶葉荷肩頭從容徐步而去。
|
|
5
|
-
|
|
6
|
-
初道士作法時,鄉人亦雜眾中,引領注目,竟忘其業。道士既去,始顧車中,則梨已空矣,方悟適所俵散,皆己物也。又細視車上一靶亡,是新鑿斷者,心大憤恨。急跡之,轉過牆隅,則斷靶棄垣下,始知所伐梨本,即是物也。道士不知所在,一市粲然。','已录入《种梨》原文。其他篇目需提供可靠原文后再改编。') ON CONFLICT(id) DO NOTHING;
|
|
2
|
+
INSERT INTO books (id,title,author,era,source_url,excerpt,note) VALUES ('liaozhai','聊斋志异','蒲松龄','清','','','待录入选定篇目的原文与来源。') ON CONFLICT(id) DO NOTHING;
|
|
7
3
|
INSERT INTO books (id,title,author,era,source_url,excerpt,note) VALUES ('shishuo','世说新语','刘义庆 编','南朝宋','','','待录入选定篇目的原文与来源。') ON CONFLICT(id) DO NOTHING;
|
|
8
4
|
INSERT INTO books (id,title,author,era,source_url,excerpt,note) VALUES ('zhuangzi','庄子','庄周等','先秦','','','待录入选定篇目的原文与来源。') ON CONFLICT(id) DO NOTHING;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
-- The coordinator inventories files and verifies recovery before this destructive transaction.
|
|
2
|
+
DELETE FROM book_image_references WHERE story_id NOT IN (SELECT id FROM reader_sessions);
|
|
3
|
+
DELETE FROM events WHERE story_id NOT IN (SELECT id FROM reader_sessions);
|
|
4
|
+
DELETE FROM library_deletions WHERE kind='published';
|
|
5
|
+
-- liaozhai returns to the seed placeholder so upgraded and new libraries hold the same catalog row.
|
|
6
|
+
UPDATE books SET excerpt='',source_url='',note=CASE id WHEN 'liaozhai' THEN '待录入选定篇目的原文与来源。' ELSE '' END WHERE id IN ('liaozhai','zhongshanlang');
|
|
7
|
+
DELETE FROM books WHERE id='zhongshanlang' AND NOT EXISTS (
|
|
8
|
+
SELECT 1 FROM reader_sessions WHERE json_extract(selection,'$.bookId')='zhongshanlang');
|
|
9
|
+
DROP TABLE stories;
|
|
10
|
+
DROP TABLE jobs;
|
|
11
|
+
DROP TABLE progress;
|
|
12
|
+
ALTER TABLE reader_sessions RENAME TO stories;
|
|
13
|
+
PRAGMA user_version=1;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
-- Released 0.2-0.7 apps have no schema-version check, but each one seeds liaozhai first with its
|
|
2
|
+
-- source URL and demo text on every open. Abort that write so they refuse this library with a clear
|
|
3
|
+
-- message instead of opening it and failing every story request. The 0.8+ seed row is empty.
|
|
4
|
+
-- 0.7 CLI receipts show only EXPORT_/BACKUP_/SKILL_ messages, so the code uses the BACKUP_ prefix.
|
|
5
|
+
CREATE TRIGGER books_refuse_pre_consolidation_seed BEFORE INSERT ON books
|
|
6
|
+
WHEN NEW.id='liaozhai' AND (NEW.source_url<>'' OR NEW.excerpt<>'')
|
|
7
|
+
BEGIN
|
|
8
|
+
SELECT RAISE(ABORT,'BACKUP_APP_TOO_OLD: this library requires Shiqu 0.8.0 or later; update the app, or restore the pre-upgrade backup with its matching older app');
|
|
9
|
+
END;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
-- A rejected review inherited by a revision is already failed at INSERT, so the
|
|
2
|
+
-- ordinary UPDATE failure trigger cannot create its recovery authorization.
|
|
3
|
+
-- Keep the child and its own fault atomic; parent faults remain parent-owned.
|
|
4
|
+
CREATE TRIGGER stories_blocked_revision_fault AFTER INSERT ON stories
|
|
5
|
+
WHEN NEW.state='failed' AND json_valid(NEW.document)
|
|
6
|
+
AND json_type(NEW.document,'$.revision.parentId')='text'
|
|
7
|
+
AND json_extract(NEW.document,'$.visualReview.status')='blocked'
|
|
8
|
+
AND COALESCE(json_extract(NEW.document,'$.visualReview.overridden'),0)=0
|
|
9
|
+
AND NOT EXISTS(SELECT 1 FROM reader_faults f WHERE f.session_id=NEW.id
|
|
10
|
+
AND f.owner_id=NEW.user_id AND f.state IN ('pending','recovering')) BEGIN
|
|
11
|
+
INSERT INTO reader_faults(id,session_id,owner_id,kind,version,message,created_at,updated_at)
|
|
12
|
+
VALUES(lower(hex(randomblob(16))),NEW.id,NEW.user_id,'job','legacy',COALESCE(NEW.error,'制作未完成'),
|
|
13
|
+
CAST(strftime('%s','now') AS integer)*1000,CAST(strftime('%s','now') AS integer)*1000);
|
|
14
|
+
END;
|
|
15
|
+
|
|
16
|
+
-- Repair only stranded blocked revisions; existing authorizations keep their IDs.
|
|
17
|
+
INSERT INTO reader_faults(id,session_id,owner_id,kind,version,message,created_at,updated_at)
|
|
18
|
+
SELECT lower(hex(randomblob(16))),s.id,s.user_id,'job','legacy',COALESCE(s.error,'制作未完成'),
|
|
19
|
+
CAST(strftime('%s','now') AS integer)*1000,CAST(strftime('%s','now') AS integer)*1000
|
|
20
|
+
FROM stories s WHERE s.state='failed' AND json_valid(s.document)
|
|
21
|
+
AND json_type(s.document,'$.revision.parentId')='text'
|
|
22
|
+
AND json_extract(s.document,'$.visualReview.status')='blocked'
|
|
23
|
+
AND COALESCE(json_extract(s.document,'$.visualReview.overridden'),0)=0
|
|
24
|
+
AND NOT EXISTS(SELECT 1 FROM reader_faults f WHERE f.session_id=s.id
|
|
25
|
+
AND f.owner_id=s.user_id AND f.state IN ('pending','recovering'));
|
package/package.json
CHANGED
package/skills/shiqu/SKILL.md
CHANGED
|
@@ -15,6 +15,7 @@ description: 根据拾趣的数据契约与业务规则,自主编写任务程
|
|
|
15
15
|
- 所有书库操作使用同一绝对路径:显式 `--data-dir` 优先,其次 `SHIQU_DATA_DIR`、已保存位置和默认书库。首次访问自动建库并迁移,无需先 init;不因此更改默认位置或模型配置。书库被其他服务占用时报告占用,不绕过锁。
|
|
16
16
|
- 自主程序使用进程 API 的可执行文件与参数数组,JSON 经 `--input -` 的 stdin 或私有文件传入;不要把标题、路径、原文、提示词拼接成 shell 命令。沿用入口及其工作目录,处理 stdout 与 stderr,设置有限超时。同一书库的 CLI 调用串行执行,避免独占开库冲突。
|
|
17
17
|
- 子命令 stdout 为一个 JSON 信封:成功 `{schemaVersion:1,ok:true,data:...}`,失败 `{schemaVersion:1,ok:false,error:{code,message,details?}}`;日志在 stderr。检查退出码、信封及业务结果。`skill show` 默认是 Markdown,带 `--json` 才是信封。不要把非零退出的 JSON 丢弃,也不要把退出码 0 或 `ok:true` 当作故事完成。
|
|
18
|
+
- CLI 子命令无交互,所有询问、检查点和阶段选择由本技能在对话中处理;不要向 CLI 发送终端按键或等待它提问。
|
|
18
19
|
- 继续使用已保存的提供方与模型;缺配置时查当前 `config` 帮助。密钥仅经已有环境、私有 JSON 文件或 stdin 传入,不进入 argv、对话、报告或日志;不自行切换提供方或计费方式。
|
|
19
20
|
|
|
20
21
|
## 数据契约
|
|
@@ -52,9 +53,19 @@ description: 根据拾趣的数据契约与业务规则,自主编写任务程
|
|
|
52
53
|
| 执行生产 | `run <id> --until candidates\|prepared\|reviewed\|completed`。candidates 后按用户目标选择或等待;prepared 后检查原文、摘要和方案并确认;reviewed 在审核通过且生图前停止;默认 completed。每次检查返回 reason 和 session,不假定达到了请求边界。 |
|
|
53
54
|
| 解释停止原因 | `choice` 需选题;`frame_count_required` 是旧故事等待幅数确认,按 help 的 frameCount 输入处理;`already_prepared/already_selected` 表示已越过该边界,改用下一步;`paused` 保持暂停,`blocked` 检查故障,`superseded` 查当前版本。不能在同一停止边界空转。 |
|
|
54
55
|
| 修改与控制 | `stories edit` 使用 token/changes 创建新版;rename 仅改显示名。pause/resume/stop 控制制作;retry/override 针对当前故障。reselect/replace/cancel-reselection 按现有草稿协议处理。 |
|
|
56
|
+
| 跨库复制 | `stories copy <来源故事id> --from-data-dir <来源书库> --data-dir <目标书库>` 默认仅复制已通过审核的文本与审核记录,新故事初始暂停。`stories copy-images <目标故事id>` 用同一对书库及输入 `{sourceId:"来源故事id"}` 给已有文本副本补充图片,不创建另一个故事。`copy` 也支持显式 `--copy-images` / `--no-copy-images` 或输入 `copyImages`;仅在用户已决定时使用。换画风时不能复制旧图片。 |
|
|
55
57
|
| 预览与交付 | preview 输出独立离线 HTML;export 支持 zip/pdf/png/json/md,使用共享序列化、图片编码、水印和元数据规则。自主程序可组织导出清单,不能自己重建作品包。 |
|
|
56
58
|
| 维护 | backup 创建完整私有快照,verify-backup 验证;restore 仅恢复到新的 data-dir,不覆盖原库或自动切换默认位置。diagnostics 输出脱敏诊断;它与私有完整备份用途不同。 |
|
|
57
59
|
|
|
60
|
+
## 制片流程控制
|
|
61
|
+
|
|
62
|
+
本技能负责决定下一阶段,CLI 负责执行明确动作。根据用户目标和已保存状态推进;用户指定的选题、原文、方案、文本或生图前检查点,必须先报告结果并取得所需选择,再运行后续命令。文本与图片是分别可交付的结果,文本完成不代表已获准处理图片。
|
|
63
|
+
|
|
64
|
+
- 制作时按需要使用 `run --until candidates|prepared|reviewed|completed`,核对实际返回的 `reason/session` 后再选下一步。审核通过、生图尚未开始时可预览文本并处理反馈;不要为检查文本而直接运行到 `completed`。用户已经明确授权的阶段可以继续,不重复询问;未授权的生图、恢复或越过审核不自动执行。
|
|
65
|
+
- 复制故事时,先调用不含图片的 `stories copy`,记录来源书库、来源 id、目标书库、返回的目标 id,以及原创建 requestId 和输入。核对目标文本与审核记录后,先向用户说明“文本已复制”,再在对话中询问是否复制来源已有图片;展示已有图片数/总幅数,不能用图片生成代替图片复制。
|
|
66
|
+
- 用户同意复制图片后,调用 `stories copy-images <目标id> --from-data-dir <来源书库> --data-dir <目标书库>`,输入 `{sourceId:"来源id"}`。这是给同一文本副本补图的独立动作,不修改原创建请求、不重新复制文本。用户拒绝或尚未回答时,保留文本并等待;用户此前已明确要求连图片一起复制时,沿用该授权,无需再问。
|
|
67
|
+
- 更换画风或来源没有图片时,说明不能沿用旧图或没有可复制图片。若用户想制作新图,先确认画风和制作范围,再通过目标故事的恢复与 `run` 生产流程执行。复制文本和图片均不重新审核、不调用模型;图片复制失败保留文本,沿用相同目标 id 与来源输入重试,遇到输入冲突时停止并重新核对。
|
|
68
|
+
|
|
58
69
|
## 验收与交付
|
|
59
70
|
|
|
60
71
|
- 整理报告:说明使用的书库、筛选范围与当前版本;缺图数量来自实际 pages,尚无分镜时报告“未编排”,部分分镜报告“编排中”,不当作 0 幅完成。分析字段不全时补读 get/current/source,仍缺失则标注未知。
|