agent-embassy 1.6.0 → 1.7.0

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.
Files changed (97) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +9 -9
  3. package/README.zh-CN.md +9 -9
  4. package/SECURITY.md +34 -77
  5. package/dist/src/gateway/acp-client.d.ts +117 -0
  6. package/dist/src/gateway/acp-client.js +382 -0
  7. package/dist/src/gateway/acp-client.js.map +1 -0
  8. package/dist/src/gateway/acp-provider.d.ts +65 -0
  9. package/dist/src/gateway/acp-provider.js +163 -0
  10. package/dist/src/gateway/acp-provider.js.map +1 -0
  11. package/dist/src/gateway/claude-helper-protocol.d.ts +3 -1
  12. package/dist/src/gateway/claude-helper-protocol.js +15 -5
  13. package/dist/src/gateway/claude-helper-protocol.js.map +1 -1
  14. package/dist/src/gateway/claude-helper-supervisor.d.ts +3 -1
  15. package/dist/src/gateway/claude-helper-supervisor.js +16 -2
  16. package/dist/src/gateway/claude-helper-supervisor.js.map +1 -1
  17. package/dist/src/gateway/claude-helper.js +4 -3
  18. package/dist/src/gateway/claude-helper.js.map +1 -1
  19. package/dist/src/gateway/claude-peer.d.ts +1 -1
  20. package/dist/src/gateway/claude-peer.js +11 -13
  21. package/dist/src/gateway/claude-peer.js.map +1 -1
  22. package/dist/src/gateway/claude-runtime.d.ts +0 -20
  23. package/dist/src/gateway/claude-runtime.js +6 -127
  24. package/dist/src/gateway/claude-runtime.js.map +1 -1
  25. package/dist/src/gateway/cli-copy.en.d.ts +1 -1
  26. package/dist/src/gateway/cli-copy.en.js +2 -2
  27. package/dist/src/gateway/cli-copy.zh-CN.d.ts +1 -1
  28. package/dist/src/gateway/cli-copy.zh-CN.js +2 -2
  29. package/dist/src/gateway/cli.d.ts +1 -1
  30. package/dist/src/gateway/cli.js +26 -5
  31. package/dist/src/gateway/cli.js.map +1 -1
  32. package/dist/src/gateway/codex-app-server.d.ts +5 -74
  33. package/dist/src/gateway/codex-app-server.js +9 -597
  34. package/dist/src/gateway/codex-app-server.js.map +1 -1
  35. package/dist/src/gateway/codex-local-transport.d.ts +8 -26
  36. package/dist/src/gateway/codex-local-transport.js +26 -76
  37. package/dist/src/gateway/codex-local-transport.js.map +1 -1
  38. package/dist/src/gateway/compatibility.d.ts +6 -66
  39. package/dist/src/gateway/compatibility.js +14 -296
  40. package/dist/src/gateway/compatibility.js.map +1 -1
  41. package/dist/src/gateway/config.d.ts +9 -0
  42. package/dist/src/gateway/config.js +6 -2
  43. package/dist/src/gateway/config.js.map +1 -1
  44. package/dist/src/gateway/control.d.ts +16 -1
  45. package/dist/src/gateway/control.js +89 -57
  46. package/dist/src/gateway/control.js.map +1 -1
  47. package/dist/src/gateway/dashboard-copy.d.ts +1 -1
  48. package/dist/src/gateway/dashboard-copy.en.d.ts +14 -44
  49. package/dist/src/gateway/dashboard-copy.en.js +37 -67
  50. package/dist/src/gateway/dashboard-copy.en.js.map +1 -1
  51. package/dist/src/gateway/dashboard-copy.js +14 -44
  52. package/dist/src/gateway/dashboard-copy.js.map +1 -1
  53. package/dist/src/gateway/dashboard-copy.zh-CN.d.ts +14 -44
  54. package/dist/src/gateway/dashboard-copy.zh-CN.js +37 -67
  55. package/dist/src/gateway/dashboard-copy.zh-CN.js.map +1 -1
  56. package/dist/src/gateway/dashboard-model.d.ts +38 -76
  57. package/dist/src/gateway/dashboard-model.js +158 -256
  58. package/dist/src/gateway/dashboard-model.js.map +1 -1
  59. package/dist/src/gateway/dashboard.d.ts +0 -3
  60. package/dist/src/gateway/dashboard.js +75 -76
  61. package/dist/src/gateway/dashboard.js.map +1 -1
  62. package/dist/src/gateway/deepseek-detect.d.ts +7 -6
  63. package/dist/src/gateway/deepseek-detect.js +31 -115
  64. package/dist/src/gateway/deepseek-detect.js.map +1 -1
  65. package/dist/src/gateway/live-dashboard-app/app.js +166 -621
  66. package/dist/src/gateway/live-dashboard-command.js +2 -4
  67. package/dist/src/gateway/live-dashboard-command.js.map +1 -1
  68. package/dist/src/gateway/live-dashboard-http.d.ts +1 -2
  69. package/dist/src/gateway/live-dashboard-http.js +14 -15
  70. package/dist/src/gateway/live-dashboard-http.js.map +1 -1
  71. package/dist/src/gateway/progress-watch-machine.d.ts +1 -4
  72. package/dist/src/gateway/progress-watch-machine.js.map +1 -1
  73. package/dist/src/gateway/provenance-envelope.d.ts +3 -2
  74. package/dist/src/gateway/provenance-envelope.js +44 -11
  75. package/dist/src/gateway/provenance-envelope.js.map +1 -1
  76. package/dist/src/gateway/providers.d.ts +12 -84
  77. package/dist/src/gateway/providers.js +69 -806
  78. package/dist/src/gateway/providers.js.map +1 -1
  79. package/dist/src/gateway/server.d.ts +8 -9
  80. package/dist/src/gateway/server.js +51 -99
  81. package/dist/src/gateway/server.js.map +1 -1
  82. package/dist/src/gateway/service.d.ts +22 -49
  83. package/dist/src/gateway/service.js +196 -432
  84. package/dist/src/gateway/service.js.map +1 -1
  85. package/dist/src/gateway/store.d.ts +20 -29
  86. package/dist/src/gateway/store.js +281 -827
  87. package/dist/src/gateway/store.js.map +1 -1
  88. package/dist/src/gateway/types.d.ts +55 -55
  89. package/dist/src/gateway/types.js +49 -91
  90. package/dist/src/gateway/types.js.map +1 -1
  91. package/docs/CONFIGURATION.md +11 -10
  92. package/docs/CONFIGURATION.zh-CN.md +10 -9
  93. package/docs/DASHBOARD.md +4 -38
  94. package/docs/DASHBOARD.zh-CN.md +4 -2
  95. package/docs/GATEWAY-ARCHITECTURE.md +61 -119
  96. package/package.json +1 -1
  97. package/skills/embassy-peer/SKILL.md +6 -6
@@ -1,6 +1,6 @@
1
1
  import type { DashboardLocale } from "./locale.js";
2
2
  export { assertDashboardLocale, dashboardLocales, isDashboardLocale, type DashboardLocale, } from "./locale.js";
