@zq-silk/yui 2.17.0 → 2.18.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.
Files changed (70) hide show
  1. package/dist/cli/commandCatalog.js +2 -1
  2. package/dist/commands/controllerCommands.js +13 -4
  3. package/dist/commands/durableJobCommands.js +50 -3
  4. package/dist/commands/globalRoleCommands.js +18 -12
  5. package/dist/commands/inboxCommands.js +1 -0
  6. package/dist/commands/operatorCommands.js +10 -2
  7. package/dist/controlPlaneCli.js +21 -4
  8. package/dist/controller/clientRuntime.js +34 -13
  9. package/dist/controller/controller.js +35 -22
  10. package/dist/controller/diagnosticJournal.js +214 -0
  11. package/dist/controller/fileSchedulerStoreAdapter.js +139 -101
  12. package/dist/controller/globalInputDelivery.js +6 -2
  13. package/dist/controller/globalRuntimeAttention.js +11 -3
  14. package/dist/controller/jobControl.js +1 -1
  15. package/dist/controller/jobDefinitionControl.js +24 -13
  16. package/dist/controller/jobSupervisor.js +4 -0
  17. package/dist/controller/runtime.js +66 -4
  18. package/dist/controller/workerSchedulerStore.js +24 -0
  19. package/dist/core/boundedRpc.js +4 -0
  20. package/dist/core/controllerServer.js +1 -1
  21. package/dist/core/controllerTelemetry.js +92 -19
  22. package/dist/job/globalShell.js +51 -0
  23. package/dist/job/jobBusinessResult.js +4 -3
  24. package/dist/job/jobDefinition.js +6 -1
  25. package/dist/job/jobRunner.js +9 -0
  26. package/dist/job/scheduleService.js +2 -0
  27. package/dist/message/globalInboxRecovery.js +30 -19
  28. package/dist/message/globalProviderRetry.js +7 -1
  29. package/dist/runtime/builtinAgentErrorMappers.js +4 -0
  30. package/dist/runtime/globalSessionHealth.js +39 -0
  31. package/dist/scheduler/roleRunStall.js +10 -10
  32. package/dist/storage/persistenceWorker.js +41 -19
  33. package/dist/storage/sqliteSchema.js +35 -11
  34. package/dist/storage/sqliteStore.js +86 -8
  35. package/dist/storage/storageVersions.js +1 -1
  36. package/dist/storage/storeRpc.js +25 -11
  37. package/dist/storage/taskReadRevisionSchema.js +39 -0
  38. package/dist/web/assets/client/app/catalog.js +0 -29
  39. package/dist/web/assets/client/app/jobs.js +115 -0
  40. package/dist/web/assets/client/app/main.js +17 -6
  41. package/dist/web/assets/client/app/manage.js +1 -0
  42. package/dist/web/assets/client/app/settings.js +1 -5
  43. package/dist/web/assets/client/i18n/en.js +203 -18
  44. package/dist/web/assets/client/i18n/zh-CN.js +202 -17
  45. package/dist/web/assets/client/index.js +2 -0
  46. package/dist/web/assets/client/layout/manageShell.js +61 -15
  47. package/dist/web/assets/client/layout/router.js +2 -1
  48. package/dist/web/assets/client/lib/prefs.js +1 -1
  49. package/dist/web/assets/client/views/jobs.js +1042 -160
  50. package/dist/web/assets/client/views/sidebar.js +3 -0
  51. package/dist/web/assets/shared/manageNav.js +3 -1
  52. package/dist/web/assets/shell/appRail.js +2 -1
  53. package/dist/web/assets/shell/manage.js +7 -2
  54. package/dist/web/assets/shell/models.js +4 -3
  55. package/dist/web/assets/shell/settingsContent.js +0 -3
  56. package/dist/web/assets/shell/sidebar.js +0 -1
  57. package/dist/web/assets/styles/views/jobs.js +301 -12
  58. package/dist/web/assets/styles/views/sidebar.js +1 -2
  59. package/dist/web/webServer.js +28 -1
  60. package/docs/global-shell-jobs.md +78 -0
  61. package/docs/job-runs.md +6 -3
  62. package/docs/managed-turn-and-session-runtime.md +74 -0
  63. package/docs/managed-turn-and-session-runtime.zh-CN.md +51 -0
  64. package/docs/release-workflow.md +43 -0
  65. package/docs/release-workflow.zh-CN.md +29 -0
  66. package/docs/storage-baseline.md +14 -1
  67. package/docs/storage-baseline.zh-CN.md +6 -1
  68. package/docs/testing/verification-levels.md +2 -2
  69. package/docs/testing/verification-levels.zh-CN.md +2 -2
  70. package/package.json +1 -1
