-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path.env.example
More file actions
331 lines (317 loc) · 15 KB
/
.env.example
File metadata and controls
331 lines (317 loc) · 15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
# Kaspa network configuration for local dev / static deploys
# Recommended for production/runtime switching: configure per-network endpoints
VITE_KAS_API_MAINNET=https://api.kaspa.org
VITE_KAS_API_TESTNET=https://api-tn10.kaspa.org
VITE_KAS_API_FALLBACKS_MAINNET=
VITE_KAS_API_FALLBACKS_TESTNET=
# Extension endpoint pools (comma-separated, used by extension/network/kaspaClient.ts)
VITE_KASPA_MAINNET_API_ENDPOINTS=https://api.kaspa.org
VITE_KASPA_TN10_API_ENDPOINTS=https://api-tn10.kaspa.org
VITE_KASPA_TN11_API_ENDPOINTS=https://api-tn11.kaspa.org
VITE_KASPA_TN12_API_ENDPOINTS=https://api-tn12.kaspa.org
# Optional provider preset pools (used by extension Security tab presets)
# Defaults map to verified Kaspa L1 API roots so all presets work out-of-box.
# Override these to route through provider-specific infrastructure.
VITE_KASPA_IGRA_MAINNET_API_ENDPOINTS=https://api.kaspa.org
VITE_KASPA_IGRA_TN10_API_ENDPOINTS=https://api-tn10.kaspa.org
VITE_KASPA_IGRA_TN11_API_ENDPOINTS=https://api-tn11.kaspa.org
VITE_KASPA_IGRA_TN12_API_ENDPOINTS=https://api-tn12.kaspa.org
VITE_KASPA_KASPLEX_MAINNET_API_ENDPOINTS=https://api.kaspa.org
VITE_KASPA_KASPLEX_TN10_API_ENDPOINTS=https://api-tn10.kaspa.org
VITE_KASPA_KASPLEX_TN11_API_ENDPOINTS=https://api-tn11.kaspa.org
VITE_KASPA_KASPLEX_TN12_API_ENDPOINTS=https://api-tn12.kaspa.org
# Extension pending request controls (connect/sign queue hardening)
VITE_EXT_PENDING_REQUEST_TTL_MS=120000
VITE_EXT_PENDING_PER_ORIGIN=4
VITE_EXT_PENDING_TOTAL_MAX=40
VITE_EXT_PENDING_STRICT_GLOBAL_ORDER=false
# If true, background can open extension popup as a standalone window when
# chrome.action.openPopup() is unavailable. Keep false to avoid extra popup windows.
VITE_EXT_POPUP_WINDOW_FALLBACK=false
# Forge-OS connect policy:
# - true => require extension-auth connect (popup approval / vault state)
# - false => allow managed-wallet localStorage fallback when extension transport is unavailable
VITE_FORGEOS_STRICT_EXTENSION_AUTH_CONNECT=true
# Extension send fee policy
# Fee = estimateFee * VITE_EXT_TX_FEE_SAFETY_BPS / 10000, clamped to min/max.
VITE_EXT_TX_FEE_SAFETY_BPS=11500
VITE_EXT_TX_FEE_MIN_SOMPI=1000
VITE_EXT_TX_FEE_MAX_SOMPI=200000000
VITE_KAS_EXPLORER_MAINNET=https://explorer.kaspa.org
VITE_KAS_EXPLORER_TESTNET=https://explorer-tn10.kaspa.org
VITE_KAS_WS_URL_MAINNET=
VITE_KAS_WS_URL_TESTNET=
# Legacy single-endpoint vars (still supported; scoped vars above take precedence)
VITE_KAS_API=https://api.kaspa.org
VITE_KAS_API_FALLBACKS=
VITE_KAS_EXPLORER=https://explorer.kaspa.org
VITE_KAS_NETWORK=mainnet
VITE_KAS_NETWORK_LABEL=Kaspa Mainnet
VITE_KAS_WS_URL=
VITE_KASPIUM_DEEP_LINK_SCHEME=kaspium://
VITE_KAS_ENFORCE_WALLET_NETWORK=true
VITE_ACCUMULATE_ONLY=true
# Swap route source (live Kaspa-native default; can be overridden per deployment)
# route source: blocked | kaspa_native | evm_0x
VITE_SWAP_ENABLED=true
VITE_SWAP_ROUTE_SOURCE=kaspa_native
VITE_SWAP_DEX_ENDPOINT=
VITE_SWAP_KASPA_NATIVE_QUOTE_PATH=/quote
VITE_SWAP_KASPA_NATIVE_EXECUTE_PATH=/execute
VITE_SWAP_KASPA_NATIVE_STATUS_PATH=/status
VITE_SWAP_KASPA_NATIVE_TIMEOUT_MS=12000
VITE_SWAP_KRC_TOKEN_METADATA_ENDPOINTS=
VITE_SWAP_KRC_TOKEN_METADATA_CACHE_TTL_MS=20000
VITE_SWAP_KRC_TOKEN_METADATA_CACHE_MAX_ENTRIES=512
VITE_SWAP_KRC_TOKEN_METADATA_ENDPOINT_SUCCESS_REWARD=12
VITE_SWAP_KRC_TOKEN_METADATA_ENDPOINT_FAILURE_PENALTY=35
VITE_SWAP_KRC_TOKEN_METADATA_ENDPOINT_TIMEOUT_PENALTY=55
VITE_SWAP_KRC_TOKEN_METADATA_ENDPOINT_MISS_PENALTY=8
VITE_SWAP_KRC_TOKEN_METADATA_ENDPOINT_LATENCY_PENALTY_PER_100MS=2
VITE_SWAP_KRC_TOKEN_METADATA_ENDPOINT_DECAY_TAU_MS=120000
VITE_SWAP_KRC_TOKEN_METADATA_ENDPOINT_BACKOFF_BASE_MS=1500
VITE_SWAP_KRC_TOKEN_METADATA_ENDPOINT_BACKOFF_MAX_MS=30000
VITE_SWAP_MAX_SLIPPAGE_BPS=500
VITE_SWAP_DEFAULT_SLIPPAGE_BPS=50
VITE_SWAP_EVM_CHAIN_IDS=1
VITE_SWAP_REQUIRE_EXTERNAL_EVM_SIGNER=true
VITE_SWAP_ZEROX_QUOTE_ENDPOINT=https://api.0x.org/swap/allowance-holder/quote
VITE_SWAP_ZEROX_API_KEY=
VITE_SWAP_ZEROX_EXPECTED_SETTLER_TO=
VITE_SWAP_ZEROX_EXPECTED_ALLOWANCE_SPENDER=
VITE_SWAP_SETTLEMENT_CONFIRMATIONS=2
VITE_SWAP_SETTLEMENT_POLL_MS=4000
VITE_SWAP_SETTLEMENT_TIMEOUT_MS=240000
# Optional: network-specific treasury and accumulation vault addresses
VITE_TREASURY_ADDRESS_MAINNET=kaspa:qpv7fcvdlz6th4hqjtm9qkkms2dw0raem963x3hm8glu3kjgj7922vy69hv85
VITE_TREASURY_ADDRESS_TESTNET=kaspatest:qpqz2vxj23kvh0m73ta2jjn2u4cv4tlufqns2eap8mxyyt0rvrxy6ejkful67
VITE_ACCUMULATION_ADDRESS_MAINNET=kaspa:qpv7fcvdlz6th4hqjtm9qkkms2dw0raem963x3hm8glu3kjgj7922vy69hv85
VITE_ACCUMULATION_ADDRESS_TESTNET=kaspatest:qpqz2vxj23kvh0m73ta2jjn2u4cv4tlufqns2eap8mxyyt0rvrxy6ejkful67
# Optional demo wallet addresses for WalletGate demo mode
VITE_DEMO_ADDRESS_MAINNET=kaspa:qpv7fcvdlz6th4hqjtm9qkkms2dw0raem963x3hm8glu3kjgj7922vy69hv85
VITE_DEMO_ADDRESS_TESTNET=kaspatest:qpqz2vxj23kvh0m73ta2jjn2u4cv4tlufqns2eap8mxyyt0rvrxy6ejkful67
# Fee routing
VITE_FEE_RATE=0.20
VITE_TREASURY_SPLIT=0.30
# If true, ForgeOS attempts a separate on-chain micro-transfer of the treasury fee share after each executed action
VITE_TREASURY_FEE_ONCHAIN_ENABLED=true
# AI engine configuration
# Recommended for production: point to your backend proxy endpoint
VITE_AI_API_URL=https://api.anthropic.com/v1/messages
VITE_AI_MODEL=claude-sonnet-4-20250514
VITE_ANTHROPIC_API_KEY=
VITE_AI_FALLBACK_ENABLED=true
# For strict real-AI-only behavior, set:
# VITE_AI_OVERLAY_MODE=always
# VITE_AI_FALLBACK_ENABLED=false
# AI overlay policy for quant-core + AI hybrid engine:
# - always: call real AI every cycle
# - adaptive: call real AI on uncertain/sensitive regimes, reuse cache otherwise
# - off: quant-core only
VITE_AI_OVERLAY_MODE=always
# Minimum spacing between AI overlay calls for the same agent/state signature
VITE_AI_OVERLAY_MIN_INTERVAL_MS=15000
# Max age for cached AI overlay reuse (adaptive mode / transient AI failures)
VITE_AI_OVERLAY_CACHE_TTL_MS=45000
# Soft timeout for AI overlay requests (kept low for cycle latency)
VITE_AI_SOFT_TIMEOUT_MS=2200
# Retry attempts for transient AI transport/API failures (429/5xx/network)
VITE_AI_MAX_ATTEMPTS=2
# Run quant+AI engine in Web Worker (recommended for many agents/tabs)
VITE_QUANT_WORKER_ENABLED=true
# Worker request timeout before fallback to main-thread quant engine
VITE_QUANT_WORKER_SOFT_TIMEOUT_MS=8000
# Experimental: enable Kastle raw-tx path (signAndBroadcastTx) for multi-output / treasury-combined sends
VITE_KASTLE_RAW_TX_ENABLED=false
# Optional backend tx-builder service for automatic Kastle txJson generation
VITE_KASTLE_TX_BUILDER_URL=
VITE_KASTLE_TX_BUILDER_TOKEN=
VITE_KASTLE_TX_BUILDER_TIMEOUT_MS=12000
# If true, fail immediately on tx-builder errors instead of falling back to bridge/manual txJson input
VITE_KASTLE_TX_BUILDER_STRICT=false
# Allow manual txJson prompt fallback for Kastle raw multi-output path when no tx builder bridge is injected
VITE_KASTLE_RAW_TX_MANUAL_JSON_PROMPT_ENABLED=true
# Optional backend receipt import (callback-consumer or compatible service) to drive UI PnL with backend confirmations/fees/slippage
VITE_EXECUTION_RECEIPT_IMPORT_ENABLED=true
VITE_EXECUTION_RECEIPT_API_URL=
VITE_EXECUTION_RECEIPT_API_TOKEN=
VITE_EXECUTION_RECEIPT_API_TIMEOUT_MS=4000
VITE_EXECUTION_RECEIPT_SSE_ENABLED=true
VITE_EXECUTION_RECEIPT_SSE_URL=
VITE_EXECUTION_RECEIPT_SSE_REPLAY=true
VITE_EXECUTION_RECEIPT_SSE_REPLAY_LIMIT=100
VITE_PNL_REALIZED_MIN_CONFIRMATIONS=1
# Optional JSON policy to raise realized confirmation floors by action/risk/amount tier.
# Example: {"base":1,"byAction":{"REDUCE":2},"byRisk":{"HIGH":3},"amountTiersKas":[{"minAmountKas":25,"minConfirmations":4}]}
VITE_PNL_REALIZED_CONFIRMATION_POLICY_JSON=
# Degrade "realized" attribution to hybrid when backend-vs-chain receipt mismatch rate is too high
VITE_RECEIPT_CONSISTENCY_DEGRADE_MIN_CHECKS=6
VITE_RECEIPT_CONSISTENCY_DEGRADE_MISMATCH_RATE_PCT=20
VITE_RECEIPT_CONSISTENCY_BLOCK_AUTO_APPROVE_ON_DEGRADED=true
# Calibration guardrails: scale ACCUMULATE sizing first, then disable auto-approve if health falls too low
VITE_CALIBRATION_GUARDRAILS_ENABLED=true
VITE_CALIBRATION_MIN_SAMPLES=12
VITE_CALIBRATION_BRIER_WARN=0.24
VITE_CALIBRATION_BRIER_CRITICAL=0.34
VITE_CALIBRATION_EV_CAL_ERROR_WARN_PCT=2.0
VITE_CALIBRATION_EV_CAL_ERROR_CRITICAL_PCT=5.0
VITE_CALIBRATION_REGIME_HIT_MIN_PCT=55
VITE_CALIBRATION_REGIME_HIT_CRITICAL_PCT=46
VITE_CALIBRATION_SIZE_MULTIPLIER_WARN=0.85
VITE_CALIBRATION_SIZE_MULTIPLIER_DEGRADED=0.6
VITE_CALIBRATION_SIZE_MULTIPLIER_CRITICAL=0.35
VITE_CALIBRATION_AUTO_APPROVE_DISABLE_HEALTH_BELOW=0.4
# Require a minimum sizing reduction before calibration guardrails disable auto-approve.
VITE_CALIBRATION_AUTO_APPROVE_DISABLE_MIN_SIZE_REDUCTION_PCT=0.1
# Optional backend audit signer (server-side cryptographic signatures for decision audit records)
# Set to full sign endpoint, e.g. http://127.0.0.1:8797/v1/audit-sign
VITE_DECISION_AUDIT_SIGNER_URL=
VITE_DECISION_AUDIT_SIGNER_TOKEN=
VITE_DECISION_AUDIT_SIGNER_TIMEOUT_MS=1500
VITE_DECISION_AUDIT_SIGNER_REQUIRED=false
# Optional UI-side verification/pinning for cryptographic decision audit signatures
VITE_DECISION_AUDIT_SIGNER_PUBLIC_KEY_URL=
VITE_DECISION_AUDIT_SIGNER_PUBLIC_KEY_CACHE_TTL_MS=300000
VITE_DECISION_AUDIT_SIGNER_PINNED_FINGERPRINTS=
VITE_DECISION_AUDIT_SIGNER_REQUIRE_PINNED=false
# Monetization / usage quota
VITE_FREE_CYCLES_PER_DAY=30
VITE_BILLING_UPGRADE_URL=
VITE_BILLING_CONTACT=
# Runtime automation (seconds between automatic cycles while RUNNING)
VITE_AUTO_CYCLE_SECONDS=120
# Safety default for transaction execution (recommended false)
VITE_LIVE_EXECUTION_DEFAULT=false
# Backend starter: AI proxy (server/ai-proxy)
AI_PROXY_ALLOWED_ORIGINS=*
AI_PROXY_MAX_QUEUE=1000
AI_PROXY_CONCURRENCY=4
AI_PROXY_RATE_LIMIT_WINDOW_MS=60000
AI_PROXY_RATE_LIMIT_MAX=30
ANTHROPIC_API_KEY=
# Backend starter: Scheduler (server/scheduler)
SCHEDULER_AUTH_TOKEN=
SCHEDULER_AUTH_TOKENS=
SCHEDULER_SERVICE_TOKENS_JSON=
SCHEDULER_JWT_HS256_SECRET=
SCHEDULER_JWT_ISSUER=
SCHEDULER_JWT_AUDIENCE=
# Optional OIDC discovery (RS256 JWT via issuer -> jwks_uri); direct SCHEDULER_JWKS_URL takes precedence if set
SCHEDULER_OIDC_ISSUER=
SCHEDULER_OIDC_DISCOVERY_TTL_MS=300000
SCHEDULER_JWKS_URL=
SCHEDULER_JWKS_CACHE_TTL_MS=300000
SCHEDULER_AUTH_HTTP_TIMEOUT_MS=5000
SCHEDULER_JWKS_ALLOWED_KIDS=
SCHEDULER_JWKS_REQUIRE_PINNED_KID=false
SCHEDULER_AUTH_READS=false
SCHEDULER_ALLOWED_ORIGINS=*
SCHEDULER_REDIS_URL=
SCHEDULER_REDIS_PREFIX=forgeos:scheduler
SCHEDULER_REDIS_CONNECT_TIMEOUT_MS=2000
SCHEDULER_REDIS_AUTHORITATIVE_QUEUE=true
SCHEDULER_REDIS_RESET_EXEC_QUEUE_ON_BOOT=false
SCHEDULER_INSTANCE_ID=
SCHEDULER_LEADER_LOCK_TTL_MS=5000
SCHEDULER_LEADER_LOCK_RENEW_MS=2500
SCHEDULER_LEADER_LOCK_RENEW_JITTER_MS=250
SCHEDULER_LEADER_ACQUIRE_BACKOFF_MIN_MS=150
SCHEDULER_LEADER_ACQUIRE_BACKOFF_MAX_MS=2000
SCHEDULER_JOB_LEASE_TTL_MS=15000
SCHEDULER_MAX_DUE_CLAIMS_PER_TICK=8
SCHEDULER_REDIS_EXEC_LEASE_TTL_MS=30000
SCHEDULER_REDIS_EXEC_REQUEUE_BATCH=16
SCHEDULER_CALLBACK_IDEMPOTENCY_TTL_MS=86400000
SCHEDULER_QUOTA_WINDOW_MS=60000
SCHEDULER_QUOTA_READ_MAX=600
SCHEDULER_QUOTA_WRITE_MAX=240
SCHEDULER_QUOTA_TICK_MAX=60
# Backend starter: Tx Builder (server/tx-builder) for automatic Kastle txJson generation
TX_BUILDER_AUTH_TOKEN=
TX_BUILDER_AUTH_TOKENS=
TX_BUILDER_AUTH_READS=false
TX_BUILDER_ALLOWED_ORIGINS=*
# Mode 1: command hook (preferred for local builder integration)
TX_BUILDER_COMMAND=
TX_BUILDER_COMMAND_TIMEOUT_MS=15000
# Mode 0: local kaspa-wasm constructor (automatic Kastle txJson generation from Kaspa UTXOs)
TX_BUILDER_LOCAL_WASM_ENABLED=true
TX_BUILDER_LOCAL_WASM_JSON_KIND=transaction
TX_BUILDER_LOCAL_WASM_COIN_SELECTION=auto
TX_BUILDER_LOCAL_WASM_MAX_INPUTS=48
TX_BUILDER_LOCAL_WASM_ESTIMATED_NETWORK_FEE_SOMPI=20000
TX_BUILDER_LOCAL_WASM_PER_INPUT_FEE_BUFFER_SOMPI=1500
TX_BUILDER_LOCAL_WASM_EXTRA_SAFETY_BUFFER_SOMPI=5000
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_MODE=request_or_fixed
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_SOMPI=0
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_OUTPUT_BPS=5
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_PER_OUTPUT_SOMPI=2000
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_MIN_SOMPI=0
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_MAX_SOMPI=2500000
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_ADAPTIVE_RECEIPT_LAG_HIGH_MS=12000
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_ADAPTIVE_RECEIPT_LAG_CRITICAL_MS=45000
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_ADAPTIVE_RECEIPT_LAG_BUMP_SOMPI=4000
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_ADAPTIVE_SCHEDULER_CALLBACK_HIGH_MS=500
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_ADAPTIVE_SCHEDULER_CALLBACK_CRITICAL_MS=2500
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_ADAPTIVE_SCHEDULER_CALLBACK_BUMP_SOMPI=2500
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_ADAPTIVE_STALE_HARD_SAFETY_BUMP_SOMPI=12000
TX_BUILDER_LOCAL_WASM_PRIORITY_FEE_ADAPTIVE_STALE_HARD_SAFETY_PER_INPUT_SOMPI=800
TX_BUILDER_LOCAL_WASM_PREFER_CONSOLIDATION=true
TX_BUILDER_KAS_API_BASE=
TX_BUILDER_KAS_API_MAINNET=https://api.kaspa.org
TX_BUILDER_KAS_API_TESTNET=https://api-tn10.kaspa.org
TX_BUILDER_KAS_API_TIMEOUT_MS=12000
# Bundled command adapter (server/tx-builder/commands/kastle-http-bridge-command.mjs) upstream config
KASTLE_TX_BUILDER_COMMAND_UPSTREAM_URL=
KASTLE_TX_BUILDER_COMMAND_UPSTREAM_TOKEN=
KASTLE_TX_BUILDER_COMMAND_TIMEOUT_MS=15000
# Mode 2: upstream proxy
TX_BUILDER_UPSTREAM_URL=
TX_BUILDER_UPSTREAM_TOKEN=
TX_BUILDER_REQUEST_TIMEOUT_MS=15000
# Optional live telemetry summaries (tx-builder adaptive fee mode auto-feed)
TX_BUILDER_CALLBACK_CONSUMER_SUMMARY_URL=
TX_BUILDER_CALLBACK_CONSUMER_SUMMARY_TOKEN=
TX_BUILDER_SCHEDULER_SUMMARY_URL=
TX_BUILDER_SCHEDULER_SUMMARY_TOKEN=
TX_BUILDER_TELEMETRY_SUMMARY_TIMEOUT_MS=3000
TX_BUILDER_TELEMETRY_SUMMARY_TTL_MS=5000
TX_BUILDER_TELEMETRY_SUMMARY_STALE_SOFT_MS=15000
TX_BUILDER_TELEMETRY_SUMMARY_STALE_HARD_MS=60000
TX_BUILDER_TELEMETRY_SUMMARY_REQUIRE_FRESH=false
TX_BUILDER_TELEMETRY_SAFETY_WINDOW_SIZE=48
TX_BUILDER_TELEMETRY_SAFETY_MIN_BUILDS=8
TX_BUILDER_TELEMETRY_SAFETY_FALLBACK_SPIKE_RATIO=0.12
TX_BUILDER_TELEMETRY_SAFETY_ESCALATE_ON_STALE_HARD=true
# Debug/manual mode only (allows caller-supplied txJson passthrough)
TX_BUILDER_ALLOW_MANUAL_TXJSON=false
# Backend starter: Callback Consumer (server/callback-consumer) with fence/idempotency enforcement + receipt ingestion
CALLBACK_CONSUMER_AUTH_TOKEN=
CALLBACK_CONSUMER_AUTH_TOKENS=
CALLBACK_CONSUMER_AUTH_READS=false
CALLBACK_CONSUMER_ALLOWED_ORIGINS=*
CALLBACK_CONSUMER_REDIS_URL=
CALLBACK_CONSUMER_REDIS_PREFIX=forgeos:callback-consumer
CALLBACK_CONSUMER_REDIS_CONNECT_TIMEOUT_MS=2000
CALLBACK_CONSUMER_IDEMPOTENCY_TTL_MS=86400000
CALLBACK_CONSUMER_MAX_EVENTS=500
CALLBACK_CONSUMER_MAX_RECEIPTS=2000
CALLBACK_CONSUMER_RECEIPT_SSE_HEARTBEAT_MS=15000
CALLBACK_CONSUMER_RECEIPT_SSE_MAX_CLIENTS=200
CALLBACK_CONSUMER_RECEIPT_SSE_REPLAY_DEFAULT_LIMIT=100
# Backend starter: Audit Signer (server/audit-signer) for server-side / HSM-ready decision audit signatures
AUDIT_SIGNER_AUTH_TOKEN=
AUDIT_SIGNER_AUTH_TOKENS=
AUDIT_SIGNER_AUTH_READS=false
AUDIT_SIGNER_ALLOWED_ORIGINS=*
# Mode 1: local private key (Ed25519 recommended)
AUDIT_SIGNER_PRIVATE_KEY_PEM=
AUDIT_SIGNER_PRIVATE_KEY_PATH=
AUDIT_SIGNER_KEY_ID=
AUDIT_SIGNER_INCLUDE_PUBLIC_KEY=true
# Mode 2: external command (HSM/KMS/remote signer adapter)
AUDIT_SIGNER_COMMAND=
AUDIT_SIGNER_COMMAND_TIMEOUT_MS=5000
# Optional append-only JSONL decision audit export (hash-chained JSONL for external verification / replay)
AUDIT_SIGNER_APPEND_LOG_PATH=
AUDIT_SIGNER_APPEND_LOG_MAX_EXPORT_LINES=2000