@xdxer/dingtalk-agent 0.1.4-beta.8 → 0.1.4-beta.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.
- package/CHANGELOG.md +35 -0
- package/README.en.md +395 -0
- package/README.md +466 -35
- package/dist/bin/dingtalk-agent.js +1058 -10
- package/dist/bin/dingtalk-agent.js.map +1 -1
- package/dist/src/actions.js +98 -14
- package/dist/src/actions.js.map +1 -1
- package/dist/src/agent-audit.js +460 -0
- package/dist/src/agent-audit.js.map +1 -0
- package/dist/src/agent-bindings.js +132 -0
- package/dist/src/agent-bindings.js.map +1 -0
- package/dist/src/agent-definition.js +182 -0
- package/dist/src/agent-definition.js.map +1 -0
- package/dist/src/agent-enhance.js +678 -0
- package/dist/src/agent-enhance.js.map +1 -0
- package/dist/src/bootstrap.js +125 -17
- package/dist/src/bootstrap.js.map +1 -1
- package/dist/src/development-workspace.js +729 -0
- package/dist/src/development-workspace.js.map +1 -0
- package/dist/src/dws.js +145 -0
- package/dist/src/dws.js.map +1 -1
- package/dist/src/eval-evidence.js +193 -0
- package/dist/src/eval-evidence.js.map +1 -0
- package/dist/src/invocation.js +36 -0
- package/dist/src/invocation.js.map +1 -0
- package/dist/src/lab.js +679 -0
- package/dist/src/lab.js.map +1 -0
- package/dist/src/lease.js +100 -0
- package/dist/src/lease.js.map +1 -0
- package/dist/src/memory/candidates.js +451 -0
- package/dist/src/memory/candidates.js.map +1 -0
- package/dist/src/memory/completion-evidence.js +536 -0
- package/dist/src/memory/completion-evidence.js.map +1 -0
- package/dist/src/memory/operational.js +263 -0
- package/dist/src/memory/operational.js.map +1 -0
- package/dist/src/memory/remote-state.js +478 -0
- package/dist/src/memory/remote-state.js.map +1 -0
- package/dist/src/memory/task-checkpoints.js +204 -0
- package/dist/src/memory/task-checkpoints.js.map +1 -0
- package/dist/src/multica-deploy.js +1480 -0
- package/dist/src/multica-deploy.js.map +1 -0
- package/dist/src/multica-provider.js +685 -0
- package/dist/src/multica-provider.js.map +1 -0
- package/dist/src/opencode-evals.js +1062 -0
- package/dist/src/opencode-evals.js.map +1 -0
- package/dist/src/opencode-provider.js +531 -0
- package/dist/src/opencode-provider.js.map +1 -0
- package/dist/src/opencode-workspace.js +197 -0
- package/dist/src/opencode-workspace.js.map +1 -0
- package/dist/src/perception.js +225 -0
- package/dist/src/perception.js.map +1 -0
- package/dist/src/personal-event-evals.js +595 -0
- package/dist/src/personal-event-evals.js.map +1 -0
- package/dist/src/promotion.js +786 -0
- package/dist/src/promotion.js.map +1 -0
- package/dist/src/remote-semantic-state-live-evals.js +888 -0
- package/dist/src/remote-semantic-state-live-evals.js.map +1 -0
- package/dist/src/remote-semantic-state-worker.js +38 -0
- package/dist/src/remote-semantic-state-worker.js.map +1 -0
- package/dist/src/remote-state-evals.js +501 -0
- package/dist/src/remote-state-evals.js.map +1 -0
- package/dist/src/response-gate.js +51 -0
- package/dist/src/response-gate.js.map +1 -0
- package/dist/src/robot-evals.js +770 -0
- package/dist/src/robot-evals.js.map +1 -0
- package/dist/src/sessions.js +66 -105
- package/dist/src/sessions.js.map +1 -1
- package/dist/src/skill-manager.js +25 -16
- package/dist/src/skill-manager.js.map +1 -1
- package/dist/src/skills.js.map +1 -1
- package/dist/src/storage-evals.js +26 -0
- package/dist/src/storage-evals.js.map +1 -0
- package/dist/src/types.js.map +1 -1
- package/dist/src/waits.js +5 -1
- package/dist/src/waits.js.map +1 -1
- package/dist/src/workspace.js +28 -3
- package/dist/src/workspace.js.map +1 -1
- package/docs/INSTALLATION.md +47 -0
- package/docs/SECOND-AGENT-ACCEPTANCE.md +62 -0
- package/docs/architecture/agent-memory-topology.png +0 -0
- package/docs/architecture/agent-memory-topology.svg +132 -0
- package/docs/architecture/general-agent-kernel-topology.png +0 -0
- package/docs/architecture/general-agent-kernel-topology.svg +149 -0
- package/docs/architecture/provider-bound-development-workspace.png +0 -0
- package/docs/architecture/provider-bound-development-workspace.svg +141 -0
- package/docs/architecture/task-completion-gate.png +0 -0
- package/docs/architecture/task-completion-gate.svg +191 -0
- package/docs/schemas/agent-audit-load-evidence.schema.json +14 -0
- package/docs/schemas/agent-audit.schema.json +92 -0
- package/docs/schemas/agent-bindings.schema.json +54 -0
- package/docs/schemas/agent-definition.schema.json +78 -0
- package/docs/schemas/agent-enhancement-plan.schema.json +88 -0
- package/docs/schemas/agent-enhancement-receipt.schema.json +37 -0
- package/docs/schemas/enriched-invocation.schema.json +46 -0
- package/docs/schemas/eval-candidate-plan.schema.json +28 -0
- package/docs/schemas/eval-candidate-result.schema.json +20 -0
- package/docs/schemas/eval-candidate.schema.json +30 -0
- package/docs/schemas/invocation.schema.json +19 -0
- package/docs/schemas/memory-candidate-proposal.schema.json +18 -0
- package/docs/schemas/memory-candidate.schema.json +76 -0
- package/docs/schemas/memory-publish-target.schema.json +25 -0
- package/docs/schemas/multica-deployment-list.schema.json +29 -0
- package/docs/schemas/multica-deployment-operation.schema.json +51 -0
- package/docs/schemas/multica-deployment-plan.schema.json +70 -0
- package/docs/schemas/multica-deployment-receipt.schema.json +87 -0
- package/docs/schemas/multica-deployment-status.schema.json +23 -0
- package/docs/schemas/multica-workspace-inspection.schema.json +77 -0
- package/docs/schemas/multica-workspace-plan.schema.json +68 -0
- package/docs/schemas/multica-workspace-resource-list.schema.json +27 -0
- package/docs/schemas/multica-workspace-status.schema.json +34 -0
- package/docs/schemas/observation.schema.json +21 -0
- package/docs/schemas/operational-memory-provider.schema.json +36 -0
- package/docs/schemas/operational-memory-record.schema.json +24 -0
- package/docs/schemas/perception-input.schema.json +56 -0
- package/docs/schemas/project.schema.json +112 -0
- package/docs/schemas/promotion-list.schema.json +36 -0
- package/docs/schemas/promotion-plan.schema.json +60 -0
- package/docs/schemas/promotion-policy.schema.json +29 -0
- package/docs/schemas/promotion-receipt.schema.json +43 -0
- package/docs/schemas/promotion-status.schema.json +23 -0
- package/docs/schemas/release-readiness.schema.json +65 -0
- package/docs/schemas/remote-semantic-state-live-eval.schema.json +60 -0
- package/docs/schemas/remote-semantic-state-manifest.schema.json +79 -0
- package/docs/schemas/remote-semantic-state-provider.schema.json +98 -0
- package/docs/schemas/response-gate.schema.json +20 -0
- package/docs/schemas/task-checkpoint.schema.json +71 -0
- package/docs/schemas/task-completion-evidence.schema.json +154 -0
- package/docs/schemas/workspace-doctor.schema.json +56 -0
- package/docs/schemas/workspace-state.schema.json +39 -0
- package/evals/baselines/2026-07-16/opencode-basic-010-completion-summary.json +123 -0
- package/evals/baselines/2026-07-16/opencode-basic-skill-required-summary.json +69 -0
- package/evals/baselines/2026-07-16/opencode-multi-surface-summary.json +63 -0
- package/evals/baselines/2026-07-16/remote-state-live-summary.json +70 -0
- package/evals/baselines/2026-07-17/agent-enhance-opencode-dogfood-summary.json +98 -0
- package/evals/baselines/2026-07-17/personal-event-live-readiness-summary.json +68 -0
- package/examples/agents/fde-coach/AGENTS.md +26 -0
- package/examples/agents/fde-coach/MEMORY.md +3 -0
- package/examples/agents/fde-coach/fields/default/field.json +24 -0
- package/examples/agents/fde-coach/knowledge/INDEX.md +4 -0
- package/examples/agents/fde-coach/skills/fde-coach/SKILL.md +13 -0
- package/examples/agents/release-manager/AGENTS.md +26 -0
- package/examples/agents/release-manager/MEMORY.md +3 -0
- package/examples/agents/release-manager/fields/default/field.json +24 -0
- package/examples/agents/release-manager/knowledge/INDEX.md +4 -0
- package/examples/agents/release-manager/skills/release-manager/SKILL.md +13 -0
- package/lab/README.md +109 -0
- package/lab/agent-eval/catalog.json +91 -0
- package/lab/agent-eval/classic-failures.json +177 -0
- package/lab/agent-eval/completion-gate-regression.json +99 -0
- package/lab/agent-eval/personal-event-live.example.json +94 -0
- package/lab/agent-eval/remote-semantic-state-live.example.json +70 -0
- package/lab/agent-eval/remote-semantic-state-provider.fixture.json +47 -0
- package/lab/agent-eval/remote-state-workspace/AGENTS.md +8 -0
- package/lab/agent-eval/remote-state-workspace/opencode.json +7 -0
- package/lab/agent-eval/remote-state-workspace/skills/remote-state-operator/SKILL.md +13 -0
- package/lab/agent-eval/remote-state.example.json +31 -0
- package/lab/agent-eval/workspace/AGENTS.md +7 -0
- package/lab/agent-eval/workspace/MEMORY.md +4 -0
- package/lab/agent-eval/workspace/artifacts/pending-review.md +3 -0
- package/lab/agent-eval/workspace/knowledge/INDEX.md +4 -0
- package/lab/agent-eval/workspace/opencode.json +20 -0
- package/lab/manifest.example.json +27 -0
- package/lab/manifest.personal-event.example.json +27 -0
- package/lab/project-workspace/README.md +11 -0
- package/lab/project-workspace/fake-multica-provider.mjs +266 -0
- package/lab/project-workspace/multica-deploy.fixture.json +29 -0
- package/lab/project-workspace/multica-readonly.fixture.json +69 -0
- package/lab/project-workspace/observation.fixture.json +14 -0
- package/lab/project-workspace/opencode-provider-suite.json +65 -0
- package/lab/project-workspace/project.fixture.json +44 -0
- package/lab/project-workspace/promotion-policy.fixture.json +15 -0
- package/lab/robot-eval/pool.example.json +30 -0
- package/lab/robot-eval/suite.json +123 -0
- package/lab/robot-eval/workspace/AGENTS.md +21 -0
- package/lab/robot-eval/workspace/MEMORY.md +3 -0
- package/lab/robot-eval/workspace/knowledge/INDEX.md +5 -0
- package/lab/robot-eval/workspace/opencode.json +22 -0
- package/lab/schemas/agent-eval-catalog.schema.json +47 -0
- package/lab/schemas/lab-manifest.schema.json +70 -0
- package/lab/schemas/personal-event-eval.schema.json +91 -0
- package/lab/schemas/remote-state-eval.schema.json +66 -0
- package/lab/schemas/robot-eval-suite.schema.json +184 -0
- package/lab/schemas/robot-pool.schema.json +56 -0
- package/package.json +21 -3
- package/skills/dingtalk-agent-boot-multica/SKILL.md +40 -0
- package/skills/dingtalk-agent-compose/SKILL.md +110 -0
- package/skills/dingtalk-agent-compose/assets/AGENTS.template.md +26 -0
- package/skills/dingtalk-agent-compose/assets/agent.bindings.dingtalk-doc.template.json +13 -0
- package/skills/dingtalk-agent-compose/assets/agent.bindings.local.template.json +13 -0
- package/skills/dingtalk-agent-compose/assets/opencode.template.json +12 -0
- package/skills/dingtalk-agent-compose/assets/role-skill.template.md +24 -0
- package/skills/dingtalk-agent-compose/evals/evals.json +94 -0
- package/skills/dingtalk-agent-compose/references/agent-definition-contract.md +55 -0
- package/skills/dingtalk-agent-compose/references/opencode-host-contract.md +65 -0
- package/skills/dingtalk-agent-compose/references/storage-routing.md +20 -0
- package/skills/dingtalk-agent-deploy/SKILL.md +60 -0
- package/skills/dingtalk-agent-deploy/references/multica-deployment-contract.md +49 -0
- package/skills/dingtalk-agent-deploy/references/promotion-observation-contract.md +49 -0
- package/skills/dingtalk-agent-eval/SKILL.md +116 -0
- package/skills/dingtalk-agent-eval/assets/eval-catalog.template.json +18 -0
- package/skills/dingtalk-agent-eval/evals/evals.json +61 -0
- package/skills/dingtalk-agent-eval/references/eval-topology.md +34 -0
- package/skills/dingtalk-agent-eval/references/evidence-contract.md +31 -0
- package/skills/dingtalk-agent-eval/references/scenario-taxonomy.md +25 -0
- package/skills/dingtalk-agent-eval/references/storage-modes.md +75 -0
- package/skills/dingtalk-basic-behavior/SKILL.md +63 -3
- package/skills/dingtalk-basic-behavior/assets/memory-candidate-proposal.json +10 -0
- package/skills/dingtalk-basic-behavior/assets/{task-checkpoint.md → task-checkpoint.json} +2 -21
- package/skills/dingtalk-basic-behavior/references/action-contract.md +2 -0
- package/skills/dingtalk-basic-behavior/references/memory-and-evolution.md +15 -1
- package/skills/dingtalk-basic-behavior/references/perception-and-gates.md +28 -0
- package/skills/dingtalk-basic-behavior/references/task-lifecycle.md +32 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-evidence.js","sourceRoot":"","sources":["../../../src/memory/completion-evidence.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync,\n renameSync, writeFileSync,\n} from 'node:fs'\nimport { createHash, randomUUID } from 'node:crypto'\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path'\nimport { digest, stableStringify } from '../events.js'\nimport { acquireLease } from '../lease.js'\nimport type { AgentConfig } from '../types.js'\n\nexport const COMPLETION_EVIDENCE_ID_PATTERN = /^evd_[a-f0-9]{32}$/\nexport const ACTION_RECEIPT_EVIDENCE_TTL_MS = 7 * 24 * 60 * 60 * 1000\n\ntype CompletionEvidenceIssuer =\n | { type: 'run'; id: string }\n | { type: 'host'; id: string }\n\ntype ArtifactReference = {\n type: 'artifact'\n locator: string\n sha256: string\n bytes: number\n}\n\ntype ActionReceiptReference = {\n type: 'action-receipt'\n runId: string\n actionId: string\n action: 'reply'\n receiptHash: string\n completedAt: string\n validUntil: string\n}\n\ntype ConfirmationReference =\n | {\n type: 'confirmation'\n source: 'trusted-event'\n confirmationId: string\n eventId: string\n recordHash: string\n }\n | {\n type: 'confirmation'\n source: 'host-record'\n confirmationId: string\n hostIdentity: string\n recordHash: string\n }\n\nexport interface TaskCompletionEvidence {\n $schema: 'dingtalk-agent/task-completion-evidence@1'\n evidenceId: string\n kind: 'artifact' | 'action-receipt' | 'confirmation'\n taskId: string\n scopeId: string\n sessionId: string\n issuer: CompletionEvidenceIssuer\n condition: { ref: 'doneWhen'; hash: string }\n reference: ArtifactReference | ActionReceiptReference | ConfirmationReference\n observed: { status: 'verified' | 'confirmed'; hash: string }\n issuedAt: string\n}\n\ntype CompletionEvidenceClaimBase = { doneWhen: string }\n\nexport type CompletionEvidenceClaim =\n | CompletionEvidenceClaimBase & {\n kind: 'artifact'\n artifact: { path: string; expectedSha256?: string }\n }\n | CompletionEvidenceClaimBase & {\n kind: 'action-receipt'\n receipt: { runId: string; actionId: string; action: 'ack' | 'reply' | 'ask' | 'silence' }\n }\n | CompletionEvidenceClaimBase & {\n kind: 'confirmation'\n confirmation:\n | { source: 'trusted-event'; confirmationId: string; eventId: string }\n | { source: 'host-record'; confirmationId: string }\n }\n\nexport interface CompletionEvidenceIssueOptions {\n sessionPath: string\n runPath?: string\n hostIdentity?: string\n now?: string\n}\n\nexport interface CompletionEvidenceResolveOptions {\n now?: string\n}\n\nexport interface CompletionEvidenceIssueResult {\n $schema: 'dingtalk-agent/task-completion-evidence-result@1'\n evidenceId: string\n registryRevision: number\n evidence: TaskCompletionEvidence\n}\n\ninterface CompletionEvidenceRegistry {\n $schema: 'dingtalk-agent/task-completion-evidence-registry@1'\n taskId: string\n scopeId: string\n sessionId: string\n revision: number\n evidence: TaskCompletionEvidence[]\n updatedAt: string\n}\n\ntype EvidenceContext = {\n sessionPath: string\n session: Record<string, any>\n}\n\nconst HASH_PATTERN = /^[a-f0-9]{64}$/\nconst RUN_ID_PATTERN = /^run_[a-f0-9]{20}$/\nconst ACTION_ID_PATTERN = /^act_[a-f0-9]{20}$/\nconst ARTIFACT_CONDITION = /(?:文件|文档|产物|工作区|保存|创建|写入|file|document|artifact|workspace|write|saved|created)/iu\nconst MESSAGE_DELIVERY_CONDITION = /(?:回复|消息|发送|送达|回读|reply|message|send|sent|deliver|readback)/iu\n\n/**\n * Host-only issuance API. It is intentionally not wired to the public CLI: callers must already\n * hold a trusted Session/Run or an explicit host identity.\n */\nexport function issueCompletionEvidence(\n root: string,\n cfg: AgentConfig,\n claim: CompletionEvidenceClaim,\n options: CompletionEvidenceIssueOptions,\n): CompletionEvidenceIssueResult {\n const context = resolveEvidenceContext(root, cfg, options.sessionPath)\n const issuer = resolveIssuer(context, options)\n const issuedAt = parseNow(options.now).toISOString()\n const doneWhen = requireText(claim.doneWhen, 'Completion evidence doneWhen')\n const conditionHash = digest(doneWhen)\n let reference: TaskCompletionEvidence['reference']\n let observed: TaskCompletionEvidence['observed']\n\n if (claim.kind === 'artifact') {\n const artifact = observeArtifact(root, claim.artifact.path)\n const expected = String(claim.artifact.expectedSha256 || '').trim().toLowerCase()\n if (expected && (!HASH_PATTERN.test(expected) || expected !== artifact.sha256)) {\n throw new Error(\n `Completion Artifact hash 不一致:expected=${expected || '-'}, actual=${artifact.sha256}`,\n )\n }\n reference = {\n type: 'artifact', locator: artifact.locator,\n sha256: artifact.sha256, bytes: artifact.bytes,\n }\n observed = { status: 'verified', hash: artifact.sha256 }\n } else if (claim.kind === 'action-receipt') {\n assertReceiptCondition(doneWhen, claim.receipt.action)\n const receipt = observeActionReceipt(\n root, cfg, context, claim.receipt.runId, claim.receipt.actionId,\n claim.receipt.action, new Date(issuedAt),\n )\n reference = receipt.reference\n observed = { status: 'verified', hash: receipt.hash }\n } else {\n const confirmation = observeConfirmation(\n root, cfg, context, issuer, conditionHash, claim.confirmation,\n )\n reference = confirmation.reference\n observed = { status: 'confirmed', hash: confirmation.hash }\n }\n\n const evidence: TaskCompletionEvidence = {\n $schema: 'dingtalk-agent/task-completion-evidence@1',\n evidenceId: `evd_${randomUUID().replaceAll('-', '')}`,\n kind: claim.kind,\n taskId: context.session.id,\n scopeId: context.session.contextId,\n sessionId: context.session.id,\n issuer,\n condition: { ref: 'doneWhen', hash: conditionHash },\n reference,\n observed,\n issuedAt,\n }\n validateCompletionEvidence(evidence)\n verifyEvidenceSource(root, cfg, context, evidence, new Date(issuedAt))\n\n const registryPath = completionEvidenceRegistryPath(root, cfg, context.session)\n const release = acquireLease(`${registryPath}.lock`,\n `Task ${context.session.id} completion evidence 正在签发`, {\n waitMs: 3_000, staleAfterMs: 2 * 60_000,\n })\n try {\n const current = readRegistry(registryPath, context, true)\n if (current.evidence.some((item) => item.evidenceId === evidence.evidenceId)) {\n throw new Error(`Completion evidenceId 碰撞: ${evidence.evidenceId}`)\n }\n const next: CompletionEvidenceRegistry = {\n ...current,\n revision: current.revision + 1,\n evidence: [...current.evidence, evidence],\n updatedAt: issuedAt,\n }\n writeJsonAtomic(registryPath, next)\n const readback = readRegistry(registryPath, context, false)\n if (stableStringify(readback) !== stableStringify(next)) {\n throw new Error('Completion evidence registry 原子写后回读不一致')\n }\n return {\n $schema: 'dingtalk-agent/task-completion-evidence-result@1',\n evidenceId: evidence.evidenceId,\n registryRevision: readback.revision,\n evidence: clone(evidence),\n }\n } finally {\n release()\n }\n}\n\n/** Resolve every opaque ID from trusted host state and re-verify its source before completion. */\nexport function resolveCompletionEvidence(\n root: string,\n cfg: AgentConfig,\n sessionPath: string,\n doneWhen: string,\n evidenceIds: string[],\n options: CompletionEvidenceResolveOptions = {},\n): TaskCompletionEvidence[] {\n const context = resolveEvidenceContext(root, cfg, sessionPath)\n const conditionHash = digest(requireText(doneWhen, 'Task doneWhen'))\n if (!Array.isArray(evidenceIds) || !evidenceIds.length) {\n throw new Error('Task completed 状态必须引用宿主签发的 completion evidenceId')\n }\n if (new Set(evidenceIds).size !== evidenceIds.length) {\n throw new Error('Task completion evidenceId 不能重复')\n }\n for (const evidenceId of evidenceIds) {\n if (!isCompletionEvidenceId(evidenceId)) {\n throw new Error(`Task evidence 只能引用宿主签发的 evidenceId: ${evidenceId || '-'}`)\n }\n }\n const registryPath = completionEvidenceRegistryPath(root, cfg, context.session)\n if (!existsSync(registryPath)) {\n throw new Error(`当前 Session 没有宿主 completion evidence registry`)\n }\n const registry = readRegistry(registryPath, context, false)\n const byId = new Map(registry.evidence.map((item) => [item.evidenceId, item]))\n const now = parseNow(options.now)\n return evidenceIds.map((evidenceId) => {\n const evidence = byId.get(evidenceId)\n if (!evidence) throw new Error(`找不到宿主签发的 completion evidenceId: ${evidenceId}`)\n validateCompletionEvidence(evidence)\n if (evidence.taskId !== context.session.id ||\n evidence.sessionId !== context.session.id ||\n evidence.scopeId !== context.session.contextId) {\n throw new Error(`Completion evidence ${evidenceId} 与当前 Session/Task 作用域不一致`)\n }\n if (evidence.condition.ref !== 'doneWhen' || evidence.condition.hash !== conditionHash) {\n throw new Error(`Completion evidence ${evidenceId} 与当前 doneWhen 不一致`)\n }\n verifyEvidenceSource(root, cfg, context, evidence, now)\n return clone(evidence)\n })\n}\n\nexport function isCompletionEvidenceId(value: string): boolean {\n return COMPLETION_EVIDENCE_ID_PATTERN.test(String(value || ''))\n}\n\nfunction verifyEvidenceSource(\n root: string,\n cfg: AgentConfig,\n context: EvidenceContext,\n evidence: TaskCompletionEvidence,\n now: Date,\n): void {\n if (evidence.issuer.type === 'run') {\n const index = findRunIndex(root, cfg, evidence.issuer.id)\n assertIndexScope(index, context, `签发 Run ${evidence.issuer.id}`)\n }\n if (evidence.kind === 'artifact') {\n if (evidence.reference.type !== 'artifact') throw new Error('Artifact evidence reference 非法')\n const actual = observeArtifact(root, evidence.reference.locator)\n if (actual.sha256 !== evidence.reference.sha256 ||\n actual.sha256 !== evidence.observed.hash ||\n actual.bytes !== evidence.reference.bytes) {\n throw new Error(`Completion Artifact ${evidence.reference.locator} 内容/hash 已漂移`)\n }\n if (evidence.observed.status !== 'verified') {\n throw new Error(`Completion Artifact ${evidence.evidenceId} 尚未 verified`)\n }\n return\n }\n if (evidence.kind === 'action-receipt') {\n if (evidence.reference.type !== 'action-receipt') {\n throw new Error('Action Receipt evidence reference 非法')\n }\n assertReceiptConditionHash(evidence)\n const receipt = observeActionReceipt(\n root, cfg, context, evidence.reference.runId, evidence.reference.actionId,\n evidence.reference.action, now,\n )\n if (receipt.hash !== evidence.reference.receiptHash ||\n receipt.hash !== evidence.observed.hash ||\n receipt.reference.completedAt !== evidence.reference.completedAt ||\n receipt.reference.validUntil !== evidence.reference.validUntil) {\n throw new Error(`Action Receipt ${evidence.reference.actionId} 内容/hash 已漂移`)\n }\n if (evidence.observed.status !== 'verified') {\n throw new Error(`Action Receipt ${evidence.reference.actionId} 尚未 verified`)\n }\n return\n }\n if (evidence.reference.type !== 'confirmation') {\n throw new Error('Confirmation evidence reference 非法')\n }\n const observed = reobserveConfirmation(root, cfg, context, evidence)\n if (observed !== evidence.reference.recordHash || observed !== evidence.observed.hash ||\n evidence.observed.status !== 'confirmed') {\n throw new Error(`Confirmation ${evidence.reference.confirmationId} 未确认或记录已漂移`)\n }\n}\n\nfunction observeArtifact(root: string, input: string): {\n locator: string; sha256: string; bytes: number\n} {\n const locator = requireText(input, 'Completion Artifact locator')\n if (isAbsolute(locator) || locator.split(/[\\\\/]/).includes('..')) {\n throw new Error(`Completion Artifact 必须是 Workspace 内相对路径: ${locator}`)\n }\n const workspace = realpathSync(resolve(root))\n const candidate = resolve(workspace, locator)\n assertInside(workspace, candidate, 'Completion Artifact')\n if (!existsSync(candidate)) throw new Error(`Completion Artifact 不存在: ${locator}`)\n const stat = lstatSync(candidate)\n if (stat.isSymbolicLink()) throw new Error(`Completion Artifact 不接受符号链接: ${locator}`)\n if (!stat.isFile()) throw new Error(`Completion Artifact 必须是文件: ${locator}`)\n const actual = realpathSync(candidate)\n assertInside(workspace, actual, 'Completion Artifact')\n const body = readFileSync(actual)\n return {\n locator: relative(workspace, actual).split('\\\\').join('/'),\n sha256: createHash('sha256').update(body).digest('hex'),\n bytes: body.byteLength,\n }\n}\n\nfunction observeActionReceipt(\n root: string,\n cfg: AgentConfig,\n context: EvidenceContext,\n runId: string,\n actionId: string,\n action: 'ack' | 'reply' | 'ask' | 'silence',\n now: Date,\n): { reference: ActionReceiptReference; hash: string } {\n if (!RUN_ID_PATTERN.test(runId) || !ACTION_ID_PATTERN.test(actionId)) {\n throw new Error(`Action Receipt reference 非法: run=${runId || '-'}, action=${actionId || '-'}`)\n }\n if (action !== 'reply') {\n throw new Error(`Action Receipt ${action} 不能作为 completed 证据`)\n }\n const index = findRunIndex(root, cfg, runId)\n assertIndexScope(index, context, `Action Receipt Run ${runId}`)\n const indexRoot = resolve(root, cfg.runtime?.eventIndexRoot || '.dingtalk-agent/event-index')\n const path = join(indexRoot, 'actions', runId, actionId, 'receipt.json')\n if (!existsSync(path)) throw new Error(`找不到 Action Receipt: ${actionId}`)\n const receipt = readJson(path)\n if (receipt.$schema !== 'dingtalk-agent/action-receipt@1' ||\n receipt.actionId !== actionId || receipt.runId !== runId || receipt.kind !== action) {\n throw new Error(`Action Receipt ${actionId} 身份或动作类型不一致`)\n }\n if (receipt.verified !== true || receipt.outcome !== 'confirmed' ||\n !String(receipt.verification || '').trim() ||\n receipt.verification === 'local-no-side-effect') {\n throw new Error(`Action Receipt ${actionId} 未 verified/confirmed`)\n }\n const completedAt = parseTimestamp(receipt.completedAt, `Action Receipt ${actionId} completedAt`)\n const validUntil = new Date(completedAt.getTime() + ACTION_RECEIPT_EVIDENCE_TTL_MS)\n if (now.getTime() > validUntil.getTime()) {\n throw new Error(`Action Receipt ${actionId} 已过期`)\n }\n const hash = digest(stableStringify(receipt))\n return {\n reference: {\n type: 'action-receipt', runId, actionId, action,\n receiptHash: hash,\n completedAt: completedAt.toISOString(),\n validUntil: validUntil.toISOString(),\n },\n hash,\n }\n}\n\nfunction observeConfirmation(\n root: string,\n cfg: AgentConfig,\n context: EvidenceContext,\n issuer: CompletionEvidenceIssuer,\n conditionHash: string,\n confirmation: Extract<CompletionEvidenceClaim, { kind: 'confirmation' }>['confirmation'],\n): { reference: ConfirmationReference; hash: string } {\n const confirmationId = requireText(confirmation.confirmationId, 'Confirmation ID')\n if (confirmation.source === 'trusted-event') {\n const eventId = requireText(confirmation.eventId, 'Confirmation eventId')\n const index = readEventIndex(root, cfg, eventId)\n assertIndexScope(index, context, `Confirmation event ${eventId}`)\n const hash = trustedEventConfirmationHash(index, confirmationId)\n return {\n reference: {\n type: 'confirmation', source: 'trusted-event', confirmationId,\n eventId, recordHash: hash,\n },\n hash,\n }\n }\n if (issuer.type !== 'host') {\n throw new Error('Host confirmation 必须由显式 host identity 签发')\n }\n const hash = hostConfirmationHash(\n confirmationId, issuer.id, context.session.id, context.session.contextId, conditionHash,\n )\n return {\n reference: {\n type: 'confirmation', source: 'host-record', confirmationId,\n hostIdentity: issuer.id, recordHash: hash,\n },\n hash,\n }\n}\n\nfunction reobserveConfirmation(\n root: string,\n cfg: AgentConfig,\n context: EvidenceContext,\n evidence: TaskCompletionEvidence,\n): string {\n if (evidence.reference.type !== 'confirmation') throw new Error('Confirmation reference 非法')\n if (evidence.reference.source === 'trusted-event') {\n const index = readEventIndex(root, cfg, evidence.reference.eventId)\n assertIndexScope(index, context, `Confirmation event ${evidence.reference.eventId}`)\n return trustedEventConfirmationHash(index, evidence.reference.confirmationId)\n }\n if (evidence.issuer.type !== 'host' || evidence.issuer.id !== evidence.reference.hostIdentity) {\n throw new Error('Host confirmation issuer 身份不一致')\n }\n return hostConfirmationHash(\n evidence.reference.confirmationId, evidence.reference.hostIdentity,\n evidence.sessionId, evidence.scopeId, evidence.condition.hash,\n )\n}\n\nfunction trustedEventConfirmationHash(index: Record<string, any>, confirmationId: string): string {\n return digest(stableStringify({\n confirmationId,\n eventId: index.eventId,\n eventHash: index.eventHash,\n sessionId: index.sessionId,\n contextId: index.contextId,\n runId: index.runId,\n }))\n}\n\nfunction hostConfirmationHash(\n confirmationId: string,\n hostIdentity: string,\n sessionId: string,\n scopeId: string,\n conditionHash: string,\n): string {\n return digest(stableStringify({\n confirmationId, hostIdentity, sessionId, scopeId, conditionHash,\n }))\n}\n\nfunction assertReceiptCondition(doneWhen: string, action: string): void {\n if (action !== 'reply') {\n throw new Error(`Action Receipt ${action} 不能作为 completed 证据`)\n }\n if (ARTIFACT_CONDITION.test(doneWhen) || !MESSAGE_DELIVERY_CONDITION.test(doneWhen)) {\n throw new Error(\n 'reply 的消息送达 Receipt 只能证明回复动作;不能证明文件、文档或 Artifact 已完成',\n )\n }\n}\n\nfunction assertReceiptConditionHash(evidence: TaskCompletionEvidence): void {\n if (evidence.reference.type !== 'action-receipt' || evidence.reference.action !== 'reply') {\n throw new Error('只有 verified reply Receipt 可作为首批消息动作完成证据')\n }\n}\n\nfunction resolveEvidenceContext(\n root: string,\n cfg: AgentConfig,\n sessionInput: string,\n): EvidenceContext {\n const configuredRoot = realpathSync(resolve(root,\n cfg.runtime.sessionRoot || '.dingtalk-agent/sessions'))\n const input = requireText(sessionInput, 'Completion evidence Session path')\n const sessionPath = realpathSync(resolve(input))\n assertInside(configuredRoot, sessionPath, 'Completion evidence Session')\n const session = readJson(join(sessionPath, 'session.json'))\n if (!session.id || !session.contextId) throw new Error('Completion evidence Session 缺少 id/contextId')\n if (session.id !== String(session.id) || !/^ses_[a-f0-9]{20}$/.test(session.id)) {\n throw new Error(`Completion evidence Session ID 非法: ${session.id || '-'}`)\n }\n return { sessionPath, session }\n}\n\nfunction resolveIssuer(\n context: EvidenceContext,\n options: CompletionEvidenceIssueOptions,\n): CompletionEvidenceIssuer {\n if (options.runPath) {\n const runPath = realpathSync(resolve(options.runPath))\n assertInside(join(context.sessionPath, 'runs'), runPath, 'Completion evidence Run')\n const run = readJson(join(runPath, 'run.json'))\n if (run.sessionId !== context.session.id || run.contextId !== context.session.contextId ||\n !RUN_ID_PATTERN.test(String(run.id || ''))) {\n throw new Error('Completion evidence Run 与 Session 身份不一致')\n }\n return { type: 'run', id: run.id }\n }\n return { type: 'host', id: requireText(options.hostIdentity, 'Completion evidence host identity') }\n}\n\nfunction completionEvidenceRegistryPath(\n root: string,\n cfg: AgentConfig,\n session: Record<string, any>,\n): string {\n const indexRoot = resolve(root, cfg.runtime.eventIndexRoot || '.dingtalk-agent/event-index')\n return join(indexRoot, 'completion-evidence', digest(session.id), 'registry.json')\n}\n\nfunction readRegistry(\n path: string,\n context: EvidenceContext,\n create: boolean,\n): CompletionEvidenceRegistry {\n const empty: CompletionEvidenceRegistry = {\n $schema: 'dingtalk-agent/task-completion-evidence-registry@1',\n taskId: context.session.id,\n scopeId: context.session.contextId,\n sessionId: context.session.id,\n revision: 0,\n evidence: [],\n updatedAt: '',\n }\n if (!existsSync(path)) {\n if (create) return empty\n throw new Error('当前 Session 没有宿主 completion evidence registry')\n }\n const input = readJson(path)\n if (input.$schema !== empty.$schema || input.taskId !== empty.taskId ||\n input.scopeId !== empty.scopeId || input.sessionId !== empty.sessionId ||\n !Number.isInteger(input.revision) || input.revision < 1 ||\n !Array.isArray(input.evidence) || typeof input.updatedAt !== 'string') {\n throw new Error('Completion evidence registry 身份、revision 或结构非法')\n }\n const ids = new Set<string>()\n for (const value of input.evidence) {\n validateCompletionEvidence(value)\n if (value.taskId !== empty.taskId || value.scopeId !== empty.scopeId ||\n value.sessionId !== empty.sessionId) {\n throw new Error(`Completion evidence ${value.evidenceId} 与 registry 作用域不一致`)\n }\n if (ids.has(value.evidenceId)) throw new Error(`Completion evidenceId 重复: ${value.evidenceId}`)\n ids.add(value.evidenceId)\n }\n return clone(input) as CompletionEvidenceRegistry\n}\n\nfunction validateCompletionEvidence(value: unknown): asserts value is TaskCompletionEvidence {\n if (!isRecord(value)) throw new Error('Completion evidence 必须是 JSON object')\n const allowed = new Set([\n '$schema', 'evidenceId', 'kind', 'taskId', 'scopeId', 'sessionId',\n 'issuer', 'condition', 'reference', 'observed', 'issuedAt',\n ])\n assertNoExtra(value, allowed, 'Completion evidence')\n if (value.$schema !== 'dingtalk-agent/task-completion-evidence@1' ||\n !isCompletionEvidenceId(String(value.evidenceId || '')) ||\n !['artifact', 'action-receipt', 'confirmation'].includes(String(value.kind || '')) ||\n !String(value.taskId || '').trim() || !String(value.scopeId || '').trim() ||\n !String(value.sessionId || '').trim()) {\n throw new Error('Completion evidence schema、ID、kind 或作用域非法')\n }\n if (!isRecord(value.issuer)) throw new Error('Completion evidence issuer 非法')\n assertNoExtra(value.issuer, new Set(['type', 'id']), 'Completion evidence issuer')\n if (!['run', 'host'].includes(String(value.issuer.type || '')) ||\n !String(value.issuer.id || '').trim()) throw new Error('Completion evidence issuer 非法')\n if (!isRecord(value.condition)) throw new Error('Completion evidence condition 非法')\n assertNoExtra(value.condition, new Set(['ref', 'hash']), 'Completion evidence condition')\n if (value.condition.ref !== 'doneWhen' || !HASH_PATTERN.test(String(value.condition.hash || ''))) {\n throw new Error('Completion evidence condition hash 非法')\n }\n if (!isRecord(value.observed)) throw new Error('Completion evidence observed 非法')\n assertNoExtra(value.observed, new Set(['status', 'hash']), 'Completion evidence observed')\n if (!['verified', 'confirmed'].includes(String(value.observed.status || '')) ||\n !HASH_PATTERN.test(String(value.observed.hash || ''))) {\n throw new Error('Completion evidence observed status/hash 非法')\n }\n parseTimestamp(value.issuedAt, 'Completion evidence issuedAt')\n validateReference(value.kind, value.reference)\n}\n\nfunction validateReference(kind: unknown, reference: unknown): void {\n if (!isRecord(reference)) throw new Error('Completion evidence reference 非法')\n if (kind === 'artifact') {\n assertNoExtra(reference, new Set(['type', 'locator', 'sha256', 'bytes']), 'Artifact reference')\n if (reference.type !== 'artifact' || !String(reference.locator || '').trim() ||\n !HASH_PATTERN.test(String(reference.sha256 || '')) ||\n !Number.isInteger(reference.bytes) || Number(reference.bytes) < 0) {\n throw new Error('Artifact reference 非法')\n }\n return\n }\n if (kind === 'action-receipt') {\n assertNoExtra(reference, new Set([\n 'type', 'runId', 'actionId', 'action', 'receiptHash', 'completedAt', 'validUntil',\n ]), 'Action Receipt reference')\n if (reference.type !== 'action-receipt' || !RUN_ID_PATTERN.test(String(reference.runId || '')) ||\n !ACTION_ID_PATTERN.test(String(reference.actionId || '')) || reference.action !== 'reply' ||\n !HASH_PATTERN.test(String(reference.receiptHash || ''))) {\n throw new Error('Action Receipt reference 非法')\n }\n parseTimestamp(reference.completedAt, 'Action Receipt reference completedAt')\n parseTimestamp(reference.validUntil, 'Action Receipt reference validUntil')\n return\n }\n assertNoExtra(reference, new Set([\n 'type', 'source', 'confirmationId', 'eventId', 'hostIdentity', 'recordHash',\n ]), 'Confirmation reference')\n if (reference.type !== 'confirmation' ||\n !['trusted-event', 'host-record'].includes(String(reference.source || '')) ||\n !String(reference.confirmationId || '').trim() ||\n !HASH_PATTERN.test(String(reference.recordHash || ''))) {\n throw new Error('Confirmation reference 非法')\n }\n if (reference.source === 'trusted-event' && !String(reference.eventId || '').trim()) {\n throw new Error('Trusted-event confirmation 缺少 eventId')\n }\n if (reference.source === 'host-record' && !String(reference.hostIdentity || '').trim()) {\n throw new Error('Host confirmation 缺少 hostIdentity')\n }\n}\n\nfunction findRunIndex(root: string, cfg: AgentConfig, runId: string): Record<string, any> {\n const indexRoot = resolve(root, cfg.runtime.eventIndexRoot || '.dingtalk-agent/event-index')\n if (!existsSync(indexRoot)) throw new Error(`找不到签发 Run: ${runId}`)\n const matches = readdirSync(indexRoot, { withFileTypes: true })\n .filter((entry) => entry.isFile() && entry.name.endsWith('.json'))\n .map((entry) => readJson(join(indexRoot, entry.name)))\n .filter((index) => index.$schema === 'dingtalk-agent/event-index@1' && index.runId === runId)\n if (matches.length !== 1) throw new Error(`签发 Run ${runId} 的 event index 数量非法: ${matches.length}`)\n validateEventIndex(matches[0], `签发 Run ${runId}`)\n return matches[0]\n}\n\nfunction readEventIndex(root: string, cfg: AgentConfig, eventId: string): Record<string, any> {\n const indexRoot = resolve(root, cfg.runtime.eventIndexRoot || '.dingtalk-agent/event-index')\n const path = join(indexRoot, `${digest(eventId)}.json`)\n if (!existsSync(path)) throw new Error(`找不到可信 Confirmation event: ${eventId}`)\n const index = readJson(path)\n validateEventIndex(index, `Confirmation event ${eventId}`)\n if (index.eventId !== eventId) throw new Error(`Confirmation event ${eventId} 身份不一致`)\n return index\n}\n\nfunction validateEventIndex(index: Record<string, any>, label: string): void {\n if (index.$schema !== 'dingtalk-agent/event-index@1' ||\n index.eventHash !== index.authority?.eventHash ||\n index.runId !== index.control?.id ||\n digest(stableStringify(index.authority)) !== index.authorityHash) {\n throw new Error(`${label} 权威 event index 损坏`)\n }\n}\n\nfunction assertIndexScope(index: Record<string, any>, context: EvidenceContext, label: string): void {\n if (index.sessionId !== context.session.id || index.contextId !== context.session.contextId ||\n realpathSync(resolve(index.sessionPath)) !== context.sessionPath) {\n throw new Error(`${label} 与当前 Session/Task 作用域不一致`)\n }\n}\n\nfunction assertInside(root: string, path: string, label: string): void {\n const rootPath = existsSync(root) ? realpathSync(resolve(root)) : resolve(root)\n const rel = relative(rootPath, resolve(path))\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`${label} 必须位于可信根目录内`)\n }\n}\n\nfunction assertNoExtra(value: Record<string, any>, allowed: Set<string>, label: string): void {\n const extra = Object.keys(value).filter((key) => !allowed.has(key))\n if (extra.length) throw new Error(`${label} 含未知字段: ${extra.join(', ')}`)\n}\n\nfunction parseNow(value?: string): Date {\n return value === undefined ? new Date() : parseTimestamp(value, 'Completion evidence now')\n}\n\nfunction parseTimestamp(value: unknown, label: string): Date {\n const text = String(value || '').trim()\n const time = Date.parse(text)\n if (!text || !Number.isFinite(time)) throw new Error(`${label} 必须是合法时间`)\n return new Date(time)\n}\n\nfunction requireText(value: unknown, label: string): string {\n const text = String(value || '').trim()\n if (!text) throw new Error(`${label} 不能为空`)\n return text\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction readJson(path: string): Record<string, any> {\n return JSON.parse(readFileSync(path, 'utf8'))\n}\n\nfunction writeJsonAtomic(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T\n}\n"]}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { digest, stableStringify } from '../events.js';
|
|
2
|
+
import * as dws from '../dws.js';
|
|
3
|
+
export function upsertOperationalMemory(providerValue, recordValue, options = {}) {
|
|
4
|
+
const provider = validateProvider(providerValue);
|
|
5
|
+
const record = validateRecord(recordValue);
|
|
6
|
+
const profile = clean(provider.profile || process.env.DTA_DWS_PROFILE);
|
|
7
|
+
const expectedUserId = clean(provider.expectedUserId || process.env.DTA_EXPECTED_USER_ID);
|
|
8
|
+
if (!profile || profile.includes(',')) {
|
|
9
|
+
throw new Error('Operational Memory 必须固定单一 DWS profile');
|
|
10
|
+
}
|
|
11
|
+
if (!expectedUserId)
|
|
12
|
+
throw new Error('Operational Memory 必须固定 expectedUserId');
|
|
13
|
+
const recorded = {
|
|
14
|
+
...record,
|
|
15
|
+
recordedAt: new Date().toISOString(),
|
|
16
|
+
};
|
|
17
|
+
const cells = toCells(provider, recorded);
|
|
18
|
+
const base = {
|
|
19
|
+
$schema: 'dingtalk-agent/operational-memory-result@1',
|
|
20
|
+
sideEffect: false,
|
|
21
|
+
verified: false,
|
|
22
|
+
verification: 'dry-run-no-dws-call',
|
|
23
|
+
recordId: '',
|
|
24
|
+
inputHash: digest(stableStringify(recorded)),
|
|
25
|
+
identity: { profile, expectedUserId, actualUserId: '' },
|
|
26
|
+
cells,
|
|
27
|
+
readback: null,
|
|
28
|
+
mismatches: [],
|
|
29
|
+
};
|
|
30
|
+
if (!options.execute)
|
|
31
|
+
return { ...base, mode: 'dry-run' };
|
|
32
|
+
if (!options.yes)
|
|
33
|
+
throw new Error('Operational Memory 真实写入必须显式 --live --yes');
|
|
34
|
+
if (process.env.DTA_RUN) {
|
|
35
|
+
throw new Error('Prepared Run 禁止绕过 Action Gate 直接写 Operational Memory;请由宿主 typed Broker 执行');
|
|
36
|
+
}
|
|
37
|
+
const identityData = dws.getSelf(profile);
|
|
38
|
+
const actualUserId = String(findValue(identityData, ['userId', 'user_id', 'userid']) || '');
|
|
39
|
+
if (!actualUserId)
|
|
40
|
+
throw new Error('dws contact user get-self 没有返回 userId,禁止写业务记忆');
|
|
41
|
+
if (actualUserId !== expectedUserId) {
|
|
42
|
+
throw new Error(`DWS 执行身份不符:expected=${expectedUserId}, actual=${actualUserId}`);
|
|
43
|
+
}
|
|
44
|
+
const filters = {
|
|
45
|
+
operator: 'and',
|
|
46
|
+
operands: [
|
|
47
|
+
{ operator: 'eq', operands: [provider.fields.key, recorded.key] },
|
|
48
|
+
{ operator: 'eq', operands: [provider.fields.scopeId, recorded.scopeId] },
|
|
49
|
+
],
|
|
50
|
+
};
|
|
51
|
+
let matches = dws.queryAiTableRecords({
|
|
52
|
+
baseId: provider.baseId, tableId: provider.tableId, filters, profile,
|
|
53
|
+
});
|
|
54
|
+
if (matches.length > 1) {
|
|
55
|
+
throw new Error(`Operational Memory key/scope 命中 ${matches.length} 条,拒绝猜测或批量覆盖`);
|
|
56
|
+
}
|
|
57
|
+
const existing = matches[0] || null;
|
|
58
|
+
let recordId = clean(existing?.recordId);
|
|
59
|
+
let mode = existing ? 'updated' : 'created';
|
|
60
|
+
let accepted = false;
|
|
61
|
+
if (existing) {
|
|
62
|
+
const write = dws.updateAiTableRecord(provider.baseId, provider.tableId, recordId, cells, profile);
|
|
63
|
+
accepted = write.accepted;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const write = dws.createAiTableRecord(provider.baseId, provider.tableId, cells, profile);
|
|
67
|
+
accepted = write.accepted;
|
|
68
|
+
recordId = write.recordIds[0] || '';
|
|
69
|
+
if (!recordId) {
|
|
70
|
+
matches = dws.queryAiTableRecords({
|
|
71
|
+
baseId: provider.baseId, tableId: provider.tableId, filters, profile,
|
|
72
|
+
});
|
|
73
|
+
if (matches.length === 1)
|
|
74
|
+
recordId = clean(matches[0]?.recordId);
|
|
75
|
+
else if (matches.length > 1) {
|
|
76
|
+
throw new Error('Operational Memory 创建回查命中多条,进入人工 reconcile');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (!recordId) {
|
|
81
|
+
return {
|
|
82
|
+
...base,
|
|
83
|
+
mode: 'uncertain',
|
|
84
|
+
sideEffect: true,
|
|
85
|
+
verification: accepted
|
|
86
|
+
? 'write-accepted-but-no-record-id' : 'write-error-and-key-readback-miss',
|
|
87
|
+
identity: { profile, expectedUserId, actualUserId },
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
const readbackRows = dws.queryAiTableRecords({
|
|
91
|
+
baseId: provider.baseId,
|
|
92
|
+
tableId: provider.tableId,
|
|
93
|
+
recordIds: [recordId],
|
|
94
|
+
profile,
|
|
95
|
+
});
|
|
96
|
+
const readback = readbackRows.length === 1 ? readbackRows[0] : null;
|
|
97
|
+
const mismatches = compareCells(provider, cells, readback?.cells);
|
|
98
|
+
if (!readback || mismatches.length)
|
|
99
|
+
mode = 'uncertain';
|
|
100
|
+
return {
|
|
101
|
+
...base,
|
|
102
|
+
mode,
|
|
103
|
+
sideEffect: true,
|
|
104
|
+
verified: Boolean(readback) && mismatches.length === 0,
|
|
105
|
+
verification: readback && !mismatches.length
|
|
106
|
+
? 'record-id-independent-readback' : 'record-readback-mismatch',
|
|
107
|
+
recordId,
|
|
108
|
+
identity: { profile, expectedUserId, actualUserId },
|
|
109
|
+
readback,
|
|
110
|
+
mismatches,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function validateProvider(value) {
|
|
114
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
115
|
+
throw new Error('Operational Memory provider 必须是 JSON object');
|
|
116
|
+
}
|
|
117
|
+
const input = value;
|
|
118
|
+
const allowed = new Set([
|
|
119
|
+
'$schema', 'provider', 'baseId', 'tableId', 'profile', 'expectedUserId', 'fields',
|
|
120
|
+
]);
|
|
121
|
+
const extra = Object.keys(input).filter((key) => !allowed.has(key));
|
|
122
|
+
if (extra.length)
|
|
123
|
+
throw new Error(`Operational Memory provider 含未知字段: ${extra.join(', ')}`);
|
|
124
|
+
if (input.$schema !== 'dingtalk-agent/operational-memory-provider@1' ||
|
|
125
|
+
input.provider !== 'dingtalk-aitable') {
|
|
126
|
+
throw new Error('Operational Memory provider schema/type 非法');
|
|
127
|
+
}
|
|
128
|
+
for (const key of ['baseId', 'tableId']) {
|
|
129
|
+
if (!clean(input[key]))
|
|
130
|
+
throw new Error(`Operational Memory provider 缺少 ${key}`);
|
|
131
|
+
}
|
|
132
|
+
const fieldNames = [
|
|
133
|
+
'key', 'scopeId', 'kind', 'subjectId', 'summary', 'sourceRefs', 'occurredAt',
|
|
134
|
+
'recordedAt', 'confidence', 'attributes',
|
|
135
|
+
];
|
|
136
|
+
if (!input.fields || fieldNames.some((name) => !clean(input.fields[name]))) {
|
|
137
|
+
throw new Error(`Operational Memory fields 必须包含 ${fieldNames.join(' / ')}`);
|
|
138
|
+
}
|
|
139
|
+
const fieldIds = fieldNames.map((name) => clean(input.fields[name]));
|
|
140
|
+
if (new Set(fieldIds).size !== fieldIds.length) {
|
|
141
|
+
throw new Error('Operational Memory fields 不能复用同一个 fieldId');
|
|
142
|
+
}
|
|
143
|
+
return JSON.parse(JSON.stringify(input));
|
|
144
|
+
}
|
|
145
|
+
function validateRecord(value) {
|
|
146
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
147
|
+
throw new Error('Operational Memory record 必须是 JSON object');
|
|
148
|
+
}
|
|
149
|
+
const input = value;
|
|
150
|
+
const allowed = new Set([
|
|
151
|
+
'$schema', 'key', 'scopeId', 'kind', 'subjectId', 'summary', 'sourceRefs',
|
|
152
|
+
'occurredAt', 'recordedAt', 'confidence', 'attributes',
|
|
153
|
+
]);
|
|
154
|
+
const extra = Object.keys(input).filter((key) => !allowed.has(key));
|
|
155
|
+
if (extra.length)
|
|
156
|
+
throw new Error(`Operational Memory record 含未知字段: ${extra.join(', ')}`);
|
|
157
|
+
if (input.$schema !== 'dingtalk-agent/operational-memory-record@1') {
|
|
158
|
+
throw new Error('Operational Memory record schema 非法');
|
|
159
|
+
}
|
|
160
|
+
for (const key of ['key', 'scopeId', 'subjectId', 'summary']) {
|
|
161
|
+
if (!clean(input[key]))
|
|
162
|
+
throw new Error(`Operational Memory record 缺少 ${key}`);
|
|
163
|
+
}
|
|
164
|
+
if (!['summary', 'interaction', 'task', 'calendar', 'fact'].includes(input.kind)) {
|
|
165
|
+
throw new Error(`Operational Memory kind 非法: ${input.kind || '-'}`);
|
|
166
|
+
}
|
|
167
|
+
if (!Array.isArray(input.sourceRefs) || !input.sourceRefs.length ||
|
|
168
|
+
input.sourceRefs.some((item) => !clean(item))) {
|
|
169
|
+
throw new Error('Operational Memory sourceRefs 必须至少包含一条非空来源');
|
|
170
|
+
}
|
|
171
|
+
if (input.occurredAt !== null && !validTime(input.occurredAt)) {
|
|
172
|
+
throw new Error('Operational Memory occurredAt 必须是 RFC3339 或 null');
|
|
173
|
+
}
|
|
174
|
+
if (typeof input.recordedAt !== 'string') {
|
|
175
|
+
throw new Error('Operational Memory recordedAt 必须是 string(由 CLI 重写)');
|
|
176
|
+
}
|
|
177
|
+
if (typeof input.confidence !== 'number' || input.confidence < 0 || input.confidence > 1) {
|
|
178
|
+
throw new Error('Operational Memory confidence 必须在 0..1');
|
|
179
|
+
}
|
|
180
|
+
if (!input.attributes || typeof input.attributes !== 'object' || Array.isArray(input.attributes)) {
|
|
181
|
+
throw new Error('Operational Memory attributes 必须是 JSON object');
|
|
182
|
+
}
|
|
183
|
+
return JSON.parse(JSON.stringify(input));
|
|
184
|
+
}
|
|
185
|
+
function toCells(provider, record) {
|
|
186
|
+
const fields = provider.fields;
|
|
187
|
+
const cells = {
|
|
188
|
+
[fields.key]: record.key,
|
|
189
|
+
[fields.scopeId]: record.scopeId,
|
|
190
|
+
[fields.kind]: record.kind,
|
|
191
|
+
[fields.subjectId]: record.subjectId,
|
|
192
|
+
[fields.summary]: record.summary,
|
|
193
|
+
[fields.sourceRefs]: stableStringify(record.sourceRefs),
|
|
194
|
+
[fields.recordedAt]: record.recordedAt,
|
|
195
|
+
[fields.confidence]: record.confidence,
|
|
196
|
+
[fields.attributes]: stableStringify(record.attributes),
|
|
197
|
+
};
|
|
198
|
+
if (record.occurredAt)
|
|
199
|
+
cells[fields.occurredAt] = record.occurredAt;
|
|
200
|
+
return cells;
|
|
201
|
+
}
|
|
202
|
+
function compareCells(provider, expected, actualValue) {
|
|
203
|
+
if (!actualValue || typeof actualValue !== 'object' || Array.isArray(actualValue)) {
|
|
204
|
+
return ['cells:missing'];
|
|
205
|
+
}
|
|
206
|
+
const actual = actualValue;
|
|
207
|
+
const mismatches = [];
|
|
208
|
+
for (const [name, fieldId] of Object.entries(provider.fields)) {
|
|
209
|
+
const wanted = expected[fieldId];
|
|
210
|
+
const seen = normalizeCell(actual[fieldId]);
|
|
211
|
+
if (name === 'confidence') {
|
|
212
|
+
if (Number(seen) !== Number(wanted))
|
|
213
|
+
mismatches.push(name);
|
|
214
|
+
}
|
|
215
|
+
else if (name === 'occurredAt' || name === 'recordedAt') {
|
|
216
|
+
if (!sameTimeOrText(seen, wanted))
|
|
217
|
+
mismatches.push(name);
|
|
218
|
+
}
|
|
219
|
+
else if (String(seen ?? '') !== String(wanted ?? ''))
|
|
220
|
+
mismatches.push(name);
|
|
221
|
+
}
|
|
222
|
+
return mismatches;
|
|
223
|
+
}
|
|
224
|
+
function normalizeCell(value) {
|
|
225
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
226
|
+
const item = value;
|
|
227
|
+
return item.name ?? item.text ?? item.value ?? value;
|
|
228
|
+
}
|
|
229
|
+
return value;
|
|
230
|
+
}
|
|
231
|
+
function sameTimeOrText(actual, expected) {
|
|
232
|
+
const left = String(actual ?? '');
|
|
233
|
+
const right = String(expected ?? '');
|
|
234
|
+
if (!left || !right)
|
|
235
|
+
return left === right;
|
|
236
|
+
const leftTime = Date.parse(left);
|
|
237
|
+
const rightTime = Date.parse(right);
|
|
238
|
+
return Number.isFinite(leftTime) && Number.isFinite(rightTime)
|
|
239
|
+
? leftTime === rightTime : left === right;
|
|
240
|
+
}
|
|
241
|
+
function findValue(value, keys) {
|
|
242
|
+
if (!value || typeof value !== 'object')
|
|
243
|
+
return null;
|
|
244
|
+
for (const [key, child] of Object.entries(value)) {
|
|
245
|
+
if (keys.includes(key) && child !== undefined && child !== null && child !== '')
|
|
246
|
+
return child;
|
|
247
|
+
}
|
|
248
|
+
for (const child of Object.values(value)) {
|
|
249
|
+
const found = findValue(child, keys);
|
|
250
|
+
if (found !== null)
|
|
251
|
+
return found;
|
|
252
|
+
}
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
function validTime(value) {
|
|
256
|
+
if (typeof value !== 'string' || !value.trim() || !Number.isFinite(Date.parse(value)))
|
|
257
|
+
return null;
|
|
258
|
+
return new Date(value).toISOString();
|
|
259
|
+
}
|
|
260
|
+
function clean(value) {
|
|
261
|
+
return typeof value === 'string' ? value.trim() : '';
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=operational.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operational.js","sourceRoot":"","sources":["../../../src/memory/operational.ts"],"names":[],"mappings":"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","sourcesContent":["import { digest, stableStringify } from '../events.js'\nimport * as dws from '../dws.js'\n\nexport interface OperationalMemoryRecord {\n $schema: 'dingtalk-agent/operational-memory-record@1'\n key: string\n scopeId: string\n kind: 'summary' | 'interaction' | 'task' | 'calendar' | 'fact'\n subjectId: string\n summary: string\n sourceRefs: string[]\n occurredAt: string | null\n recordedAt: string\n confidence: number\n attributes: Record<string, unknown>\n}\n\nexport interface OperationalMemoryProvider {\n $schema: 'dingtalk-agent/operational-memory-provider@1'\n provider: 'dingtalk-aitable'\n baseId: string\n tableId: string\n profile?: string\n expectedUserId?: string\n fields: {\n key: string\n scopeId: string\n kind: string\n subjectId: string\n summary: string\n sourceRefs: string\n occurredAt: string\n recordedAt: string\n confidence: string\n attributes: string\n }\n}\n\nexport interface OperationalUpsertResult {\n $schema: 'dingtalk-agent/operational-memory-result@1'\n mode: 'dry-run' | 'created' | 'updated' | 'uncertain'\n sideEffect: boolean\n verified: boolean\n verification: string\n recordId: string\n inputHash: string\n identity: { profile: string; expectedUserId: string; actualUserId: string }\n cells: Record<string, unknown>\n readback: unknown\n mismatches: string[]\n}\n\nexport function upsertOperationalMemory(\n providerValue: unknown,\n recordValue: unknown,\n options: { execute?: boolean; yes?: boolean } = {},\n): OperationalUpsertResult {\n const provider = validateProvider(providerValue)\n const record = validateRecord(recordValue)\n const profile = clean(provider.profile || process.env.DTA_DWS_PROFILE)\n const expectedUserId = clean(provider.expectedUserId || process.env.DTA_EXPECTED_USER_ID)\n if (!profile || profile.includes(',')) {\n throw new Error('Operational Memory 必须固定单一 DWS profile')\n }\n if (!expectedUserId) throw new Error('Operational Memory 必须固定 expectedUserId')\n const recorded: OperationalMemoryRecord = {\n ...record,\n recordedAt: new Date().toISOString(),\n }\n const cells = toCells(provider, recorded)\n const base = {\n $schema: 'dingtalk-agent/operational-memory-result@1' as const,\n sideEffect: false,\n verified: false,\n verification: 'dry-run-no-dws-call',\n recordId: '',\n inputHash: digest(stableStringify(recorded)),\n identity: { profile, expectedUserId, actualUserId: '' },\n cells,\n readback: null,\n mismatches: [] as string[],\n }\n if (!options.execute) return { ...base, mode: 'dry-run' }\n if (!options.yes) throw new Error('Operational Memory 真实写入必须显式 --live --yes')\n if (process.env.DTA_RUN) {\n throw new Error(\n 'Prepared Run 禁止绕过 Action Gate 直接写 Operational Memory;请由宿主 typed Broker 执行',\n )\n }\n\n const identityData = dws.getSelf(profile)\n const actualUserId = String(findValue(identityData, ['userId', 'user_id', 'userid']) || '')\n if (!actualUserId) throw new Error('dws contact user get-self 没有返回 userId,禁止写业务记忆')\n if (actualUserId !== expectedUserId) {\n throw new Error(`DWS 执行身份不符:expected=${expectedUserId}, actual=${actualUserId}`)\n }\n\n const filters = {\n operator: 'and',\n operands: [\n { operator: 'eq', operands: [provider.fields.key, recorded.key] },\n { operator: 'eq', operands: [provider.fields.scopeId, recorded.scopeId] },\n ],\n }\n let matches = dws.queryAiTableRecords({\n baseId: provider.baseId, tableId: provider.tableId, filters, profile,\n })\n if (matches.length > 1) {\n throw new Error(\n `Operational Memory key/scope 命中 ${matches.length} 条,拒绝猜测或批量覆盖`,\n )\n }\n const existing = matches[0] || null\n let recordId = clean(existing?.recordId)\n let mode: OperationalUpsertResult['mode'] = existing ? 'updated' : 'created'\n let accepted = false\n if (existing) {\n const write = dws.updateAiTableRecord(\n provider.baseId, provider.tableId, recordId, cells, profile,\n )\n accepted = write.accepted\n } else {\n const write = dws.createAiTableRecord(provider.baseId, provider.tableId, cells, profile)\n accepted = write.accepted\n recordId = write.recordIds[0] || ''\n if (!recordId) {\n matches = dws.queryAiTableRecords({\n baseId: provider.baseId, tableId: provider.tableId, filters, profile,\n })\n if (matches.length === 1) recordId = clean(matches[0]?.recordId)\n else if (matches.length > 1) {\n throw new Error('Operational Memory 创建回查命中多条,进入人工 reconcile')\n }\n }\n }\n if (!recordId) {\n return {\n ...base,\n mode: 'uncertain',\n sideEffect: true,\n verification: accepted\n ? 'write-accepted-but-no-record-id' : 'write-error-and-key-readback-miss',\n identity: { profile, expectedUserId, actualUserId },\n }\n }\n const readbackRows = dws.queryAiTableRecords({\n baseId: provider.baseId,\n tableId: provider.tableId,\n recordIds: [recordId],\n profile,\n })\n const readback = readbackRows.length === 1 ? readbackRows[0] : null\n const mismatches = compareCells(provider, cells, readback?.cells)\n if (!readback || mismatches.length) mode = 'uncertain'\n return {\n ...base,\n mode,\n sideEffect: true,\n verified: Boolean(readback) && mismatches.length === 0,\n verification: readback && !mismatches.length\n ? 'record-id-independent-readback' : 'record-readback-mismatch',\n recordId,\n identity: { profile, expectedUserId, actualUserId },\n readback,\n mismatches,\n }\n}\n\nfunction validateProvider(value: unknown): OperationalMemoryProvider {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Operational Memory provider 必须是 JSON object')\n }\n const input = value as Record<string, any>\n const allowed = new Set([\n '$schema', 'provider', 'baseId', 'tableId', 'profile', 'expectedUserId', 'fields',\n ])\n const extra = Object.keys(input).filter((key) => !allowed.has(key))\n if (extra.length) throw new Error(`Operational Memory provider 含未知字段: ${extra.join(', ')}`)\n if (input.$schema !== 'dingtalk-agent/operational-memory-provider@1' ||\n input.provider !== 'dingtalk-aitable') {\n throw new Error('Operational Memory provider schema/type 非法')\n }\n for (const key of ['baseId', 'tableId']) {\n if (!clean(input[key])) throw new Error(`Operational Memory provider 缺少 ${key}`)\n }\n const fieldNames = [\n 'key', 'scopeId', 'kind', 'subjectId', 'summary', 'sourceRefs', 'occurredAt',\n 'recordedAt', 'confidence', 'attributes',\n ]\n if (!input.fields || fieldNames.some((name) => !clean(input.fields[name]))) {\n throw new Error(`Operational Memory fields 必须包含 ${fieldNames.join(' / ')}`)\n }\n const fieldIds = fieldNames.map((name) => clean(input.fields[name]))\n if (new Set(fieldIds).size !== fieldIds.length) {\n throw new Error('Operational Memory fields 不能复用同一个 fieldId')\n }\n return JSON.parse(JSON.stringify(input)) as OperationalMemoryProvider\n}\n\nfunction validateRecord(value: unknown): OperationalMemoryRecord {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Operational Memory record 必须是 JSON object')\n }\n const input = value as Record<string, any>\n const allowed = new Set([\n '$schema', 'key', 'scopeId', 'kind', 'subjectId', 'summary', 'sourceRefs',\n 'occurredAt', 'recordedAt', 'confidence', 'attributes',\n ])\n const extra = Object.keys(input).filter((key) => !allowed.has(key))\n if (extra.length) throw new Error(`Operational Memory record 含未知字段: ${extra.join(', ')}`)\n if (input.$schema !== 'dingtalk-agent/operational-memory-record@1') {\n throw new Error('Operational Memory record schema 非法')\n }\n for (const key of ['key', 'scopeId', 'subjectId', 'summary']) {\n if (!clean(input[key])) throw new Error(`Operational Memory record 缺少 ${key}`)\n }\n if (!['summary', 'interaction', 'task', 'calendar', 'fact'].includes(input.kind)) {\n throw new Error(`Operational Memory kind 非法: ${input.kind || '-'}`)\n }\n if (!Array.isArray(input.sourceRefs) || !input.sourceRefs.length ||\n input.sourceRefs.some((item: unknown) => !clean(item))) {\n throw new Error('Operational Memory sourceRefs 必须至少包含一条非空来源')\n }\n if (input.occurredAt !== null && !validTime(input.occurredAt)) {\n throw new Error('Operational Memory occurredAt 必须是 RFC3339 或 null')\n }\n if (typeof input.recordedAt !== 'string') {\n throw new Error('Operational Memory recordedAt 必须是 string(由 CLI 重写)')\n }\n if (typeof input.confidence !== 'number' || input.confidence < 0 || input.confidence > 1) {\n throw new Error('Operational Memory confidence 必须在 0..1')\n }\n if (!input.attributes || typeof input.attributes !== 'object' || Array.isArray(input.attributes)) {\n throw new Error('Operational Memory attributes 必须是 JSON object')\n }\n return JSON.parse(JSON.stringify(input)) as OperationalMemoryRecord\n}\n\nfunction toCells(\n provider: OperationalMemoryProvider,\n record: OperationalMemoryRecord,\n): Record<string, unknown> {\n const fields = provider.fields\n const cells: Record<string, unknown> = {\n [fields.key]: record.key,\n [fields.scopeId]: record.scopeId,\n [fields.kind]: record.kind,\n [fields.subjectId]: record.subjectId,\n [fields.summary]: record.summary,\n [fields.sourceRefs]: stableStringify(record.sourceRefs),\n [fields.recordedAt]: record.recordedAt,\n [fields.confidence]: record.confidence,\n [fields.attributes]: stableStringify(record.attributes),\n }\n if (record.occurredAt) cells[fields.occurredAt] = record.occurredAt\n return cells\n}\n\nfunction compareCells(\n provider: OperationalMemoryProvider,\n expected: Record<string, unknown>,\n actualValue: unknown,\n): string[] {\n if (!actualValue || typeof actualValue !== 'object' || Array.isArray(actualValue)) {\n return ['cells:missing']\n }\n const actual = actualValue as Record<string, unknown>\n const mismatches: string[] = []\n for (const [name, fieldId] of Object.entries(provider.fields)) {\n const wanted = expected[fieldId]\n const seen = normalizeCell(actual[fieldId])\n if (name === 'confidence') {\n if (Number(seen) !== Number(wanted)) mismatches.push(name)\n } else if (name === 'occurredAt' || name === 'recordedAt') {\n if (!sameTimeOrText(seen, wanted)) mismatches.push(name)\n } else if (String(seen ?? '') !== String(wanted ?? '')) mismatches.push(name)\n }\n return mismatches\n}\n\nfunction normalizeCell(value: unknown): unknown {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const item = value as Record<string, unknown>\n return item.name ?? item.text ?? item.value ?? value\n }\n return value\n}\n\nfunction sameTimeOrText(actual: unknown, expected: unknown): boolean {\n const left = String(actual ?? '')\n const right = String(expected ?? '')\n if (!left || !right) return left === right\n const leftTime = Date.parse(left)\n const rightTime = Date.parse(right)\n return Number.isFinite(leftTime) && Number.isFinite(rightTime)\n ? leftTime === rightTime : left === right\n}\n\nfunction findValue(value: unknown, keys: string[]): unknown {\n if (!value || typeof value !== 'object') return null\n for (const [key, child] of Object.entries(value)) {\n if (keys.includes(key) && child !== undefined && child !== null && child !== '') return child\n }\n for (const child of Object.values(value)) {\n const found = findValue(child, keys)\n if (found !== null) return found\n }\n return null\n}\n\nfunction validTime(value: unknown): string | null {\n if (typeof value !== 'string' || !value.trim() || !Number.isFinite(Date.parse(value))) return null\n return new Date(value).toISOString()\n}\n\nfunction clean(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n"]}
|