@shawnstack/quickforge 1.7.7 → 1.7.9

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.
Files changed (85) hide show
  1. package/bin/quickforge.mjs +10 -1
  2. package/dist/assets/AgentProfilesPage-BSM5w3bn.js +1 -0
  3. package/dist/assets/ChatPanelHost-cd80S4EX.js +48 -0
  4. package/dist/assets/CloudAccountSettingsPage-BJMrfgy9.js +1 -0
  5. package/dist/assets/{PluginsPage-CPE5tbbf.js → PluginsPage-mJkTmVVV.js} +1 -1
  6. package/dist/assets/ScheduledTasksPage-DJj_NLm9.js +2 -0
  7. package/dist/assets/{SettingsWorkspacePage-BE2T4d3P.js → SettingsWorkspacePage-7lQ0Wl63.js} +389 -389
  8. package/dist/assets/ShareLinksSettingsPage-DjFq_Lnb.js +1 -0
  9. package/dist/assets/SharedConversationPage-BbuNpcpP.js +1 -0
  10. package/dist/assets/TerminalDock-CczcCJJE.js +2 -0
  11. package/dist/assets/WorkspaceInspector-0i6x-diB.js +36 -0
  12. package/dist/assets/{icons-2D18YbSI.js → icons-DM_qJ7VJ.js} +1 -1
  13. package/dist/assets/{index-BiCTgUlY.css → index-D-J_8Smf.css} +1 -1
  14. package/dist/assets/index-DFASc15l.js +66 -0
  15. package/dist/assets/local-tools-Dn1Y9aPe.js +270 -0
  16. package/dist/assets/{model-display-label-C6-0eDxF.js → logger-8REuLPGK.js} +1 -1
  17. package/dist/assets/{mcp-servers-dialog-GY7sdfIr.js → mcp-servers-dialog-BG4b67ea.js} +2 -2
  18. package/dist/assets/{model-reference-o41fJ6jQ.js → model-display-label-CURwH0xM.js} +1 -1
  19. package/dist/assets/{monaco-DvXErxp2.js → monaco-bDr860xx.js} +1 -1
  20. package/dist/assets/{react-vendor-3UaA-C9W.js → react-vendor-BpWW_Nvp.js} +1 -1
  21. package/dist/assets/{skills-dialog-C1fJ1Jl7.js → skills-dialog-DIzZvQqW.js} +3 -3
  22. package/dist/index.html +8 -8
  23. package/package.json +1 -1
  24. package/server/acp/server.mjs +17 -1
  25. package/server/agent-manager.mjs +251 -31
  26. package/server/ai-http-logger.mjs +162 -19
  27. package/server/ai-provider-options.mjs +4 -1
  28. package/server/auto-archive.mjs +42 -29
  29. package/server/cloud/auto-approval.mjs +155 -0
  30. package/server/cloud/client.mjs +5 -0
  31. package/server/cloud/qf-agent-process.mjs +163 -3
  32. package/server/cloud/service-config.mjs +1 -1
  33. package/server/index.mjs +69 -13
  34. package/server/lan-access-backup.mjs +256 -0
  35. package/server/lan-access-cutover.mjs +306 -0
  36. package/server/lan-access-json-file.mjs +75 -0
  37. package/server/lan-access-service.mjs +155 -0
  38. package/server/lan-access-store.mjs +110 -9
  39. package/server/maintenance/downgrade-lan-access-v1.mjs +101 -0
  40. package/server/maintenance/downgrade-session-state-v1.mjs +130 -0
  41. package/server/maintenance/downgrade-share-v1.mjs +101 -0
  42. package/server/maintenance/export-lan-access-v1.mjs +80 -0
  43. package/server/maintenance/export-scheduled-runs-v1.mjs +45 -0
  44. package/server/maintenance/export-session-state-v1.mjs +67 -0
  45. package/server/maintenance/export-share-v1.mjs +77 -0
  46. package/server/public-api.mjs +21 -2
  47. package/server/routes/agent.mjs +37 -4
  48. package/server/routes/backup.mjs +221 -39
  49. package/server/routes/cloud.mjs +28 -1
  50. package/server/routes/scheduled-tasks.mjs +347 -134
  51. package/server/routes/shares.mjs +4 -2
  52. package/server/routes/storage.mjs +138 -8
  53. package/server/routes/workspace.mjs +265 -4
  54. package/server/scheduled-runs-backup.mjs +235 -0
  55. package/server/scheduled-runs-cutover.mjs +497 -0
  56. package/server/scheduled-task-runs-service.mjs +279 -0
  57. package/server/session-index-service.mjs +495 -0
  58. package/server/session-state-backup.mjs +277 -0
  59. package/server/session-state-cutover.mjs +370 -0
  60. package/server/session-state-service.mjs +709 -0
  61. package/server/share-backup.mjs +255 -0
  62. package/server/share-cutover.mjs +296 -0
  63. package/server/share-json-file.mjs +60 -0
  64. package/server/share-service.mjs +163 -0
  65. package/server/share-store.mjs +196 -19
  66. package/server/skills.mjs +0 -1
  67. package/server/sqlite/database.mjs +233 -0
  68. package/server/sqlite/lan-access-repository.mjs +652 -0
  69. package/server/sqlite/migrations.mjs +577 -0
  70. package/server/sqlite/scheduled-task-runs-repository.mjs +464 -0
  71. package/server/sqlite/session-index-repository.mjs +297 -0
  72. package/server/sqlite/session-state-repository.mjs +786 -0
  73. package/server/sqlite/share-repository.mjs +854 -0
  74. package/server/storage.mjs +317 -1
  75. package/dist/assets/AgentProfilesPage-BfA_sQ3A.js +0 -1
  76. package/dist/assets/ChatPanelHost-Dul1ahKj.js +0 -307
  77. package/dist/assets/CloudAccountSettingsPage-qZh0lTUN.js +0 -1
  78. package/dist/assets/ScheduledTasksPage-PTxL_PPg.js +0 -2
  79. package/dist/assets/ShareLinksSettingsPage-Bl8fP62X.js +0 -1
  80. package/dist/assets/SharedConversationPage-BK9XJnEe.js +0 -1
  81. package/dist/assets/TerminalDock-CL7HU9DI.js +0 -2
  82. package/dist/assets/WorkspaceInspector-MNBLIKMn.js +0 -36
  83. package/dist/assets/index-BTPzyq7d.js +0 -65
  84. package/dist/assets/mermaid-renderer-jEbqFaTe.js +0 -2
  85. /package/dist/assets/{plugin-api-Uu2xAB4d.js → plugin-api-BrdQeM4B.js} +0 -0