3
- export declare const dashboardCopyKeys: readonly ["meta.title", "skip", "language.label", "language.en", "language.zhCn", "brand.eyebrow", "brand.title", "brand.subtitle", "snapshot.asOf", "snapshot.static", "overall.ready", "overall.setup", "overall.attention", "exchange.eyebrow", "exchange.title", "exchange.note", "inbound.paired.badge", "inbound.paired.body", "inbound.open.badge", "inbound.open.body", "inbound.noPair.body", "exchange.claude.title", "exchange.claude.note", "exchange.codex.title", "exchange.codex.note", "exchange.pouch.title", "exchange.pouch.empty", "exchange.pouch.queued", "exchange.pouch.oldest", "exchange.count.claude", "exchange.count.codex", "status.ready", "status.busy", "status.waiting", "status.missing", "status.attention", "status.selected", "status.available", "status.notSelectable", "status.enabled", "status.disabled", "next.label", "next.none", "next.discoverClaude", "next.selectClaude", "next.pairRoutes", "next.restoreClaude", "next.repairClaude", "next.registerCodex", "next.restoreCodex", "next.reviewCompatibility", "attention.eyebrow", "attention.title", "attention.count", "attention.countVisible", "attention.projectionOnly", "attention.scope", "severity.info", "severity.warning", "severity.error", "guidance.reobserveClaude.title", "guidance.reobserveClaude.body", "guidance.reobserveClaude.action", "guidance.reobserveCodex.title", "guidance.reobserveCodex.body", "guidance.reobserveCodex.action", "guidance.codexReactivationRequired.title", "guidance.codexReactivationRequired.body", "guidance.codexReactivationRequired.action", "guidance.consentEdgeUnavailable.title", "guidance.consentEdgeUnavailable.body", "guidance.consentEdgeUnavailable.action", "guidance.claudeNotObserved.title", "guidance.claudeNotObserved.body", "guidance.claudeNotObserved.action", "guidance.codexStale.title", "guidance.codexStale.body", "guidance.codexStale.action", "guidance.codexAppReconnectRequired.title", "guidance.codexAppReconnectRequired.body", "guidance.codexAppReconnectRequired.action", "guidance.connectorOffline.title", "guidance.connectorOffline.body", "guidance.connectorOffline.action", "guidance.routeStale.title", "guidance.routeStale.body", "guidance.routeStale.action", "guidance.queueStalled.title", "guidance.queueStalled.body", "guidance.queueStalled.action", "guidance.queueStalled.busy", "guidance.recipientWaitingInput.title", "guidance.recipientWaitingInput.body", "guidance.recipientWaitingInput.action", "guidance.unconfirmed.title", "guidance.unconfirmed.body", "guidance.unconfirmed.action", "guidance.degraded.title", "guidance.degraded.body", "guidance.degraded.action", "guidance.providerIncompatible.title", "guidance.providerIncompatible.body", "guidance.providerIncompatible.action", "guidance.generic.title", "guidance.generic.body", "guidance.generic.action", "guidance.codexSuccessionBusy.title", "guidance.codexSuccessionBusy.body", "guidance.codexSuccessionBusy.action", "guidance.codexSuccessionRecovery.title", "guidance.codexSuccessionRecovery.body", "guidance.codexSuccessionRecovery.action", "guidance.progressWatch.title", "guidance.progressWatch.body", "guidance.progressWatch.action", "guidance.registryEmpty.title", "guidance.registryEmpty.body", "guidance.registryEmpty.action", "guidance.registryRejected.title", "guidance.registryRejected.body", "guidance.registryRejected.action", "transit.eyebrow", "transit.title", "transit.queued", "transit.active", "transit.oldest", "transit.empty", "transit.unavailable", "count.atLeast", "watches.eyebrow", "watches.title", "watches.note", "watches.empty", "watches.column.conversation", "watches.column.parties", "watches.column.quietFor", "watches.column.nextAction", "watches.column.nudges", "watches.history.title", "watches.event.opened", "watches.event.replaced", "watches.event.settled", "watches.actor.owner", "watches.actor.worker", "watches.actor.operator", "watches.actor.gateway", "watches.actor.unknown", "watches.reason.done", "watches.reason.untracked", "watches.reason.idleTimeout", "watches.reason.pairRemoved", "watches.reason.endpointRetired", "watches.reason.trackingDisabled", "watches.reason.legacyUpgrade", "watches.reason.legacyDone", "activity.eyebrow", "activity.title", "activity.note", "activity.empty", "activity.column.updated", "activity.column.route", "activity.column.id", "activity.column.result", "activity.column.elapsed", "activity.column.size", "activity.column.history", "activity.history.one", "activity.history.many", "activity.meaning.delivered", "activity.meaning.delivered.codexToClaude", "activity.meaning.delivered.claudeToCodex", "activity.meaning.unconfirmed", "activity.meaning.ambiguous", "activity.meaning.other", "activity.meaning.queued", "activity.meaning.dispatching", "activity.meaning.transportWritten", "activity.meaning.held", "activity.meaning.duplicate", "activity.meaning.rejected", "activity.meaning.senderNotPaired", "activity.meaning.failed", "activity.meaning.expired", "activity.meaning.cancelled", "activity.meaning.abandoned.controllerRestarted", "activity.meaning.abandoned.transientBody", "activity.meaning.abandoned.routeTerminated", "activity.meaning.abandoned.generic", "direction.claudeToCodex", "direction.codexToClaude", "delivery.queued", "delivery.duplicate", "delivery.dispatching", "delivery.transportWritten", "delivery.held", "delivery.delivered", "delivery.unconfirmed", "delivery.failed", "delivery.ambiguous", "delivery.expired", "delivery.cancelled", "delivery.abandoned", "delivery.rejected", "sessions.eyebrow", "sessions.title", "sessions.note", "sessions.peers.title", "sessions.peers.empty", "sessions.peers.caption", "sessions.routes.title", "sessions.routes.empty", "sessions.routes.caption", "column.alias", "column.host", "column.provider", "column.state", "column.compatibility", "column.selection", "column.validation", "status.validated", "status.validationRejected", "column.queue", "column.observed", "column.issue", "diagnostics.title", "diagnostics.note", "diagnostics.connectors", "diagnostics.connectors.empty", "diagnostics.connectors.caption", "diagnostics.compatibilityChecks", "diagnostics.compatibilityChecks.empty", "diagnostics.compatibilityChecks.caption", "diagnostics.version", "diagnostics.testedVersion", "diagnostics.supportedMajor", "diagnostics.tier", "diagnostics.checkedAt", "diagnostics.failure", "compatibilityTier.certified", "compatibilityTier.schema_attested", "compatibilityTier.schema_attested.writesCovered", "compatibilityTier.incompatible", "compatibilityTier.notDetected", "diagnostics.registry.title", "diagnostics.registry.entriesScanned", "diagnostics.registry.parseableRecords", "diagnostics.registry.rejected", "diagnostics.registry.rejectedNone", "diagnostics.registry.rejectedCodesOmitted", "diagnostics.registry.state.parseableRecordObserved", "diagnostics.registry.state.emptySinceBoot", "diagnostics.registry.state.noParseableRecordSinceBoot", "diagnostics.protocol", "diagnostics.health", "diagnostics.accounting", "diagnostics.accepted", "diagnostics.duplicates", "diagnostics.delivered", "diagnostics.unconfirmed", "diagnostics.ambiguous", "diagnostics.failed", "diagnostics.expired", "diagnostics.cancelled", "diagnostics.abandoned", "diagnostics.rejected", "diagnostics.bytesAccepted", "diagnostics.queuedBytes", "diagnostics.omissions", "diagnostics.omissions.none", "diagnostics.omissions.connectors", "diagnostics.omissions.peers", "diagnostics.omissions.routes", "diagnostics.omissions.pairs", "diagnostics.omissions.progressWatches", "diagnostics.omissions.upstreamProgressWatchEvents", "diagnostics.omissions.progressWatchEvents", "diagnostics.omissions.upstreamMessageEvents", "diagnostics.omissions.messageGroups", "diagnostics.omissions.messageEvents", "diagnostics.omissions.upstreamAlerts", "diagnostics.omissions.attentionItems", "diagnostics.omissions.upstreamActivityEvents", "diagnostics.omissions.activityEvents", "provider.claude", "provider.codex", "provider.deepseek", "health.offline", "health.connecting", "health.healthy", "health.degraded", "health.incompatible", "health.meaning.healthy", "health.meaning.connecting", "health.meaning.degraded", "health.meaning.offline", "health.meaning.incompatible", "compatibility.unknown", "compatibility.compatible", "compatibility.incompatible", "compatibility.expired", "compatibility.meaning.compatible", "compatibility.meaning.unknown", "compatibility.meaning.expired", "compatibility.meaning.incompatible", "route.stale", "route.idle", "route.busy", "route.awaitingApproval", "route.offline", "route.incompatible", "route.disabled", "route.meaning.idle", "route.meaning.busy", "route.meaning.awaitingApproval", "route.meaning.stale", "route.meaning.offline", "route.meaning.incompatible", "route.meaning.disabled", "peer.idle", "peer.busy", "peer.awaitingApproval", "peer.offline", "peer.incompatible", "peer.meaning.idle", "peer.meaning.busy", "peer.meaning.awaitingApproval", "peer.meaning.offline", "peer.meaning.incompatible", "peer.reason.aliasCollision", "peer.reason.sessionCollision", "peer.reason.discoveryIncomplete", "peer.reason.incompatible", "peer.reason.offline", "time.atSnapshot", "time.beforeSnapshot", "time.afterSnapshot", "time.unavailable", "time.ago", "live.title", "live.noscript", "live.label", "live.mastheadSubtitle", "live.readonlyFooter", "live.action.authorityLabel", "live.action.authorityBody", "live.action.sectionTitle", "live.action.scope", "live.action.pair", "live.action.unpair", "live.action.removeStaleCodexRegistration", "live.action.refresh", "live.action.confirm", "live.action.cancel", "live.action.pending", "live.action.succeeded", "live.action.failed", "live.action.requiresConnected", "live.connection.connecting", "live.connection.connected", "live.connection.unavailable", "live.connection.capacity", "live.connection.disconnected", "live.connection.fatal", "live.connection.paused", "live.connection.stopped", "live.control.pause", "live.control.reconnect", "live.control.refresh", "live.filter.placeholder", "live.metric.queued", "live.metric.active", "live.attention.empty", "live.activity.empty", "live.sessions.title", "live.diagnostics.title", "live.metric.revision", "live.stream.reset", "live.http.badRequest", "live.http.forbidden", "live.http.notFound", "live.http.methodNotAllowed", "live.http.bodyTooLarge", "live.http.targetTooLarge", "live.http.unsupportedMediaType", "live.http.tooManyStreams", "live.http.headersTooLarge", "live.http.snapshotUnavailable", "live.http.requestFailed", "live.http.starting", "app.tab.overview", "app.tab.deliveries", "app.tab.routes", "app.tab.activity", "app.tab.diagnostics", "app.search.label", "app.search.placeholder", "app.asOf", "app.stale", "app.missedFrames", "app.lowerBound", "app.copy", "app.copied", "app.copyFailed", "app.staleQuiet", "app.notLanded.title", "app.notLanded.body", "app.show", "app.hide", "app.overview.statusStrip", "app.overview.broker", "app.overview.claudeConn", "app.overview.codexConn", "app.overview.compat", "app.overview.connectorMissing", "app.overview.node.claude.title", "app.overview.node.claude.sub", "app.overview.node.codex.title", "app.overview.node.codex.sub", "app.overview.count.codex", "app.overview.noPair.title", "app.overview.noPair.body", "app.overview.degradedEdge", "app.overview.degradedEdges", "app.overview.queueC2x", "app.overview.queueX2c", "app.overview.depth", "app.overview.oldest", "app.overview.pulse.title", "app.overview.pulse.caption", "app.overview.pulse.empty", "app.overview.viewIn", "app.deliveries.title", "app.deliveries.caption", "app.deliveries.dir.label", "app.deliveries.dir.all", "app.deliveries.dir.codexToClaude", "app.deliveries.view.label", "app.deliveries.view.byRoute", "app.deliveries.view.flat", "app.deliveries.state.all", "app.deliveries.search", "app.deliveries.noMatch", "app.deliveries.pickRow", "app.deliveries.lifecycle", "app.deliveries.frames", "app.deliveries.noFrames", "app.deliveries.raw", "app.deliveries.hideRaw", "app.deliveries.bodyLabel", "app.deliveries.bodiesNote", "app.deliveries.noConv", "app.deliveries.eventsTruncated", "app.deliveries.earliestRetained", "app.routes.topology", "app.routes.candidates", "app.routes.claudeSessions", "app.routes.codexRoutes", "app.routes.pairs", "app.routes.pairDescription", "app.routes.pairState.degraded", "app.routes.pairState.unavailable", "app.routes.pairDegradedReason", "app.routes.pairUnavailableReason", "app.routes.pairSummary", "app.routes.unpairedSummary", "app.routes.pairCmd.consequence", "app.routes.unpairCmd.consequence", "app.routes.selectCmd.title", "app.routes.selectCmd.consequence", "app.routes.selectCmd.consequenceOpen", "app.routes.unselectCmd.consequence", "app.routes.unselectCmd.consequenceOpen", "app.routes.refreshCmd", "app.routes.removeStaleCodex.consequence", "app.routes.monitorOnlyReason", "app.routes.noPeers", "app.routes.noCodex", "app.routes.successions", "app.routes.successions.empty", "app.routes.successions.note", "app.routes.detail.absent", "app.routes.expandDetails", "app.routes.collapseDetails", "app.routes.queueDepth", "app.routes.counters", "app.routes.registered", "app.routes.monitorOnly", "app.routes.registerHint", "app.routes.noPairInline", "app.omitted.pairs", "app.activity.title", "app.activity.kinds.all", "app.activity.kinds.delivery", "app.activity.kinds.operation", "app.activity.kinds.alert", "app.activity.operation.discoveryRefreshed", "app.activity.operation.claudeSelected", "app.activity.operation.claudeUnselected", "app.activity.operation.codexRegistered", "app.activity.operation.codexSucceeded", "app.activity.operation.codexUnregistered", "app.activity.operation.routesPaired", "app.activity.operation.routesUnpaired", "app.activity.operation.watchEnded", "app.activity.operation.endpointRefreshed", "app.activity.operation.codexOrphanRemoved", "app.activity.operation.operator", "app.activity.operation.automatic", "app.activity.operation.accepted", "app.activity.operation.rejected", "app.activity.limited", "app.activity.empty", "app.diag.versions", "app.diag.versions.caption", "app.diag.versions.rangeAbsent", "app.diag.col.provider", "app.diag.col.host", "app.diag.col.protocol", "app.diag.col.version", "app.diag.col.compat", "app.diag.providerCompatibility.title", "app.diag.lease.title", "app.diag.lease.absent", "app.diag.limits", "app.diag.limits.hint", "app.diag.deadline.title", "app.diag.deadline.body", "app.diag.deadline.retained", "app.diag.deadline.bucket.under1m", "app.diag.deadline.bucket.1to5m", "app.diag.deadline.bucket.5to15m", "app.diag.deadline.bucket.15to60m", "app.diag.deadline.bucket.over60m", "app.diag.queue.title", "app.diag.queue.body", "app.diag.bytes.title", "app.diag.bytes.body", "app.diag.steering.title", "app.diag.steering.absent", "app.diag.deliveryNotices.title", "app.diag.deliveryNotices.note", "app.diag.editable.title", "app.diag.editable.note", "app.diag.counters", "app.diag.counters.caption", "app.diag.omissions", "app.diag.omissions.caption", "footer"];
3
+ export declare const dashboardCopyKeys: readonly ["meta.title", "skip", "language.label", "language.en", "language.zhCn", "brand.eyebrow", "brand.title", "brand.subtitle", "snapshot.asOf", "snapshot.static", "overall.ready", "overall.setup", "overall.attention", "exchange.eyebrow", "exchange.title", "exchange.note", "inbound.paired.badge", "inbound.paired.body", "inbound.open.badge", "inbound.open.body", "inbound.noPair.body", "exchange.claude.title", "exchange.claude.note", "exchange.codex.title", "exchange.codex.note", "exchange.provider.note", "exchange.pouch.title", "exchange.pouch.empty", "exchange.pouch.queued", "exchange.pouch.oldest", "exchange.count.claude", "exchange.count.codex", "app.overview.count.provider", "status.ready", "status.busy", "status.waiting", "status.missing", "status.attention", "status.selected", "status.available", "status.notSelectable", "status.enabled", "status.disabled", "next.label", "next.none", "next.discoverClaude", "next.selectClaude", "next.pairRoutes", "next.restoreClaude", "next.repairClaude", "next.registerCodex", "next.restoreCodex", "attention.eyebrow", "attention.title", "attention.count", "attention.countVisible", "attention.projectionOnly", "attention.scope", "severity.info", "severity.warning", "severity.error", "guidance.reobserveClaude.title", "guidance.reobserveClaude.body", "guidance.reobserveClaude.action", "guidance.reobserveCodex.title", "guidance.reobserveCodex.body", "guidance.reobserveCodex.action", "guidance.codexReactivationRequired.title", "guidance.codexReactivationRequired.body", "guidance.codexReactivationRequired.action", "guidance.consentEdgeUnavailable.title", "guidance.consentEdgeUnavailable.body", "guidance.consentEdgeUnavailable.action", "guidance.claudeNotObserved.title", "guidance.claudeNotObserved.body", "guidance.claudeNotObserved.action", "guidance.codexStale.title", "guidance.codexStale.body", "guidance.codexStale.action", "guidance.codexAppReconnectRequired.title", "guidance.codexAppReconnectRequired.body", "guidance.codexAppReconnectRequired.action", "guidance.connectorOffline.title", "guidance.connectorOffline.body", "guidance.connectorOffline.action", "guidance.routeStale.title", "guidance.routeStale.body", "guidance.routeStale.action", "guidance.queueStalled.title", "guidance.queueStalled.body", "guidance.queueStalled.action", "guidance.queueStalled.busy", "guidance.recipientWaitingInput.title", "guidance.recipientWaitingInput.body", "guidance.recipientWaitingInput.action", "guidance.unconfirmed.title", "guidance.unconfirmed.body", "guidance.unconfirmed.action", "guidance.degraded.title", "guidance.degraded.body", "guidance.degraded.action", "guidance.generic.title", "guidance.generic.body", "guidance.generic.action", "guidance.codexSuccessionBusy.title", "guidance.codexSuccessionBusy.body", "guidance.codexSuccessionBusy.action", "guidance.codexSuccessionRecovery.title", "guidance.codexSuccessionRecovery.body", "guidance.codexSuccessionRecovery.action", "guidance.progressWatch.title", "guidance.progressWatch.body", "guidance.progressWatch.action", "guidance.registryEmpty.title", "guidance.registryEmpty.body", "guidance.registryEmpty.action", "guidance.registryRejected.title", "guidance.registryRejected.body", "guidance.registryRejected.action", "transit.eyebrow", "transit.title", "transit.queued", "transit.active", "transit.oldest", "transit.empty", "transit.unavailable", "count.atLeast", "watches.eyebrow", "watches.title", "watches.note", "watches.empty", "watches.column.conversation", "watches.column.parties", "watches.column.quietFor", "watches.column.nextAction", "watches.column.nudges", "watches.history.title", "watches.event.opened", "watches.event.replaced", "watches.event.settled", "watches.actor.owner", "watches.actor.worker", "watches.actor.operator", "watches.actor.gateway", "watches.actor.unknown", "watches.reason.done", "watches.reason.untracked", "watches.reason.idleTimeout", "watches.reason.pairRemoved", "watches.reason.endpointRetired", "watches.reason.trackingDisabled", "activity.eyebrow", "activity.title", "activity.note", "activity.empty", "activity.column.updated", "activity.column.route", "activity.column.id", "activity.column.result", "activity.column.elapsed", "activity.column.size", "activity.column.history", "activity.history.one", "activity.history.many", "activity.meaning.delivered", "activity.meaning.delivered.toClaude", "activity.meaning.delivered.toCodex", "activity.meaning.delivered.toDeepSeek", "activity.meaning.delivered.toGrok", "activity.meaning.unconfirmed", "activity.meaning.ambiguous", "activity.meaning.other", "activity.meaning.queued", "activity.meaning.dispatching", "activity.meaning.transportWritten", "activity.meaning.held", "activity.meaning.duplicate", "activity.meaning.rejected", "activity.meaning.senderNotPaired", "activity.meaning.failed", "activity.meaning.expired", "activity.meaning.cancelled", "activity.meaning.abandoned.controllerRestarted", "activity.meaning.abandoned.transientBody", "activity.meaning.abandoned.routeTerminated", "activity.meaning.abandoned.generic", "direction.claudeToCodex", "direction.codexToClaude", "delivery.queued", "delivery.duplicate", "delivery.dispatching", "delivery.transportWritten", "delivery.held", "delivery.delivered", "delivery.unconfirmed", "delivery.failed", "delivery.ambiguous", "delivery.expired", "delivery.cancelled", "delivery.abandoned", "delivery.rejected", "sessions.eyebrow", "sessions.title", "sessions.note", "sessions.peers.title", "sessions.peers.empty", "sessions.peers.caption", "sessions.routes.title", "sessions.routes.empty", "sessions.routes.caption", "column.alias", "column.host", "column.provider", "column.state", "column.selection", "column.validation", "status.validated", "status.validationRejected", "column.queue", "column.observed", "column.issue", "diagnostics.title", "diagnostics.note", "diagnostics.connectors", "diagnostics.connectors.empty", "diagnostics.connectors.caption", "diagnostics.registry.title", "diagnostics.registry.entriesScanned", "diagnostics.registry.parseableRecords", "diagnostics.registry.rejected", "diagnostics.registry.rejectedNone", "diagnostics.registry.rejectedCodesOmitted", "diagnostics.registry.state.parseableRecordObserved", "diagnostics.registry.state.emptySinceBoot", "diagnostics.registry.state.noParseableRecordSinceBoot", "diagnostics.protocol", "diagnostics.health", "diagnostics.accounting", "diagnostics.accepted", "diagnostics.duplicates", "diagnostics.delivered", "diagnostics.unconfirmed", "diagnostics.ambiguous", "diagnostics.failed", "diagnostics.expired", "diagnostics.cancelled", "diagnostics.abandoned", "diagnostics.rejected", "diagnostics.bytesAccepted", "diagnostics.queuedBytes", "diagnostics.omissions", "diagnostics.omissions.none", "diagnostics.omissions.connectors", "diagnostics.omissions.peers", "diagnostics.omissions.routes", "diagnostics.omissions.consentEdges", "diagnostics.omissions.progressWatches", "diagnostics.omissions.upstreamProgressWatchEvents", "diagnostics.omissions.progressWatchEvents", "diagnostics.omissions.upstreamMessageEvents", "diagnostics.omissions.messageGroups", "diagnostics.omissions.messageEvents", "diagnostics.omissions.upstreamAlerts", "diagnostics.omissions.attentionItems", "diagnostics.omissions.upstreamActivityEvents", "diagnostics.omissions.activityEvents", "provider.claude", "provider.codex", "provider.deepseek", "provider.grok", "health.offline", "health.connecting", "health.healthy", "health.degraded", "health.meaning.healthy", "health.meaning.connecting", "health.meaning.degraded", "health.meaning.offline", "route.stale", "route.idle", "route.busy", "route.awaitingApproval", "route.offline", "route.disabled", "route.meaning.idle", "route.meaning.busy", "route.meaning.awaitingApproval", "route.meaning.stale", "route.meaning.offline", "route.meaning.disabled", "peer.idle", "peer.busy", "peer.awaitingApproval", "peer.offline", "peer.meaning.idle", "peer.meaning.busy", "peer.meaning.awaitingApproval", "peer.meaning.offline", "peer.reason.aliasCollision", "peer.reason.sessionCollision", "peer.reason.discoveryIncomplete", "peer.reason.offline", "time.atSnapshot", "time.beforeSnapshot", "time.afterSnapshot", "time.unavailable", "time.ago", "live.title", "live.noscript", "live.label", "live.mastheadSubtitle", "live.readonlyFooter", "live.action.authorityLabel", "live.action.authorityBody", "live.action.sectionTitle", "live.action.scope", "live.action.pair", "live.action.unpair", "live.action.removeStaleCodexRegistration", "live.action.refresh", "live.action.confirm", "live.action.cancel", "live.action.pending", "live.action.succeeded", "live.action.failed", "live.action.requiresConnected", "live.connection.connecting", "live.connection.connected", "live.connection.unavailable", "live.connection.capacity", "live.connection.disconnected", "live.connection.fatal", "live.connection.paused", "live.connection.stopped", "live.control.pause", "live.control.reconnect", "live.control.refresh", "live.filter.placeholder", "live.metric.queued", "live.metric.active", "live.attention.empty", "live.activity.empty", "live.sessions.title", "live.diagnostics.title", "live.metric.revision", "live.stream.reset", "live.http.badRequest", "live.http.forbidden", "live.http.notFound", "live.http.methodNotAllowed", "live.http.bodyTooLarge", "live.http.targetTooLarge", "live.http.unsupportedMediaType", "live.http.tooManyStreams", "live.http.headersTooLarge", "live.http.snapshotUnavailable", "live.http.requestFailed", "live.http.starting", "app.tab.overview", "app.tab.deliveries", "app.tab.routes", "app.tab.activity", "app.tab.diagnostics", "app.search.label", "app.search.placeholder", "app.asOf", "app.stale", "app.missedFrames", "app.lowerBound", "app.copy", "app.copied", "app.copyFailed", "app.staleQuiet", "app.notLanded.title", "app.notLanded.body", "app.show", "app.hide", "app.overview.statusStrip", "app.overview.broker", "app.overview.claudeConn", "app.overview.codexConn", "app.overview.connectorMissing", "app.overview.node.claude.title", "app.overview.node.claude.sub", "app.overview.node.codex.title", "app.overview.node.codex.sub", "app.overview.count.codex", "app.overview.noPair.title", "app.overview.noPair.body", "app.overview.degradedEdge", "app.overview.degradedEdges", "app.overview.queueC2x", "app.overview.queueX2c", "app.overview.depth", "app.overview.oldest", "app.overview.pulse.title", "app.overview.pulse.caption", "app.overview.pulse.empty", "app.overview.viewIn", "app.deliveries.title", "app.deliveries.caption", "app.deliveries.dir.label", "app.deliveries.dir.all", "app.deliveries.dir.codexToClaude", "app.deliveries.fromProvider", "app.deliveries.toProvider", "app.deliveries.providerAll", "app.deliveries.view.label", "app.deliveries.view.byRoute", "app.deliveries.view.flat", "app.deliveries.state.all", "app.deliveries.search", "app.deliveries.noMatch", "app.deliveries.pickRow", "app.deliveries.lifecycle", "app.deliveries.frames", "app.deliveries.noFrames", "app.deliveries.raw", "app.deliveries.hideRaw", "app.deliveries.bodyLabel", "app.deliveries.bodiesNote", "app.deliveries.noConv", "app.deliveries.eventsTruncated", "app.deliveries.earliestRetained", "app.routes.topology", "app.routes.candidates", "app.routes.claudeSessions", "app.routes.codexRoutes", "app.routes.pairs", "app.routes.pairDescription", "app.routes.unpairedProvider", "app.routes.consentEndpoint", "app.routes.consentEdge", "app.routes.pairState.degraded", "app.routes.pairState.unavailable", "app.routes.pairDegradedReason", "app.routes.pairUnavailableReason", "app.routes.pairSummary", "app.routes.unpairedSummary", "app.routes.pairCmd.consequence", "app.routes.unpairCmd.consequence", "app.routes.selectCmd.title", "app.routes.selectCmd.consequence", "app.routes.selectCmd.consequenceOpen", "app.routes.unselectCmd.consequence", "app.routes.unselectCmd.consequenceOpen", "app.routes.refreshCmd", "app.routes.removeStaleCodex.consequence", "app.routes.noPeers", "app.routes.noCodex", "app.routes.successions", "app.routes.successions.empty", "app.routes.successions.note", "app.routes.detail.absent", "app.routes.expandDetails", "app.routes.collapseDetails", "app.routes.queueDepth", "app.routes.counters", "app.routes.registered", "app.routes.registerHint", "app.routes.noPairInline", "app.omitted.pairs", "app.activity.title", "app.activity.kinds.all", "app.activity.kinds.delivery", "app.activity.kinds.operation", "app.activity.kinds.alert", "app.activity.operation.discoveryRefreshed", "app.activity.operation.claudeSelected", "app.activity.operation.claudeUnselected", "app.activity.operation.codexRegistered", "app.activity.operation.codexSucceeded", "app.activity.operation.codexUnregistered", "app.activity.operation.routesPaired", "app.activity.operation.routesUnpaired", "app.activity.operation.watchEnded", "app.activity.operation.endpointRefreshed", "app.activity.operation.codexOrphanRemoved", "app.activity.operation.operator", "app.activity.operation.automatic", "app.activity.operation.accepted", "app.activity.operation.rejected", "app.activity.limited", "app.activity.empty", "app.diag.versions", "app.diag.versions.caption", "app.diag.versions.rangeAbsent", "app.diag.col.provider", "app.diag.col.host", "app.diag.col.protocol", "app.diag.col.version", "app.diag.lease.title", "app.diag.lease.absent", "app.diag.limits", "app.diag.limits.hint", "app.diag.deadline.title", "app.diag.deadline.body", "app.diag.deadline.retained", "app.diag.deadline.bucket.under1m", "app.diag.deadline.bucket.1to5m", "app.diag.deadline.bucket.5to15m", "app.diag.deadline.bucket.15to60m", "app.diag.deadline.bucket.over60m", "app.diag.queue.title", "app.diag.queue.body", "app.diag.bytes.title", "app.diag.bytes.body", "app.diag.steering.title", "app.diag.steering.absent", "app.diag.deliveryNotices.title", "app.diag.deliveryNotices.note", "app.diag.editable.title", "app.diag.editable.note", "app.diag.counters", "app.diag.counters.caption", "app.diag.omissions", "app.diag.omissions.caption", "footer"];
4
4
  export type DashboardCopyKey = (typeof dashboardCopyKeys)[number];
