[Init] Initial commit - NetMesh terminal manager
Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
This commit is contained in:
257
electron/capabilities/services/vaultService.cjs
Normal file
257
electron/capabilities/services/vaultService.cjs
Normal file
@@ -0,0 +1,257 @@
|
||||
"use strict";
|
||||
|
||||
/** Matches waitForScriptRun default (1h) plus bridge overhead. */
|
||||
const VAULT_AGENT_SCRIPT_WAIT_TIMEOUT_MS = 3_605_000;
|
||||
|
||||
function parseVaultAgentWaitFlag(raw) {
|
||||
if (raw === undefined || raw === null || raw === "") return false;
|
||||
if (typeof raw === "boolean") return raw;
|
||||
const normalized = String(raw).trim().toLowerCase();
|
||||
return normalized === "true" || normalized === "1" || normalized === "yes";
|
||||
}
|
||||
|
||||
function vaultAgentInvokeOptions(op, params = {}) {
|
||||
if (op !== "snippets.run" && op !== "scripts.run") return undefined;
|
||||
if (!parseVaultAgentWaitFlag(params.wait)) return undefined;
|
||||
return { timeoutMs: VAULT_AGENT_SCRIPT_WAIT_TIMEOUT_MS };
|
||||
}
|
||||
|
||||
/**
|
||||
* Vault domain service. Read-only metadata and notes/snippets are served from
|
||||
* renderer vault state via VaultAgentBridge; credentials never cross the bridge.
|
||||
*/
|
||||
function createVaultService(ctx = {}) {
|
||||
const { invokeVaultAgent } = ctx;
|
||||
|
||||
function requireBridge() {
|
||||
if (typeof invokeVaultAgent !== "function") {
|
||||
return { ok: false, error: "Vault agent bridge is unavailable." };
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
getHost: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("host.get", { hostId: params.hostId });
|
||||
},
|
||||
listHosts: async () => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("host.list", {});
|
||||
},
|
||||
openHost: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("host.open", {
|
||||
hostId: params.hostId,
|
||||
chatSessionId: params.chatSessionId,
|
||||
});
|
||||
},
|
||||
createHosts: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("hosts.create", params);
|
||||
},
|
||||
updateHost: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("host.update", params);
|
||||
},
|
||||
deleteHost: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("host.delete", { hostId: params.hostId });
|
||||
},
|
||||
importHosts: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("host.import", params);
|
||||
},
|
||||
getHostNotes: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("host.notes.get", { hostId: params.hostId });
|
||||
},
|
||||
setHostNotes: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("host.notes.set", {
|
||||
hostId: params.hostId,
|
||||
notes: params.notes,
|
||||
});
|
||||
},
|
||||
listNotes: async () => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("note.list", {});
|
||||
},
|
||||
getNote: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("note.get", {
|
||||
noteId: params.noteId,
|
||||
offset: params.offset,
|
||||
maxChars: params.maxChars,
|
||||
query: params.query,
|
||||
expectedUpdatedAt: params.expectedUpdatedAt,
|
||||
});
|
||||
},
|
||||
createNote: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("note.create", params);
|
||||
},
|
||||
updateNote: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("note.update", params);
|
||||
},
|
||||
deleteNote: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("note.delete", { noteId: params.noteId });
|
||||
},
|
||||
listIdentities: async () => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("identity.list", {});
|
||||
},
|
||||
listProxyProfiles: async () => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("proxyProfile.list", {});
|
||||
},
|
||||
listGroups: async () => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("group.list", {});
|
||||
},
|
||||
createGroup: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("group.create", params);
|
||||
},
|
||||
updateGroup: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("group.update", params);
|
||||
},
|
||||
deleteGroup: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("group.delete", params);
|
||||
},
|
||||
listSnippets: async () => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("snippets.list", {});
|
||||
},
|
||||
getSnippet: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("snippets.get", { snippetId: params.snippetId });
|
||||
},
|
||||
runSnippet: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("snippets.run", {
|
||||
snippetId: params.snippetId,
|
||||
sessionId: params.sessionId,
|
||||
variables: params.variables,
|
||||
chatSessionId: params.chatSessionId,
|
||||
wait: params.wait,
|
||||
}, vaultAgentInvokeOptions("snippets.run", params));
|
||||
},
|
||||
createSnippet: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("snippets.create", params);
|
||||
},
|
||||
updateSnippet: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("snippets.update", params);
|
||||
},
|
||||
deleteSnippet: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("snippets.delete", params);
|
||||
},
|
||||
listScripts: async () => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("scripts.list", {});
|
||||
},
|
||||
getScript: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("scripts.get", { scriptId: params.scriptId, snippetId: params.scriptId });
|
||||
},
|
||||
createScript: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("scripts.create", params);
|
||||
},
|
||||
updateScript: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("scripts.update", params);
|
||||
},
|
||||
deleteScript: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("scripts.delete", params);
|
||||
},
|
||||
runScript: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("scripts.run", params, vaultAgentInvokeOptions("scripts.run", params));
|
||||
},
|
||||
getScriptReference: async () => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("scripts.reference", {});
|
||||
},
|
||||
listScriptRuns: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("scripts.runs.list", params);
|
||||
},
|
||||
stopScriptRun: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("scripts.run.stop", params);
|
||||
},
|
||||
pauseScriptRun: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("scripts.run.pause", params);
|
||||
},
|
||||
resumeScriptRun: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("scripts.run.resume", params);
|
||||
},
|
||||
setScriptTargets: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("scripts.targets.set", params);
|
||||
},
|
||||
listHostConnectScripts: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("host.connectScripts.list", params);
|
||||
},
|
||||
setHostConnectScripts: async (params = {}) => {
|
||||
const bridgeErr = requireBridge();
|
||||
if (bridgeErr) return bridgeErr;
|
||||
return invokeVaultAgent("host.connectScripts.set", params);
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
createVaultService,
|
||||
};
|
||||
Reference in New Issue
Block a user