daemora 1.0.9 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/daemora-ui/dist/assets/index-D7W1-PNQ.js +92 -0
- package/daemora-ui/dist/assets/index-DzMLJeoL.css +1 -0
- package/daemora-ui/dist/index.html +2 -2
- package/package.json +1 -1
- package/skills/coding.md +23 -4
- package/src/agents/systemPrompt.js +78 -57
- package/src/index.js +49 -13
- package/daemora-ui/dist/assets/index-AfA65HSy.js +0 -90
- package/daemora-ui/dist/assets/index-DP95eMOr.css +0 -1
package/src/index.js
CHANGED
|
@@ -871,14 +871,23 @@ app.get("/api/settings", (req, res) => {
|
|
|
871
871
|
}
|
|
872
872
|
}
|
|
873
873
|
|
|
874
|
-
//
|
|
874
|
+
// Merge vault secrets (if unlocked) — vault takes priority
|
|
875
|
+
const vaultActive = secretVault.isUnlocked();
|
|
876
|
+
if (vaultActive) {
|
|
877
|
+
const vaultSecrets = secretVault.getAsEnv();
|
|
878
|
+
for (const key of Object.keys(vaultSecrets)) {
|
|
879
|
+
envVars[key] = vaultSecrets[key]; // vault overrides .env
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
// Uniform masking — never leak any characters
|
|
875
884
|
const masked = {};
|
|
876
885
|
for (const [key, val] of Object.entries(envVars)) {
|
|
877
886
|
if (!val) { masked[key] = ""; continue; }
|
|
878
|
-
masked[key] =
|
|
887
|
+
masked[key] = "••••••••";
|
|
879
888
|
}
|
|
880
889
|
|
|
881
|
-
res.json({ vars: masked, available });
|
|
890
|
+
res.json({ vars: masked, available, vaultActive });
|
|
882
891
|
});
|
|
883
892
|
|
|
884
893
|
app.put("/api/settings", (req, res) => {
|
|
@@ -887,25 +896,52 @@ app.put("/api/settings", (req, res) => {
|
|
|
887
896
|
return res.status(400).json({ error: "updates object is required" });
|
|
888
897
|
}
|
|
889
898
|
|
|
890
|
-
const
|
|
891
|
-
|
|
899
|
+
const vaultActive = secretVault.isUnlocked();
|
|
900
|
+
const sensitivePattern = /KEY|TOKEN|SECRET|PASSWORD|PASSPHRASE|CREDENTIAL/i;
|
|
901
|
+
|
|
902
|
+
// Separate sensitive vs non-sensitive
|
|
903
|
+
const envUpdates = {};
|
|
904
|
+
const vaultUpdates = {};
|
|
892
905
|
|
|
893
906
|
for (const [key, value] of Object.entries(updates)) {
|
|
894
|
-
// Validate key format (alphanumeric + underscore only)
|
|
895
907
|
if (!/^[A-Z][A-Z0-9_]*$/.test(key)) continue;
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
content = content.replace(regex, `${key}=${value}`);
|
|
908
|
+
if (vaultActive && sensitivePattern.test(key)) {
|
|
909
|
+
vaultUpdates[key] = value;
|
|
899
910
|
} else {
|
|
900
|
-
|
|
911
|
+
envUpdates[key] = value;
|
|
901
912
|
}
|
|
902
|
-
//
|
|
913
|
+
// Always update process.env so changes take effect immediately
|
|
903
914
|
process.env[key] = value;
|
|
904
915
|
}
|
|
905
916
|
|
|
906
|
-
|
|
917
|
+
// Write non-sensitive (or all if vault locked) to .env
|
|
918
|
+
if (Object.keys(envUpdates).length > 0 || (!vaultActive && Object.keys(vaultUpdates).length === 0)) {
|
|
919
|
+
const allEnvUpdates = vaultActive ? envUpdates : { ...envUpdates, ...vaultUpdates };
|
|
920
|
+
const envPath = join(__dirname, "..", ".env");
|
|
921
|
+
let content = existsSync(envPath) ? readFileSync(envPath, "utf-8") : "";
|
|
922
|
+
for (const [key, value] of Object.entries(allEnvUpdates)) {
|
|
923
|
+
const regex = new RegExp(`^${key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}=.*$`, "m");
|
|
924
|
+
if (regex.test(content)) {
|
|
925
|
+
content = content.replace(regex, `${key}=${value}`);
|
|
926
|
+
} else {
|
|
927
|
+
content = content.trimEnd() + `\n${key}=${value}\n`;
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
writeFileSync(envPath, content, "utf-8");
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
// Write sensitive keys to vault
|
|
934
|
+
if (vaultActive && Object.keys(vaultUpdates).length > 0) {
|
|
935
|
+
for (const [key, value] of Object.entries(vaultUpdates)) {
|
|
936
|
+
secretVault.set(key, value);
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
const stored = vaultActive
|
|
941
|
+
? { env: Object.keys(envUpdates), vault: Object.keys(vaultUpdates) }
|
|
942
|
+
: { env: Object.keys(updates).filter(k => /^[A-Z][A-Z0-9_]*$/.test(k)) };
|
|
907
943
|
|
|
908
|
-
res.json({ message: `Updated ${Object.keys(updates).length} variable(s)`,
|
|
944
|
+
res.json({ message: `Updated ${Object.keys(updates).length} variable(s)`, stored });
|
|
909
945
|
});
|
|
910
946
|
|
|
911
947
|
// --- User Profile endpoints ---
|