@bryanhu/codexly 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/README.md +4 -0
- package/README.zh-CN.md +4 -0
- package/dist/{chunk-NROPHBJ7.js → chunk-2J5P2EG2.js} +2508 -4038
- package/dist/{chunk-3PU3WPOK.js → chunk-AIACWU7L.js} +659 -72
- package/dist/chunk-B2673ODM.js +260 -0
- package/dist/chunk-GT7XTSEG.js +56 -0
- package/dist/{chunk-M6GWGUSX.js → chunk-X5JZ3VOF.js} +311 -77
- package/dist/{chunk-2O7SN37L.js → chunk-ZUECHB6L.js} +1 -1
- package/dist/cli.js +113 -39
- package/dist/client/index.js +135 -11
- package/dist/core/index.js +1 -1
- package/dist/protocol/index.js +2 -1
- package/dist/providers/codex/index.js +4 -3
- package/dist/runtime-instance-worker.js +19 -0
- package/dist/scheduled-task-recurrence-worker.js +2969 -0
- package/dist/server/index.js +6 -5
- package/dist/sqlite-state-worker.js +156 -13
- package/dist/web/.vite/manifest.json +106 -106
- package/dist/web/.vite/manifest.json.br +0 -0
- package/dist/web/.vite/manifest.json.gz +0 -0
- package/dist/web/assets/{agent-settings-panel-BagNBAoe.js → agent-settings-panel-B3hoqvYI.js} +1 -1
- package/dist/web/assets/agent-settings-panel-B3hoqvYI.js.br +0 -0
- package/dist/web/assets/agent-settings-panel-B3hoqvYI.js.gz +0 -0
- package/dist/web/assets/background-image-picker-DV18Olkx.js +1 -0
- package/dist/web/assets/background-image-picker-DV18Olkx.js.br +0 -0
- package/dist/web/assets/background-image-picker-DV18Olkx.js.gz +0 -0
- package/dist/web/assets/{bing-wallpaper-queries-B-1L0OYP.js → bing-wallpaper-queries-CybCDdtr.js} +1 -1
- package/dist/web/assets/bing-wallpaper-queries-CybCDdtr.js.br +0 -0
- package/dist/web/assets/bing-wallpaper-queries-CybCDdtr.js.gz +0 -0
- package/dist/web/assets/{button-group-DIxa2Erp.js → button-group-DLm5MGrs.js} +1 -1
- package/dist/web/assets/button-group-DLm5MGrs.js.br +0 -0
- package/dist/web/assets/button-group-DLm5MGrs.js.gz +0 -0
- package/dist/web/assets/{commit-settings-panel-Co1u5Lzc.js → commit-settings-panel-RS1ax2vB.js} +1 -1
- package/dist/web/assets/commit-settings-panel-RS1ax2vB.js.br +0 -0
- package/dist/web/assets/commit-settings-panel-RS1ax2vB.js.gz +0 -0
- package/dist/web/assets/{context-menu-HaQeWpEd.js → context-menu-DP6ii80r.js} +1 -1
- package/dist/web/assets/context-menu-DP6ii80r.js.br +0 -0
- package/dist/web/assets/context-menu-DP6ii80r.js.gz +0 -0
- package/dist/web/assets/{file-review-dialog-B-0RkLZR.js → file-review-dialog-C3to4N_J.js} +1 -1
- package/dist/web/assets/file-review-dialog-C3to4N_J.js.br +0 -0
- package/dist/web/assets/file-review-dialog-C3to4N_J.js.gz +0 -0
- package/dist/web/assets/{git-history-panel-QiNKxo_n.js → git-history-panel-D2OdQ1Pg.js} +1 -1
- package/dist/web/assets/git-history-panel-D2OdQ1Pg.js.br +0 -0
- package/dist/web/assets/git-history-panel-D2OdQ1Pg.js.gz +0 -0
- package/dist/web/assets/{global-settings-about-DWXfIOas.js → global-settings-about-DYd77AOa.js} +1 -1
- package/dist/web/assets/global-settings-about-DYd77AOa.js.br +0 -0
- package/dist/web/assets/global-settings-about-DYd77AOa.js.gz +0 -0
- package/dist/web/assets/{global-settings-fields-CmEy5pOE.js → global-settings-fields-C0IfL3RQ.js} +1 -1
- package/dist/web/assets/global-settings-fields-C0IfL3RQ.js.br +0 -0
- package/dist/web/assets/global-settings-fields-C0IfL3RQ.js.gz +0 -0
- package/dist/web/assets/global-settings-model-dAGHIcU5.js +1 -0
- package/dist/web/assets/global-settings-model-dAGHIcU5.js.br +0 -0
- package/dist/web/assets/global-settings-model-dAGHIcU5.js.gz +0 -0
- package/dist/web/assets/global-settings-page-746-HK5D.js +2 -0
- package/dist/web/assets/global-settings-page-746-HK5D.js.br +0 -0
- package/dist/web/assets/global-settings-page-746-HK5D.js.gz +0 -0
- package/dist/web/assets/{global-settings-pets-DP2AxhJW.js → global-settings-pets-B6HRYnYq.js} +1 -1
- package/dist/web/assets/global-settings-pets-B6HRYnYq.js.br +0 -0
- package/dist/web/assets/global-settings-pets-B6HRYnYq.js.gz +0 -0
- package/dist/web/assets/{index-BGtID8VJ.css → index-DGp-a5pq.css} +1 -1
- package/dist/web/assets/index-DGp-a5pq.css.br +0 -0
- package/dist/web/assets/{index-BGtID8VJ.css.gz → index-DGp-a5pq.css.gz} +0 -0
- package/dist/web/assets/index-DwEl9mCY.js +4 -0
- package/dist/web/assets/index-DwEl9mCY.js.br +0 -0
- package/dist/web/assets/index-DwEl9mCY.js.gz +0 -0
- package/dist/web/assets/initial-deps-Bk3GSWTk.js +1 -0
- package/dist/web/assets/initial-deps-Bk3GSWTk.js.br +0 -0
- package/dist/web/assets/initial-deps-Bk3GSWTk.js.gz +0 -0
- package/dist/web/assets/installed-skills-pane-Gzaol8-B.js +1 -0
- package/dist/web/assets/installed-skills-pane-Gzaol8-B.js.br +0 -0
- package/dist/web/assets/installed-skills-pane-Gzaol8-B.js.gz +0 -0
- package/dist/web/assets/{lazy-message-response-3Fr_a8du.js → lazy-message-response-CZT51-go.js} +2 -2
- package/dist/web/assets/lazy-message-response-CZT51-go.js.br +0 -0
- package/dist/web/assets/lazy-message-response-CZT51-go.js.gz +0 -0
- package/dist/web/assets/mcp-management-pane-C0g0wk8t.js +1 -0
- package/dist/web/assets/mcp-management-pane-C0g0wk8t.js.br +0 -0
- package/dist/web/assets/mcp-management-pane-C0g0wk8t.js.gz +0 -0
- package/dist/web/assets/{message-response-D3YFwFiE.js → message-response-CA2hanqw.js} +1 -1
- package/dist/web/assets/message-response-CA2hanqw.js.br +0 -0
- package/dist/web/assets/message-response-CA2hanqw.js.gz +0 -0
- package/dist/web/assets/{official-plugins-pane-k8o9gVMR.js → official-plugins-pane-D6kbUBEm.js} +1 -1
- package/dist/web/assets/official-plugins-pane-D6kbUBEm.js.br +0 -0
- package/dist/web/assets/official-plugins-pane-D6kbUBEm.js.gz +0 -0
- package/dist/web/assets/personalization-settings-panel-DnWZEv6V.js +1 -0
- package/dist/web/assets/personalization-settings-panel-DnWZEv6V.js.br +0 -0
- package/dist/web/assets/personalization-settings-panel-DnWZEv6V.js.gz +0 -0
- package/dist/web/assets/{project-file-popup-page-0uRpUcFH.js → project-file-popup-page-C8zcwgkf.js} +1 -1
- package/dist/web/assets/project-file-popup-page-C8zcwgkf.js.br +0 -0
- package/dist/web/assets/project-file-popup-page-C8zcwgkf.js.gz +0 -0
- package/dist/web/assets/{project-source-panel-CEegjNVo.js → project-source-panel-ChVlP72p.js} +2 -2
- package/dist/web/assets/project-source-panel-ChVlP72p.js.br +0 -0
- package/dist/web/assets/project-source-panel-ChVlP72p.js.gz +0 -0
- package/dist/web/assets/{prompt-input-Bs_e51Ey.js → prompt-input-CcovKFMj.js} +1 -1
- package/dist/web/assets/prompt-input-CcovKFMj.js.br +0 -0
- package/dist/web/assets/prompt-input-CcovKFMj.js.gz +0 -0
- package/dist/web/assets/{prompt-input-controls-DMqyvYVY.js → prompt-input-controls-j_r9SnuL.js} +1 -1
- package/dist/web/assets/prompt-input-controls-j_r9SnuL.js.br +0 -0
- package/dist/web/assets/prompt-input-controls-j_r9SnuL.js.gz +0 -0
- package/dist/web/assets/{scheduled-task-date-time-picker-CHc9a7G1.js → scheduled-task-date-time-picker-CkLwYwGu.js} +1 -1
- package/dist/web/assets/scheduled-task-date-time-picker-CkLwYwGu.js.br +0 -0
- package/dist/web/assets/scheduled-task-date-time-picker-CkLwYwGu.js.gz +0 -0
- package/dist/web/assets/{scheduled-task-schedule-2Ugh5sqp.js → scheduled-task-schedule-f0nylWUa.js} +1 -1
- package/dist/web/assets/scheduled-task-schedule-f0nylWUa.js.br +0 -0
- package/dist/web/assets/scheduled-task-schedule-f0nylWUa.js.gz +0 -0
- package/dist/web/assets/scheduled-tasks-container-DxM30EEY.js +2 -0
- package/dist/web/assets/scheduled-tasks-container-DxM30EEY.js.br +0 -0
- package/dist/web/assets/scheduled-tasks-container-DxM30EEY.js.gz +0 -0
- package/dist/web/assets/{settings-personalization-b55VcvKr.js → settings-personalization-CPFvvwt7.js} +1 -1
- package/dist/web/assets/settings-personalization-CPFvvwt7.js.br +0 -0
- package/dist/web/assets/settings-personalization-CPFvvwt7.js.gz +0 -0
- package/dist/web/assets/{sheet-DbEBBgCs.js → sheet-Co357cup.js} +1 -1
- package/dist/web/assets/sheet-Co357cup.js.br +0 -0
- package/dist/web/assets/sheet-Co357cup.js.gz +0 -0
- package/dist/web/assets/{skills-market-container-BwT-U8XF.js → skills-market-container-CJ8k5fIO.js} +2 -2
- package/dist/web/assets/skills-market-container-CJ8k5fIO.js.br +0 -0
- package/dist/web/assets/skills-market-container-CJ8k5fIO.js.gz +0 -0
- package/dist/web/assets/{third-party-marketplace-pane-Cva9dfRn.js → third-party-marketplace-pane-BrosEBTn.js} +1 -1
- package/dist/web/assets/third-party-marketplace-pane-BrosEBTn.js.br +0 -0
- package/dist/web/assets/third-party-marketplace-pane-BrosEBTn.js.gz +0 -0
- package/dist/web/assets/workbench-composer-CxDyu4IJ.js +8 -0
- package/dist/web/assets/workbench-composer-CxDyu4IJ.js.br +0 -0
- package/dist/web/assets/workbench-composer-CxDyu4IJ.js.gz +0 -0
- package/dist/web/assets/workbench-inspector-changes-DXrYXxmV.js +2 -0
- package/dist/web/assets/workbench-inspector-changes-DXrYXxmV.js.br +0 -0
- package/dist/web/assets/workbench-inspector-changes-DXrYXxmV.js.gz +0 -0
- package/dist/web/assets/workbench-pet-canvas-C5NL9nOc.js +1 -0
- package/dist/web/assets/workbench-pet-canvas-C5NL9nOc.js.br +0 -0
- package/dist/web/assets/workbench-pet-canvas-C5NL9nOc.js.gz +0 -0
- package/dist/web/assets/workbench-shell-C3Zu4F9x.js +8 -0
- package/dist/web/assets/workbench-shell-C3Zu4F9x.js.br +0 -0
- package/dist/web/assets/workbench-shell-C3Zu4F9x.js.gz +0 -0
- package/dist/web/index.html +3 -3
- package/dist/web/index.html.br +0 -0
- package/dist/web/index.html.gz +0 -0
- package/package.json +1 -1
- package/dist/chunk-RNTA4MFS.js +0 -23
- package/dist/web/assets/agent-settings-panel-BagNBAoe.js.br +0 -0
- package/dist/web/assets/agent-settings-panel-BagNBAoe.js.gz +0 -0
- package/dist/web/assets/background-image-picker-CjpS0dIk.js +0 -1
- package/dist/web/assets/background-image-picker-CjpS0dIk.js.br +0 -0
- package/dist/web/assets/background-image-picker-CjpS0dIk.js.gz +0 -0
- package/dist/web/assets/bing-wallpaper-queries-B-1L0OYP.js.br +0 -0
- package/dist/web/assets/bing-wallpaper-queries-B-1L0OYP.js.gz +0 -0
- package/dist/web/assets/button-group-DIxa2Erp.js.br +0 -0
- package/dist/web/assets/button-group-DIxa2Erp.js.gz +0 -0
- package/dist/web/assets/commit-settings-panel-Co1u5Lzc.js.br +0 -0
- package/dist/web/assets/commit-settings-panel-Co1u5Lzc.js.gz +0 -0
- package/dist/web/assets/context-menu-HaQeWpEd.js.br +0 -0
- package/dist/web/assets/context-menu-HaQeWpEd.js.gz +0 -0
- package/dist/web/assets/file-review-dialog-B-0RkLZR.js.br +0 -0
- package/dist/web/assets/file-review-dialog-B-0RkLZR.js.gz +0 -0
- package/dist/web/assets/git-history-panel-QiNKxo_n.js.br +0 -0
- package/dist/web/assets/git-history-panel-QiNKxo_n.js.gz +0 -0
- package/dist/web/assets/global-settings-about-DWXfIOas.js.br +0 -0
- package/dist/web/assets/global-settings-about-DWXfIOas.js.gz +0 -0
- package/dist/web/assets/global-settings-fields-CmEy5pOE.js.br +0 -0
- package/dist/web/assets/global-settings-fields-CmEy5pOE.js.gz +0 -0
- package/dist/web/assets/global-settings-model-B49sZloO.js +0 -1
- package/dist/web/assets/global-settings-model-B49sZloO.js.br +0 -0
- package/dist/web/assets/global-settings-model-B49sZloO.js.gz +0 -0
- package/dist/web/assets/global-settings-page-DKXRkWmd.js +0 -2
- package/dist/web/assets/global-settings-page-DKXRkWmd.js.br +0 -0
- package/dist/web/assets/global-settings-page-DKXRkWmd.js.gz +0 -0
- package/dist/web/assets/global-settings-pets-DP2AxhJW.js.br +0 -0
- package/dist/web/assets/global-settings-pets-DP2AxhJW.js.gz +0 -0
- package/dist/web/assets/index-BGtID8VJ.css.br +0 -0
- package/dist/web/assets/index-mkWzMsjN.js +0 -4
- package/dist/web/assets/index-mkWzMsjN.js.br +0 -0
- package/dist/web/assets/index-mkWzMsjN.js.gz +0 -0
- package/dist/web/assets/initial-deps-CDAJF_GU.js +0 -1
- package/dist/web/assets/initial-deps-CDAJF_GU.js.br +0 -0
- package/dist/web/assets/initial-deps-CDAJF_GU.js.gz +0 -0
- package/dist/web/assets/installed-skills-pane-CR2LbYh9.js +0 -1
- package/dist/web/assets/installed-skills-pane-CR2LbYh9.js.br +0 -0
- package/dist/web/assets/installed-skills-pane-CR2LbYh9.js.gz +0 -0
- package/dist/web/assets/lazy-message-response-3Fr_a8du.js.br +0 -0
- package/dist/web/assets/lazy-message-response-3Fr_a8du.js.gz +0 -0
- package/dist/web/assets/mcp-management-pane-DEuUn7Y6.js +0 -1
- package/dist/web/assets/mcp-management-pane-DEuUn7Y6.js.br +0 -0
- package/dist/web/assets/mcp-management-pane-DEuUn7Y6.js.gz +0 -0
- package/dist/web/assets/message-response-D3YFwFiE.js.br +0 -0
- package/dist/web/assets/message-response-D3YFwFiE.js.gz +0 -0
- package/dist/web/assets/official-plugins-pane-k8o9gVMR.js.br +0 -0
- package/dist/web/assets/official-plugins-pane-k8o9gVMR.js.gz +0 -0
- package/dist/web/assets/personalization-settings-panel-Cl4_Y5Uk.js +0 -1
- package/dist/web/assets/personalization-settings-panel-Cl4_Y5Uk.js.br +0 -0
- package/dist/web/assets/personalization-settings-panel-Cl4_Y5Uk.js.gz +0 -0
- package/dist/web/assets/project-file-popup-page-0uRpUcFH.js.br +0 -0
- package/dist/web/assets/project-file-popup-page-0uRpUcFH.js.gz +0 -0
- package/dist/web/assets/project-source-panel-CEegjNVo.js.br +0 -0
- package/dist/web/assets/project-source-panel-CEegjNVo.js.gz +0 -0
- package/dist/web/assets/prompt-input-Bs_e51Ey.js.br +0 -0
- package/dist/web/assets/prompt-input-Bs_e51Ey.js.gz +0 -0
- package/dist/web/assets/prompt-input-controls-DMqyvYVY.js.br +0 -0
- package/dist/web/assets/prompt-input-controls-DMqyvYVY.js.gz +0 -0
- package/dist/web/assets/scheduled-task-date-time-picker-CHc9a7G1.js.br +0 -0
- package/dist/web/assets/scheduled-task-date-time-picker-CHc9a7G1.js.gz +0 -0
- package/dist/web/assets/scheduled-task-schedule-2Ugh5sqp.js.br +0 -0
- package/dist/web/assets/scheduled-task-schedule-2Ugh5sqp.js.gz +0 -0
- package/dist/web/assets/scheduled-tasks-container-Ddieo85Q.js +0 -2
- package/dist/web/assets/scheduled-tasks-container-Ddieo85Q.js.br +0 -0
- package/dist/web/assets/scheduled-tasks-container-Ddieo85Q.js.gz +0 -0
- package/dist/web/assets/settings-personalization-b55VcvKr.js.br +0 -0
- package/dist/web/assets/settings-personalization-b55VcvKr.js.gz +0 -0
- package/dist/web/assets/sheet-DbEBBgCs.js.br +0 -0
- package/dist/web/assets/sheet-DbEBBgCs.js.gz +0 -0
- package/dist/web/assets/skills-market-container-BwT-U8XF.js.br +0 -0
- package/dist/web/assets/skills-market-container-BwT-U8XF.js.gz +0 -0
- package/dist/web/assets/third-party-marketplace-pane-Cva9dfRn.js.br +0 -0
- package/dist/web/assets/third-party-marketplace-pane-Cva9dfRn.js.gz +0 -0
- package/dist/web/assets/workbench-composer-BxYlmKUq.js +0 -10
- package/dist/web/assets/workbench-composer-BxYlmKUq.js.br +0 -0
- package/dist/web/assets/workbench-composer-BxYlmKUq.js.gz +0 -0
- package/dist/web/assets/workbench-inspector-changes-DFZ_PDdt.js +0 -2
- package/dist/web/assets/workbench-inspector-changes-DFZ_PDdt.js.br +0 -0
- package/dist/web/assets/workbench-inspector-changes-DFZ_PDdt.js.gz +0 -0
- package/dist/web/assets/workbench-pet-canvas-DwkSGxpw.js +0 -1
- package/dist/web/assets/workbench-pet-canvas-DwkSGxpw.js.br +0 -0
- package/dist/web/assets/workbench-pet-canvas-DwkSGxpw.js.gz +0 -0
- package/dist/web/assets/workbench-shell-CnjG23lI.js +0 -8
- package/dist/web/assets/workbench-shell-CnjG23lI.js.br +0 -0
- package/dist/web/assets/workbench-shell-CnjG23lI.js.gz +0 -0
package/dist/server/index.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
|
-
export { AccessSessionService, AgentEventStream, GitCommitError, GitCommitReviewError, SqliteStateRepository, commitSelectedProjectChanges, createCodexlyServer, normalizeAllowedHost, readProjectGitCommitFileDiff, readProjectGitCommitFiles } from '../chunk-
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import '../chunk-
|
|
5
|
-
import '../chunk-
|
|
6
|
-
import '../chunk-
|
|
2
|
+
export { AccessSessionService, AgentEventStream, GitCommitError, GitCommitReviewError, SqliteStateRepository, commitSelectedProjectChanges, createCodexlyServer, normalizeAllowedHost, readProjectGitCommitFileDiff, readProjectGitCommitFiles } from '../chunk-2J5P2EG2.js';
|
|
3
|
+
import '../chunk-ZUECHB6L.js';
|
|
4
|
+
import '../chunk-AIACWU7L.js';
|
|
5
|
+
import '../chunk-B2673ODM.js';
|
|
6
|
+
import '../chunk-X5JZ3VOF.js';
|
|
7
|
+
import '../chunk-GT7XTSEG.js';
|
|
7
8
|
import '../chunk-K6J42667.js';
|
|
8
9
|
|
|
9
10
|
createRequire(import.meta.url);
|
|
@@ -357,7 +357,11 @@ function createScheduledTaskOperations(database2) {
|
|
|
357
357
|
WHERE project_id = ? AND attachment_id = ?
|
|
358
358
|
LIMIT 1
|
|
359
359
|
`);
|
|
360
|
-
const
|
|
360
|
+
const removeOrphanAttachments = database2.prepare(`
|
|
361
|
+
DELETE FROM scheduled_task_attachments
|
|
362
|
+
WHERE task_id NOT IN (SELECT json_extract(value, '$.id') FROM json_each(?))
|
|
363
|
+
`);
|
|
364
|
+
const replaceAttachments = (payload) => {
|
|
361
365
|
deleteAttachments.run(payload.taskId);
|
|
362
366
|
for (const item of payload.attachments) {
|
|
363
367
|
insertAttachment.run(
|
|
@@ -371,12 +375,13 @@ function createScheduledTaskOperations(database2) {
|
|
|
371
375
|
item.content
|
|
372
376
|
);
|
|
373
377
|
}
|
|
378
|
+
};
|
|
379
|
+
const writeTasks = database2.transaction((payload) => {
|
|
380
|
+
write.run(payload.tasksJson);
|
|
381
|
+
if (payload.attachments !== void 0) replaceAttachments(payload.attachments);
|
|
382
|
+
removeOrphanAttachments.run(payload.tasksJson);
|
|
374
383
|
});
|
|
375
384
|
return {
|
|
376
|
-
deleteScheduledTaskAttachments(payload) {
|
|
377
|
-
deleteAttachments.run(payload.taskId);
|
|
378
|
-
return null;
|
|
379
|
-
},
|
|
380
385
|
listScheduledTaskAttachments(payload) {
|
|
381
386
|
return listAttachments.all(payload.taskId);
|
|
382
387
|
},
|
|
@@ -386,24 +391,163 @@ function createScheduledTaskOperations(database2) {
|
|
|
386
391
|
readScheduledTaskAttachment(payload) {
|
|
387
392
|
return readAttachment.get(payload.projectId, payload.attachmentId);
|
|
388
393
|
},
|
|
389
|
-
replaceScheduledTaskAttachments(payload) {
|
|
390
|
-
replaceAttachments(payload);
|
|
391
|
-
return null;
|
|
392
|
-
},
|
|
393
394
|
writeScheduledTasks(payload) {
|
|
394
|
-
|
|
395
|
+
writeTasks(payload);
|
|
395
396
|
return null;
|
|
396
397
|
}
|
|
397
398
|
};
|
|
398
399
|
}
|
|
399
400
|
|
|
400
|
-
// packages/server/src/sqlite-
|
|
401
|
+
// packages/server/src/sqlite-submission-worker.js
|
|
402
|
+
function createSubmissionOperations(database2) {
|
|
403
|
+
if (!database2.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'task_submissions'").get())
|
|
404
|
+
return {};
|
|
405
|
+
const read = database2.prepare(
|
|
406
|
+
"SELECT record_json FROM task_submissions WHERE project_id = ? AND submission_key = ?"
|
|
407
|
+
);
|
|
408
|
+
const count = database2.prepare("SELECT COUNT(*) AS count FROM task_submissions");
|
|
409
|
+
const prune = database2.prepare(
|
|
410
|
+
"DELETE FROM task_submissions WHERE completed = 1 AND updated_at < ?"
|
|
411
|
+
);
|
|
412
|
+
const write = database2.prepare(`INSERT INTO task_submissions (project_id, submission_key, record_json, completed, updated_at)
|
|
413
|
+
VALUES (?, ?, ?, ?, ?) ON CONFLICT(project_id, submission_key) DO UPDATE SET
|
|
414
|
+
record_json = excluded.record_json, completed = excluded.completed, updated_at = excluded.updated_at`);
|
|
415
|
+
return {
|
|
416
|
+
readSubmission({ projectId, key }) {
|
|
417
|
+
return read.get(projectId, key)?.record_json;
|
|
418
|
+
},
|
|
419
|
+
writeSubmission: database2.transaction(({ projectId, key, recordJson, completed }) => {
|
|
420
|
+
const now = Date.now();
|
|
421
|
+
prune.run(now - 7 * 24 * 60 * 60 * 1e3);
|
|
422
|
+
if (!read.get(projectId, key) && count.get().count >= 1e4)
|
|
423
|
+
throw new Error("Submission recovery capacity is exhausted");
|
|
424
|
+
write.run(projectId, key, recordJson, completed ? 1 : 0, now);
|
|
425
|
+
return null;
|
|
426
|
+
})
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// packages/server/src/sqlite-project-todo-worker.js
|
|
431
|
+
function createProjectTodoOperations(database2) {
|
|
432
|
+
if (!database2.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'project_todos'").get())
|
|
433
|
+
return {};
|
|
434
|
+
const list = database2.prepare(
|
|
435
|
+
"SELECT record_json FROM project_todos WHERE project_id = ? ORDER BY updated_at DESC, id"
|
|
436
|
+
);
|
|
437
|
+
const read = database2.prepare(
|
|
438
|
+
"SELECT version FROM project_todos WHERE project_id = ? AND id = ?"
|
|
439
|
+
);
|
|
440
|
+
const write = database2.prepare(`INSERT INTO project_todos (project_id, id, version, updated_at, record_json) VALUES (?, ?, ?, ?, ?)
|
|
441
|
+
ON CONFLICT(project_id, id) DO UPDATE SET version = excluded.version, updated_at = excluded.updated_at, record_json = excluded.record_json`);
|
|
442
|
+
const remove = database2.prepare("DELETE FROM project_todos WHERE project_id = ? AND id = ?");
|
|
443
|
+
const removeAttachments = database2.prepare(
|
|
444
|
+
"DELETE FROM project_todo_attachments WHERE project_id = ? AND todo_id = ?"
|
|
445
|
+
);
|
|
446
|
+
const writeAttachment = database2.prepare(
|
|
447
|
+
"INSERT INTO project_todo_attachments (project_id, todo_id, attachment_id, metadata, content) VALUES (?, ?, ?, ?, ?)"
|
|
448
|
+
);
|
|
449
|
+
const readAttachment = database2.prepare(
|
|
450
|
+
"SELECT metadata, content FROM project_todo_attachments WHERE project_id = ? AND attachment_id = ? LIMIT 1"
|
|
451
|
+
);
|
|
452
|
+
return {
|
|
453
|
+
listProjectTodos: ({ projectId }) => list.all(projectId).map((row) => row.record_json),
|
|
454
|
+
readProjectTodoAttachment: ({ projectId, attachmentId }) => readAttachment.get(projectId, attachmentId),
|
|
455
|
+
saveProjectTodo: database2.transaction(({ todo, expectedVersion, attachments }) => {
|
|
456
|
+
if ((read.get(todo.projectId, todo.id)?.version ?? null) !== expectedVersion) return false;
|
|
457
|
+
if (expectedVersion === null && list.all(todo.projectId).length >= 1e3)
|
|
458
|
+
throw new Error("Project todo capacity is exhausted");
|
|
459
|
+
write.run(todo.projectId, todo.id, todo.version, todo.updatedAt, JSON.stringify(todo));
|
|
460
|
+
removeAttachments.run(todo.projectId, todo.id);
|
|
461
|
+
for (const { attachment, content } of attachments)
|
|
462
|
+
writeAttachment.run(
|
|
463
|
+
todo.projectId,
|
|
464
|
+
todo.id,
|
|
465
|
+
attachment.id,
|
|
466
|
+
JSON.stringify(attachment),
|
|
467
|
+
content
|
|
468
|
+
);
|
|
469
|
+
return true;
|
|
470
|
+
}),
|
|
471
|
+
deleteProjectTodo: database2.transaction(({ projectId, todoId, expectedVersion }) => {
|
|
472
|
+
const current = read.get(projectId, todoId);
|
|
473
|
+
if (current === void 0) return false;
|
|
474
|
+
if (current.version !== expectedVersion) return null;
|
|
475
|
+
remove.run(projectId, todoId);
|
|
476
|
+
return true;
|
|
477
|
+
})
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
// packages/server/src/sqlite-async-question-worker.js
|
|
482
|
+
function createAsyncQuestionOperations(database2) {
|
|
483
|
+
if (!database2.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'async_questions'").get())
|
|
484
|
+
return {};
|
|
485
|
+
const list = database2.prepare(
|
|
486
|
+
// 同一回合的问题按发现顺序展示,不能按内容哈希重新排序。
|
|
487
|
+
"SELECT record_json FROM async_questions WHERE project_id = ? AND task_id = ? ORDER BY json_extract(record_json, '$.group.createdAt'), rowid"
|
|
488
|
+
);
|
|
489
|
+
const read = database2.prepare(
|
|
490
|
+
"SELECT record_json FROM async_questions WHERE project_id = ? AND task_id = ? AND id = ?"
|
|
491
|
+
);
|
|
492
|
+
const insert = database2.prepare(
|
|
493
|
+
"INSERT OR IGNORE INTO async_questions (project_id, task_id, id, status, record_json) VALUES (?, ?, ?, 'pending', ?)"
|
|
494
|
+
);
|
|
495
|
+
const update = database2.prepare(
|
|
496
|
+
"UPDATE async_questions SET status = ?, record_json = ? WHERE project_id = ? AND task_id = ? AND id = ? AND status = ?"
|
|
497
|
+
);
|
|
498
|
+
const count = database2.prepare(
|
|
499
|
+
"SELECT COUNT(*) AS count FROM async_questions WHERE project_id = ? AND task_id = ?"
|
|
500
|
+
);
|
|
501
|
+
return {
|
|
502
|
+
listAsyncQuestions: ({ projectId, taskId }) => list.all(projectId, taskId).map((row) => row.record_json),
|
|
503
|
+
discoverAsyncQuestions: database2.transaction(({ projectId, taskId, groups }) => {
|
|
504
|
+
for (const group of groups)
|
|
505
|
+
insert.run(projectId, taskId, group.id, JSON.stringify({ group }));
|
|
506
|
+
if (count.get(projectId, taskId).count > 1e4)
|
|
507
|
+
throw new Error("Async question capacity is exhausted");
|
|
508
|
+
return null;
|
|
509
|
+
}),
|
|
510
|
+
updateAsyncQuestion: ({ projectId, taskId, record, expectedStatus }) => update.run(
|
|
511
|
+
record.group.status,
|
|
512
|
+
JSON.stringify(record),
|
|
513
|
+
projectId,
|
|
514
|
+
taskId,
|
|
515
|
+
record.group.id,
|
|
516
|
+
expectedStatus
|
|
517
|
+
).changes === 1,
|
|
518
|
+
dismissAsyncQuestions: database2.transaction(({ projectId, taskId, ids }) => {
|
|
519
|
+
for (const id of ids) {
|
|
520
|
+
const row = read.get(projectId, taskId, id);
|
|
521
|
+
if (row === void 0) continue;
|
|
522
|
+
const record = JSON.parse(row.record_json);
|
|
523
|
+
record.group.status = "dismissed";
|
|
524
|
+
update.run("dismissed", JSON.stringify(record), projectId, taskId, id, "pending");
|
|
525
|
+
}
|
|
526
|
+
return null;
|
|
527
|
+
})
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// packages/server/src/sqlite-state-worker-features.js
|
|
532
|
+
function createFeatureOperations(database2) {
|
|
533
|
+
return {
|
|
534
|
+
...createTaskQueueOperations(database2),
|
|
535
|
+
...createScheduledTaskOperations(database2),
|
|
536
|
+
...createSubmissionOperations(database2),
|
|
537
|
+
...createProjectTodoOperations(database2),
|
|
538
|
+
...createAsyncQuestionOperations(database2)
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
// packages/server/src/sqlite-worker-error.js
|
|
401
543
|
function serializeError(error) {
|
|
402
544
|
return {
|
|
403
545
|
message: error instanceof Error ? error.message : String(error),
|
|
404
546
|
name: error instanceof Error ? error.name : "Error"
|
|
405
547
|
};
|
|
406
548
|
}
|
|
549
|
+
|
|
550
|
+
// packages/server/src/sqlite-state-worker.js
|
|
407
551
|
function createOperations(database2) {
|
|
408
552
|
const statements = hasTable(database2, "projects") && hasTable(database2, "project_roots") ? {
|
|
409
553
|
upsertProject: database2.prepare(
|
|
@@ -667,8 +811,7 @@ function createOperations(database2) {
|
|
|
667
811
|
)
|
|
668
812
|
} : void 0;
|
|
669
813
|
return {
|
|
670
|
-
...
|
|
671
|
-
...createScheduledTaskOperations(database2),
|
|
814
|
+
...createFeatureOperations(database2),
|
|
672
815
|
diagnose() {
|
|
673
816
|
database2.exec("BEGIN IMMEDIATE");
|
|
674
817
|
try {
|