@ cloudhal/ 时间表
Cloudhal网站的预定出版和自动化(RFC-0008 (英语), (中文(简体) ), ADR-0023 (英语):时间模型,RRULE子集,发布被固定到精确的节点版本,自动化和运行状态,花纹和预算核算,以及调度器的 runDue 与它的 D1/SQLite 商店.
这里的一切 工人安全: 任何条目均不只导入节点。 唯一的时间进入点是 temporal-polyfill/implementation (从未是本地或全球的) Temporal永远 Temporal.Now; Biome拒绝其他条目,并进行测试扫描存储器. now 总是注射.
| 条目 | 什麽 |
|---|---|
@cloudhal/schedules | 时间模型 重现 发布模型 自动化/运行状态机器 纹身 预算, TickMeter,则 Scheduler 接口, runDue, (中文(简体) ), createScheduler。除此之外,没有存储依赖性 SqlDriver 类型. |
@cloudhal/schedules/engine | 免费部分:发布模式,运行IDs,即时帮助者, TickMeter, (中文(简体) ), releaseFinishStatements,调度器的类型. @cloudhal/core-ts 通过它应用发布,所以网站Worker从不捆绑时区库. |
@cloudhal/schedules/time | 仅是时间模型; @cloudhal/core-ts/time 重新出口(一项执行). |
@cloudhal/schedules/recurrence | 仅RRULE子集(平面,验证,扩展,预设,句子). |
@cloudhal/schedules/sql | SqlScheduleStore 结束 SqlDriver 用于移徙 0017_schedules。 。 。 . |
@cloudhal/schedules/testing | describeScheduleStoreConformance, (中文(简体) ), describeSchedulerConformance, (中文(简体) ), fakeReleaseExecutor, (中文(简体) ), countingDriver, (中文(简体) ), expectContract* (vitest) (英语). |
时间(第9节)
resolveLocalTime("2026-11-02T09:00", "Europe/Istanbul")→{ at: "2026-11-02T06:00:00.000Z", offset: "+03:00" }。在 DST 空隙内的时间移动到下一个有效时间(adjusted: "dst-gap"); 重复的时间决定了它的第一个瞬间(D2).recomputeExecuteAt(when)——永远不早:用今天的tzdata重新解决了所储存的一时钟时间,而只有瞬间才会在后期移动(sadjusted: "tzdata") (中文(简体) ).isTimeZone, (中文(简体) ),toLocalDateTime, (中文(简体) ),zoneOffset, (中文(简体) ),latenessSeconds, (中文(简体) ),canonicalInstant(存储的形式是Date#toISOString()) (中文(简体) ).
重复(第9.3、D3节)
parseRule, (中文(简体) ), formatRule, (中文(简体) ), validateRecurrence (最少1小时,最多24天), occurrences, (中文(简体) ), nextOccurrence, (中文(简体) ), occurrencesBetween, (中文(简体) ), presetRule编号 :presetOf, (中文(简体) ), presetMinuteOffset. 差距发生点向前移动,而不是被放弃(记录显示偏离RFC 5545§3.3.10);属性测试将扩展器与 rrule-temporal 排除了这种差别.
句子是数据 : describeRecurrence(rec) 返回时 { key, times, days?, weekdays?, monthDays?, n?, count?, until? }· ; renderRecurrence(sentence, "en" | "tr") 让它与 RECURRENCE_MESSAGES ("每月第二个星期二上午9:07" /"Her ayın ikinci salısı"09:07").
释放(第6节)
pinItems, (中文(简体) ),dependencyClosure(与referencedNodeIds作为默认提取器,composeRelease(第1节):nodes(S) = nodes(L) − ids + targets, (中文(简体) ),releaseConflicts页:1,missingDependency, (中文(简体) ),planRelease。 。 。 .RELEASE_TRANSITIONS, (中文(简体) ),HOLDING_STATES, (中文(简体) ),TERMINAL_RELEASE_STATES, (中文(简体) ),releaseWhen(领先时间,地平线),baseApprovalVerdict(D5、D9级),isPastLateLimit财务报告和审定财务报表nextRetryAt(一小时规则和退后),orderReleases财务报告和审定财务报表releaseOverlaps(D15) (英语).
标识符 (表)
rl1 = "rl1:" + hex(SHA-256(utf8(lines.join("\n"))))
lines = ["site <siteId>"] + per item, sorted by node id (code-unit order):
"<set|remove> <nodeId> <nodeKind> <targetRev>:<targetHash>|- <baseRev>:<baseHash>|-"
runId = "run_" + Crockford-base32(first 100 bits of SHA-256(utf8(subjectId + "\n" + occurrenceAt.toISOString())))
时间还没到 rl1: (D4)批准请求 args_hash 覆盖 approvalArgs(releaseId, when). 释放和自动化标识是随机的(rel_编号 :aut_ + 20克罗克福德字符; 租赁符是任意的每个索赔.
自动化(第5.3和11节)
AUTOMATION_TRANSITIONS, (中文(简体) ), RUN_TRANSITIONS, (中文(简体) ), accountRunResult (三次失败暂停,一次违反预算暂停), dueOccurrences (只有最近丢失的事件运行), runWindow, (中文(简体) ), runEndsAt, (中文(简体) ), killSwitchPauses编号 :killSwitchResumes; 纹 (checkRunCall, (中文(简体) ), afterRunCall, (中文(简体) ), forbiddenUntrustedScopes, (中文(简体) ), untrustedEffectiveScopes)预算(checkRunBudget, (中文(简体) ), budgetLeft, (中文(简体) ), withinDailyWriteCap) (中文(简体) ).
排程器(第8节)
import { createScheduler, TICK_BUDGETS, TickMeter } from "@cloudhal/schedules";
import { SqlScheduleStore } from "@cloudhal/schedules/sql";
const scheduler = createScheduler({
openStore: (meter) => new SqlScheduleStore(meter.wrap(d1Driver)),
newMeter: (budget) => new TickMeter(budget),
releases: releaseExecutor({ graph, schedules }), // `@cloudhal/core-ts/releases`
builtins, systemJobs, checkApproval, wake: "minute",
});
await scheduler.runDue(new Date(controller.scheduledTime), TICK_BUDGETS.free, "cron");
在实践中,每打一个电话 runScheduledTick 从 @cloudhal/core-ts/releases,用于构建图表、此商店、执行器和系统工作 TickMeter。 。 。 . runClaimedRelease 跑步结束 一个呼叫者声称自己(一个人的"现在的波兰"), SqlScheduleStore.claimManualRun) (中文(简体) ).
runDue 声称每起事件都带有一个比较和擦拭和新的租赁标志,以后每写在那个标志上时都有警卫,所以同时出现的勾勾产生一种效果(S3)。 按时间顺序(D15),每个地点一次放出一次,最多迟到一个小时(S8),进行回放并收回租约. SqlScheduleStore.releaseFinishStatements(…, guard) 给 publishRelease 声明,结束发布 附加到自己的 守卫批量.
对于API和MCP(推出步骤7-8),商店也有 automationByKey, (中文(简体) ), openAgentRun, (中文(简体) ), readyAgentRun, (中文(简体) ), openManualWindow, (中文(简体) ), recordRunCall, (中文(简体) ), endAgentRunAs, (中文(简体) ), updateAutomation, (中文(简体) ), deleteAutomation, (中文(简体) ), retitleRelease 财务报告和审定财务报表 releaseLateness。调度器 checkApproval 实值 createReleaseApprovalCheck 从 @cloudhal/mcp-server/schedules (由 @cloudhal/api 与 releaseRights) (中文(简体) ).
内建自动化设备(第11.1节,推出步骤9)
createBuiltinRunner(sources) 这是 BuiltinRunner 从事五项工作; @cloudhal/core-ts/automations 执行 BuiltinSources 超过站点图表(graphBuiltinRunner),以及 runScheduledTick 默认使用。 每份工作都是按固定步骤进行的——最多每分一分 BUILTIN_STEP_COST[job] 声明——并保持其立场 automations.cursor,因此一个大站点跨出数个滴答,它们之间的相撞继续同样的跑道. 调查结果(运行时只有JSON,最多200;计数准确)带有稳定代码:
| 任务 | 步骤 | 查找代码 | 计数 |
|---|---|---|---|
broken-links | 50页活页,条目,名词和菜单;后为周行404行(taints: broken_links(中文(简体) ) | broken-internal-link, (中文(简体) ), broken-media-reference, (中文(简体) ), broken-menu-target, (中文(简体) ), link-to-gated-content, (中文(简体) ), not-found-path (带有方向调整) proposal(中文(简体) ) | 每个代码, broken-links, (中文(简体) ), nodes-scanned, (中文(简体) ), links-checked |
stale-content | 200个条目的页面(仅程序字段) | stale-entry (最古老的第一时间) | stale-entries, (中文(简体) ), entries-scanned |
feed-check | /rss.xml,则 /sitemap.xml (图: feed_check(中文(简体) ) | feed-unreachable, (中文(简体) ), feed-invalid, (中文(简体) ), feed-item-incomplete, (中文(简体) ), feed-future-date, (中文(简体) ), feed-missing-entry, (中文(简体) ), feed-gated-node (大门自查), feed-asset-not-live | 每个代码, documents-checked, (中文(简体) ), feed-problems, (中文(简体) ), feed-errors |
weekly-digest | 一个 | digest-published, (中文(简体) ), digest-scheduled, (中文(简体) ), digest-attention, (中文(简体) ), digest-open-findings (各节) | published, (中文(简体) ), scheduled, (中文(简体) ), needs-attention, (中文(简体) ), open-findings |
cleanup | 保留批次直至无保留, 然后提醒 | stale-draft | runs-deleted, (中文(简体) ), releases-deleted, (中文(简体) ), findings-trimmed, (中文(简体) ), leases-cleared, (中文(简体) ), stale-runs-closed, (中文(简体) ), stale-drafts |
每个内置运行也记录 counts.steps 财务报告和审定财务报表 counts.statements (预算使用情况). 读取访问者文本或获取的文档的一步返回 taint;运行运行立即被标记. RunDueDeps.notify (单位:千美元)ScheduleNotifier获得 automation-findings, (中文(简体) ), automation-digest, (中文(简体) ), automation-failed 财务报告和审定财务报表 automation-paused 运行结束后; Studio的通知来源于运行行 @cloudhal/api一个人的"现在跑"是 SqlScheduleStore.startBuiltinNow(单位:千美元) manual 运行此分钟, 接下来的勾选步骤, 之后自动化会返回到它的时间表 。 没有种子自动化:人们在 Studio(D7)中创造出种子.
每个路径的报表(按 TickMeter,工人自由预算40:
| 路径 | 发言 |
|---|---|
| 闲置勾选 | 1 (当心跳到期时,每5分钟) |
| 已公布, 未执行 | 第9条 |
发布, publishRelease 形状( 4 读取 + 8 个报表批次) | 第 18 条 |
出版发行 runScheduledTick 与真实 publishRelease (核心套房,没有资产blobs) | 页:1 |
| 未发行 | 第7条 |
| 回收释放(租赁期满或瞬间出错) | 第13条 |
| 内建步骤(索赔,二项声明,完成) | 第8条 |
| 内置步骤来刺穿跑道( 还要做) | 10个 |
broken-links 勾选( core-ts 套接字: 活节点的一页) | 9-10岁 |
stale-content 勾选 | 8-9 (中文(简体) ) |
feed-check 勾选 | 第9条 |
weekly-digest 勾选 | 第13条 |
cleanup 勾选(保留批次/提醒草案) | 17 第8条 |
| 代理任务发生记录 | 6个 |
| 关闭代理任务窗口 | 第8条 |
| 第一勾选注册系统任务 | 3个 |
| 系统工作运行(加上工作本身) | 6个 |