@@ -50,7 +50,6 @@ export const EN = {
50
50
  "permissions.empty": "No matching templates.",
51
51
  "permissions.retry": "Retry read",
52
52
  "tabs.jobs": "Jobs",
53
- "settings.section.jobs": "Jobs & schedules",
54
53
  "jobs.builtinSync": "Built-in Project sync · safe fast-forward only",
55
54
  "jobs.automatic": "Automatic sync preference",
56
55
  "jobs.syncEvery": "Sync interval (milliseconds, minimum 60000)",
@@ -62,14 +61,52 @@ export const EN = {
62
61
  "jobs.executor": "Execution method",
63
62
  "jobs.executionTask": "Open execution Task",
64
63
  "jobs.sourceJob": "Created by Job / Run",
65
- "jobs.taskCategory": "Task category",
66
- "jobs.category.ordinary": "Ordinary Tasks",
67
- "jobs.category.job": "Job execution Tasks",
68
- "jobs.category.all": "All Tasks",
69
- "jobs.categoryShort.ordinary": "Ordinary",
70
- "jobs.categoryShort.job": "Jobs",
71
- "jobs.categoryShort.all": "All",
72
- "jobs.recentSuccess": "Most recent successful Run",
64
+ "nav.jobs": "Jobs",
65
+ "jobs.scopeLabel": "Owner",
66
+ "jobs.scopeHelp": "Global, or one Task that owns Jobs. Counts, search and the list describe only this scope.",
67
+ "jobs.scopesError": "Owner list unavailable:",
68
+ "jobs.search": "Search Jobs",
69
+ "jobs.count": "{total} Jobs",
70
+ "jobs.countFiltered": "{shown} of {total} Jobs",
71
+ "jobs.noMatch": "No Jobs in this scope match the search.",
72
+ "jobs.noSchedule": "No plan",
73
+ "jobs.noRunsShort": "No Runs",
74
+ "jobs.nextShort": "next",
75
+ "jobs.plan": "Plan",
76
+ "jobs.definition": "Definition",
77
+ "jobs.execution": "Execution",
78
+ "jobs.runVsPlan": "A Run's status describes one execution; it does not turn the plan on or off.",
79
+ "jobs.type": "Type",
80
+ "jobs.type.projectSync": "Project sync",
81
+ "jobs.kind.shell": "Shell command",
82
+ "jobs.form.scripts": "Script files",
83
+ "jobs.form.scriptPath": "Relative path",
84
+ "jobs.form.scriptContent": "Script content",
85
+ "jobs.form.addScript": "Add script",
86
+ "jobs.form.stepOptions": "Timeout and environment",
87
+ "jobs.form.shellHome": "This Job owns its commands and scripts. Each Run uses a version snapshot in a separate directory. Invoke scripts with sh scripts/run.sh. Commands run as the local user, not in a security sandbox; saving does not execute them.",
88
+ "jobs.kind.task": "Task delegation",
89
+ "jobs.kind.agent": "Agent run",
90
+ "jobs.kind.builtin": "Built-in action",
91
+ "jobs.kind.process": "Process",
92
+ "jobs.ownerGlobal": "Global",
93
+ "jobs.ownerTask": "Task",
94
+ "jobs.openInJobs": "Open in Jobs",
95
+ "jobs.moved": "Jobs moved out of Settings into their own entry. This link now opens here.",
96
+ "catalog.sourceJob": "Job",
97
+ "catalog.sourceRemoved": "The Task category filter was removed: the list shows every Task, and Jobs have their own entry.",
98
+ "schedule.enabled": "On",
99
+ "schedule.disabled": "Off",
100
+ "schedule.completed": "Completed",
101
+ "schedule.needs-attention": "Needs attention",
102
+ "schedule.retired": "Retired",
103
+ "admission.admitted": "Admitted",
104
+ "admission.overlap": "Skipped (overlap)",
105
+ "admission.blocked": "Blocked",
106
+ "trigger.manual": "Manual",
107
+ "trigger.schedule": "Scheduled",
108
+ "trigger.retry": "Retry",
109
+ "jobs.recentSuccess": "Last success",
73
110
  "jobs.diagnostics": "Execution diagnostics",
74
111
  "jobs.artifacts": "Registered fixed artifacts",
75
112
  "jobs.registeredOnly": "Only the exact registered owner, Run, commit, path and digest are readable. Linked images must also be registered.",
@@ -88,7 +125,9 @@ export const EN = {
88
125
  "jobs.project": "Target Project",
89
126
  "jobs.name": "Title",
90
127
  "jobs.action": "Controlled action",
91
- "jobs.newJob": "Create Job",
128
+ "jobs.newJob": "New Job",
129
+ "jobs.newJobIn": "Creates the Job in",
130
+ "jobs.ownerShort": "Owner",
92
131
  "jobs.editJob": "Edit Job",
93
132
  "jobs.runNow": "Run now",
94
133
  "jobs.newSchedule": "Create schedule",
@@ -96,10 +135,11 @@ export const EN = {
96
135
  "jobs.cancelRun": "Cancel this Run",
97
136
  "jobs.disable": "Disable future runs",
98
137
  "jobs.enable": "Enable schedule",
99
- "jobs.refresh": "Refresh facts",
138
+ "jobs.refresh": "Refresh",
100
139
  "jobs.save": "Save",
101
140
  "jobs.close": "Close editor",
102
141
  "jobs.discard": "Discard this unsaved draft?",
142
+ "jobs.leaveBusy": "A submission is still in progress; this view stays open until its receipt arrives.",
103
143
  "jobs.loading": "Reading authoritative state…",
104
144
  "jobs.submitting": "Submitting…",
105
145
  "jobs.saved": "Saved. This is not proof of execution or success.",
@@ -109,17 +149,85 @@ export const EN = {
109
149
  "jobs.observed": "Facts refreshed",
110
150
  "jobs.unknown": "Submission outcome is unknown; it will not be resent. Inspect current facts and the original operation before taking another action.",
111
151
  "jobs.empty": "No Jobs in this scope. Creating a Job does not run it.",
112
- "jobs.configuration": "Execution configuration",
113
- "jobs.taskConfig": "Use the documented shell, Task delegation or Agent configuration. Shell requires an exact managed workspace/HEAD; new execution Tasks still require independent activation. Agent input grants no extra authority. No secrets. Executor kind is immutable.",
114
- "jobs.rebind": "Saving a Project refresh Job explicitly binds its current catalog target. It does not refresh the Project. No arbitrary global shell commands.",
152
+ "jobs.configuration": "Configuration",
153
+ "jobs.taskConfig": "Saving changes configuration only; it does not run the Job. Do not include passwords or keys. Execution still requires the relevant permissions and workspace.",
154
+ "jobs.saveAsNew": "Save as new Job",
155
+ "jobs.kindCopyHelp": "You selected a different execution method. Saving creates a new Job. The original Job, history and schedules stay unchanged; schedules are not copied or started.",
156
+ "jobs.rebind": "Saving a Project refresh Job binds its current catalog target. It does not immediately refresh the Project.",
115
157
  "jobs.rule": "Time rule",
116
158
  "jobs.instant": "Instant / interval anchor (ISO time with UTC offset)",
117
159
  "jobs.every": "Interval (milliseconds, minimum 1000)",
118
160
  "jobs.cron": "Cron expression (five fields)",
119
161
  "jobs.timezone": "Timezone",
120
- "jobs.scheduleHelp": "Creating a schedule enables future execution. Rule edits preserve enabled status only when already enabled. Cron uses the service's DST rules; next due is never calculated in this browser.",
162
+ "jobs.scheduleHelp": "New schedules are enabled on save. Editing preserves their current on/off state.",
163
+ "jobs.form.customCron": "Custom Cron",
164
+ "jobs.form.cron": "Recurring",
165
+ "jobs.form.interval": "Fixed interval",
166
+ "jobs.form.once": "Run once",
167
+ "jobs.form.daily": "Daily",
168
+ "jobs.form.weekly": "Weekly",
169
+ "jobs.form.monthly": "Monthly",
170
+ "jobs.form.advanced": "Advanced details",
171
+ "jobs.form.frequency": "Repeat",
172
+ "jobs.form.time": "Time",
173
+ "jobs.form.time24": "Time · 24-hour clock",
174
+ "jobs.form.quickTime": "Common times",
175
+ "jobs.form.cronRequired": "Enter a Cron expression, or return to a repeat frequency.",
176
+ "jobs.form.cronSymbols": "* means any value, , separates values, - defines a range, and / sets a step. Example: 0 9 * * 1-5 runs at 09:00 Monday–Friday. The server validates on save.",
177
+ "jobs.form.cron.minute": "Minute",
178
+ "jobs.form.cron.hour": "Hour",
179
+ "jobs.form.cron.date": "Day",
180
+ "jobs.form.cron.month": "Month",
181
+ "jobs.form.cron.weekday": "Weekday",
182
+ "jobs.form.cron.minuteRange": "0–59",
183
+ "jobs.form.cron.hourRange": "0–23",
184
+ "jobs.form.cron.dateRange": "1–31",
185
+ "jobs.form.cron.monthRange": "1–12",
186
+ "jobs.form.cron.weekdayRange": "0–7; 0/7 = Sun",
187
+ "jobs.form.day": "Day of month",
188
+ "jobs.form.weekdays": "Days of week",
189
+ "jobs.form.monthHelp": "For days 29–31, months without that date are skipped.",
190
+ "jobs.form.complexHelp": "Custom five-field Cron. The server validates on save; complex expressions stay unchanged.",
191
+ "jobs.form.replaceComplex": "This expression cannot be converted losslessly. Switching to the visual form will replace this rule. Continue?",
192
+ "jobs.form.zonePreserved": "Times use this schedule’s saved timezone. Editing does not change it.",
193
+ "jobs.form.forJob": "Run Job",
194
+ "jobs.form.internalId": "Internal identifier",
195
+ "jobs.form.idHelp": "Used for links and record associations. Generated automatically; usually no need to change.",
196
+ "jobs.form.paused": "Future runs are paused. Existing run history is unchanged.",
197
+ "jobs.form.cronTime": "Choose a valid time.",
198
+ "jobs.form.cronDays": "Select at least one day.",
199
+ "jobs.form.cronDay": "Day must be an integer from 1 to 31.",
200
+ "jobs.form.monthRule": "Monthly on day {day}, {time}",
201
+ "jobs.form.command": "Command",
202
+ "jobs.form.remove": "Remove",
203
+ "jobs.form.addStep": "Add step",
204
+ "jobs.form.addEnv": "Add environment variable",
205
+ "jobs.form.envName": "Variable name",
206
+ "jobs.form.envValue": "Value",
207
+ "jobs.form.timeout": "Timeout (ms, optional)",
208
+ "jobs.form.target": "Execution target",
209
+ "jobs.form.goal": "Completion goal",
210
+ "jobs.form.delivery": "Deliver the task",
211
+ "jobs.form.task-created": "Create the task",
212
+ "jobs.form.work-item": "Existing work item",
213
+ "jobs.form.new": "New task",
214
+ "jobs.form.operator": "Global Operator",
215
+ "jobs.form.task": "Task role",
216
+ "jobs.form.job": "Dedicated Agent",
217
+ "jobs.form.serial": "Serial",
218
+ "jobs.form.isolated": "Isolated",
219
+ "jobs.form.concurrency": "Execution policy",
220
+ "jobs.form.addBinding": "Add Project",
221
+ "jobs.form.directory": "Directory",
222
+ "jobs.form.baseRef": "Base branch",
223
+ "jobs.form.unchanged": "Fields not shown here are preserved unchanged.",
224
+ "jobs.form.duplicateEnv": "Environment names must be nonempty and unique.",
225
+ "jobs.form.positiveInteger": "Enter a positive integer.",
226
+ "jobs.form.needStep": "Add at least one execution step.",
227
+ "jobs.form.argvHelp": "This step executes these arguments directly, without a shell. Command is a display description.",
228
+ "jobs.form.addArgument": "Add argument",
121
229
  "jobs.state": "State",
122
- "jobs.recentRun": "Most recent Run",
230
+ "jobs.recentRun": "Latest Run",
123
231
  "jobs.refreshAttempt": "Project: last attempt",
124
232
  "jobs.refreshSuccess": "Project: last successful refresh",
125
233
  "jobs.onceCompleted": "The once plan was admitted. Completed does not mean its Run succeeded.",
@@ -130,7 +238,7 @@ export const EN = {
130
238
  "jobs.lastAttempt": "Last admission attempt",
131
239
  "jobs.lastSuccess": "Last successful scheduled Run",
132
240
  "jobs.refreshFacts": "Project refresh: last attempt / last success",
133
- "jobs.history": "Execution history · exact Runs",
241
+ "jobs.history": "Run history",
134
242
  "jobs.noRuns": "No executions yet.",
135
243
  "jobs.inspectRun": "Inspect attempt Run",
136
244
  "jobs.trigger": "Trigger",
@@ -140,6 +248,83 @@ export const EN = {
140
248
  "jobs.logs": "Step logs",
141
249
  "jobs.truncated": "last 64 KiB",
142
250
  "jobs.noLogs": "No checkpointed step logs yet. This does not establish success.",
251
+ "jobs.copy": "Copy",
252
+ "jobs.copied": "Copied",
253
+ "jobs.copyManual": "Copy manually:",
254
+ "jobs.copyJson": "Copy JSON",
255
+ "jobs.copyCommand": "Copy command",
256
+ "jobs.jsonInvalid": "Configuration is not valid JSON:",
257
+ "jobs.preview": "Reads as",
258
+ "jobs.basics": "Basics",
259
+ "jobs.runDetail": "Run",
260
+ "jobs.closeRun": "Close Run details",
261
+ "jobs.started": "Started",
262
+ "jobs.updated": "Updated",
263
+ "jobs.duration": "Duration",
264
+ "jobs.exit": "Exit",
265
+ "jobs.failedStep": "Failed step",
266
+ "jobs.retryOf": "Retry of",
267
+ "jobs.steps": "Steps",
268
+ "jobs.overview": "Overview",
269
+ "jobs.successRate": "Success rate",
270
+ "jobs.avgDuration": "Avg. duration",
271
+ "jobs.sparkLabel": "Last {count} Runs, {ok} succeeded",
272
+ "jobs.runCount": "{count} Runs",
273
+ "jobs.showMore": "Show {count} more",
274
+ "jobs.filterRuns": "Filter Runs by status",
275
+ "jobs.filter.all": "All",
276
+ "jobs.filter.active": "Active",
277
+ "jobs.col.status": "Status",
278
+ "jobs.col.run": "Run",
279
+ "jobs.col.started": "Started",
280
+ "jobs.lastAttemptShort": "Last attempt",
281
+ "jobs.lastSuccessShort": "Last success",
282
+ "jobs.ruleDaily": "Daily at {time}",
283
+ "jobs.ruleWeekly": "{days} at {time}",
284
+ "jobs.ruleEvery": "Every {period}",
285
+ "jobs.ruleOnce": "Once at {at}",
286
+ "jobs.ruleAnchor": "from",
287
+ "jobs.cfg.input": "Input",
288
+ "jobs.cfg.workspace": "Workspace",
289
+ "jobs.cfg.head": "HEAD",
290
+ "jobs.cfg.owner": "Owner",
291
+ "jobs.cfg.ownerTask": "This Task",
292
+ "jobs.cfg.env": "Environment",
293
+ "jobs.cfg.noEnv": "None",
294
+ "jobs.cfg.goal": "Goal",
295
+ "jobs.cfg.target": "Target",
296
+ "jobs.cfg.concurrency": "Concurrency",
297
+ "jobs.cfg.agentInput": "Instructions",
298
+ "jobs.cfg.other": "Other fields",
299
+ "jobs.cfg.raw": "Exact configuration",
300
+ "jobs.cfg.noParams": "No parameters",
301
+ "jobs.cfg.emptyList": "Empty list",
302
+ "jobs.cfg.emptyText": "Empty",
303
+ "jobs.cfg.fields": "{count} fields",
304
+ "jobs.cfg.value": "Value",
305
+ "jobs.cfg.timeout": "Timeout",
306
+ "jobs.cfg.cwd": "cwd",
307
+ "jobs.cfg.unnamed": "unnamed",
308
+ "jobs.cfg.description": "Description",
309
+ "jobs.cfg.bindings": "Project bindings",
310
+ "jobs.cfg.task": "Task",
311
+ "jobs.cfg.workItem": "WorkItem",
312
+ "jobs.cfg.role": "Role",
313
+ "jobs.cfg.agent": "Agent",
314
+ "jobs.cfg.ownerRun": "Owner Run",
315
+ "jobs.cfg.attempt": "Integration attempt",
316
+ "jobs.action.system.noop": "No-op check",
317
+ "jobs.action.project.refresh": "Project refresh",
318
+ "jobs.goal.delivery": "Deliver in a new Task",
319
+ "jobs.goal.task-created": "Create a Task",
320
+ "jobs.goal.work-item": "Run a WorkItem",
321
+ "jobs.target.new": "New Task",
322
+ "jobs.target.work-item": "Existing WorkItem",
323
+ "jobs.target.operator": "Operator",
324
+ "jobs.target.task": "Task role",
325
+ "jobs.target.job": "Job-owned Agent",
326
+ "jobs.concurrency.serial": "Serial",
327
+ "jobs.concurrency.isolated": "Isolated",
143
328
  "models.subscriptionAuth": "Subscription",
144
329
  "models.account": "Account",
145
330
  "models.providerReadOnlyHelp": "Managed by its provider. Edit the configuration in the owning service.",
@@ -148,7 +333,7 @@ export const EN = {
148
333
  "models.window.weekly": "Weekly",
149
334
  "models.window.monthly": "Monthly",
150
335
  "manage.nav": "Main navigation",
151
- "manage.workbench": "Workbench",
336
+ "manage.workbench": "Tasks",
152
337
  "manage.sections": "Sections",
153
338
  "manage.collapseSections": "Collapse sections",
154
339
  "manage.showSections": "Show sections",
@@ -48,7 +48,6 @@ export const ZH_CN = {
48
48
  "permissions.empty": "没有匹配的模板。",
49
49
  "permissions.retry": "重新读取",
50
50
  "tabs.jobs": "Job",
51
- "settings.section.jobs": "Job 与时间计划",
52
51
  "jobs.builtinSync": "内置 Project 同步 · 仅安全快进",
53
52
  "jobs.automatic": "自动同步偏好",
54
53
  "jobs.syncEvery": "同步间隔(毫秒,最少 60000)",
@@ -60,14 +59,52 @@ export const ZH_CN = {
60
59
  "jobs.executor": "执行方式",
61
60
  "jobs.executionTask": "打开执行 Task",
62
61
  "jobs.sourceJob": "创建来源 Job / Run",
63
- "jobs.taskCategory": "任务分类",
64
- "jobs.category.ordinary": "普通任务",
65
- "jobs.category.job": "Job 执行任务",
66
- "jobs.category.all": "全部任务",
67
- "jobs.categoryShort.ordinary": "普通",
68
- "jobs.categoryShort.job": "Job",
69
- "jobs.categoryShort.all": "全部",
70
- "jobs.recentSuccess": "最近成功的 Run",
62
+ "nav.jobs": "Job",
63
+ "jobs.scopeLabel": "归属",
64
+ "jobs.scopeHelp": "全局,或某个拥有 Job 的 Task。计数、搜索与列表只描述这一范围。",
65
+ "jobs.scopesError": "归属列表不可用:",
66
+ "jobs.search": "搜索 Job",
67
+ "jobs.count": "{total} 个 Job",
68
+ "jobs.countFiltered": "{shown} / {total} 个 Job",
69
+ "jobs.noMatch": "此范围内没有匹配搜索的 Job。",
70
+ "jobs.noSchedule": "无计划",
71
+ "jobs.noRunsShort": "无 Run",
72
+ "jobs.nextShort": "下次",
73
+ "jobs.plan": "计划",
74
+ "jobs.definition": "定义",
75
+ "jobs.execution": "执行",
76
+ "jobs.runVsPlan": "Run 状态只描述一次执行,不会开启或关闭计划。",
77
+ "jobs.type": "类型",
78
+ "jobs.type.projectSync": "Project 同步",
79
+ "jobs.kind.shell": "Shell 命令",
80
+ "jobs.form.scripts": "脚本文件",
81
+ "jobs.form.scriptPath": "相对路径",
82
+ "jobs.form.scriptContent": "脚本内容",
83
+ "jobs.form.addScript": "添加脚本",
84
+ "jobs.form.stepOptions": "超时与环境变量",
85
+ "jobs.form.shellHome": "命令与脚本由此 Job 管理,每次运行使用独立目录中的版本快照。可用 sh scripts/run.sh 调用脚本。命令以本机用户权限执行,不是安全沙箱;保存不会立即执行。",
86
+ "jobs.kind.task": "Task 委派",
87
+ "jobs.kind.agent": "Agent 运行",
88
+ "jobs.kind.builtin": "内置动作",
89
+ "jobs.kind.process": "进程",
90
+ "jobs.ownerGlobal": "全局",
91
+ "jobs.ownerTask": "Task",
92
+ "jobs.openInJobs": "在 Job 中打开",
93
+ "jobs.moved": "Job 已从设置移到独立入口,此链接现在在这里打开。",
94
+ "catalog.sourceJob": "Job",
95
+ "catalog.sourceRemoved": "已移除任务分类筛选:列表显示全部任务,Job 有独立入口。",
96
+ "schedule.enabled": "开启",
97
+ "schedule.disabled": "关闭",
98
+ "schedule.completed": "已完成",
99
+ "schedule.needs-attention": "需要处理",
100
+ "schedule.retired": "已停用",
101
+ "admission.admitted": "已接纳",
102
+ "admission.overlap": "跳过(重叠)",
103
+ "admission.blocked": "被阻止",
104
+ "trigger.manual": "手动",
105
+ "trigger.schedule": "计划",
106
+ "trigger.retry": "重试",
107
+ "jobs.recentSuccess": "最近成功",
71
108
  "jobs.diagnostics": "执行诊断",
72
109
  "jobs.artifacts": "已登记固定产物",
73
110
  "jobs.registeredOnly": "仅可读取已登记的准确归属、Run、commit、路径及摘要。引用图片也须独立登记。",
@@ -86,7 +123,9 @@ export const ZH_CN = {
86
123
  "jobs.project": "目标 Project",
87
124
  "jobs.name": "名称",
88
125
  "jobs.action": "受控操作",
89
- "jobs.newJob": "创建 Job",
126
+ "jobs.newJob": "新建 Job",
127
+ "jobs.newJobIn": "新 Job 将归属于",
128
+ "jobs.ownerShort": "归属",
90
129
  "jobs.editJob": "编辑 Job",
91
130
  "jobs.runNow": "立即运行",
92
131
  "jobs.newSchedule": "创建时间计划",
@@ -94,10 +133,11 @@ export const ZH_CN = {
94
133
  "jobs.cancelRun": "取消本次 Run",
95
134
  "jobs.disable": "停用后续计划",
96
135
  "jobs.enable": "启用时间计划",
97
- "jobs.refresh": "刷新事实",
136
+ "jobs.refresh": "刷新",
98
137
  "jobs.save": "保存",
99
138
  "jobs.close": "关闭编辑",
100
139
  "jobs.discard": "放弃当前未保存的草稿?",
140
+ "jobs.leaveBusy": "仍有提交在进行中;收到回执前保留当前视图。",
101
141
  "jobs.loading": "正在读取权威状态…",
102
142
  "jobs.submitting": "提交中…",
103
143
  "jobs.saved": "已保存;不代表已执行或执行成功。",
@@ -108,16 +148,84 @@ export const ZH_CN = {
108
148
  "jobs.unknown": "提交结果未知,不会重发。请先检查当前事实和原操作,再决定后续动作。",
109
149
  "jobs.empty": "此范围暂无 Job。创建定义不会立即执行。",
110
150
  "jobs.configuration": "执行配置",
111
- "jobs.taskConfig": "使用已文档化的 shell、Task 委托或 Agent 配置。shell 要求准确受管工作区及 HEAD;新执行 Task 仍需独立激活。Agent 输入不扩展权限。禁止包含凭据;执行器类型不可改写。",
112
- "jobs.rebind": "保存 Project 刷新 Job 会显式绑定当前目录中的目标,但不会执行刷新。全局不开放任意 shell 命令。",
151
+ "jobs.taskConfig": "保存仅更新配置,不会立即执行。请勿填写密码或密钥;运行时仍需满足对应权限与工作区要求。",
152
+ "jobs.saveAsNew": "另存为新 Job",
153
+ "jobs.kindCopyHelp": "你选择了不同的执行方式。保存将创建新的 Job;原 Job、执行历史和时间计划保持不变,不会复制或启动计划。",
154
+ "jobs.rebind": "保存 Project 刷新 Job 会绑定当前目录中的目标,但不会立即执行刷新。",
113
155
  "jobs.rule": "时间规则",
114
156
  "jobs.instant": "执行时间/周期锚点(带 UTC 偏移的 ISO 时间)",
115
157
  "jobs.every": "周期间隔(毫秒,至少 1000)",
116
158
  "jobs.cron": "Cron 表达式(五字段)",
117
159
  "jobs.timezone": "时区",
118
- "jobs.scheduleHelp": "创建计划会启用后续执行;修改规则只在原本启用时保持启用。Cron 遵循服务端夏令时规则,浏览器不计算下次时间。",
160
+ "jobs.scheduleHelp": "新计划保存后启用;编辑已有计划不会改变启停状态。",
161
+ "jobs.form.customCron": "自定义 Cron",
162
+ "jobs.form.cron": "重复执行",
163
+ "jobs.form.interval": "固定间隔",
164
+ "jobs.form.once": "仅执行一次",
165
+ "jobs.form.daily": "每天",
166
+ "jobs.form.weekly": "每周",
167
+ "jobs.form.monthly": "每月",
168
+ "jobs.form.advanced": "高级详情",
169
+ "jobs.form.frequency": "重复频率",
170
+ "jobs.form.time": "执行时间",
171
+ "jobs.form.time24": "执行时间 · 24 小时制",
172
+ "jobs.form.quickTime": "常用时间",
173
+ "jobs.form.cronRequired": "输入 Cron 表达式,或返回选择执行频率。",
174
+ "jobs.form.cronSymbols": "* 表示任意值,, 分隔多个值,- 表示范围,/ 表示步长。例如 0 9 * * 1-5:每周一至周五 09:00。保存时由服务端校验。",
175
+ "jobs.form.cron.minute": "分钟",
176
+ "jobs.form.cron.hour": "小时",
177
+ "jobs.form.cron.date": "日期",
178
+ "jobs.form.cron.month": "月份",
179
+ "jobs.form.cron.weekday": "星期",
180
+ "jobs.form.cron.minuteRange": "0–59",
181
+ "jobs.form.cron.hourRange": "0–23",
182
+ "jobs.form.cron.dateRange": "1–31",
183
+ "jobs.form.cron.monthRange": "1–12",
184
+ "jobs.form.cron.weekdayRange": "0–7,0/7 为周日",
185
+ "jobs.form.day": "每月几号",
186
+ "jobs.form.weekdays": "执行星期",
187
+ "jobs.form.monthHelp": "选择 29–31 日时,没有该日期的月份不会执行。",
188
+ "jobs.form.complexHelp": "自定义五字段 Cron。保存时由服务端校验;复杂规则保持原样,不自动转换。",
189
+ "jobs.form.replaceComplex": "此表达式不能无损转换为常见频率。改用可视化表单将替换当前规则,是否继续?",
190
+ "jobs.form.zonePreserved": "时间按此计划保存的时区执行,编辑不会改变时区。",
191
+ "jobs.form.forJob": "执行 Job",
192
+ "jobs.form.internalId": "内部标识",
193
+ "jobs.form.idHelp": "用于链接和关联记录,系统自动生成,通常无需修改。",
194
+ "jobs.form.paused": "已暂停后续执行,已有执行历史不受影响。",
195
+ "jobs.form.cronTime": "请选择有效的执行时间。",
196
+ "jobs.form.cronDays": "请至少选择一天。",
197
+ "jobs.form.cronDay": "日期应为 1–31 的整数。",
198
+ "jobs.form.monthRule": "每月 {day} 日 {time}",
199
+ "jobs.form.command": "命令",
200
+ "jobs.form.remove": "移除",
201
+ "jobs.form.addStep": "添加步骤",
202
+ "jobs.form.addEnv": "添加环境变量",
203
+ "jobs.form.envName": "变量名",
204
+ "jobs.form.envValue": "变量值",
205
+ "jobs.form.timeout": "超时(毫秒,可选)",
206
+ "jobs.form.target": "执行目标",
207
+ "jobs.form.goal": "完成目标",
208
+ "jobs.form.delivery": "完成交付",
209
+ "jobs.form.task-created": "创建任务",
210
+ "jobs.form.work-item": "已有工作项",
211
+ "jobs.form.new": "新建任务",
212
+ "jobs.form.operator": "全局 Operator",
213
+ "jobs.form.task": "任务角色",
214
+ "jobs.form.job": "独立 Agent",
215
+ "jobs.form.serial": "串行",
216
+ "jobs.form.isolated": "隔离执行",
217
+ "jobs.form.concurrency": "执行策略",
218
+ "jobs.form.addBinding": "添加 Project",
219
+ "jobs.form.directory": "目录",
220
+ "jobs.form.baseRef": "基准分支",
221
+ "jobs.form.unchanged": "未展示字段会原样保留。",
222
+ "jobs.form.duplicateEnv": "环境变量名不能为空或重复。",
223
+ "jobs.form.positiveInteger": "请输入正整数。",
224
+ "jobs.form.needStep": "请至少添加一个执行步骤。",
225
+ "jobs.form.argvHelp": "此步骤直接执行以下参数,不通过 Shell;命令字段仅作说明。",
226
+ "jobs.form.addArgument": "添加参数",
119
227
  "jobs.state": "状态",
120
- "jobs.recentRun": "最近一次 Run",
228
+ "jobs.recentRun": "最近 Run",
121
229
  "jobs.refreshAttempt": "Project 最近尝试",
122
230
  "jobs.refreshSuccess": "Project 最近成功刷新",
123
231
  "jobs.onceCompleted": "一次性计划已准入;completed 不代表其 Run 已成功。",
@@ -128,7 +236,7 @@ export const ZH_CN = {
128
236
  "jobs.lastAttempt": "最近准入尝试",
129
237
  "jobs.lastSuccess": "最近成功的计划 Run",
130
238
  "jobs.refreshFacts": "Project 刷新:最近尝试/最近成功",
131
- "jobs.history": "执行历史 · 精确 Run",
239
+ "jobs.history": "执行历史",
132
240
  "jobs.noRuns": "尚无执行记录。",
133
241
  "jobs.inspectRun": "查看此次尝试的 Run",
134
242
  "jobs.trigger": "触发来源",
@@ -138,6 +246,83 @@ export const ZH_CN = {
138
246
  "jobs.logs": "步骤日志",
139
247
  "jobs.truncated": "末尾 64 KiB",
140
248
  "jobs.noLogs": "暂无已写入检查点的步骤日志;这不代表成功。",
249
+ "jobs.copy": "复制",
250
+ "jobs.copied": "已复制",
251
+ "jobs.copyManual": "请手动复制:",
252
+ "jobs.copyJson": "复制 JSON",
253
+ "jobs.copyCommand": "复制命令",
254
+ "jobs.jsonInvalid": "配置不是有效的 JSON:",
255
+ "jobs.preview": "保存后显示为",
256
+ "jobs.basics": "基本信息",
257
+ "jobs.runDetail": "Run 详情",
258
+ "jobs.closeRun": "关闭 Run 详情",
259
+ "jobs.started": "开始时间",
260
+ "jobs.updated": "更新时间",
261
+ "jobs.duration": "耗时",
262
+ "jobs.exit": "退出",
263
+ "jobs.failedStep": "失败步骤",
264
+ "jobs.retryOf": "重试自",
265
+ "jobs.steps": "步骤",
266
+ "jobs.overview": "执行概况",
267
+ "jobs.successRate": "成功率",
268
+ "jobs.avgDuration": "平均耗时",
269
+ "jobs.sparkLabel": "最近 {count} 次 Run,{ok} 次成功",
270
+ "jobs.runCount": "共 {count} 次",
271
+ "jobs.showMore": "再显示 {count} 条",
272
+ "jobs.filterRuns": "按状态筛选 Run",
273
+ "jobs.filter.all": "全部",
274
+ "jobs.filter.active": "进行中",
275
+ "jobs.col.status": "状态",
276
+ "jobs.col.run": "Run",
277
+ "jobs.col.started": "开始",
278
+ "jobs.lastAttemptShort": "最近尝试",
279
+ "jobs.lastSuccessShort": "最近成功",
280
+ "jobs.ruleDaily": "每天 {time}",
281
+ "jobs.ruleWeekly": "每周 {days} {time}",
282
+ "jobs.ruleEvery": "每 {period}",
283
+ "jobs.ruleOnce": "一次 · {at}",
284
+ "jobs.ruleAnchor": "起点",
285
+ "jobs.cfg.input": "输入参数",
286
+ "jobs.cfg.workspace": "工作区",
287
+ "jobs.cfg.head": "HEAD",
288
+ "jobs.cfg.owner": "执行归属",
289
+ "jobs.cfg.ownerTask": "本 Task",
290
+ "jobs.cfg.env": "环境变量",
291
+ "jobs.cfg.noEnv": "无",
292
+ "jobs.cfg.goal": "目标",
293
+ "jobs.cfg.target": "执行目标",
294
+ "jobs.cfg.concurrency": "并发",
295
+ "jobs.cfg.agentInput": "Agent 指令",
296
+ "jobs.cfg.other": "其他字段",
297
+ "jobs.cfg.raw": "准确配置",
298
+ "jobs.cfg.noParams": "无参数",
299
+ "jobs.cfg.emptyList": "空列表",
300
+ "jobs.cfg.emptyText": "空",
301
+ "jobs.cfg.fields": "{count} 个字段",
302
+ "jobs.cfg.value": "值",
303
+ "jobs.cfg.timeout": "超时",
304
+ "jobs.cfg.cwd": "目录",
305
+ "jobs.cfg.unnamed": "未命名",
306
+ "jobs.cfg.description": "描述",
307
+ "jobs.cfg.bindings": "Project 绑定",
308
+ "jobs.cfg.task": "Task",
309
+ "jobs.cfg.workItem": "WorkItem",
310
+ "jobs.cfg.role": "角色",
311
+ "jobs.cfg.agent": "Agent",
312
+ "jobs.cfg.ownerRun": "所属 Run",
313
+ "jobs.cfg.attempt": "集成尝试",
314
+ "jobs.action.system.noop": "空操作检查",
315
+ "jobs.action.project.refresh": "Project 刷新",
316
+ "jobs.goal.delivery": "在新 Task 中交付",
317
+ "jobs.goal.task-created": "创建 Task",
318
+ "jobs.goal.work-item": "执行 WorkItem",
319
+ "jobs.target.new": "新 Task",
320
+ "jobs.target.work-item": "已有 WorkItem",
321
+ "jobs.target.operator": "Operator",
322
+ "jobs.target.task": "Task 角色",
323
+ "jobs.target.job": "Job 自有 Agent",
324
+ "jobs.concurrency.serial": "串行",
325
+ "jobs.concurrency.isolated": "隔离",
141
326
  "models.subscriptionAuth": "官方订阅",
142
327
  "models.account": "账号",
143
328
  "models.providerReadOnlyHelp": "由来源服务管理,请在对应服务中修改配置。",
@@ -146,7 +331,7 @@ export const ZH_CN = {
146
331
  "models.window.weekly": "每周",
147
332
  "models.window.monthly": "每月",
148
333
  "manage.nav": "主导航",
149
- "manage.workbench": "工作台",
334
+ "manage.workbench": "任务",
150
335
  "manage.sections": "分区",
151
336
  "manage.collapseSections": "收起分区列表",
152
337
  "manage.showSections": "展开分区列表",
@@ -68,6 +68,7 @@ import { JOBS_SCRIPT } from "./views/jobs.js";
68
68
  import { PERMISSIONS_SCRIPT } from "./views/permissions.js";
69
69
  import { MODELS_VIEW_SCRIPT } from "./views/models.js";
70
70
  import { MODELS_SCRIPT } from "./app/models.js";
71
+ import { JOBS_APP_SCRIPT } from "./app/jobs.js";
71
72
  import { MANAGE_SHELL_SCRIPT } from "./layout/manageShell.js";
72
73
  import { MANAGE_SCRIPT } from "./app/manage.js";
73
74
  import { LOGIN_SCRIPT } from "./app/login.js";
@@ -75,6 +76,7 @@ export { APP_SCRIPT } from "./app/main.js";
75
76
  export const CLIENT_MODULES = Object.freeze({
76
77
  "views/skills": SKILLS_SCRIPT,
77
78
  "views/jobs": JOBS_SCRIPT,
79
+ "app/jobs": JOBS_APP_SCRIPT,
78
80
  "views/permissions": PERMISSIONS_SCRIPT,
79
81
  "views/models": MODELS_VIEW_SCRIPT,
80
82
  "lib/dom": DOM_SCRIPT,