Yichen Jiang
03b534de16
feat(credentials): move the store to .credentials.yaml and layer $DSH_HOME/.env
...
$DSH_HOME/.env carried two incompatible jobs. As credentials-local's writable
secret store it could not be hoisted into process.env — hoisting makes every
stored key read as a read-only launch override and blocks rotation from the
TUI and the web page. But its name and dotenv format promise an environment
file, so a DEEPSEEK_BASE_URL sitting beside a working DEEPSEEK_API_KEY in the
same file was silently ignored: only the credential provider read the
document, and it addresses credential references alone.
Split the two jobs into two files.
.credentials.yaml is the provider-managed store: a strict YAML mapping of
CredentialRef to non-empty string, no version field, no wrapper level. Because
it holds credentials and nothing else, a non-mapping root, a non-identifier
key, a non-string value, an empty string, a duplicate key, and malformed YAML
are all rejections rather than skipped entries — loud at boot and at a write,
warn-and-keep-last-good on a live reload. The dotenv physical-line editor
gives way to a patch of the parsed document, so comments and untouched entries
keep their formatting and any string value round-trips, multi-line included.
Writer lock, read-modify-write, atomic 0600 write under a 0700 directory,
watcher, self-write suppression, and quiescent disposal are unchanged.
$DSH_HOME/.env becomes the user's ordinary environment layer. app-boot's new
loadLayeredEnv loads the invoking directory's .env then the Harness home's,
giving user < project < inherited; the home resolves from the inherited
environment first, so a project .env cannot redirect it.
Credential precedence is unchanged: the live environment still wins read-only
over the file, and shadowed writes still reject. Whether a provider-managed
store should instead win over the environment is a separate decision.
No migration: a key already in $DSH_HOME/.env keeps resolving through the new
environment layer, as a read-only env source that shadows the stored one.
2026-08-04 14:50:38 +08:00
..
2026-07-26 23:06:00 +08:00
2026-07-26 23:06:00 +08:00
2026-07-26 23:06:00 +08:00
2026-07-28 00:00:51 +08:00
2026-07-28 00:00:51 +08:00
2026-07-28 00:00:51 +08:00
2026-07-24 13:57:16 +08:00
2026-07-22 23:07:14 +08:00
2026-07-24 13:57:16 +08:00
2026-07-23 00:10:53 +08:00
2026-07-22 23:07:14 +08:00
2026-07-23 00:10:53 +08:00
2026-07-23 19:48:00 +08:00
2026-07-23 19:33:30 +08:00
2026-07-23 19:48:00 +08:00
2026-07-24 13:57:16 +08:00
2026-07-22 23:07:14 +08:00
2026-07-24 13:57:16 +08:00
2026-07-24 13:57:16 +08:00
2026-07-22 23:07:14 +08:00
2026-07-24 13:57:16 +08:00
2026-07-26 22:45:33 +08:00
2026-07-26 22:45:33 +08:00
2026-07-26 22:45:33 +08:00
2026-07-28 22:16:43 +08:00
2026-07-28 22:16:43 +08:00
2026-07-28 22:16:43 +08:00
2026-07-26 23:06:00 +08:00
2026-07-26 23:06:00 +08:00
2026-07-26 23:06:00 +08:00
2026-07-25 01:58:42 +08:00
2026-07-24 23:43:10 +08:00
2026-07-25 01:58:42 +08:00
2026-07-24 13:57:16 +08:00
2026-07-23 00:10:53 +08:00
2026-07-24 13:57:16 +08:00
2026-07-25 15:11:17 +08:00
2026-07-25 15:11:17 +08:00
2026-07-25 15:11:17 +08:00
2026-07-25 01:58:42 +08:00
2026-07-24 23:43:10 +08:00
2026-07-25 01:58:42 +08:00
2026-08-02 12:51:09 +08:00
2026-08-02 12:51:09 +08:00
2026-08-02 12:51:09 +08:00
2026-07-31 03:10:48 -07:00
2026-07-31 03:10:48 -07:00
2026-07-31 03:10:48 -07:00
2026-07-23 01:11:59 +08:00
2026-07-22 23:07:14 +08:00
2026-07-23 01:11:59 +08:00
2026-07-26 23:06:00 +08:00
2026-07-26 23:06:00 +08:00
2026-07-26 23:06:00 +08:00
2026-07-24 18:38:27 +08:00
2026-07-22 23:07:14 +08:00
2026-07-24 18:38:27 +08:00
2026-07-27 04:14:51 +08:00
2026-07-27 04:14:51 +08:00
2026-07-27 04:14:51 +08:00
2026-07-26 23:06:00 +08:00
2026-07-26 23:06:00 +08:00
2026-07-26 23:06:00 +08:00
2026-07-25 01:58:42 +08:00
2026-07-24 23:43:10 +08:00
2026-07-25 01:58:42 +08:00
2026-07-28 00:00:51 +08:00
2026-07-28 00:00:51 +08:00
2026-07-28 00:00:51 +08:00
2026-07-24 13:57:16 +08:00
2026-07-22 23:07:14 +08:00
2026-07-24 13:57:16 +08:00
2026-07-24 13:57:16 +08:00
2026-07-22 23:07:14 +08:00
2026-07-24 13:57:16 +08:00
2026-07-24 13:57:16 +08:00
2026-07-22 23:07:14 +08:00
2026-07-24 13:57:16 +08:00
2026-07-26 02:33:29 +08:00
2026-07-26 02:33:29 +08:00
2026-07-26 02:33:29 +08:00
2026-07-26 12:43:59 +08:00
2026-07-26 12:43:59 +08:00
2026-07-26 12:43:59 +08:00
2026-07-26 02:33:29 +08:00
2026-07-26 02:33:29 +08:00
2026-07-26 02:33:29 +08:00
2026-07-24 15:10:55 +08:00
2026-07-23 19:33:30 +08:00
2026-07-24 15:10:55 +08:00
2026-08-02 20:09:05 +08:00
2026-08-02 20:09:05 +08:00
2026-08-02 20:09:05 +08:00
2026-07-26 02:33:29 +08:00
2026-07-26 02:33:29 +08:00
2026-07-26 02:33:29 +08:00
2026-07-27 21:17:49 +08:00
2026-07-27 21:17:49 +08:00
2026-07-27 21:17:49 +08:00
2026-07-29 22:56:14 +08:00
2026-07-29 22:56:14 +08:00
2026-07-29 22:56:14 +08:00
2026-08-02 12:51:09 +08:00
2026-08-02 12:51:09 +08:00
2026-08-02 12:51:09 +08:00
2026-07-24 01:40:25 +08:00
2026-07-24 01:40:25 +08:00
2026-07-24 01:40:25 +08:00
2026-07-26 14:00:37 +08:00
2026-07-26 14:00:37 +08:00
2026-07-26 14:00:37 +08:00
2026-07-19 22:52:03 +08:00
2026-07-19 22:52:03 +08:00
2026-07-19 22:52:03 +08:00
2026-07-26 13:13:53 +08:00
2026-07-26 13:13:53 +08:00
2026-07-26 13:13:53 +08:00
2026-07-24 01:40:25 +08:00
2026-07-24 01:40:25 +08:00
2026-07-24 01:40:25 +08:00
2026-07-21 21:11:32 +08:00
2026-07-21 21:11:32 +08:00
2026-07-21 21:11:32 +08:00
2026-07-26 20:51:32 +08:00
2026-07-26 20:51:32 +08:00
2026-07-26 20:51:32 +08:00
2026-07-23 03:15:15 +08:00
2026-07-23 03:15:15 +08:00
2026-07-23 03:15:15 +08:00
2026-08-02 12:51:10 +08:00
2026-08-02 12:51:10 +08:00
2026-08-02 12:51:10 +08:00
2026-07-31 20:48:52 +08:00
2026-07-31 20:47:55 +08:00
2026-07-31 20:47:55 +08:00
2026-07-21 20:15:09 +08:00
2026-07-21 20:15:09 +08:00
2026-07-21 20:15:09 +08:00
2026-07-21 01:13:28 +08:00
2026-07-21 01:13:28 +08:00
2026-07-21 01:13:28 +08:00
2026-07-23 15:54:10 +08:00
2026-07-23 15:54:10 +08:00
2026-07-23 15:54:10 +08:00
2026-07-27 21:20:06 +08:00
2026-07-27 21:20:06 +08:00
2026-07-27 21:20:06 +08:00
2026-07-27 15:49:09 +08:00
2026-07-27 15:49:09 +08:00
2026-07-27 15:49:09 +08:00
2026-07-25 16:43:07 +08:00
2026-07-25 16:43:07 +08:00
2026-07-25 16:43:07 +08:00
2026-07-28 12:09:48 +08:00
2026-07-28 12:09:48 +08:00
2026-07-28 12:09:48 +08:00
2026-07-24 01:40:25 +08:00
2026-07-24 01:40:25 +08:00
2026-07-24 01:40:25 +08:00
2026-07-30 01:58:51 +08:00
2026-07-30 01:58:51 +08:00
2026-07-30 01:58:51 +08:00
2026-07-31 03:02:45 +08:00
2026-07-31 03:02:45 +08:00
2026-07-31 03:02:45 +08:00
2026-07-31 20:48:22 +08:00
2026-07-31 20:47:55 +08:00
2026-07-31 20:47:55 +08:00
2026-07-26 13:42:02 +08:00
2026-07-26 13:42:02 +08:00
2026-07-26 13:42:02 +08:00
2026-07-25 15:11:17 +08:00
2026-07-24 21:50:11 +08:00
2026-07-25 15:11:17 +08:00
2026-07-28 15:45:53 +08:00
2026-07-28 15:45:53 +08:00
2026-07-28 15:45:53 +08:00
2026-07-31 16:49:55 +08:00
2026-07-31 16:49:55 +08:00
2026-07-31 16:49:55 +08:00
2026-08-04 14:11:38 +08:00
2026-08-04 14:11:38 +08:00
2026-08-04 14:11:38 +08:00
2026-07-30 15:18:06 +08:00
2026-07-30 15:18:06 +08:00
2026-07-30 15:18:06 +08:00
2026-07-28 12:09:48 +08:00
2026-07-28 12:09:48 +08:00
2026-07-28 12:09:48 +08:00
2026-07-31 19:13:22 +08:00
2026-07-31 19:13:22 +08:00
2026-07-31 19:13:22 +08:00
2026-07-27 03:54:33 +08:00
2026-07-27 03:54:33 +08:00
2026-07-27 03:54:33 +08:00
2026-07-28 02:33:14 -07:00
2026-07-28 02:33:14 -07:00
2026-07-28 02:33:14 -07:00
2026-07-27 04:14:51 +08:00
2026-07-27 04:14:51 +08:00
2026-07-27 04:14:51 +08:00
2026-07-26 12:17:45 +08:00
2026-07-26 12:17:45 +08:00
2026-07-26 12:17:45 +08:00
2026-07-29 23:45:42 +08:00
2026-07-29 23:45:42 +08:00
2026-07-29 23:45:42 +08:00
2026-07-27 03:52:41 +08:00
2026-07-27 03:52:41 +08:00
2026-07-27 03:52:41 +08:00
2026-07-27 21:04:11 +08:00
2026-07-27 21:04:11 +08:00
2026-07-27 21:04:11 +08:00
2026-07-28 17:02:39 +08:00
2026-07-28 17:02:39 +08:00
2026-07-28 17:02:39 +08:00
2026-07-31 16:12:05 +08:00
2026-07-31 16:12:05 +08:00
2026-07-31 16:12:05 +08:00
2026-08-03 13:45:30 +08:00
2026-08-03 13:45:30 +08:00
2026-08-03 13:45:30 +08:00
2026-07-30 10:34:21 +08:00
2026-07-30 10:11:38 +08:00
2026-07-30 10:11:38 +08:00
2026-07-30 01:14:25 +08:00
2026-07-30 01:14:25 +08:00
2026-07-28 22:30:12 +08:00
2026-07-28 13:55:59 +08:00
2026-07-28 13:55:59 +08:00
2026-07-28 13:55:59 +08:00
2026-07-31 23:37:53 +08:00
2026-07-31 23:37:53 +08:00
2026-07-31 23:37:53 +08:00
2026-07-30 14:09:04 +08:00
2026-07-30 14:09:04 +08:00
2026-07-30 14:09:04 +08:00
2026-07-29 13:15:24 +08:00
2026-07-29 13:15:24 +08:00
2026-07-29 13:15:24 +08:00
2026-07-30 17:22:15 +08:00
2026-07-30 17:22:15 +08:00
2026-07-30 17:22:15 +08:00
2026-08-04 14:50:38 +08:00
2026-08-04 14:50:38 +08:00
2026-08-04 14:50:38 +08:00
2026-07-30 21:49:58 +08:00
2026-07-30 21:49:58 +08:00
2026-07-30 21:49:58 +08:00
2026-07-31 17:39:51 +08:00
2026-07-31 17:39:51 +08:00
2026-07-31 17:39:51 +08:00
2026-07-30 18:07:35 +08:00
2026-07-30 18:07:35 +08:00
2026-07-30 18:07:35 +08:00
2026-07-30 19:24:21 +08:00
2026-07-30 19:24:21 +08:00
2026-07-30 19:24:21 +08:00
2026-08-04 14:50:38 +08:00
2026-08-04 14:50:38 +08:00
2026-08-04 14:50:38 +08:00
2026-08-02 01:25:02 +08:00
2026-08-02 01:25:02 +08:00
2026-08-02 01:25:02 +08:00
2026-08-02 12:51:10 +08:00
2026-08-02 12:51:10 +08:00
2026-08-02 12:51:10 +08:00
2026-07-31 11:00:07 +08:00
2026-07-31 11:00:07 +08:00
2026-07-31 11:00:07 +08:00
2026-08-02 01:29:04 +08:00
2026-08-02 01:29:04 +08:00
2026-08-02 01:29:04 +08:00
2026-07-31 11:32:10 +08:00
2026-07-31 11:32:10 +08:00
2026-07-31 11:32:10 +08:00
2026-08-04 14:50:38 +08:00
2026-08-04 14:50:38 +08:00
2026-08-04 14:50:38 +08:00