@alma-harness/历史
将中立历史 刻意输入阿尔玛会议 没有供应商, 媒体获取、历史工具执行或财务写入。 主机转换, 来源授权和实际削减仍然是单独的责任.
运行 migrateHistoryImportStore(pool) 作为迁移本金,给予运行时间
在配置的应用角色中登录成员, 然后构建
new PostgresHistoryImportStore(pool, {statementTimeoutMs: 30000}). 移徙
重新使用现有会话表并添加三个FORCE-RLS元数据表加无效
alma_sessions.history_import_generation。运行时不需要超级用户权限.
使用可信任的 schema 搜索路径和正常的被范围化的池合同 .
const first = await imports.append({
source: {
scope: {org: 'organization', uid: 'user'}, sessionId: 'conversation',
source: 'archive', sourceSessionId: 'old-conversation',
sourceRevision: 'fixed-export-v1', importId: 'migration-1',
},
ordinal: 0, previousChecksum: null, final: false,
entries: [{sourceId: 'message-1', message: {
role: 'user', blocks: [{type: 'text', text: 'Earlier message'}],
meta: {at: '2025-01-01T00:00:00.000Z'},
}}],
});
// Next chunk: same source, ordinal 1, previousChecksum first.checksum.
// Set final only when the entire fixed export has been imported.
read(source) 返回最近不可变的收发/检查点;
receipt(source, ordinal) 读前一个. append 计算其SHA256;精确
即使在内容去除后再播放返回原收发. 改变的来源,
内容、顺序、前身、最终旗帜或再利用源条目ID相冲突。 每个
块有1~100个消息,最多1个米B犬UTF-8 JSON和深度64. 所有输入
必须是平庸的 JSON , 带有成型良好的字符串, 有限的数字和闭合的中性
信件/块/元件形状。 所需时间戳按时间顺序排列。 工具必须
在一个块内完成匹配交换;拒绝内置介质。 旋转
跨度不能超过导入历史或切换工具。 布尔
输入元数据中的边框旗可以验证交叉切口而不装入旧的
内容。 拒绝 Sparse/ extra 数组属性和内置数据 URI 。 角色和订货内容都活下来了.
最初必须排除目标。 停下来 全部 写作和维护 改写历史(包括工具流量过期),使消费者远离,直至 最终收据存在。 Live supports between 块块冲突在计数器上。 这个 导入生成 防止被擦除并重新创建的会话冒用 老目标 没有在线双写或与已存在的活历史合并. 旧读取器与已失效的添加剂列相兼容; 旧迁移 重放不会删除它 。 在导入作者前运行匹配的新迁移 .
收据、描述和输入绘图只储存源识别器、散列、, 序列/时间戳元数据和生成。 内容有一份,现有 会话条目。 App 元数据权限为 SELECT/ INSERT; 没有删除/覆盖 API 存在 。 会话擦除可以保存收据, 永远不要重现重放的数据, 并堵住失踪或娱乐后的新块。 整体遗产来源 重新授权仍然是主机水印/蒸发边界。 不清理收据 没有明确的未来留存合同:这样做结束于重新发挥保护作用.
承诺块是原子及其消息和顺序; 重放修复丢失的块
承认。 A 类 final 收据证明进口完成,而不是授权
生产激活。 历史成本/期初余额保持不变;从未
制造型号使用或重新安装进口的文字记录内容.
@alma-harness/history/testing 出口 InMemoryHistoryImportStore,合同
与检查/记录/实况附录的帮助者有关。 这不是第二件书信
会话主机或生产迁移后端。 共享验收套件
运行此引用和 PostgreSQL 导入器,读取实际导入行
结束 PostgresSessionStore。这是可执行的消费者;没有普鲁莫场景
加上,因为它不是一个移徙工具,其来源预算几乎已满.
历史成本来源
migrateHistoricalCostStore(pool) 安装单独的不可移动报告分类账.
PostgresHistoricalCostStore 支持相同的范围集合选项; 其测试
引用为 InMemoryHistoricalCostStore也没有写直播费计数器,
结算、审计事件或投影箱。 导入历史从未创建
模式使用。 开口量是历史报告,不是活封顶播种.
await costs.append({
scope: {org: 'organization', uid: 'user'}, key: 'archive-before-cutover',
sessionId: 'conversation', source: 'archive', sourceRevision: 'export-v1',
authorityRevision: 'cutover-v1',
from: '2025-01-01T00:00:00.000Z', until: '2025-02-01T00:00:00.000Z',
representation: 'opening', costUsd: 12.5,
});
替代使用 representation: 'itemized' 财务报告和审定财务报表 entries 联 合 国
{sourceId, at, costUsd, model?} (1-1000),无上层金额. 行排序
即时/源ID在散发和相声之前. 美元是有限和非负数的;模式
只是一个不透明的历史标签。 快照是关闭平原JSON,最大一米B.
精确的正态重放保留了原始收件/时间. 更改了关键内容,
任何来源/代表之间重叠的会话间隔和重复的来源
同一范围/来源/修订冲突的身份证。 间距为半开;相邻
间隔有效。 分离边界出口或使用一个开口
以一个不可分割的大间隔来计算和保存外部档案.
get(scope,key) 包括完整的快照. list(scope,{sessionId?,afterKey?,limit?})
返回 ASCII- key 元数据页(max100),不包含项目数组. summary(scope,sessionId)
返回历史美元和覆盖范围/代表数,不计算时间.
浮动总额遵循现有的成本惯例。 App 角色无法更新/删除
收据或源头映射;内容去除保证保存这些财务记录.
主机必须发布一个版本化的权威 显示地图的遗留会话/来源 身份证发给他们的目标,不包括土著居住区所有的费用. Dashboard 总和可能将不相干的历史总和添加到原生项目中一次 成本; root/batch包容性预测不是额外收费。 活盖 连续性需要一个明确的主机基线:这个分类账从来不会默默地播下它. 东道方拥有出口授权、身份测绘和切换;收据赠款 没有权限运行真正的导入或激活产品.