5
5
  export type DashboardCopy = Readonly<Record<DashboardCopyKey, string>>;
6
6
  export declare function getDashboardCopy(locale: DashboardLocale): DashboardCopy;
@@ -24,12 +24,14 @@ export declare const dashboardCopyEn: {
24
24
  "exchange.claude.note": string;
25
25
  "exchange.codex.title": string;
26
26
  "exchange.codex.note": string;
27
+ "exchange.provider.note": string;
27
28
  "exchange.pouch.title": string;
28
29
  "exchange.pouch.empty": string;
29
30
  "exchange.pouch.queued": string;
30
31
  "exchange.pouch.oldest": string;
31
32
  "exchange.count.claude": string;
32
33
  "exchange.count.codex": string;
34
+ "app.overview.count.provider": string;
33
35
  "status.ready": string;
34
36
  "status.busy": string;
35
37
  "status.waiting": string;
@@ -49,7 +51,6 @@ export declare const dashboardCopyEn: {
49
51
  "next.repairClaude": string;
50
52
  "next.registerCodex": string;
51
53
  "next.restoreCodex": string;
52
- "next.reviewCompatibility": string;
53
54
  "attention.eyebrow": string;
54
55
  "attention.title": string;
55
56
  "attention.count": string;
@@ -99,9 +100,6 @@ export declare const dashboardCopyEn: {
99
100
  "guidance.degraded.title": string;
100
101
  "guidance.degraded.body": string;
101
102
  "guidance.degraded.action": string;
102
- "guidance.providerIncompatible.title": string;
103
- "guidance.providerIncompatible.body": string;
104
- "guidance.providerIncompatible.action": string;
105
103
  "guidance.generic.title": string;
106
104
  "guidance.generic.body": string;
107
105
  "guidance.generic.action": string;
@@ -152,8 +150,6 @@ export declare const dashboardCopyEn: {
152
150
  "watches.reason.pairRemoved": string;
153
151
  "watches.reason.endpointRetired": string;
154
152
  "watches.reason.trackingDisabled": string;
155
- "watches.reason.legacyUpgrade": string;
156
- "watches.reason.legacyDone": string;
157
153
  "activity.eyebrow": string;
158
154
  "activity.title": string;
159
155
  "activity.note": string;
@@ -168,8 +164,10 @@ export declare const dashboardCopyEn: {
168
164
  "activity.history.one": string;
169
165
  "activity.history.many": string;
170
166
  "activity.meaning.delivered": string;
171
- "activity.meaning.delivered.codexToClaude": string;
172
- "activity.meaning.delivered.claudeToCodex": string;
167
+ "activity.meaning.delivered.toClaude": string;
168
+ "activity.meaning.delivered.toCodex": string;
169
+ "activity.meaning.delivered.toDeepSeek": string;
170
+ "activity.meaning.delivered.toGrok": string;
173
171
  "activity.meaning.unconfirmed": string;
174
172
  "activity.meaning.ambiguous": string;
175
173
  "activity.meaning.other": string;
@@ -215,7 +213,6 @@ export declare const dashboardCopyEn: {
215
213
  "column.host": string;
216
214
  "column.provider": string;
217
215
  "column.state": string;
218
- "column.compatibility": string;
219
216
  "column.selection": string;
220
217
  "column.validation": string;
221
218
  "status.validated": string;
@@ -228,20 +225,6 @@ export declare const dashboardCopyEn: {
228
225
  "diagnostics.connectors": string;
229
226
  "diagnostics.connectors.empty": string;
230
227
  "diagnostics.connectors.caption": string;
231
- "diagnostics.compatibilityChecks": string;
232
- "diagnostics.compatibilityChecks.empty": string;
233
- "diagnostics.compatibilityChecks.caption": string;
234
- "diagnostics.version": string;
235
- "diagnostics.testedVersion": string;
236
- "diagnostics.supportedMajor": string;
237
- "diagnostics.tier": string;
238
- "diagnostics.checkedAt": string;
239
- "diagnostics.failure": string;
240
- "compatibilityTier.certified": string;
241
- "compatibilityTier.schema_attested": string;
242
- "compatibilityTier.schema_attested.writesCovered": string;
243
- "compatibilityTier.incompatible": string;
244
- "compatibilityTier.notDetected": string;
245
228
  "diagnostics.registry.title": string;
246
229
  "diagnostics.registry.entriesScanned": string;
247
230
  "diagnostics.registry.parseableRecords": string;
@@ -271,7 +254,7 @@ export declare const dashboardCopyEn: {
271
254
  "diagnostics.omissions.connectors": string;
272
255
  "diagnostics.omissions.peers": string;
273
256
  "diagnostics.omissions.routes": string;
274
- "diagnostics.omissions.pairs": string;
257
+ "diagnostics.omissions.consentEdges": string;
275
258
  "diagnostics.omissions.progressWatches": string;
276
259
  "diagnostics.omissions.upstreamProgressWatchEvents": string;
277
260
  "diagnostics.omissions.progressWatchEvents": string;
@@ -285,52 +268,38 @@ export declare const dashboardCopyEn: {
285
268
  "provider.claude": string;
286
269
  "provider.codex": string;
287
270
  "provider.deepseek": string;
271
+ "provider.grok": string;
288
272
  "health.offline": string;
289
273
  "health.connecting": string;
290
274
  "health.healthy": string;
291
275
  "health.degraded": string;
292
- "health.incompatible": string;
293
276
  "health.meaning.healthy": string;
294
277
  "health.meaning.connecting": string;
295
278
  "health.meaning.degraded": string;
296
279
  "health.meaning.offline": string;
297
- "health.meaning.incompatible": string;
298
- "compatibility.unknown": string;
299
- "compatibility.compatible": string;
300
- "compatibility.incompatible": string;
301
- "compatibility.expired": string;
302
- "compatibility.meaning.compatible": string;
303
- "compatibility.meaning.unknown": string;
304
- "compatibility.meaning.expired": string;
305
- "compatibility.meaning.incompatible": string;
306
280
  "route.stale": string;
307
281
  "route.idle": string;
308
282
  "route.busy": string;
309
283
  "route.awaitingApproval": string;
310
284
  "route.offline": string;
311
- "route.incompatible": string;
312
285
  "route.disabled": string;
313
286
  "route.meaning.idle": string;
314
287
  "route.meaning.busy": string;
315
288
  "route.meaning.awaitingApproval": string;
316
289
  "route.meaning.stale": string;
317
290
  "route.meaning.offline": string;
318
- "route.meaning.incompatible": string;
319
291
  "route.meaning.disabled": string;
320
292
  "peer.idle": string;
321
293
  "peer.busy": string;
322
294
  "peer.awaitingApproval": string;
323
295
  "peer.offline": string;
324
- "peer.incompatible": string;
325
296
  "peer.meaning.idle": string;
326
297
  "peer.meaning.busy": string;
327
298
  "peer.meaning.awaitingApproval": string;
328
299
  "peer.meaning.offline": string;
329
- "peer.meaning.incompatible": string;
330
300
  "peer.reason.aliasCollision": string;
331
301
  "peer.reason.sessionCollision": string;
332
302
  "peer.reason.discoveryIncomplete": string;
333
- "peer.reason.incompatible": string;
334
303
  "peer.reason.offline": string;
335
304
  "time.atSnapshot": string;
336
305
  "time.beforeSnapshot": string;
@@ -411,7 +380,6 @@ export declare const dashboardCopyEn: {
411
380
  "app.overview.broker": string;
412
381
  "app.overview.claudeConn": string;
413
382
  "app.overview.codexConn": string;
414
- "app.overview.compat": string;
415
383
  "app.overview.connectorMissing": string;
416
384
  "app.overview.node.claude.title": string;
417
385
  "app.overview.node.claude.sub": string;
@@ -435,6 +403,9 @@ export declare const dashboardCopyEn: {
435
403
  "app.deliveries.dir.label": string;
436
404
  "app.deliveries.dir.all": string;
437
405
  "app.deliveries.dir.codexToClaude": string;
406
+ "app.deliveries.fromProvider": string;
407
+ "app.deliveries.toProvider": string;
408
+ "app.deliveries.providerAll": string;
438
409
  "app.deliveries.view.label": string;
439
410
  "app.deliveries.view.byRoute": string;
440
411
  "app.deliveries.view.flat": string;
@@ -458,6 +429,9 @@ export declare const dashboardCopyEn: {
458
429
  "app.routes.codexRoutes": string;
459
430
  "app.routes.pairs": string;
460
431
  "app.routes.pairDescription": string;
432
+ "app.routes.unpairedProvider": string;
433
+ "app.routes.consentEndpoint": string;
434
+ "app.routes.consentEdge": string;
461
435
  "app.routes.pairState.degraded": string;
462
436
  "app.routes.pairState.unavailable": string;
463
437
  "app.routes.pairDegradedReason": string;
@@ -473,7 +447,6 @@ export declare const dashboardCopyEn: {
473
447
  "app.routes.unselectCmd.consequenceOpen": string;
474
448
  "app.routes.refreshCmd": string;
475
449
  "app.routes.removeStaleCodex.consequence": string;
476
- "app.routes.monitorOnlyReason": string;
477
450
  "app.routes.noPeers": string;
478
451
  "app.routes.noCodex": string;
479
452
  "app.routes.successions": string;
@@ -485,7 +458,6 @@ export declare const dashboardCopyEn: {
485
458
  "app.routes.queueDepth": string;
486
459
  "app.routes.counters": string;
487
460
  "app.routes.registered": string;
488
- "app.routes.monitorOnly": string;
489
461
  "app.routes.registerHint": string;
490
462
  "app.routes.noPairInline": string;
491
463
  "app.omitted.pairs": string;
@@ -517,9 +489,7 @@ export declare const dashboardCopyEn: {
517
489
  "app.diag.col.host": string;
518
490
  "app.diag.col.protocol": string;
519
491
  "app.diag.col.version": string;
520
- "app.diag.col.compat": string;
521
492
  "app.diag.versions.rangeAbsent": string;
522
- "app.diag.providerCompatibility.title": string;
523
493
  "app.diag.lease.title": string;
524
494
  "app.diag.lease.absent": string;
525
495
  "app.diag.limits": string;
@@ -6,30 +6,32 @@ export const dashboardCopyEn = {
6
6
  "language.zhCn": "简体中文",
7
7
  "brand.eyebrow": "Local agent exchange",
8
8
  "brand.title": "Embassy",
9
- "brand.subtitle": "A point-in-time, metadata-only register of routes between Claude Code and Codex.",
9
+ "brand.subtitle": "A point-in-time, metadata-only register of routes between local agent providers.",
10
10
  "snapshot.asOf": "Snapshot {time}",
11
11
  "snapshot.static": "This file does not update itself. If the broker is not running, run embassy serve first. Then run embassy refresh-dashboard and reload — or run embassy dashboard --live for a streaming view.",
12
12
  "overall.ready": "Exchange ready",
13
13
  "overall.setup": "Setup incomplete",
14
14
  "overall.attention": "Needs attention",
15
15
  "exchange.eyebrow": "Exchange board",
16
- "exchange.title": "Two directions, two explicit boundaries",
17
- "exchange.note": "Each consent edge names one Claude session and one Codex task. Native discovery remains machine-wide; permission does not.",
16
+ "exchange.title": "Provider routes and explicit boundaries",
17
+ "exchange.note": "Each consent edge names two exact local routes. Current route state and connector health describe what Embassy can observe now.",
18
18
  "inbound.paired.badge": "Paired inbound",
19
- "inbound.paired.body": "Each registered Codex task accepts messages only across its explicit Claude consent edges.",
19
+ "inbound.paired.body": "Each registered endpoint accepts messages only across its explicit consent edges.",
20
20
  "inbound.open.badge": "Open inbound",
21
- "inbound.open.body": "Any live Claude session under this OS user may initiate inbound work; explicit Codex sends still require an edge.",
21
+ "inbound.open.body": "Any live same-user endpoint allowed by the provider may initiate inbound work; explicit sends still require an edge.",
22
22
  "inbound.noPair.body": "No consent edge exists; paired-mode endpoints refuse unpaired senders.",
23
23
  "exchange.claude.title": "Claude sessions",
24
24
  "exchange.claude.note": "Consent-edge endpoints",
25
25
  "exchange.codex.title": "Codex tasks",
26
26
  "exchange.codex.note": "Consent-edge endpoints",
27
+ "exchange.provider.note": "Consent-edge endpoints",
27
28
  "exchange.pouch.title": "Local pouch",
28
29
  "exchange.pouch.empty": "Queue clear",
29
30
  "exchange.pouch.queued": "{count} queued",
30
31
  "exchange.pouch.oldest": "Oldest wait {age}",
31
32
  "exchange.count.claude": "{ready} selected · {selectable} selectable · {total} discovered",
32
33
  "exchange.count.codex": "{ready} ready · {total} registered",
34
+ "app.overview.count.provider": "{ready} ready · {total} registered",
33
35
  "status.ready": "Ready",
34
36
  "status.busy": "Busy",
35
37
  "status.waiting": "Waiting",
@@ -44,12 +46,11 @@ export const dashboardCopyEn = {
44
46
  "next.none": "No action needed.",
45
47
  "next.discoverClaude": "Start or keep a Claude Code session running, then run embassy refresh-dashboard.",
46
48
  "next.selectClaude": "Run embassy select-claude --alias <alias> to choose a visible session explicitly.",
47
- "next.pairRoutes": "Create an explicit edge with embassy pair --claude <alias> --codex <alias>.",
49
+ "next.pairRoutes": "Create an explicit edge with embassy pair --from <alias> --to <alias>.",
48
50
  "next.restoreClaude": "Refresh discovery, then explicitly select the current Claude alias if it is not restored.",
49
- "next.repairClaude": "No compatible, live, collision-free session is selectable. Resolve the issue shown in Sessions & routes, then refresh discovery.",
51
+ "next.repairClaude": "No live, collision-free session is selectable. Resolve the issue shown in Sessions & routes, then refresh discovery.",
50
52
  "next.registerCodex": "Inside the Codex task, run embassy register-codex --alias codex-<name>@<host>.",
51
53
  "next.restoreCodex": "Re-run embassy register-codex --alias <alias> inside that exact Codex task.",
52
- "next.reviewCompatibility": "Run embassy refresh-dashboard, then review Provider compatibility; discovery or registration cannot remove this write fence.",
53
54
  "attention.eyebrow": "Needs attention",
54
55
  "attention.title": "Resolve before sending",
55
56
  "attention.count": "{count} active",
@@ -97,11 +98,8 @@ export const dashboardCopyEn = {
97
98
  "guidance.unconfirmed.body": "The local transport write completed, but terminal native evidence was unavailable when the attempt settled.",
98
99
  "guidance.unconfirmed.action": "Inspect the recipient before retrying; a retry could duplicate the message.",
99
100
  "guidance.degraded.title": "The exchange is degraded",
100
- "guidance.degraded.body": "Embassy retained a normalized compatibility or connector warning.",
101
+ "guidance.degraded.body": "Embassy retained a normalized connector warning.",
101
102
  "guidance.degraded.action": "Run embassy status. If a broker restart is necessary, queued mail survives and resumes exactly once; only a write in flight at the crash settles ambiguous.",
102
- "guidance.providerIncompatible.title": "Provider build is write-fenced",
103
- "guidance.providerIncompatible.body": "Embassy kept the broker and the other provider running. Provider compatibility names the bounded version evidence, this release's tested build, and the supported major.",
104
- "guidance.providerIncompatible.action": "Run embassy refresh-dashboard, then review Provider compatibility. For an unsupported major, install an Embassy release that supports it; this broker remains running in the meantime.",
105
103
  "guidance.generic.title": "Embassy reported a normalized alert",
106
104
  "guidance.generic.body": "This safe code has no automatic repair mapped in the dashboard.",
107
105
  "guidance.generic.action": "Review embassy status. Never automatically retry an ambiguous delivery.",
@@ -152,8 +150,6 @@ export const dashboardCopyEn = {
152
150
  "watches.reason.pairRemoved": "consent edge removed",
153
151
  "watches.reason.endpointRetired": "endpoint retired",
154
152
  "watches.reason.trackingDisabled": "tracking disabled",
155
- "watches.reason.legacyUpgrade": "closed during the v1.4 state upgrade",
156
- "watches.reason.legacyDone": "legacy completion; actor unavailable",
157
153
  "activity.eyebrow": "Activity ledger",
158
154
  "activity.title": "Recent delivery evidence",
159
155
  "activity.note": "Bodies and provider internals are never included.",
@@ -168,8 +164,10 @@ export const dashboardCopyEn = {
168
164
  "activity.history.one": "1 stage",
169
165
  "activity.history.many": "{count} stages",
170
166
  "activity.meaning.delivered": "Reached its terminal delivered state. This does not mean the model read or acted on it.",
171
- "activity.meaning.delivered.codexToClaude": "Embassy wrote the message to Claude's native mailbox immediately; it did not wait for the route to become idle. This does not mean the model read or acted on it.",
172
- "activity.meaning.delivered.claudeToCodex": "Codex App Server accepted the turn. This does not mean the model completed or acted on it.",
167
+ "activity.meaning.delivered.toClaude": "Embassy wrote the message to Claude's native mailbox immediately; it did not wait for the route to become idle. This does not mean the model read or acted on it.",
168
+ "activity.meaning.delivered.toCodex": "Codex App Server accepted the turn. This does not mean the model completed or acted on it.",
169
+ "activity.meaning.delivered.toDeepSeek": "DeepSeek accepted the delivery. This does not mean the model completed or acted on it.",
170
+ "activity.meaning.delivered.toGrok": "Grok Build accepted the delivery. This does not mean the model completed or acted on it.",
173
171
  "activity.meaning.unconfirmed": "The transport write completed, but terminal native evidence was unavailable. Inspect the recipient before retrying.",
174
172
  "activity.meaning.ambiguous": "The outcome is unknown after an uncertain write. Do not retry automatically.",
175
173
  "activity.meaning.other": "This is the latest normalized delivery state.",
@@ -215,7 +213,6 @@ export const dashboardCopyEn = {
215
213
  "column.host": "Host",
216
214
  "column.provider": "Provider",
217
215
  "column.state": "State",
218
- "column.compatibility": "Compatibility",
219
216
  "column.selection": "Selection",
220
217
  "column.validation": "Validation",
221
218
  "status.validated": "Validated",
@@ -223,25 +220,11 @@ export const dashboardCopyEn = {
223
220
  "column.queue": "Queue",
224
221
  "column.observed": "Observed",
225
222
  "column.issue": "Issue",
226
- "diagnostics.title": "Compatibility & system details",
227
- "diagnostics.note": "Pinned protocols, counters, and bounded-display notes",
223
+ "diagnostics.title": "System details",
224
+ "diagnostics.note": "Connector health, observed protocol metadata, last safe codes, counters, and bounded-display notes",
228
225
  "diagnostics.connectors": "Connectors",
229
226
  "diagnostics.connectors.empty": "No connector metadata is available.",
230
227
  "diagnostics.connectors.caption": "Local provider connector status",
231
- "diagnostics.compatibilityChecks": "Provider compatibility",
232
- "diagnostics.compatibilityChecks.empty": "No provider compatibility status is available.",
233
- "diagnostics.compatibilityChecks.caption": "Automatic provider compatibility status",
234
- "diagnostics.version": "Version",
235
- "diagnostics.testedVersion": "Tested by this release",
236
- "diagnostics.supportedMajor": "Supported major",
237
- "diagnostics.tier": "Tier",
238
- "diagnostics.checkedAt": "Checked",
239
- "diagnostics.failure": "Failure",
240
- "compatibilityTier.certified": "Supported",
241
- "compatibilityTier.schema_attested": "Live schema probes passed; build not tested by this release",
242
- "compatibilityTier.schema_attested.writesCovered": "Live read and write probes passed; build not tested by this release",
243
- "compatibilityTier.incompatible": "Incompatible",
244
- "compatibilityTier.notDetected": "Not detected",
245
228
  "diagnostics.registry.title": "Registry observation",
246
229
  "diagnostics.registry.entriesScanned": "Entries scanned",
247
230
  "diagnostics.registry.parseableRecords": "Records with parseable required fields",
@@ -271,7 +254,7 @@ export const dashboardCopyEn = {
271
254
  "diagnostics.omissions.connectors": "{count} connectors",
272
255
  "diagnostics.omissions.peers": "{count} sessions",
273
256
  "diagnostics.omissions.routes": "{count} routes",
274
- "diagnostics.omissions.pairs": "{count} consent edges",
257
+ "diagnostics.omissions.consentEdges": "{count} consent edges",
275
258
  "diagnostics.omissions.progressWatches": "{count} progress watches",
276
259
  "diagnostics.omissions.upstreamProgressWatchEvents": "{count} watch events before dashboard projection",
277
260
  "diagnostics.omissions.progressWatchEvents": "{count} watch history rows",
@@ -285,52 +268,38 @@ export const dashboardCopyEn = {
285
268
  "provider.claude": "Claude",
286
269
  "provider.codex": "Codex",
287
270
  "provider.deepseek": "DeepSeek",
271
+ "provider.grok": "Grok Build",
288
272
  "health.offline": "Offline",
289
273
  "health.connecting": "Connecting",
290
274
  "health.healthy": "Healthy",
291
275
  "health.degraded": "Degraded",
292
- "health.incompatible": "Incompatible",
293
- "health.meaning.healthy": "Connected and exchanging heartbeats.",
276
+ "health.meaning.healthy": "The local connector is currently available.",
294
277
  "health.meaning.connecting": "Establishing the local connection.",
295
278
  "health.meaning.degraded": "Connected with retained warnings.",
296
279
  "health.meaning.offline": "Not reachable on this machine.",
297
- "health.meaning.incompatible": "Required compatibility evidence is missing or failed; inspect Provider compatibility.",
298
- "compatibility.unknown": "Unknown",
299
- "compatibility.compatible": "Compatible",
300
- "compatibility.incompatible": "Incompatible",
301
- "compatibility.expired": "Expired",
302
- "compatibility.meaning.compatible": "Required compatibility evidence passed.",
303
- "compatibility.meaning.unknown": "Not yet verified.",
304
- "compatibility.meaning.expired": "Verification lapsed; re-observe.",
305
- "compatibility.meaning.incompatible": "Required compatibility evidence is missing or failed; inspect Provider compatibility.",
306
280
  "route.stale": "Stale",
307
281
  "route.idle": "Idle",
308
282
  "route.busy": "Busy",
309
283
  "route.awaitingApproval": "Awaiting approval",
310
284
  "route.offline": "Offline",
311
- "route.incompatible": "Incompatible",
312
285
  "route.disabled": "Disabled",
313
- "route.meaning.idle": "Enabled, compatible, and ready to carry messages.",
314
- "route.meaning.busy": "Claude-bound messages still write to the native mailbox immediately; ordinary Codex-bound messages queue for idle.",
286
+ "route.meaning.idle": "Enabled and ready to carry messages.",
287
+ "route.meaning.busy": "The endpoint is occupied; delivery timing follows the target provider's transport.",
315
288
  "route.meaning.awaitingApproval": "Waiting on the provider's native approval.",
316
289
  "route.meaning.stale": "No current endpoint proof; refresh and restore it.",
317
290
  "route.meaning.offline": "The route's connector is unreachable.",
318
- "route.meaning.incompatible": "Protocol versions do not match.",
319
291
  "route.meaning.disabled": "Administratively disabled; not a fault.",
320
292
  "peer.idle": "Idle",
321
293
  "peer.busy": "Busy",
322
294
  "peer.awaitingApproval": "Awaiting approval",
323
295
  "peer.offline": "Offline",
324
- "peer.incompatible": "Incompatible",
325
296
  "peer.meaning.idle": "Live and selectable.",
326
297
  "peer.meaning.busy": "Live but mid-turn.",
327
298
  "peer.meaning.awaitingApproval": "Waiting on native approval.",
328
299
  "peer.meaning.offline": "Discovered earlier, not currently live — a candidate, not an error.",
329
- "peer.meaning.incompatible": "Cannot be selected: incompatible protocol.",
330
300
  "peer.reason.aliasCollision": "Alias collision: rename one Claude session, then refresh discovery.",
331
301
  "peer.reason.sessionCollision": "Session identity collision: close the duplicate session record, then refresh discovery.",
332
302
  "peer.reason.discoveryIncomplete": "Discovery was incomplete. Refresh after Claude Code finishes publishing its session inventory.",
333
- "peer.reason.incompatible": "This session is not compatible with the pinned Embassy protocol.",
334
303
  "peer.reason.offline": "This session is not currently live.",
335
304
  "time.atSnapshot": "At snapshot",
336
305
  "time.beforeSnapshot": "{age} before snapshot",
@@ -411,15 +380,14 @@ export const dashboardCopyEn = {
411
380
  "app.overview.broker": "Broker",
412
381
  "app.overview.claudeConn": "Claude connector",
413
382
  "app.overview.codexConn": "Codex connector",
414
- "app.overview.compat": "Compatibility",
415
383
  "app.overview.connectorMissing": "No connector reported",
416
384
  "app.overview.node.claude.title": "claude",
417
385
  "app.overview.node.claude.sub": "sessions",
418
386
  "app.overview.node.codex.title": "codex",
419
387
  "app.overview.node.codex.sub": "tasks",
420
- "app.overview.count.codex": "{ready} ready · {total} registered · {monitorOnly} monitor-only",
388
+ "app.overview.count.codex": "{ready} ready · {total} registered",
421
389
  "app.overview.noPair.title": "No consent edge",
422
- "app.overview.noPair.body": "Paired inbound accepts only senders connected to a registered Codex task by an explicit edge; Codex routes only along explicit edges.",
390
+ "app.overview.noPair.body": "Paired inbound accepts only senders connected by an explicit consent edge; every provider route follows those same edges.",
423
391
  "app.overview.degradedEdge": "One shown consent edge is not ready.",
424
392
  "app.overview.degradedEdges": "Some consent edges remain but are not ready.",
425
393
  "app.overview.queueC2x": "Claude → Codex",
@@ -435,6 +403,9 @@ export const dashboardCopyEn = {
435
403
  "app.deliveries.dir.label": "Direction",
436
404
  "app.deliveries.dir.all": "All",
437
405
  "app.deliveries.dir.codexToClaude": "Claude ← Codex",
406
+ "app.deliveries.fromProvider": "From provider",
407
+ "app.deliveries.toProvider": "To provider",
408
+ "app.deliveries.providerAll": "All providers",
438
409
  "app.deliveries.view.label": "View",
439
410
  "app.deliveries.view.byRoute": "By route pair",
440
411
  "app.deliveries.view.flat": "Flat list",
@@ -458,22 +429,24 @@ export const dashboardCopyEn = {
458
429
  "app.routes.codexRoutes": "Codex tasks",
459
430
  "app.routes.pairs": "Consent edges",
460
431
  "app.routes.pairDescription": "Consent edge: {claude} ↔ {codex}",
432
+ "app.routes.unpairedProvider": "{provider}: {count} ready without an edge",
433
+ "app.routes.consentEndpoint": "{provider} · {alias}",
434
+ "app.routes.consentEdge": "{left} ↔ {right}",
461
435
  "app.routes.pairState.degraded": "Degraded",
462
436
  "app.routes.pairState.unavailable": "Unavailable",
463
437
  "app.routes.pairDegradedReason": "Consent edge retained; one or both routes need attention.",
464
438
  "app.routes.pairUnavailableReason": "Consent edge retained; one or both saved route records are unavailable in this snapshot.",
465
439
  "app.routes.pairSummary": "Ready: {ready} · Consent edges: {total}",
466
- "app.routes.unpairedSummary": "{claude} ready Claude endpoints and {codex} ready Codex endpoints have no consent edge.",
467
- "app.routes.pairCmd.consequence": "Create consent only between {claude} and {codex}. Existing edges stay unchanged.",
468
- "app.routes.unpairCmd.consequence": "Remove consent only between {claude} and {codex}. Work on adjacent edges stays active.",
440
+ "app.routes.unpairedSummary": "Ready endpoints without consent remain visible in their provider rows.",
441
+ "app.routes.pairCmd.consequence": "Create consent only between these two named provider endpoints. Existing edges stay unchanged.",
442
+ "app.routes.unpairCmd.consequence": "Remove consent only between these two named provider endpoints. Work on adjacent edges stays active.",
469
443
  "app.routes.selectCmd.title": "Create a consent edge",
470
- "app.routes.selectCmd.consequence": "Create one consent edge between this Claude session and a Codex task. Other edges stay unchanged.",
444
+ "app.routes.selectCmd.consequence": "Create one consent edge between the two named provider endpoints. Other edges stay unchanged.",
471
445
  "app.routes.selectCmd.consequenceOpen": "Create one outbound destination edge. Open inbound still accepts any live Claude session under this OS user.",
472
446
  "app.routes.unselectCmd.consequence": "Remove only this consent edge. Work on adjacent edges stays active.",
473
447
  "app.routes.unselectCmd.consequenceOpen": "Remove only this outbound edge. Open inbound remains enabled for every live Claude session under this OS user.",
474
448
  "app.routes.refreshCmd": "Re-read local discovery and rewrite the static dashboard file.",
475
449
  "app.routes.removeStaleCodex.consequence": "Remove only {alias} if the broker confirms that the registration is stale and its endpoint generation is dead. Its consent edges are removed; a live registration is never touched.",
476
- "app.routes.monitorOnlyReason": "Monitor only — writes are disabled for this route by CODEX_WRITES_DISABLED.",
477
450
  "app.routes.noPeers": "No Claude session was discovered in this snapshot.",
478
451
  "app.routes.noCodex": "No Codex task is registered.",
479
452
  "app.routes.successions": "Succession history",
@@ -485,9 +458,8 @@ export const dashboardCopyEn = {
485
458
  "app.routes.queueDepth": "Queue depth",
486
459
  "app.routes.counters": "Route counters",
487
460
  "app.routes.registered": "registered",
488
- "app.routes.monitorOnly": "monitor-only",
489
461
  "app.routes.registerHint": "Registration is not a button: it must run inside the Codex task to inherit its identity. Ask your agent to run:",
490
- "app.routes.noPairInline": "no consent edge — pair a Claude session with a Codex task",
462
+ "app.routes.noPairInline": "no consent edge — pair two ready endpoints from different providers",
491
463
  "app.omitted.pairs": "{count} additional consent edges are omitted.",
492
464
  "app.activity.title": "Event stream — bounded, most recent first",
493
465
  "app.activity.kinds.all": "All kinds",
@@ -511,15 +483,13 @@ export const dashboardCopyEn = {
511
483
  "app.activity.operation.rejected": "rejected",
512
484
  "app.activity.limited": "The operator-action ledger lasts for this broker process. Operator-action rows carry no message bodies; Deliveries shows retained bodies by design. Full capability tokens are never shown.",
513
485
  "app.activity.empty": "Nothing in this window. Events appear as the broker produces them; try",
514
- "app.diag.versions": "Connector protocols",
515
- "app.diag.versions.caption": "Local connectors with protocol and compatibility state",
486
+ "app.diag.versions": "Provider connectors",
487
+ "app.diag.versions.caption": "Best-effort observations for local provider connectors",
516
488
  "app.diag.col.provider": "Provider",
517
489
  "app.diag.col.host": "Host",
518
490
  "app.diag.col.protocol": "Protocol",
519
491
  "app.diag.col.version": "Version",
520
- "app.diag.col.compat": "Compatibility",
521
- "app.diag.versions.rangeAbsent": "Connector rows show observed protocol tokens. Provider compatibility below shows the observed version, this release's tested build, the supported major, and probe results.",
522
- "app.diag.providerCompatibility.title": "Provider compatibility",
492
+ "app.diag.versions.rangeAbsent": "Protocol and version are observed metadata, not routing authority. Health and the last safe code describe the current connector.",
523
493
  "app.diag.lease.title": "Lease / instance",
524
494
  "app.diag.lease.absent": "Lease state is not carried by the live contract. Read the local posture with the command below.",
525
495
  "app.diag.limits": "Limits & pressure",