agentvault 1.0.2 → 1.0.5
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 +69 -0
- package/README.md +66 -6
- package/dist/cli/commands/approve.d.ts.map +1 -0
- package/dist/cli/commands/approve.js +357 -1
- package/dist/cli/commands/approve.js.map +1 -0
- package/dist/cli/commands/archive.d.ts.map +1 -0
- package/dist/cli/commands/archive.js.map +1 -0
- package/dist/cli/commands/backup.d.ts.map +1 -0
- package/dist/cli/commands/backup.js +303 -20
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/cloud-backup.d.ts.map +1 -0
- package/dist/cli/commands/cloud-backup.js +17 -0
- package/dist/cli/commands/cloud-backup.js.map +1 -0
- package/dist/cli/commands/cron.d.ts +14 -0
- package/dist/cli/commands/cron.d.ts.map +1 -0
- package/dist/cli/commands/cron.js +144 -0
- package/dist/cli/commands/cron.js.map +1 -0
- package/dist/cli/commands/cycles.d.ts.map +1 -0
- package/dist/cli/commands/cycles.js.map +1 -0
- package/dist/cli/commands/decrypt.d.ts.map +1 -0
- package/dist/cli/commands/decrypt.js.map +1 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -0
- package/dist/cli/commands/deploy.js.map +1 -0
- package/dist/cli/commands/exec.d.ts.map +1 -0
- package/dist/cli/commands/exec.js.map +1 -0
- package/dist/cli/commands/fetch.d.ts +3 -0
- package/dist/cli/commands/fetch.d.ts.map +1 -0
- package/dist/cli/commands/fetch.js +68 -4
- package/dist/cli/commands/fetch.js.map +1 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +57 -2
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/identity.d.ts.map +1 -0
- package/dist/cli/commands/identity.js.map +1 -0
- package/dist/cli/commands/inference.d.ts.map +1 -0
- package/dist/cli/commands/inference.js.map +1 -0
- package/dist/cli/commands/info.d.ts.map +1 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/init.d.ts +18 -1
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +152 -27
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/instrument.d.ts.map +1 -0
- package/dist/cli/commands/instrument.js.map +1 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +4 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +228 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +26 -0
- package/dist/cli/commands/memory.d.ts.map +1 -0
- package/dist/cli/commands/memory.js +509 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/mint.d.ts +25 -0
- package/dist/cli/commands/mint.d.ts.map +1 -0
- package/dist/cli/commands/mint.js +276 -0
- package/dist/cli/commands/mint.js.map +1 -0
- package/dist/cli/commands/mirror.d.ts +19 -0
- package/dist/cli/commands/mirror.d.ts.map +1 -0
- package/dist/cli/commands/mirror.js +216 -0
- package/dist/cli/commands/mirror.js.map +1 -0
- package/dist/cli/commands/monitor.d.ts.map +1 -0
- package/dist/cli/commands/monitor.js.map +1 -0
- package/dist/cli/commands/network.d.ts.map +1 -0
- package/dist/cli/commands/network.js.map +1 -0
- package/dist/cli/commands/orchestrate.d.ts +35 -0
- package/dist/cli/commands/orchestrate.d.ts.map +1 -0
- package/dist/cli/commands/orchestrate.js +190 -0
- package/dist/cli/commands/orchestrate.js.map +1 -0
- package/dist/cli/commands/package.d.ts.map +1 -0
- package/dist/cli/commands/package.js.map +1 -0
- package/dist/cli/commands/pilot.d.ts +17 -0
- package/dist/cli/commands/pilot.d.ts.map +1 -0
- package/dist/cli/commands/pilot.js +490 -0
- package/dist/cli/commands/pilot.js.map +1 -0
- package/dist/cli/commands/polytician.d.ts +4 -0
- package/dist/cli/commands/polytician.d.ts.map +1 -0
- package/dist/cli/commands/polytician.js +229 -0
- package/dist/cli/commands/polytician.js.map +1 -0
- package/dist/cli/commands/profile.d.ts.map +1 -0
- package/dist/cli/commands/profile.js +1 -1
- package/dist/cli/commands/profile.js.map +1 -0
- package/dist/cli/commands/promote.d.ts.map +1 -0
- package/dist/cli/commands/promote.js.map +1 -0
- package/dist/cli/commands/rebase.d.ts +85 -0
- package/dist/cli/commands/rebase.d.ts.map +1 -0
- package/dist/cli/commands/rebase.js +175 -0
- package/dist/cli/commands/rebase.js.map +1 -0
- package/dist/cli/commands/rebuild.d.ts.map +1 -0
- package/dist/cli/commands/rebuild.js.map +1 -0
- package/dist/cli/commands/repo.d.ts +19 -0
- package/dist/cli/commands/repo.d.ts.map +1 -0
- package/dist/cli/commands/repo.js +187 -0
- package/dist/cli/commands/repo.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts.map +1 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/safehouse.d.ts +11 -0
- package/dist/cli/commands/safehouse.d.ts.map +1 -0
- package/dist/cli/commands/safehouse.js +323 -0
- package/dist/cli/commands/safehouse.js.map +1 -0
- package/dist/cli/commands/show.d.ts.map +1 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +12 -0
- package/dist/cli/commands/skills.d.ts.map +1 -0
- package/dist/cli/commands/skills.js +248 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +2 -2
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +25 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/commands/tokens.d.ts.map +1 -0
- package/dist/cli/commands/tokens.js.map +1 -0
- package/dist/cli/commands/trace.d.ts.map +1 -0
- package/dist/cli/commands/trace.js +3 -3
- package/dist/cli/commands/trace.js.map +1 -0
- package/dist/cli/commands/vault.d.ts +7 -0
- package/dist/cli/commands/vault.d.ts.map +1 -0
- package/dist/cli/commands/vault.js +551 -0
- package/dist/cli/commands/vault.js.map +1 -0
- package/dist/cli/commands/wallet-export.d.ts.map +1 -0
- package/dist/cli/commands/wallet-export.js.map +1 -0
- package/dist/cli/commands/wallet-history.d.ts.map +1 -0
- package/dist/cli/commands/wallet-history.js +2 -26
- package/dist/cli/commands/wallet-history.js.map +1 -0
- package/dist/cli/commands/wallet-import.d.ts.map +1 -0
- package/dist/cli/commands/wallet-import.js.map +1 -0
- package/dist/cli/commands/wallet-multi-send.d.ts.map +1 -0
- package/dist/cli/commands/wallet-multi-send.js.map +1 -0
- package/dist/cli/commands/wallet-process-queue.d.ts.map +1 -0
- package/dist/cli/commands/wallet-process-queue.js +2 -23
- package/dist/cli/commands/wallet-process-queue.js.map +1 -0
- package/dist/cli/commands/wallet-sign.d.ts.map +1 -0
- package/dist/cli/commands/wallet-sign.js +2 -26
- package/dist/cli/commands/wallet-sign.js.map +1 -0
- package/dist/cli/commands/wallet.d.ts +61 -0
- package/dist/cli/commands/wallet.d.ts.map +1 -0
- package/dist/cli/commands/wallet.js +312 -42
- package/dist/cli/commands/wallet.js.map +1 -0
- package/dist/cli/commands/wiki.d.ts +29 -0
- package/dist/cli/commands/wiki.d.ts.map +1 -0
- package/dist/cli/commands/wiki.js +528 -0
- package/dist/cli/commands/wiki.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +74 -2
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/merge.d.ts +70 -0
- package/dist/cli/merge.d.ts.map +1 -0
- package/dist/cli/merge.js +232 -0
- package/dist/cli/merge.js.map +1 -0
- package/dist/src/archival/archive-manager.d.ts +4 -0
- package/dist/src/archival/archive-manager.d.ts.map +1 -0
- package/dist/src/archival/archive-manager.js +6 -0
- package/dist/src/archival/archive-manager.js.map +1 -0
- package/dist/src/archival/arweave-archiver.d.ts +173 -0
- package/dist/src/archival/arweave-archiver.d.ts.map +1 -0
- package/dist/src/archival/arweave-archiver.js +279 -0
- package/dist/src/archival/arweave-archiver.js.map +1 -0
- package/dist/src/archival/arweave-client.d.ts +1 -0
- package/dist/src/archival/arweave-client.d.ts.map +1 -0
- package/dist/src/archival/arweave-client.js +5 -2
- package/dist/src/archival/arweave-client.js.map +1 -0
- package/dist/src/archival/index.d.ts +4 -1
- package/dist/src/archival/index.d.ts.map +1 -0
- package/dist/src/archival/index.js +2 -1
- package/dist/src/archival/index.js.map +1 -0
- package/dist/src/backbone/constants.d.ts +30 -0
- package/dist/src/backbone/constants.d.ts.map +1 -0
- package/dist/src/backbone/constants.js +62 -0
- package/dist/src/backbone/constants.js.map +1 -0
- package/dist/src/backbone/index.d.ts +15 -0
- package/dist/src/backbone/index.d.ts.map +1 -0
- package/dist/src/backbone/index.js +18 -0
- package/dist/src/backbone/index.js.map +1 -0
- package/dist/src/backbone/services/communication.d.ts +42 -0
- package/dist/src/backbone/services/communication.d.ts.map +1 -0
- package/dist/src/backbone/services/communication.js +107 -0
- package/dist/src/backbone/services/communication.js.map +1 -0
- package/dist/src/backbone/services/consensus.d.ts +61 -0
- package/dist/src/backbone/services/consensus.d.ts.map +1 -0
- package/dist/src/backbone/services/consensus.js +210 -0
- package/dist/src/backbone/services/consensus.js.map +1 -0
- package/dist/src/backbone/services/index.d.ts +10 -0
- package/dist/src/backbone/services/index.d.ts.map +1 -0
- package/dist/src/backbone/services/index.js +6 -0
- package/dist/src/backbone/services/index.js.map +1 -0
- package/dist/src/backbone/services/knowledge.d.ts +44 -0
- package/dist/src/backbone/services/knowledge.d.ts.map +1 -0
- package/dist/src/backbone/services/knowledge.js +99 -0
- package/dist/src/backbone/services/knowledge.js.map +1 -0
- package/dist/src/backbone/services/memory.d.ts +36 -0
- package/dist/src/backbone/services/memory.d.ts.map +1 -0
- package/dist/src/backbone/services/memory.js +94 -0
- package/dist/src/backbone/services/memory.js.map +1 -0
- package/dist/src/backbone/services/vault-health.d.ts +18 -0
- package/dist/src/backbone/services/vault-health.d.ts.map +1 -0
- package/dist/src/backbone/services/vault-health.js +74 -0
- package/dist/src/backbone/services/vault-health.js.map +1 -0
- package/dist/src/backbone/types.d.ts +211 -0
- package/dist/src/backbone/types.d.ts.map +1 -0
- package/dist/src/backbone/types.js +8 -0
- package/dist/src/backbone/types.js.map +1 -0
- package/dist/src/backbone/validators.d.ts +211 -0
- package/dist/src/backbone/validators.d.ts.map +1 -0
- package/dist/src/backbone/validators.js +122 -0
- package/dist/src/backbone/validators.js.map +1 -0
- package/dist/src/backup/backup.d.ts +107 -1
- package/dist/src/backup/backup.d.ts.map +1 -0
- package/dist/src/backup/backup.js +413 -4
- package/dist/src/backup/backup.js.map +1 -0
- package/dist/src/backup/index.d.ts +3 -1
- package/dist/src/backup/index.d.ts.map +1 -0
- package/dist/src/backup/index.js +3 -1
- package/dist/src/backup/index.js.map +1 -0
- package/dist/src/backup/merkle.d.ts +44 -0
- package/dist/src/backup/merkle.d.ts.map +1 -0
- package/dist/src/backup/merkle.js +85 -0
- package/dist/src/backup/merkle.js.map +1 -0
- package/dist/src/backup/thoughtform-bundle.d.ts +42 -0
- package/dist/src/backup/thoughtform-bundle.d.ts.map +1 -0
- package/dist/src/backup/thoughtform-bundle.js +200 -0
- package/dist/src/backup/thoughtform-bundle.js.map +1 -0
- package/dist/src/canister/actor.d.ts +310 -0
- package/dist/src/canister/actor.d.ts.map +1 -0
- package/dist/src/canister/actor.idl.d.ts +8 -0
- package/dist/src/canister/actor.idl.d.ts.map +1 -0
- package/dist/src/canister/actor.idl.js +518 -0
- package/dist/src/canister/actor.idl.js.map +1 -0
- package/dist/src/canister/actor.js +51 -0
- package/dist/src/canister/actor.js.map +1 -0
- package/dist/src/canister/encryption.d.ts +158 -0
- package/dist/src/canister/encryption.d.ts.map +1 -0
- package/dist/src/canister/encryption.js +296 -0
- package/dist/src/canister/encryption.js.map +1 -0
- package/dist/src/canister/memory-repo-actor.d.ts +162 -0
- package/dist/src/canister/memory-repo-actor.d.ts.map +1 -0
- package/dist/src/canister/memory-repo-actor.idl.d.ts +8 -0
- package/dist/src/canister/memory-repo-actor.idl.d.ts.map +1 -0
- package/dist/src/canister/memory-repo-actor.idl.js +90 -0
- package/dist/src/canister/memory-repo-actor.idl.js.map +1 -0
- package/dist/src/canister/memory-repo-actor.js +69 -0
- package/dist/src/canister/memory-repo-actor.js.map +1 -0
- package/dist/src/canister/types.d.ts +54 -0
- package/dist/src/canister/types.d.ts.map +1 -0
- package/dist/src/canister/types.js +7 -0
- package/dist/src/canister/types.js.map +1 -0
- package/dist/src/cloud-storage/cloud-sync.d.ts.map +1 -0
- package/dist/src/cloud-storage/cloud-sync.js +10 -5
- package/dist/src/cloud-storage/cloud-sync.js.map +1 -0
- package/dist/src/cloud-storage/index.d.ts.map +1 -0
- package/dist/src/cloud-storage/index.js.map +1 -0
- package/dist/src/cloud-storage/provider-detector.d.ts.map +1 -0
- package/dist/src/cloud-storage/provider-detector.js.map +1 -0
- package/dist/src/cloud-storage/types.d.ts +5 -0
- package/dist/src/cloud-storage/types.d.ts.map +1 -0
- package/dist/src/cloud-storage/types.js.map +1 -0
- package/dist/src/debugging/debug-logger.d.ts +8 -0
- package/dist/src/debugging/debug-logger.d.ts.map +1 -0
- package/dist/src/debugging/debug-logger.js +11 -0
- package/dist/src/debugging/debug-logger.js.map +1 -0
- package/dist/src/debugging/index.d.ts +1 -0
- package/dist/src/debugging/index.d.ts.map +1 -0
- package/dist/src/debugging/index.js +1 -0
- package/dist/src/debugging/index.js.map +1 -0
- package/dist/src/debugging/logs.d.ts.map +1 -0
- package/dist/src/debugging/logs.js.map +1 -0
- package/dist/src/debugging/types.d.ts.map +1 -0
- package/dist/src/debugging/types.js.map +1 -0
- package/dist/src/deployment/deployer.d.ts.map +1 -0
- package/dist/src/deployment/deployer.js +133 -1
- package/dist/src/deployment/deployer.js.map +1 -0
- package/dist/src/deployment/icpClient.d.ts.map +1 -0
- package/dist/src/deployment/icpClient.js +4 -0
- package/dist/src/deployment/icpClient.js.map +1 -0
- package/dist/src/deployment/index.d.ts.map +1 -0
- package/dist/src/deployment/index.js.map +1 -0
- package/dist/src/deployment/promotion.d.ts.map +1 -0
- package/dist/src/deployment/promotion.js.map +1 -0
- package/dist/src/deployment/types.d.ts +2 -1
- package/dist/src/deployment/types.d.ts.map +1 -0
- package/dist/src/deployment/types.js.map +1 -0
- package/dist/src/fault-tolerance/backup-status.d.ts +31 -0
- package/dist/src/fault-tolerance/backup-status.d.ts.map +1 -0
- package/dist/src/fault-tolerance/backup-status.js +76 -0
- package/dist/src/fault-tolerance/backup-status.js.map +1 -0
- package/dist/src/fault-tolerance/cron-check.d.ts +66 -0
- package/dist/src/fault-tolerance/cron-check.d.ts.map +1 -0
- package/dist/src/fault-tolerance/cron-check.js +177 -0
- package/dist/src/fault-tolerance/cron-check.js.map +1 -0
- package/dist/src/fault-tolerance/index.d.ts +12 -0
- package/dist/src/fault-tolerance/index.d.ts.map +1 -0
- package/dist/src/fault-tolerance/index.js +12 -0
- package/dist/src/fault-tolerance/index.js.map +1 -0
- package/dist/src/fault-tolerance/mirror-sync.d.ts +61 -0
- package/dist/src/fault-tolerance/mirror-sync.d.ts.map +1 -0
- package/dist/src/fault-tolerance/mirror-sync.js +203 -0
- package/dist/src/fault-tolerance/mirror-sync.js.map +1 -0
- package/dist/src/icp/batch.d.ts.map +1 -0
- package/dist/src/icp/batch.js +10 -4
- package/dist/src/icp/batch.js.map +1 -0
- package/dist/src/icp/cycles.d.ts.map +1 -0
- package/dist/src/icp/cycles.js.map +1 -0
- package/dist/src/icp/environment.d.ts.map +1 -0
- package/dist/src/icp/environment.js.map +1 -0
- package/dist/src/icp/icpcli.d.ts.map +1 -0
- package/dist/src/icp/icpcli.js.map +1 -0
- package/dist/src/icp/icwasm.d.ts.map +1 -0
- package/dist/src/icp/icwasm.js.map +1 -0
- package/dist/src/icp/identity.d.ts.map +1 -0
- package/dist/src/icp/identity.js.map +1 -0
- package/dist/src/icp/index.d.ts.map +1 -0
- package/dist/src/icp/index.js.map +1 -0
- package/dist/src/icp/optimization.d.ts.map +1 -0
- package/dist/src/icp/optimization.js.map +1 -0
- package/dist/src/icp/tokens.d.ts.map +1 -0
- package/dist/src/icp/tokens.js.map +1 -0
- package/dist/src/icp/tool-detector.d.ts.map +1 -0
- package/dist/src/icp/tool-detector.js +19 -5
- package/dist/src/icp/tool-detector.js.map +1 -0
- package/dist/src/icp/types.d.ts.map +1 -0
- package/dist/src/icp/types.js.map +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +22 -1
- package/dist/src/index.js.map +1 -0
- package/dist/src/inference/bittensor-client.d.ts +54 -1
- package/dist/src/inference/bittensor-client.d.ts.map +1 -0
- package/dist/src/inference/bittensor-client.js +96 -3
- package/dist/src/inference/bittensor-client.js.map +1 -0
- package/dist/src/inference/fallback-chain.d.ts +90 -0
- package/dist/src/inference/fallback-chain.d.ts.map +1 -0
- package/dist/src/inference/fallback-chain.js +219 -0
- package/dist/src/inference/fallback-chain.js.map +1 -0
- package/dist/src/inference/index.d.ts +6 -1
- package/dist/src/inference/index.d.ts.map +1 -0
- package/dist/src/inference/index.js +6 -1
- package/dist/src/inference/index.js.map +1 -0
- package/dist/src/inference/inference-manager.d.ts.map +1 -0
- package/dist/src/inference/inference-manager.js.map +1 -0
- package/dist/src/inference/local-model-client.d.ts +46 -0
- package/dist/src/inference/local-model-client.d.ts.map +1 -0
- package/dist/src/inference/local-model-client.js +92 -0
- package/dist/src/inference/local-model-client.js.map +1 -0
- package/dist/src/inference/secure-inference.d.ts +105 -0
- package/dist/src/inference/secure-inference.d.ts.map +1 -0
- package/dist/src/inference/secure-inference.js +237 -0
- package/dist/src/inference/secure-inference.js.map +1 -0
- package/dist/src/inference/venice-client.d.ts +149 -0
- package/dist/src/inference/venice-client.d.ts.map +1 -0
- package/dist/src/inference/venice-client.js +333 -0
- package/dist/src/inference/venice-client.js.map +1 -0
- package/dist/src/metrics/index.d.ts.map +1 -0
- package/dist/src/metrics/index.js.map +1 -0
- package/dist/src/metrics/metrics.d.ts.map +1 -0
- package/dist/src/metrics/metrics.js.map +1 -0
- package/dist/src/mint/google-adk.d.ts +19 -0
- package/dist/src/mint/google-adk.d.ts.map +1 -0
- package/dist/src/mint/google-adk.js +180 -0
- package/dist/src/mint/google-adk.js.map +1 -0
- package/dist/src/monitoring/alerting.d.ts.map +1 -0
- package/dist/src/monitoring/alerting.js.map +1 -0
- package/dist/src/monitoring/health.d.ts +9 -1
- package/dist/src/monitoring/health.d.ts.map +1 -0
- package/dist/src/monitoring/health.js +63 -0
- package/dist/src/monitoring/health.js.map +1 -0
- package/dist/src/monitoring/index.d.ts +2 -2
- package/dist/src/monitoring/index.d.ts.map +1 -0
- package/dist/src/monitoring/index.js +1 -1
- package/dist/src/monitoring/index.js.map +1 -0
- package/dist/src/monitoring/info.d.ts.map +1 -0
- package/dist/src/monitoring/info.js.map +1 -0
- package/dist/src/monitoring/types.d.ts +26 -0
- package/dist/src/monitoring/types.d.ts.map +1 -0
- package/dist/src/monitoring/types.js.map +1 -0
- package/dist/src/network/index.d.ts.map +1 -0
- package/dist/src/network/index.js.map +1 -0
- package/dist/src/network/network-config.d.ts.map +1 -0
- package/dist/src/network/network-config.js.map +1 -0
- package/dist/src/orchestration/claude.d.ts +125 -0
- package/dist/src/orchestration/claude.d.ts.map +1 -0
- package/dist/src/orchestration/claude.js +639 -0
- package/dist/src/orchestration/claude.js.map +1 -0
- package/dist/src/orchestration/google-adk.d.ts +77 -0
- package/dist/src/orchestration/google-adk.d.ts.map +1 -0
- package/dist/src/orchestration/google-adk.js +659 -0
- package/dist/src/orchestration/google-adk.js.map +1 -0
- package/dist/src/orchestration/mcp-client.d.ts +47 -0
- package/dist/src/orchestration/mcp-client.d.ts.map +1 -0
- package/dist/src/orchestration/mcp-client.js +179 -0
- package/dist/src/orchestration/mcp-client.js.map +1 -0
- package/dist/src/orchestration/polytician-enricher.d.ts +21 -0
- package/dist/src/orchestration/polytician-enricher.d.ts.map +1 -0
- package/dist/src/orchestration/polytician-enricher.js +131 -0
- package/dist/src/orchestration/polytician-enricher.js.map +1 -0
- package/dist/src/orchestration/smallchat-bridge.d.ts +121 -0
- package/dist/src/orchestration/smallchat-bridge.d.ts.map +1 -0
- package/dist/src/orchestration/smallchat-bridge.js +331 -0
- package/dist/src/orchestration/smallchat-bridge.js.map +1 -0
- package/dist/src/orchestration/smallchat-compression.d.ts +100 -0
- package/dist/src/orchestration/smallchat-compression.d.ts.map +1 -0
- package/dist/src/orchestration/smallchat-compression.js +203 -0
- package/dist/src/orchestration/smallchat-compression.js.map +1 -0
- package/dist/src/orchestration/smallchat-policy.d.ts +158 -0
- package/dist/src/orchestration/smallchat-policy.d.ts.map +1 -0
- package/dist/src/orchestration/smallchat-policy.js +314 -0
- package/dist/src/orchestration/smallchat-policy.js.map +1 -0
- package/dist/src/orchestration/smallchat-tools.d.ts +69 -0
- package/dist/src/orchestration/smallchat-tools.d.ts.map +1 -0
- package/dist/src/orchestration/smallchat-tools.js +501 -0
- package/dist/src/orchestration/smallchat-tools.js.map +1 -0
- package/dist/src/packaging/compiler.d.ts.map +1 -0
- package/dist/src/packaging/compiler.js.map +1 -0
- package/dist/src/packaging/config-persistence.d.ts.map +1 -0
- package/dist/src/packaging/config-persistence.js.map +1 -0
- package/dist/src/packaging/config-schemas.d.ts +44 -2
- package/dist/src/packaging/config-schemas.d.ts.map +1 -0
- package/dist/src/packaging/config-schemas.js +19 -0
- package/dist/src/packaging/config-schemas.js.map +1 -0
- package/dist/src/packaging/detector.d.ts.map +1 -0
- package/dist/src/packaging/detector.js +15 -1
- package/dist/src/packaging/detector.js.map +1 -0
- package/dist/src/packaging/index.d.ts +11 -5
- package/dist/src/packaging/index.d.ts.map +1 -0
- package/dist/src/packaging/index.js +10 -4
- package/dist/src/packaging/index.js.map +1 -0
- package/dist/src/packaging/packager.d.ts.map +1 -0
- package/dist/src/packaging/packager.js.map +1 -0
- package/dist/src/packaging/parsers/clawdbot.d.ts +1 -1
- package/dist/src/packaging/parsers/clawdbot.d.ts.map +1 -0
- package/dist/src/packaging/parsers/clawdbot.js +26 -28
- package/dist/src/packaging/parsers/clawdbot.js.map +1 -0
- package/dist/src/packaging/parsers/cline.d.ts.map +1 -0
- package/dist/src/packaging/parsers/cline.js.map +1 -0
- package/dist/src/packaging/parsers/generic.d.ts +1 -1
- package/dist/src/packaging/parsers/generic.d.ts.map +1 -0
- package/dist/src/packaging/parsers/generic.js +13 -20
- package/dist/src/packaging/parsers/generic.js.map +1 -0
- package/dist/src/packaging/parsers/goose.d.ts.map +1 -0
- package/dist/src/packaging/parsers/goose.js.map +1 -0
- package/dist/src/packaging/parsers/index.d.ts +2 -0
- package/dist/src/packaging/parsers/index.d.ts.map +1 -0
- package/dist/src/packaging/parsers/index.js +2 -0
- package/dist/src/packaging/parsers/index.js.map +1 -0
- package/dist/src/packaging/parsers/nemoclaw.d.ts +4 -0
- package/dist/src/packaging/parsers/nemoclaw.d.ts.map +1 -0
- package/dist/src/packaging/parsers/nemoclaw.js +145 -0
- package/dist/src/packaging/parsers/nemoclaw.js.map +1 -0
- package/dist/src/packaging/parsers/polytician.d.ts +4 -0
- package/dist/src/packaging/parsers/polytician.d.ts.map +1 -0
- package/dist/src/packaging/parsers/polytician.js +121 -0
- package/dist/src/packaging/parsers/polytician.js.map +1 -0
- package/dist/src/packaging/serializer.d.ts +7 -1
- package/dist/src/packaging/serializer.d.ts.map +1 -0
- package/dist/src/packaging/serializer.js +14 -3
- package/dist/src/packaging/serializer.js.map +1 -0
- package/dist/src/packaging/serializers/index.d.ts +3 -0
- package/dist/src/packaging/serializers/index.d.ts.map +1 -0
- package/dist/src/packaging/serializers/index.js +2 -0
- package/dist/src/packaging/serializers/index.js.map +1 -0
- package/dist/src/packaging/serializers/thoughtform.d.ts +89 -0
- package/dist/src/packaging/serializers/thoughtform.d.ts.map +1 -0
- package/dist/src/packaging/serializers/thoughtform.js +84 -0
- package/dist/src/packaging/serializers/thoughtform.js.map +1 -0
- package/dist/src/packaging/state-format.d.ts +332 -0
- package/dist/src/packaging/state-format.d.ts.map +1 -0
- package/dist/src/packaging/state-format.js +602 -0
- package/dist/src/packaging/state-format.js.map +1 -0
- package/dist/src/packaging/types.d.ts +2 -2
- package/dist/src/packaging/types.d.ts.map +1 -0
- package/dist/src/packaging/types.js.map +1 -0
- package/dist/src/packaging/wasm-compiler.d.ts +160 -0
- package/dist/src/packaging/wasm-compiler.d.ts.map +1 -0
- package/dist/src/packaging/wasm-compiler.js +662 -0
- package/dist/src/packaging/wasm-compiler.js.map +1 -0
- package/dist/src/packaging/wasmedge-compiler.d.ts.map +1 -0
- package/dist/src/packaging/wasmedge-compiler.js +6 -4
- package/dist/src/packaging/wasmedge-compiler.js.map +1 -0
- package/dist/src/pilot/air-gap.d.ts +51 -0
- package/dist/src/pilot/air-gap.d.ts.map +1 -0
- package/dist/src/pilot/air-gap.js +118 -0
- package/dist/src/pilot/air-gap.js.map +1 -0
- package/dist/src/pilot/index.d.ts +14 -0
- package/dist/src/pilot/index.d.ts.map +1 -0
- package/dist/src/pilot/index.js +16 -0
- package/dist/src/pilot/index.js.map +1 -0
- package/dist/src/pilot/private-replica.d.ts +67 -0
- package/dist/src/pilot/private-replica.d.ts.map +1 -0
- package/dist/src/pilot/private-replica.js +429 -0
- package/dist/src/pilot/private-replica.js.map +1 -0
- package/dist/src/pilot/proxy-config.d.ts +36 -0
- package/dist/src/pilot/proxy-config.d.ts.map +1 -0
- package/dist/src/pilot/proxy-config.js +96 -0
- package/dist/src/pilot/proxy-config.js.map +1 -0
- package/dist/src/pilot/types.d.ts +181 -0
- package/dist/src/pilot/types.d.ts.map +1 -0
- package/dist/src/pilot/types.js +7 -0
- package/dist/src/pilot/types.js.map +1 -0
- package/dist/src/security/icp-audit.d.ts +63 -0
- package/dist/src/security/icp-audit.d.ts.map +1 -0
- package/dist/src/security/icp-audit.js +234 -0
- package/dist/src/security/icp-audit.js.map +1 -0
- package/dist/src/security/index.d.ts +7 -1
- package/dist/src/security/index.d.ts.map +1 -0
- package/dist/src/security/index.js +12 -2
- package/dist/src/security/index.js.map +1 -0
- package/dist/src/security/mfa-approval.d.ts +219 -0
- package/dist/src/security/mfa-approval.d.ts.map +1 -0
- package/dist/src/security/mfa-approval.js +668 -0
- package/dist/src/security/mfa-approval.js.map +1 -0
- package/dist/src/security/multisig.d.ts.map +1 -0
- package/dist/src/security/multisig.js.map +1 -0
- package/dist/src/security/totp.d.ts +67 -0
- package/dist/src/security/totp.d.ts.map +1 -0
- package/dist/src/security/totp.js +148 -0
- package/dist/src/security/totp.js.map +1 -0
- package/dist/src/security/types.d.ts +7 -2
- package/dist/src/security/types.d.ts.map +1 -0
- package/dist/src/security/types.js +14 -14
- package/dist/src/security/types.js.map +1 -0
- package/dist/src/security/vetkeys.d.ts +43 -0
- package/dist/src/security/vetkeys.d.ts.map +1 -0
- package/dist/src/security/vetkeys.js +144 -15
- package/dist/src/security/vetkeys.js.map +1 -0
- package/dist/src/security/webauthn.d.ts +127 -0
- package/dist/src/security/webauthn.d.ts.map +1 -0
- package/dist/src/security/webauthn.js +246 -0
- package/dist/src/security/webauthn.js.map +1 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/testing/local-runner.d.ts.map +1 -0
- package/dist/src/testing/local-runner.js.map +1 -0
- package/dist/src/testing/types.d.ts.map +1 -0
- package/dist/src/testing/types.js.map +1 -0
- package/dist/src/trading/api-key-manager.d.ts +96 -0
- package/dist/src/trading/api-key-manager.d.ts.map +1 -0
- package/dist/src/trading/api-key-manager.js +201 -0
- package/dist/src/trading/api-key-manager.js.map +1 -0
- package/dist/src/trading/consensus.d.ts +171 -0
- package/dist/src/trading/consensus.d.ts.map +1 -0
- package/dist/src/trading/consensus.js +291 -0
- package/dist/src/trading/consensus.js.map +1 -0
- package/dist/src/trading/index.d.ts +19 -0
- package/dist/src/trading/index.d.ts.map +1 -0
- package/dist/src/trading/index.js +15 -0
- package/dist/src/trading/index.js.map +1 -0
- package/dist/src/trading/ip-whitelist.d.ts +70 -0
- package/dist/src/trading/ip-whitelist.d.ts.map +1 -0
- package/dist/src/trading/ip-whitelist.js +239 -0
- package/dist/src/trading/ip-whitelist.js.map +1 -0
- package/dist/src/trading/skill-sandbox.d.ts +88 -0
- package/dist/src/trading/skill-sandbox.d.ts.map +1 -0
- package/dist/src/trading/skill-sandbox.js +175 -0
- package/dist/src/trading/skill-sandbox.js.map +1 -0
- package/dist/src/utils/path-validation.d.ts +34 -0
- package/dist/src/utils/path-validation.d.ts.map +1 -0
- package/dist/src/utils/path-validation.js +88 -0
- package/dist/src/utils/path-validation.js.map +1 -0
- package/dist/src/vault/bitwarden.d.ts +51 -0
- package/dist/src/vault/bitwarden.d.ts.map +1 -0
- package/dist/src/vault/bitwarden.js +172 -0
- package/dist/src/vault/bitwarden.js.map +1 -0
- package/dist/src/vault/client.d.ts +44 -0
- package/dist/src/vault/client.d.ts.map +1 -0
- package/dist/src/vault/client.js +523 -0
- package/dist/src/vault/client.js.map +1 -0
- package/dist/src/vault/config.d.ts +68 -0
- package/dist/src/vault/config.d.ts.map +1 -0
- package/dist/src/vault/config.js +265 -0
- package/dist/src/vault/config.js.map +1 -0
- package/dist/src/vault/encrypted-memory-store.d.ts +80 -0
- package/dist/src/vault/encrypted-memory-store.d.ts.map +1 -0
- package/dist/src/vault/encrypted-memory-store.js +175 -0
- package/dist/src/vault/encrypted-memory-store.js.map +1 -0
- package/dist/src/vault/hashicorp-provider.d.ts +22 -0
- package/dist/src/vault/hashicorp-provider.d.ts.map +1 -0
- package/dist/src/vault/hashicorp-provider.js +63 -0
- package/dist/src/vault/hashicorp-provider.js.map +1 -0
- package/dist/src/vault/index.d.ts +40 -0
- package/dist/src/vault/index.d.ts.map +1 -0
- package/dist/src/vault/index.js +38 -0
- package/dist/src/vault/index.js.map +1 -0
- package/dist/src/vault/memory-provider.d.ts +26 -0
- package/dist/src/vault/memory-provider.d.ts.map +1 -0
- package/dist/src/vault/memory-provider.js +42 -0
- package/dist/src/vault/memory-provider.js.map +1 -0
- package/dist/src/vault/provider.d.ts +68 -0
- package/dist/src/vault/provider.d.ts.map +1 -0
- package/dist/src/vault/provider.js +50 -0
- package/dist/src/vault/provider.js.map +1 -0
- package/dist/src/vault/safehouse-types.d.ts +204 -0
- package/dist/src/vault/safehouse-types.d.ts.map +1 -0
- package/dist/src/vault/safehouse-types.js +9 -0
- package/dist/src/vault/safehouse-types.js.map +1 -0
- package/dist/src/vault/secret-audit.d.ts +91 -0
- package/dist/src/vault/secret-audit.d.ts.map +1 -0
- package/dist/src/vault/secret-audit.js +224 -0
- package/dist/src/vault/secret-audit.js.map +1 -0
- package/dist/src/vault/secret-injector.d.ts +62 -0
- package/dist/src/vault/secret-injector.d.ts.map +1 -0
- package/dist/src/vault/secret-injector.js +237 -0
- package/dist/src/vault/secret-injector.js.map +1 -0
- package/dist/src/vault/secret-leak-detector.d.ts +94 -0
- package/dist/src/vault/secret-leak-detector.d.ts.map +1 -0
- package/dist/src/vault/secret-leak-detector.js +218 -0
- package/dist/src/vault/secret-leak-detector.js.map +1 -0
- package/dist/src/vault/secret-management-layer.d.ts +139 -0
- package/dist/src/vault/secret-management-layer.d.ts.map +1 -0
- package/dist/src/vault/secret-management-layer.js +366 -0
- package/dist/src/vault/secret-management-layer.js.map +1 -0
- package/dist/src/vault/secret-rotation.d.ts +54 -0
- package/dist/src/vault/secret-rotation.d.ts.map +1 -0
- package/dist/src/vault/secret-rotation.js +156 -0
- package/dist/src/vault/secret-rotation.js.map +1 -0
- package/dist/src/vault/secret-sandbox.d.ts +94 -0
- package/dist/src/vault/secret-sandbox.d.ts.map +1 -0
- package/dist/src/vault/secret-sandbox.js +232 -0
- package/dist/src/vault/secret-sandbox.js.map +1 -0
- package/dist/src/vault/types.d.ts +148 -0
- package/dist/src/vault/types.d.ts.map +1 -0
- package/dist/src/vault/types.js +7 -0
- package/dist/src/vault/types.js.map +1 -0
- package/dist/src/wallet/cbor-serializer.d.ts.map +1 -0
- package/dist/src/wallet/cbor-serializer.js +7 -2
- package/dist/src/wallet/cbor-serializer.js.map +1 -0
- package/dist/src/wallet/chain-dispatcher.d.ts +1 -1
- package/dist/src/wallet/chain-dispatcher.d.ts.map +1 -0
- package/dist/src/wallet/chain-dispatcher.js +8 -19
- package/dist/src/wallet/chain-dispatcher.js.map +1 -0
- package/dist/src/wallet/cross-chain-aggregator.d.ts.map +1 -0
- package/dist/src/wallet/cross-chain-aggregator.js.map +1 -0
- package/dist/src/wallet/hsm/index.d.ts +39 -0
- package/dist/src/wallet/hsm/index.d.ts.map +1 -0
- package/dist/src/wallet/hsm/index.js +60 -0
- package/dist/src/wallet/hsm/index.js.map +1 -0
- package/dist/src/wallet/hsm/ledger-provider.d.ts +75 -0
- package/dist/src/wallet/hsm/ledger-provider.d.ts.map +1 -0
- package/dist/src/wallet/hsm/ledger-provider.js +272 -0
- package/dist/src/wallet/hsm/ledger-provider.js.map +1 -0
- package/dist/src/wallet/hsm/sgx-provider.d.ts +83 -0
- package/dist/src/wallet/hsm/sgx-provider.d.ts.map +1 -0
- package/dist/src/wallet/hsm/sgx-provider.js +281 -0
- package/dist/src/wallet/hsm/sgx-provider.js.map +1 -0
- package/dist/src/wallet/hsm/types.d.ts +134 -0
- package/dist/src/wallet/hsm/types.d.ts.map +1 -0
- package/dist/src/wallet/hsm/types.js +46 -0
- package/dist/src/wallet/hsm/types.js.map +1 -0
- package/dist/src/wallet/index.d.ts +8 -2
- package/dist/src/wallet/index.d.ts.map +1 -0
- package/dist/src/wallet/index.js +9 -2
- package/dist/src/wallet/index.js.map +1 -0
- package/dist/src/wallet/key-derivation.d.ts +29 -1
- package/dist/src/wallet/key-derivation.d.ts.map +1 -0
- package/dist/src/wallet/key-derivation.js +106 -23
- package/dist/src/wallet/key-derivation.js.map +1 -0
- package/dist/src/wallet/providers/arweave-provider.d.ts +34 -0
- package/dist/src/wallet/providers/arweave-provider.d.ts.map +1 -0
- package/dist/src/wallet/providers/arweave-provider.js +126 -0
- package/dist/src/wallet/providers/arweave-provider.js.map +1 -0
- package/dist/src/wallet/providers/base-provider.d.ts.map +1 -0
- package/dist/src/wallet/providers/base-provider.js.map +1 -0
- package/dist/src/wallet/providers/cketh-provider.d.ts.map +1 -0
- package/dist/src/wallet/providers/cketh-provider.js.map +1 -0
- package/dist/src/wallet/providers/icp-provider.d.ts +34 -0
- package/dist/src/wallet/providers/icp-provider.d.ts.map +1 -0
- package/dist/src/wallet/providers/icp-provider.js +114 -0
- package/dist/src/wallet/providers/icp-provider.js.map +1 -0
- package/dist/src/wallet/providers/polkadot-provider.d.ts.map +1 -0
- package/dist/src/wallet/providers/polkadot-provider.js +5 -6
- package/dist/src/wallet/providers/polkadot-provider.js.map +1 -0
- package/dist/src/wallet/providers/provider-factory.d.ts +23 -0
- package/dist/src/wallet/providers/provider-factory.d.ts.map +1 -0
- package/dist/src/wallet/providers/provider-factory.js +74 -0
- package/dist/src/wallet/providers/provider-factory.js.map +1 -0
- package/dist/src/wallet/providers/solana-provider.d.ts.map +1 -0
- package/dist/src/wallet/providers/solana-provider.js +6 -7
- package/dist/src/wallet/providers/solana-provider.js.map +1 -0
- package/dist/src/wallet/secure-wallet.d.ts +132 -0
- package/dist/src/wallet/secure-wallet.d.ts.map +1 -0
- package/dist/src/wallet/secure-wallet.js +298 -0
- package/dist/src/wallet/secure-wallet.js.map +1 -0
- package/dist/src/wallet/transaction-queue.d.ts.map +1 -0
- package/dist/src/wallet/transaction-queue.js.map +1 -0
- package/dist/src/wallet/types.d.ts +57 -2
- package/dist/src/wallet/types.d.ts.map +1 -0
- package/dist/src/wallet/types.js.map +1 -0
- package/dist/src/wallet/vetkeys-adapter.d.ts.map +1 -0
- package/dist/src/wallet/vetkeys-adapter.js +16 -25
- package/dist/src/wallet/vetkeys-adapter.js.map +1 -0
- package/dist/src/wallet/wallet-crypto.d.ts +101 -0
- package/dist/src/wallet/wallet-crypto.d.ts.map +1 -0
- package/dist/src/wallet/wallet-crypto.js +185 -0
- package/dist/src/wallet/wallet-crypto.js.map +1 -0
- package/dist/src/wallet/wallet-manager.d.ts +24 -4
- package/dist/src/wallet/wallet-manager.d.ts.map +1 -0
- package/dist/src/wallet/wallet-manager.js +70 -3
- package/dist/src/wallet/wallet-manager.js.map +1 -0
- package/dist/src/wallet/wallet-storage.d.ts +15 -7
- package/dist/src/wallet/wallet-storage.d.ts.map +1 -0
- package/dist/src/wallet/wallet-storage.js +34 -18
- package/dist/src/wallet/wallet-storage.js.map +1 -0
- package/dist/src/wiki/index.d.ts +30 -0
- package/dist/src/wiki/index.d.ts.map +1 -0
- package/dist/src/wiki/index.js +30 -0
- package/dist/src/wiki/index.js.map +1 -0
- package/dist/src/wiki/ingest.d.ts +51 -0
- package/dist/src/wiki/ingest.d.ts.map +1 -0
- package/dist/src/wiki/ingest.js +197 -0
- package/dist/src/wiki/ingest.js.map +1 -0
- package/dist/src/wiki/lint.d.ts +43 -0
- package/dist/src/wiki/lint.d.ts.map +1 -0
- package/dist/src/wiki/lint.js +187 -0
- package/dist/src/wiki/lint.js.map +1 -0
- package/dist/src/wiki/mcp-tools.d.ts +35 -0
- package/dist/src/wiki/mcp-tools.d.ts.map +1 -0
- package/dist/src/wiki/mcp-tools.js +353 -0
- package/dist/src/wiki/mcp-tools.js.map +1 -0
- package/dist/src/wiki/query.d.ts +38 -0
- package/dist/src/wiki/query.d.ts.map +1 -0
- package/dist/src/wiki/query.js +117 -0
- package/dist/src/wiki/query.js.map +1 -0
- package/dist/src/wiki/wiki-store.d.ts +53 -0
- package/dist/src/wiki/wiki-store.d.ts.map +1 -0
- package/dist/src/wiki/wiki-store.js +132 -0
- package/dist/src/wiki/wiki-store.js.map +1 -0
- package/package.json +35 -11
- package/.claude/settings.local.json +0 -9
- package/.dfx/local/network-id +0 -4
- package/.next/trace +0 -2
- package/.vercel/README.txt +0 -11
- package/.vercel/project.json +0 -1
- package/AGENTS.md +0 -43
- package/PLAN_VAULT_INTEGRATION.md +0 -318
- package/dist/vitest.config.d.ts +0 -3
- package/dist/vitest.config.js +0 -14
- package/fixup_1_0_OSS_release.md +0 -136
- package/fixup_REALEASE_PRD.md +0 -136
- package/macos-wallet-app/AgentVaultWallet/App/AgentVaultWalletApp.swift +0 -54
- package/macos-wallet-app/AgentVaultWallet/Models/AppState.swift +0 -102
- package/macos-wallet-app/AgentVaultWallet/Models/Chain.swift +0 -121
- package/macos-wallet-app/AgentVaultWallet/Models/Wallet.swift +0 -98
- package/macos-wallet-app/AgentVaultWallet/Resources/AgentVaultWallet.entitlements +0 -27
- package/macos-wallet-app/AgentVaultWallet/Resources/Info.plist +0 -69
- package/macos-wallet-app/AgentVaultWallet/Services/BackupService.swift +0 -270
- package/macos-wallet-app/AgentVaultWallet/Services/CLIBridge.swift +0 -367
- package/macos-wallet-app/AgentVaultWallet/Services/CryptoService.swift +0 -157
- package/macos-wallet-app/AgentVaultWallet/Services/FileService.swift +0 -120
- package/macos-wallet-app/AgentVaultWallet/Services/KeychainService.swift +0 -219
- package/macos-wallet-app/AgentVaultWallet/Utilities/Constants.swift +0 -44
- package/macos-wallet-app/AgentVaultWallet/Utilities/Extensions.swift +0 -115
- package/macos-wallet-app/AgentVaultWallet/ViewModels/BackupViewModel.swift +0 -237
- package/macos-wallet-app/AgentVaultWallet/ViewModels/CreateWalletViewModel.swift +0 -137
- package/macos-wallet-app/AgentVaultWallet/ViewModels/ImportWalletViewModel.swift +0 -179
- package/macos-wallet-app/AgentVaultWallet/ViewModels/WalletStore.swift +0 -286
- package/macos-wallet-app/AgentVaultWallet/Views/Backup/BackupView.swift +0 -235
- package/macos-wallet-app/AgentVaultWallet/Views/Backup/RestoreView.swift +0 -316
- package/macos-wallet-app/AgentVaultWallet/Views/Create/CreateWalletFlow.swift +0 -438
- package/macos-wallet-app/AgentVaultWallet/Views/Import/ImportWalletFlow.swift +0 -399
- package/macos-wallet-app/AgentVaultWallet/Views/MainView.swift +0 -134
- package/macos-wallet-app/AgentVaultWallet/Views/Settings/SettingsView.swift +0 -276
- package/macos-wallet-app/AgentVaultWallet/Views/Sidebar/SidebarView.swift +0 -133
- package/macos-wallet-app/AgentVaultWallet/Views/Wallet/DashboardView.swift +0 -233
- package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletDetailView.swift +0 -281
- package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletListView.swift +0 -280
- package/macos-wallet-app/AgentVaultWallet/Views/Welcome/WelcomeView.swift +0 -176
- package/macos-wallet-app/Makefile +0 -47
- package/macos-wallet-app/project.yml +0 -40
- package/macos-wallet-app/setup.sh +0 -73
- package/pnpm-workspace.yaml +0 -5
- package/vercel.json +0 -8
|
@@ -0,0 +1,668 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Factor Agent Approval (human-approve protocol)
|
|
3
|
+
*
|
|
4
|
+
* Five-layer defence for every agent approval request:
|
|
5
|
+
*
|
|
6
|
+
* 1. TOTP + nonce chain
|
|
7
|
+
* The agent generates its own TOTP seed once per branch (never transmitted).
|
|
8
|
+
* Each challenge carries:
|
|
9
|
+
* • currentNonce — monotonically incrementing counter (single-use)
|
|
10
|
+
* • challengeHash — SHA-256(nonce ‖ branchId ‖ timestamp)
|
|
11
|
+
* The approver replies: "APPROVE <TOTP-code> <nonce>"
|
|
12
|
+
* The agent verifies the code against the stored seed and checks the nonce.
|
|
13
|
+
* Replay protection: nonce is written to a used-set immediately after success.
|
|
14
|
+
*
|
|
15
|
+
* 2. Biometric fallback (WebAuthn / Secure Enclave)
|
|
16
|
+
* When TOTP is unavailable, the approver signs the challengeHash with a
|
|
17
|
+
* device-bound P-256 key (simulating iOS Face ID / Android fingerprint).
|
|
18
|
+
* The private key never leaves the local Secure Enclave equivalent; only
|
|
19
|
+
* the ECDSA signature is transmitted. Verified against the enrolled public key.
|
|
20
|
+
*
|
|
21
|
+
* 3. One-time link (60 s)
|
|
22
|
+
* Each challenge also generates a short-lived URL:
|
|
23
|
+
* https://agentvault.approve/<requestId>?token=<hex>
|
|
24
|
+
* Token = HMAC-SHA256(requestId ‖ nonce ‖ expiresAt, linkSigningKey)
|
|
25
|
+
* The link dies on first use or after 60 seconds — whichever comes first.
|
|
26
|
+
*
|
|
27
|
+
* 4. Rate limiting
|
|
28
|
+
* Max 3 successful approvals per signer per rolling hour.
|
|
29
|
+
* Excess attempts are rejected and logged.
|
|
30
|
+
*
|
|
31
|
+
* 5. Anomaly detection
|
|
32
|
+
* Each approver device has a fingerprint = SHA-256(hostname ‖ platform ‖ arch)[:16].
|
|
33
|
+
* First approval from a new fingerprint for a known signer triggers:
|
|
34
|
+
* • branch auto-lock
|
|
35
|
+
* • anomaly-detected audit entry
|
|
36
|
+
* • "Was this you?" ping flag stored in the audit entry (detail field)
|
|
37
|
+
* The operator must call unlockBranch() with a fresh TOTP code to resume.
|
|
38
|
+
* Replying YES via TOTP to the anomaly ping registers the device as trusted.
|
|
39
|
+
*
|
|
40
|
+
* 6. Audit log (local + ICP)
|
|
41
|
+
* Every event (setup, challenge, approve, reject, anomaly, lock) is appended to
|
|
42
|
+
* ~/.agentvault/mfa/audit-<branchId>.yaml for local forensics AND submitted
|
|
43
|
+
* asynchronously to the ICP canister for tamper-evident on-chain storage.
|
|
44
|
+
* The verifyMfaApproval() return value includes an auditToken
|
|
45
|
+
* (HMAC over the approval payload) suitable for on-chain verification.
|
|
46
|
+
*/
|
|
47
|
+
import fs from 'node:fs';
|
|
48
|
+
import path from 'node:path';
|
|
49
|
+
import os from 'node:os';
|
|
50
|
+
import crypto from 'node:crypto';
|
|
51
|
+
import { parse, stringify } from 'yaml';
|
|
52
|
+
import { generateTotpSecret, base32Encode, base32Decode, verifyTotp, otpAuthUri, } from './totp.js';
|
|
53
|
+
import { verifyWebAuthnAssertion, getDevicePublicKey, getSignCounter, } from './webauthn.js';
|
|
54
|
+
import { submitIcpAuditEntry } from './icp-audit.js';
|
|
55
|
+
// ─── Directory paths ─────────────────────────────────────────────────────────
|
|
56
|
+
const MFA_DIR = path.join(os.homedir(), '.agentvault', 'mfa');
|
|
57
|
+
function ensureMfaDir() {
|
|
58
|
+
fs.mkdirSync(MFA_DIR, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
// ─── File helpers ─────────────────────────────────────────────────────────────
|
|
61
|
+
function stateFile(branchId) {
|
|
62
|
+
return path.join(MFA_DIR, `state-${branchId}.yaml`);
|
|
63
|
+
}
|
|
64
|
+
function auditFile(branchId) {
|
|
65
|
+
return path.join(MFA_DIR, `audit-${branchId}.yaml`);
|
|
66
|
+
}
|
|
67
|
+
function rateLimitFile() {
|
|
68
|
+
return path.join(MFA_DIR, 'rate-limit.yaml');
|
|
69
|
+
}
|
|
70
|
+
function otpLinksFile() {
|
|
71
|
+
return path.join(MFA_DIR, 'otp-links.yaml');
|
|
72
|
+
}
|
|
73
|
+
function deviceRegistryFile() {
|
|
74
|
+
return path.join(MFA_DIR, 'device-registry.yaml');
|
|
75
|
+
}
|
|
76
|
+
function loadState(branchId) {
|
|
77
|
+
const fp = stateFile(branchId);
|
|
78
|
+
if (!fs.existsSync(fp))
|
|
79
|
+
return null;
|
|
80
|
+
return parse(fs.readFileSync(fp, 'utf8'));
|
|
81
|
+
}
|
|
82
|
+
function saveState(state) {
|
|
83
|
+
ensureMfaDir();
|
|
84
|
+
fs.writeFileSync(stateFile(state.branchId), stringify(state), 'utf8');
|
|
85
|
+
}
|
|
86
|
+
function loadRateLimit() {
|
|
87
|
+
const fp = rateLimitFile();
|
|
88
|
+
if (!fs.existsSync(fp))
|
|
89
|
+
return { windows: {} };
|
|
90
|
+
return parse(fs.readFileSync(fp, 'utf8'));
|
|
91
|
+
}
|
|
92
|
+
function saveRateLimit(rl) {
|
|
93
|
+
ensureMfaDir();
|
|
94
|
+
fs.writeFileSync(rateLimitFile(), stringify(rl), 'utf8');
|
|
95
|
+
}
|
|
96
|
+
function loadOtpLinks() {
|
|
97
|
+
const fp = otpLinksFile();
|
|
98
|
+
if (!fs.existsSync(fp))
|
|
99
|
+
return {};
|
|
100
|
+
return parse(fs.readFileSync(fp, 'utf8'));
|
|
101
|
+
}
|
|
102
|
+
function saveOtpLinks(links) {
|
|
103
|
+
ensureMfaDir();
|
|
104
|
+
fs.writeFileSync(otpLinksFile(), stringify(links), 'utf8');
|
|
105
|
+
}
|
|
106
|
+
function loadDeviceRegistry() {
|
|
107
|
+
const fp = deviceRegistryFile();
|
|
108
|
+
if (!fs.existsSync(fp))
|
|
109
|
+
return { known: {} };
|
|
110
|
+
return parse(fs.readFileSync(fp, 'utf8'));
|
|
111
|
+
}
|
|
112
|
+
function saveDeviceRegistry(reg) {
|
|
113
|
+
ensureMfaDir();
|
|
114
|
+
fs.writeFileSync(deviceRegistryFile(), stringify(reg), 'utf8');
|
|
115
|
+
}
|
|
116
|
+
// ─── Audit log ────────────────────────────────────────────────────────────────
|
|
117
|
+
function makeAuditId() {
|
|
118
|
+
return `aud-${Date.now()}-${crypto.randomBytes(3).toString('hex')}`;
|
|
119
|
+
}
|
|
120
|
+
function appendAuditEntry(entry) {
|
|
121
|
+
ensureMfaDir();
|
|
122
|
+
const fp = auditFile(entry.branchId);
|
|
123
|
+
let log = [];
|
|
124
|
+
if (fs.existsSync(fp)) {
|
|
125
|
+
log = parse(fs.readFileSync(fp, 'utf8'));
|
|
126
|
+
}
|
|
127
|
+
log.push(entry);
|
|
128
|
+
fs.writeFileSync(fp, stringify(log), 'utf8');
|
|
129
|
+
// Async fire-and-forget to ICP — never blocks the local flow.
|
|
130
|
+
// Failures are queued locally and retried on the next flush.
|
|
131
|
+
submitIcpAuditEntry(entry).catch(() => {
|
|
132
|
+
// Silently queued — getIcpQueueDepth() shows pending count.
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
// ─── Challenge hash ───────────────────────────────────────────────────────────
|
|
136
|
+
function computeChallengeHash(nonce, branchId, timestamp) {
|
|
137
|
+
return crypto
|
|
138
|
+
.createHash('sha256')
|
|
139
|
+
.update(`${nonce}:${branchId}:${timestamp}`)
|
|
140
|
+
.digest('hex');
|
|
141
|
+
}
|
|
142
|
+
// ─── One-time links ───────────────────────────────────────────────────────────
|
|
143
|
+
const LINK_TTL_MS = 60_000; // 60 seconds
|
|
144
|
+
/**
|
|
145
|
+
* Derive a per-branch link-signing key from the TOTP secret.
|
|
146
|
+
* This key is never stored on disk — it is re-derived on every call.
|
|
147
|
+
*/
|
|
148
|
+
function linkSigningKey(branchId) {
|
|
149
|
+
const state = loadState(branchId);
|
|
150
|
+
if (!state)
|
|
151
|
+
throw new Error(`MFA not configured for branch: ${branchId}`);
|
|
152
|
+
const totpBuf = base32Decode(state.totpSecretB32);
|
|
153
|
+
return crypto.createHmac('sha256', totpBuf).update('agentvault:link-signing:v1').digest();
|
|
154
|
+
}
|
|
155
|
+
function generateOtpToken(requestId, branchId, nonce) {
|
|
156
|
+
const key = linkSigningKey(branchId);
|
|
157
|
+
const expiresAt = new Date(Date.now() + LINK_TTL_MS).toISOString();
|
|
158
|
+
const payload = `${requestId}:${nonce}:${expiresAt}`;
|
|
159
|
+
const token = crypto.createHmac('sha256', key).update(payload).digest('hex');
|
|
160
|
+
// Persist the link so we can validate it later
|
|
161
|
+
const links = loadOtpLinks();
|
|
162
|
+
links[token] = { requestId, expiresAt, used: false };
|
|
163
|
+
saveOtpLinks(links);
|
|
164
|
+
return token;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Validate a one-time approval link token.
|
|
168
|
+
* Returns the associated requestId on success, or an error reason.
|
|
169
|
+
*/
|
|
170
|
+
export function validateOtpToken(token) {
|
|
171
|
+
const links = loadOtpLinks();
|
|
172
|
+
const link = links[token];
|
|
173
|
+
if (!link)
|
|
174
|
+
return { ok: false, reason: 'token-not-found' };
|
|
175
|
+
if (link.used)
|
|
176
|
+
return { ok: false, reason: 'token-already-used' };
|
|
177
|
+
if (new Date() > new Date(link.expiresAt))
|
|
178
|
+
return { ok: false, reason: 'token-expired' };
|
|
179
|
+
// Mark consumed
|
|
180
|
+
link.used = true;
|
|
181
|
+
saveOtpLinks(links);
|
|
182
|
+
return { ok: true, requestId: link.requestId };
|
|
183
|
+
}
|
|
184
|
+
// ─── Rate limiting ────────────────────────────────────────────────────────────
|
|
185
|
+
const RATE_WINDOW_MS = 60 * 60 * 1000; // 1 hour
|
|
186
|
+
const RATE_MAX = 3; // approvals per window
|
|
187
|
+
/**
|
|
188
|
+
* Record an approval attempt and return false if the signer is rate-limited.
|
|
189
|
+
* The timestamp is recorded only when true is returned (i.e. the attempt counts).
|
|
190
|
+
*/
|
|
191
|
+
function checkAndRecordRateLimit(signer) {
|
|
192
|
+
const rl = loadRateLimit();
|
|
193
|
+
const now = Date.now();
|
|
194
|
+
const windowStart = now - RATE_WINDOW_MS;
|
|
195
|
+
// Prune events outside the rolling window
|
|
196
|
+
const events = (rl.windows[signer] ?? []).filter((ts) => new Date(ts).getTime() > windowStart);
|
|
197
|
+
if (events.length >= RATE_MAX) {
|
|
198
|
+
saveRateLimit(rl); // persist pruned list even on rejection
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
events.push(new Date().toISOString());
|
|
202
|
+
rl.windows[signer] = events;
|
|
203
|
+
saveRateLimit(rl);
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
// ─── Anomaly detection ────────────────────────────────────────────────────────
|
|
207
|
+
/**
|
|
208
|
+
* Compute the device fingerprint for the current machine.
|
|
209
|
+
* Uses hostname + OS platform + CPU architecture, hashed to a short hex token.
|
|
210
|
+
*/
|
|
211
|
+
export function getDeviceFingerprint() {
|
|
212
|
+
return crypto
|
|
213
|
+
.createHash('sha256')
|
|
214
|
+
.update(`${os.hostname()}:${os.platform()}:${os.arch()}`)
|
|
215
|
+
.digest('hex')
|
|
216
|
+
.slice(0, 16);
|
|
217
|
+
}
|
|
218
|
+
function checkDevice(signer, fingerprint) {
|
|
219
|
+
const reg = loadDeviceRegistry();
|
|
220
|
+
const known = reg.known[signer] ?? [];
|
|
221
|
+
if (known.length === 0) {
|
|
222
|
+
// First approval ever from this signer — enrol the device automatically
|
|
223
|
+
reg.known[signer] = [fingerprint];
|
|
224
|
+
saveDeviceRegistry(reg);
|
|
225
|
+
return 'first-time';
|
|
226
|
+
}
|
|
227
|
+
return known.includes(fingerprint) ? 'known' : 'new-device';
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Explicitly register a device fingerprint for a signer.
|
|
231
|
+
* Call this after the operator has confirmed a new-device alert via secondary TOTP.
|
|
232
|
+
*/
|
|
233
|
+
export function registerDevice(signer, fingerprint) {
|
|
234
|
+
const reg = loadDeviceRegistry();
|
|
235
|
+
const known = reg.known[signer] ?? [];
|
|
236
|
+
if (!known.includes(fingerprint)) {
|
|
237
|
+
reg.known[signer] = [...known, fingerprint];
|
|
238
|
+
saveDeviceRegistry(reg);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
242
|
+
/**
|
|
243
|
+
* Initialise MFA for a branch.
|
|
244
|
+
*
|
|
245
|
+
* Generates a fresh 20-byte TOTP secret, stores it encrypted on disk,
|
|
246
|
+
* and returns the otpauth:// URI to be scanned once by the approver.
|
|
247
|
+
*
|
|
248
|
+
* @param branchId - Unique branch / workflow identifier (e.g. "pending-001")
|
|
249
|
+
*/
|
|
250
|
+
export function setupMfa(branchId) {
|
|
251
|
+
ensureMfaDir();
|
|
252
|
+
const secret = generateTotpSecret();
|
|
253
|
+
const secretB32 = base32Encode(secret);
|
|
254
|
+
const uri = otpAuthUri(secret, `AgentVault:${branchId}`);
|
|
255
|
+
const now = new Date().toISOString();
|
|
256
|
+
const state = {
|
|
257
|
+
branchId,
|
|
258
|
+
totpSecretB32: secretB32,
|
|
259
|
+
currentNonce: 0,
|
|
260
|
+
usedNonces: [],
|
|
261
|
+
locked: false,
|
|
262
|
+
createdAt: now,
|
|
263
|
+
updatedAt: now,
|
|
264
|
+
};
|
|
265
|
+
saveState(state);
|
|
266
|
+
appendAuditEntry({
|
|
267
|
+
id: makeAuditId(),
|
|
268
|
+
requestId: 'setup',
|
|
269
|
+
branchId,
|
|
270
|
+
event: 'setup',
|
|
271
|
+
timestamp: now,
|
|
272
|
+
detail: 'TOTP seed generated — enrol in authenticator app using the otpauth URI',
|
|
273
|
+
});
|
|
274
|
+
return { branchId, totpSecretB32: secretB32, otpAuthUri: uri, createdAt: now };
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Issue a challenge for a pending approval request.
|
|
278
|
+
*
|
|
279
|
+
* Increments the branch nonce, computes the challenge hash, and generates
|
|
280
|
+
* a 60-second one-time approval link. The approver must reply with:
|
|
281
|
+
* APPROVE <TOTP-code> <nonce>
|
|
282
|
+
*
|
|
283
|
+
* @param requestId - Approval request identifier (e.g. "pending-001")
|
|
284
|
+
* @param branchId - Branch that owns the TOTP seed
|
|
285
|
+
*/
|
|
286
|
+
export function issueChallenge(requestId, branchId) {
|
|
287
|
+
const state = loadState(branchId);
|
|
288
|
+
if (!state) {
|
|
289
|
+
throw new Error(`MFA not configured for branch '${branchId}'. Run: agentvault approve mfa setup --branch ${branchId}`);
|
|
290
|
+
}
|
|
291
|
+
if (state.locked) {
|
|
292
|
+
throw new Error(`Branch '${branchId}' is locked due to a security anomaly. ` +
|
|
293
|
+
`Investigate, then run: agentvault approve mfa unlock --branch ${branchId}`);
|
|
294
|
+
}
|
|
295
|
+
// Monotonically increment nonce
|
|
296
|
+
state.currentNonce += 1;
|
|
297
|
+
state.updatedAt = new Date().toISOString();
|
|
298
|
+
saveState(state);
|
|
299
|
+
const nonce = state.currentNonce;
|
|
300
|
+
const timestamp = new Date().toISOString();
|
|
301
|
+
const challengeHash = computeChallengeHash(nonce, branchId, timestamp);
|
|
302
|
+
const token = generateOtpToken(requestId, branchId, nonce);
|
|
303
|
+
const expiresAt = new Date(Date.now() + LINK_TTL_MS).toISOString();
|
|
304
|
+
appendAuditEntry({
|
|
305
|
+
id: makeAuditId(),
|
|
306
|
+
requestId,
|
|
307
|
+
branchId,
|
|
308
|
+
event: 'challenge-issued',
|
|
309
|
+
nonce,
|
|
310
|
+
challengeHash,
|
|
311
|
+
timestamp,
|
|
312
|
+
detail: `One-time link expires at ${expiresAt}`,
|
|
313
|
+
});
|
|
314
|
+
return {
|
|
315
|
+
requestId,
|
|
316
|
+
branchId,
|
|
317
|
+
nonce,
|
|
318
|
+
timestamp,
|
|
319
|
+
challengeHash,
|
|
320
|
+
approvalLink: `https://agentvault.approve/${requestId}?token=${token}`,
|
|
321
|
+
expiresAt,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Verify a TOTP code + nonce submitted by the approver.
|
|
326
|
+
*
|
|
327
|
+
* Runs all five security layers in order:
|
|
328
|
+
* 1. MFA setup / branch-lock check
|
|
329
|
+
* 2. Nonce match + replay detection
|
|
330
|
+
* 3. TOTP verification (±1 window for clock drift)
|
|
331
|
+
* 4. Rate-limit check (3 / hour)
|
|
332
|
+
* 5. Device-fingerprint anomaly detection
|
|
333
|
+
*
|
|
334
|
+
* On success, marks the nonce as consumed, appends an audit entry,
|
|
335
|
+
* and returns a cryptographic auditToken suitable for on-chain logging.
|
|
336
|
+
*/
|
|
337
|
+
export function verifyMfaApproval(input) {
|
|
338
|
+
const { requestId, branchId, totpCode, nonce } = input;
|
|
339
|
+
const fingerprint = input.deviceFingerprint ?? getDeviceFingerprint();
|
|
340
|
+
const now = new Date().toISOString();
|
|
341
|
+
// ── Layer 1: setup / lock check ──────────────────────────────────────────
|
|
342
|
+
const state = loadState(branchId);
|
|
343
|
+
if (!state) {
|
|
344
|
+
return { ok: false, reason: 'not-setup' };
|
|
345
|
+
}
|
|
346
|
+
if (state.locked) {
|
|
347
|
+
appendAuditEntry({
|
|
348
|
+
id: makeAuditId(),
|
|
349
|
+
requestId,
|
|
350
|
+
branchId,
|
|
351
|
+
event: 'rejected',
|
|
352
|
+
nonce,
|
|
353
|
+
timestamp: now,
|
|
354
|
+
detail: 'Branch is locked — approval blocked',
|
|
355
|
+
deviceFingerprint: fingerprint,
|
|
356
|
+
});
|
|
357
|
+
return { ok: false, reason: 'branch-locked' };
|
|
358
|
+
}
|
|
359
|
+
// ── Layer 2: nonce match ──────────────────────────────────────────────────
|
|
360
|
+
if (nonce !== state.currentNonce) {
|
|
361
|
+
appendAuditEntry({
|
|
362
|
+
id: makeAuditId(),
|
|
363
|
+
requestId,
|
|
364
|
+
branchId,
|
|
365
|
+
event: 'rejected',
|
|
366
|
+
nonce,
|
|
367
|
+
timestamp: now,
|
|
368
|
+
detail: `Nonce mismatch — expected ${state.currentNonce}, got ${nonce}`,
|
|
369
|
+
deviceFingerprint: fingerprint,
|
|
370
|
+
});
|
|
371
|
+
return { ok: false, reason: 'nonce-mismatch' };
|
|
372
|
+
}
|
|
373
|
+
// ── Layer 2b: replay detection ────────────────────────────────────────────
|
|
374
|
+
if (state.usedNonces.includes(nonce)) {
|
|
375
|
+
appendAuditEntry({
|
|
376
|
+
id: makeAuditId(),
|
|
377
|
+
requestId,
|
|
378
|
+
branchId,
|
|
379
|
+
event: 'rejected',
|
|
380
|
+
nonce,
|
|
381
|
+
timestamp: now,
|
|
382
|
+
detail: 'Nonce already consumed — replay attempt blocked',
|
|
383
|
+
deviceFingerprint: fingerprint,
|
|
384
|
+
});
|
|
385
|
+
return { ok: false, reason: 'nonce-replayed' };
|
|
386
|
+
}
|
|
387
|
+
// ── Layer 3: TOTP verification ────────────────────────────────────────────
|
|
388
|
+
const secret = base32Decode(state.totpSecretB32);
|
|
389
|
+
if (!verifyTotp(secret, totpCode)) {
|
|
390
|
+
appendAuditEntry({
|
|
391
|
+
id: makeAuditId(),
|
|
392
|
+
requestId,
|
|
393
|
+
branchId,
|
|
394
|
+
event: 'rejected',
|
|
395
|
+
nonce,
|
|
396
|
+
timestamp: now,
|
|
397
|
+
detail: 'TOTP code invalid',
|
|
398
|
+
deviceFingerprint: fingerprint,
|
|
399
|
+
});
|
|
400
|
+
return { ok: false, reason: 'invalid-totp' };
|
|
401
|
+
}
|
|
402
|
+
// ── Layer 4: rate limiting ────────────────────────────────────────────────
|
|
403
|
+
if (!checkAndRecordRateLimit(fingerprint)) {
|
|
404
|
+
appendAuditEntry({
|
|
405
|
+
id: makeAuditId(),
|
|
406
|
+
requestId,
|
|
407
|
+
branchId,
|
|
408
|
+
event: 'rate-limit-exceeded',
|
|
409
|
+
nonce,
|
|
410
|
+
timestamp: now,
|
|
411
|
+
detail: `Device ${fingerprint} exceeded ${RATE_MAX} approvals / hour`,
|
|
412
|
+
deviceFingerprint: fingerprint,
|
|
413
|
+
});
|
|
414
|
+
return { ok: false, reason: 'rate-limited' };
|
|
415
|
+
}
|
|
416
|
+
// ── Layer 5: anomaly detection ────────────────────────────────────────────
|
|
417
|
+
// Use branchId as the stable identity key: tracks which devices have ever
|
|
418
|
+
// successfully approved requests for this branch.
|
|
419
|
+
const deviceCheck = checkDevice(branchId, fingerprint);
|
|
420
|
+
if (deviceCheck === 'new-device') {
|
|
421
|
+
// Auto-lock the branch and demand secondary confirmation
|
|
422
|
+
state.locked = true;
|
|
423
|
+
state.pendingAnomalyFingerprint = fingerprint;
|
|
424
|
+
state.updatedAt = new Date().toISOString();
|
|
425
|
+
saveState(state);
|
|
426
|
+
appendAuditEntry({
|
|
427
|
+
id: makeAuditId(),
|
|
428
|
+
requestId,
|
|
429
|
+
branchId,
|
|
430
|
+
event: 'anomaly-detected',
|
|
431
|
+
nonce,
|
|
432
|
+
timestamp: now,
|
|
433
|
+
detail: `Unknown device fingerprint ${fingerprint} — was this you? Reply YES via TOTP to agentvault approve mfa unlock --branch ${branchId} --register-device ${fingerprint}`,
|
|
434
|
+
deviceFingerprint: fingerprint,
|
|
435
|
+
});
|
|
436
|
+
appendAuditEntry({
|
|
437
|
+
id: makeAuditId(),
|
|
438
|
+
requestId,
|
|
439
|
+
branchId,
|
|
440
|
+
event: 'anomaly-ping-sent',
|
|
441
|
+
timestamp: now,
|
|
442
|
+
detail: `Branch auto-locked. Operator notified: run 'agentvault approve mfa unlock --branch ${branchId} --totp <code> --register-device ${fingerprint}' to confirm and re-register, or leave unregistered to deny.`,
|
|
443
|
+
deviceFingerprint: fingerprint,
|
|
444
|
+
});
|
|
445
|
+
appendAuditEntry({
|
|
446
|
+
id: makeAuditId(),
|
|
447
|
+
requestId,
|
|
448
|
+
branchId,
|
|
449
|
+
event: 'branch-locked',
|
|
450
|
+
timestamp: now,
|
|
451
|
+
detail: 'Auto-locked after anomaly. Confirm via secondary TOTP then call unlockBranch().',
|
|
452
|
+
deviceFingerprint: fingerprint,
|
|
453
|
+
});
|
|
454
|
+
return { ok: false, reason: 'anomaly' };
|
|
455
|
+
}
|
|
456
|
+
// ── All layers passed — commit the approval ───────────────────────────────
|
|
457
|
+
// Consume the nonce (replay guard)
|
|
458
|
+
state.usedNonces.push(nonce);
|
|
459
|
+
state.updatedAt = now;
|
|
460
|
+
saveState(state);
|
|
461
|
+
// Compute an HMAC-based audit token over the approval payload
|
|
462
|
+
const challengeHash = computeChallengeHash(nonce, branchId, now);
|
|
463
|
+
const auditToken = crypto
|
|
464
|
+
.createHmac('sha256', base32Decode(state.totpSecretB32))
|
|
465
|
+
.update(`${nonce}:${requestId}:${branchId}:${now}`)
|
|
466
|
+
.digest('hex');
|
|
467
|
+
appendAuditEntry({
|
|
468
|
+
id: makeAuditId(),
|
|
469
|
+
requestId,
|
|
470
|
+
branchId,
|
|
471
|
+
event: 'approved',
|
|
472
|
+
nonce,
|
|
473
|
+
challengeHash,
|
|
474
|
+
auditToken,
|
|
475
|
+
timestamp: now,
|
|
476
|
+
detail: `Approved by device ${fingerprint}`,
|
|
477
|
+
deviceFingerprint: fingerprint,
|
|
478
|
+
});
|
|
479
|
+
return { ok: true, auditToken };
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Verify a biometric (WebAuthn) assertion instead of a TOTP code.
|
|
483
|
+
*
|
|
484
|
+
* This is the Layer 2 fallback path: used when TOTP is unavailable or the
|
|
485
|
+
* approver's device natively supports WebAuthn (iOS Face ID, Android fingerprint,
|
|
486
|
+
* YubiKey, etc.).
|
|
487
|
+
*
|
|
488
|
+
* The flow:
|
|
489
|
+
* 1. Caller obtains a challengeHash from issueChallenge().
|
|
490
|
+
* 2. Device signs it via signChallenge() (or browser WebAuthn API).
|
|
491
|
+
* 3. This function verifies the ECDSA signature, nonce, rate-limit, and anomaly.
|
|
492
|
+
* 4. On success an auditToken is returned identical to the TOTP path.
|
|
493
|
+
*
|
|
494
|
+
* @param input - { requestId, branchId, challengeHash, assertion, nonce, deviceFingerprint? }
|
|
495
|
+
*/
|
|
496
|
+
export function verifyBiometricApproval(input) {
|
|
497
|
+
const { requestId, branchId, challengeHash, assertion, nonce } = input;
|
|
498
|
+
const fingerprint = input.deviceFingerprint ?? getDeviceFingerprint();
|
|
499
|
+
const now = new Date().toISOString();
|
|
500
|
+
// ── Layer 1: setup / lock check ──────────────────────────────────────────
|
|
501
|
+
const state = loadState(branchId);
|
|
502
|
+
if (!state)
|
|
503
|
+
return { ok: false, reason: 'not-setup' };
|
|
504
|
+
if (state.locked) {
|
|
505
|
+
appendAuditEntry({
|
|
506
|
+
id: makeAuditId(), requestId, branchId, event: 'rejected',
|
|
507
|
+
nonce, timestamp: now,
|
|
508
|
+
detail: 'Branch is locked — biometric approval blocked',
|
|
509
|
+
deviceFingerprint: fingerprint,
|
|
510
|
+
});
|
|
511
|
+
return { ok: false, reason: 'branch-locked' };
|
|
512
|
+
}
|
|
513
|
+
// ── Layer 2: nonce match + replay ─────────────────────────────────────────
|
|
514
|
+
if (nonce !== state.currentNonce) {
|
|
515
|
+
appendAuditEntry({
|
|
516
|
+
id: makeAuditId(), requestId, branchId, event: 'rejected',
|
|
517
|
+
nonce, timestamp: now,
|
|
518
|
+
detail: `Nonce mismatch — expected ${state.currentNonce}, got ${nonce}`,
|
|
519
|
+
deviceFingerprint: fingerprint,
|
|
520
|
+
});
|
|
521
|
+
return { ok: false, reason: 'nonce-mismatch' };
|
|
522
|
+
}
|
|
523
|
+
if (state.usedNonces.includes(nonce)) {
|
|
524
|
+
appendAuditEntry({
|
|
525
|
+
id: makeAuditId(), requestId, branchId, event: 'rejected',
|
|
526
|
+
nonce, timestamp: now,
|
|
527
|
+
detail: 'Nonce already consumed — replay attempt blocked',
|
|
528
|
+
deviceFingerprint: fingerprint,
|
|
529
|
+
});
|
|
530
|
+
return { ok: false, reason: 'nonce-replayed' };
|
|
531
|
+
}
|
|
532
|
+
// ── Layer 3: biometric signature verification ─────────────────────────────
|
|
533
|
+
const publicKeyB64 = getDevicePublicKey(fingerprint);
|
|
534
|
+
if (!publicKeyB64) {
|
|
535
|
+
appendAuditEntry({
|
|
536
|
+
id: makeAuditId(), requestId, branchId, event: 'rejected',
|
|
537
|
+
nonce, timestamp: now,
|
|
538
|
+
detail: `No biometric credential enrolled for device ${fingerprint}`,
|
|
539
|
+
deviceFingerprint: fingerprint,
|
|
540
|
+
});
|
|
541
|
+
return { ok: false, reason: 'biometric-not-enrolled' };
|
|
542
|
+
}
|
|
543
|
+
const lastCounter = getSignCounter(fingerprint) - 1; // current stored is already incremented
|
|
544
|
+
const verifyResult = verifyWebAuthnAssertion(assertion, challengeHash, publicKeyB64, lastCounter);
|
|
545
|
+
if (!verifyResult.ok) {
|
|
546
|
+
const reason = verifyResult.reason === 'counter-replay'
|
|
547
|
+
? 'biometric-counter-replay'
|
|
548
|
+
: 'biometric-signature-invalid';
|
|
549
|
+
appendAuditEntry({
|
|
550
|
+
id: makeAuditId(), requestId, branchId, event: 'rejected',
|
|
551
|
+
nonce, timestamp: now,
|
|
552
|
+
detail: `Biometric verification failed: ${verifyResult.reason}`,
|
|
553
|
+
deviceFingerprint: fingerprint,
|
|
554
|
+
});
|
|
555
|
+
return { ok: false, reason };
|
|
556
|
+
}
|
|
557
|
+
// ── Layer 4: rate limiting ────────────────────────────────────────────────
|
|
558
|
+
if (!checkAndRecordRateLimit(fingerprint)) {
|
|
559
|
+
appendAuditEntry({
|
|
560
|
+
id: makeAuditId(), requestId, branchId,
|
|
561
|
+
event: 'rate-limit-exceeded', nonce, timestamp: now,
|
|
562
|
+
detail: `Device ${fingerprint} exceeded ${RATE_MAX} approvals / hour`,
|
|
563
|
+
deviceFingerprint: fingerprint,
|
|
564
|
+
});
|
|
565
|
+
return { ok: false, reason: 'rate-limited' };
|
|
566
|
+
}
|
|
567
|
+
// ── Layer 5: anomaly detection ────────────────────────────────────────────
|
|
568
|
+
const deviceCheck = checkDevice(branchId, fingerprint);
|
|
569
|
+
if (deviceCheck === 'new-device') {
|
|
570
|
+
state.locked = true;
|
|
571
|
+
state.pendingAnomalyFingerprint = fingerprint;
|
|
572
|
+
state.updatedAt = new Date().toISOString();
|
|
573
|
+
saveState(state);
|
|
574
|
+
appendAuditEntry({
|
|
575
|
+
id: makeAuditId(), requestId, branchId, event: 'anomaly-detected',
|
|
576
|
+
nonce, timestamp: now,
|
|
577
|
+
detail: `Unknown biometric device ${fingerprint} — was this you? Reply YES via TOTP to unlock.`,
|
|
578
|
+
deviceFingerprint: fingerprint,
|
|
579
|
+
});
|
|
580
|
+
appendAuditEntry({
|
|
581
|
+
id: makeAuditId(), requestId, branchId, event: 'branch-locked',
|
|
582
|
+
timestamp: now,
|
|
583
|
+
detail: 'Auto-locked after biometric anomaly.',
|
|
584
|
+
deviceFingerprint: fingerprint,
|
|
585
|
+
});
|
|
586
|
+
return { ok: false, reason: 'anomaly' };
|
|
587
|
+
}
|
|
588
|
+
// ── All layers passed ─────────────────────────────────────────────────────
|
|
589
|
+
state.usedNonces.push(nonce);
|
|
590
|
+
state.updatedAt = now;
|
|
591
|
+
saveState(state);
|
|
592
|
+
const auditToken = crypto
|
|
593
|
+
.createHmac('sha256', base32Decode(state.totpSecretB32))
|
|
594
|
+
.update(`biometric:${nonce}:${requestId}:${branchId}:${now}`)
|
|
595
|
+
.digest('hex');
|
|
596
|
+
appendAuditEntry({
|
|
597
|
+
id: makeAuditId(), requestId, branchId,
|
|
598
|
+
event: 'approved-biometric', nonce, challengeHash,
|
|
599
|
+
auditToken, timestamp: now,
|
|
600
|
+
detail: `Approved via biometric by device ${fingerprint} (signCounter=${assertion.signCounter})`,
|
|
601
|
+
deviceFingerprint: fingerprint,
|
|
602
|
+
});
|
|
603
|
+
return { ok: true, auditToken };
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* Unlock a branch after an anomaly has been investigated.
|
|
607
|
+
*
|
|
608
|
+
* Requires a valid TOTP code to prevent unauthorised unlocking.
|
|
609
|
+
* Optionally registers the new device fingerprint so future approvals succeed.
|
|
610
|
+
*
|
|
611
|
+
* @param branchId - Branch to unlock
|
|
612
|
+
* @param totpCode - Fresh 6-digit TOTP code from the authenticator app
|
|
613
|
+
* @param newFingerprint - If provided, add this fingerprint to the known-device list
|
|
614
|
+
*/
|
|
615
|
+
export function unlockBranch(branchId, totpCode, newFingerprint) {
|
|
616
|
+
const state = loadState(branchId);
|
|
617
|
+
if (!state)
|
|
618
|
+
return false;
|
|
619
|
+
const secret = base32Decode(state.totpSecretB32);
|
|
620
|
+
if (!verifyTotp(secret, totpCode))
|
|
621
|
+
return false;
|
|
622
|
+
state.locked = false;
|
|
623
|
+
state.pendingAnomalyFingerprint = undefined;
|
|
624
|
+
state.updatedAt = new Date().toISOString();
|
|
625
|
+
saveState(state);
|
|
626
|
+
if (newFingerprint) {
|
|
627
|
+
registerDevice(branchId, newFingerprint);
|
|
628
|
+
}
|
|
629
|
+
appendAuditEntry({
|
|
630
|
+
id: makeAuditId(),
|
|
631
|
+
requestId: 'unlock',
|
|
632
|
+
branchId,
|
|
633
|
+
event: 'branch-unlocked',
|
|
634
|
+
timestamp: new Date().toISOString(),
|
|
635
|
+
detail: newFingerprint
|
|
636
|
+
? `Branch unlocked; device ${newFingerprint} registered as trusted (anomaly confirmed as operator)`
|
|
637
|
+
: 'Branch unlocked after anomaly investigation (new device NOT registered)',
|
|
638
|
+
deviceFingerprint: newFingerprint,
|
|
639
|
+
});
|
|
640
|
+
return true;
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* Return the complete audit log for a branch.
|
|
644
|
+
* Suitable for piping to the ICP canister or displaying with `approve mfa audit`.
|
|
645
|
+
*/
|
|
646
|
+
export function getMfaAuditLog(branchId) {
|
|
647
|
+
const fp = auditFile(branchId);
|
|
648
|
+
if (!fs.existsSync(fp))
|
|
649
|
+
return [];
|
|
650
|
+
return parse(fs.readFileSync(fp, 'utf8'));
|
|
651
|
+
}
|
|
652
|
+
/**
|
|
653
|
+
* Return the current MFA posture for a branch (no secrets exposed).
|
|
654
|
+
*/
|
|
655
|
+
export function getMfaStatus(branchId) {
|
|
656
|
+
const state = loadState(branchId);
|
|
657
|
+
if (!state) {
|
|
658
|
+
return { configured: false, locked: false, currentNonce: 0, usedNonceCount: 0 };
|
|
659
|
+
}
|
|
660
|
+
return {
|
|
661
|
+
configured: true,
|
|
662
|
+
locked: state.locked,
|
|
663
|
+
currentNonce: state.currentNonce,
|
|
664
|
+
usedNonceCount: state.usedNonces.length,
|
|
665
|
+
createdAt: state.createdAt,
|
|
666
|
+
};
|
|
667
|
+
}
|
|
668
|
+
//# sourceMappingURL=mfa-approval.js.map
|