@@ -2,6 +2,7 @@ import { getQfAgentStatus } from '../cloud/qf-agent-process.mjs'
2
2
  import { isAuthenticatedAppClient } from '../access-policy.mjs'
3
3
  import { CloudClient, CloudApiError } from '../cloud/client.mjs'
4
4
  import { parseCloudBaseUrl } from '../cloud/config.mjs'
5
+ import { armAgentAutoApproval, clearAgentAutoApproval, retryAgentAutoApproval } from '../cloud/auto-approval.mjs'
5
6
  import { createCloudCredentialStore } from '../cloud/credential-store.mjs'
6
7
  import { getCloudRuntime, invalidateCloudRuntime } from '../cloud/runtime.mjs'
7
8
  import {
@@ -22,6 +23,7 @@ const JSON_WRITE_ROUTES = new Set([
22
23
  'POST /api/cloud/device/start',
23
24
  'POST /api/cloud/device/poll',
24
25
  'POST /api/cloud/device/cancel',
26
+ 'POST /api/cloud/remote/authorize-retry',
25
27
  ])
26
28
 
27
29
  function routeError(message, statusCode, code) {
@@ -81,6 +83,9 @@ export function createCloudRouteHandler({
81
83
  invalidateRuntime = invalidateCloudRuntime,
82
84
  cloudClientFactory = (config) => new CloudClient(config),
83
85
  qfAgentStatus = getQfAgentStatus,
86
+ armAutoApproval = armAgentAutoApproval,
87
+ clearAutoApproval = clearAgentAutoApproval,
88
+ retryAutoApproval = retryAgentAutoApproval,
84
89
  onServiceConfigChanged,
85
90
  } = {}) {
86
91
  async function runtimeOrError() {
@@ -108,6 +113,17 @@ export function createCloudRouteHandler({
108
113
  return
109
114
  }
110
115
 
116
+ // 自动批准失败后由 UI 发起的重试:仍使用服务端内存中保留的 user_code,
117
+ // 不要求用户打开授权页或输入码。
118
+ if (req.method === 'POST' && url.pathname === '/api/cloud/remote/authorize-retry') {
119
+ if (context.isLocalRequest !== true) {
120
+ throw routeError('Remote agent authorization can be retried only on this computer.', 403, 'cloud_local_only')
121
+ }
122
+ await readJsonBody(req, CLOUD_CONFIG_BODY_MAX_BYTES)
123
+ sendJson(res, 200, await retryAutoApproval())
124
+ return
125
+ }
126
+
111
127
  if (req.method === 'GET' && url.pathname === '/api/cloud/config') {
112
128
  sendJson(res, 200, publicCloudServiceConfig(await readServiceConfig({ strict: false })))
113
129
  return
@@ -138,6 +154,10 @@ export function createCloudRouteHandler({
138
154
  const currentConfig = await readServiceConfig({ strict: false })
139
155
  const nextUrl = parseCloudBaseUrl(body?.cloudUrl === undefined ? currentConfig.cloudUrl : body.cloudUrl).href
140
156
  const nextEnabled = body?.enabled === undefined ? currentConfig.enabled === true : body.enabled
157
+ // 仅在本机用户显式将 Cloud 服务从 disabled 切换为 enabled 时立即创建短时、一次性的
158
+ // agent 自动批准意图;其余场景由 qf-agent 在首次 authorizing 时依据本机 desktop 会话
159
+ // 自动 arm(认证远程客户端触发的变更以 'manual' 策略排除,见下方 notify)。
160
+ const enabledTransition = context.isLocalRequest === true && currentConfig.enabled !== true && nextEnabled === true
141
161
  const urlChanged = !sameCloudUrl(currentConfig.cloudUrl, nextUrl)
142
162
  if (body?.cloudUrl !== undefined) {
143
163
  const credentialStore = credentialStoreFactory()
@@ -152,9 +172,16 @@ export function createCloudRouteHandler({
152
172
  }
153
173
  await saveServiceConfig({ cloudUrl: nextUrl, enabled: nextEnabled })
154
174
  invalidateRuntime()
175
+ if (enabledTransition) armAutoApproval()
176
+ else if (!nextEnabled) clearAutoApproval()
155
177
  const saved = await readServiceConfig({ strict: false })
156
178
  const notify = context.onCloudServiceConfigChanged || onServiceConfigChanged
157
- if (typeof notify === 'function') await notify(saved, { urlChanged })
179
+ // 认证远程客户端触发的配置变更以 manual 策略通知生命周期:由此启动的 agent
180
+ // 生命周期(含其自动重启)不自动创建批准意图;本机请求保持默认(允许自动 arm)。
181
+ const remoteInitiated = context.isLocalRequest !== true
182
+ if (typeof notify === 'function') {
183
+ await notify(saved, remoteInitiated ? { urlChanged, autoApprovalPolicy: 'manual' } : { urlChanged })
184
+ }
158
185
  sendJson(res, 200, publicCloudServiceConfig(saved))
159
186
  return
160
187
  }