@caupulican/pi-adaptative 0.93.11 → 0.93.13

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 (139) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/core/agent-paths.d.ts +6 -0
  3. package/dist/core/agent-paths.d.ts.map +1 -1
  4. package/dist/core/agent-paths.js +15 -0
  5. package/dist/core/agent-paths.js.map +1 -1
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +2 -0
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/background-lane-controller.d.ts +2 -0
  10. package/dist/core/background-lane-controller.d.ts.map +1 -1
  11. package/dist/core/background-lane-controller.js +3 -0
  12. package/dist/core/background-lane-controller.js.map +1 -1
  13. package/dist/core/background-tool-task-controller.d.ts +4 -0
  14. package/dist/core/background-tool-task-controller.d.ts.map +1 -1
  15. package/dist/core/background-tool-task-controller.js +22 -19
  16. package/dist/core/background-tool-task-controller.js.map +1 -1
  17. package/dist/core/delegation/worker-agent-control-coordinator.d.ts +3 -1
  18. package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
  19. package/dist/core/delegation/worker-agent-control-coordinator.js +8 -0
  20. package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
  21. package/dist/core/delegation/worker-attempt-executor.d.ts +2 -1
  22. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
  23. package/dist/core/delegation/worker-attempt-executor.js +14 -1
  24. package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
  25. package/dist/core/delegation/worker-claim.d.ts +4 -1
  26. package/dist/core/delegation/worker-claim.d.ts.map +1 -1
  27. package/dist/core/delegation/worker-claim.js +20 -2
  28. package/dist/core/delegation/worker-claim.js.map +1 -1
  29. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  30. package/dist/core/delegation/worker-delegation-controller.js +2 -0
  31. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  32. package/dist/core/delegation/worker-lifecycle.d.ts +1 -0
  33. package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
  34. package/dist/core/delegation/worker-lifecycle.js +3 -0
  35. package/dist/core/delegation/worker-lifecycle.js.map +1 -1
  36. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  37. package/dist/core/delegation/worker-runner.js +15 -9
  38. package/dist/core/delegation/worker-runner.js.map +1 -1
  39. package/dist/core/delegation/worker-terminal-output-artifact.d.ts +14 -0
  40. package/dist/core/delegation/worker-terminal-output-artifact.d.ts.map +1 -0
  41. package/dist/core/delegation/worker-terminal-output-artifact.js +49 -0
  42. package/dist/core/delegation/worker-terminal-output-artifact.js.map +1 -0
  43. package/dist/core/foreground-terminal-handoff-controller.d.ts +3 -0
  44. package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
  45. package/dist/core/foreground-terminal-handoff-controller.js +6 -0
  46. package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
  47. package/dist/core/goals/goal-session-controller.d.ts +2 -2
  48. package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
  49. package/dist/core/goals/goal-session-controller.js +2 -11
  50. package/dist/core/goals/goal-session-controller.js.map +1 -1
  51. package/dist/core/orchestration/contracts.d.ts +2 -0
  52. package/dist/core/orchestration/contracts.d.ts.map +1 -1
  53. package/dist/core/orchestration/contracts.js +3 -0
  54. package/dist/core/orchestration/contracts.js.map +1 -1
  55. package/dist/core/orchestration/task-runtime-codecs.d.ts.map +1 -1
  56. package/dist/core/orchestration/task-runtime-codecs.js +11 -2
  57. package/dist/core/orchestration/task-runtime-codecs.js.map +1 -1
  58. package/dist/core/orchestration/worker-result-adapter.d.ts +2 -1
  59. package/dist/core/orchestration/worker-result-adapter.d.ts.map +1 -1
  60. package/dist/core/orchestration/worker-result-adapter.js +41 -7
  61. package/dist/core/orchestration/worker-result-adapter.js.map +1 -1
  62. package/dist/core/runtime-builder.d.ts +5 -2
  63. package/dist/core/runtime-builder.d.ts.map +1 -1
  64. package/dist/core/runtime-builder.js +26 -8
  65. package/dist/core/runtime-builder.js.map +1 -1
  66. package/dist/core/secrets/bitwarden-credential-storage-router.d.ts +22 -0
  67. package/dist/core/secrets/bitwarden-credential-storage-router.d.ts.map +1 -0
  68. package/dist/core/secrets/bitwarden-credential-storage-router.js +59 -0
  69. package/dist/core/secrets/bitwarden-credential-storage-router.js.map +1 -0
  70. package/dist/core/secrets/bitwarden-credential-storage.d.ts +2 -8
  71. package/dist/core/secrets/bitwarden-credential-storage.d.ts.map +1 -1
  72. package/dist/core/secrets/bitwarden-credential-storage.js +23 -134
  73. package/dist/core/secrets/bitwarden-credential-storage.js.map +1 -1
  74. package/dist/core/secrets/bitwarden-secrets-manager-storage.d.ts +46 -0
  75. package/dist/core/secrets/bitwarden-secrets-manager-storage.d.ts.map +1 -0
  76. package/dist/core/secrets/bitwarden-secrets-manager-storage.js +379 -0
  77. package/dist/core/secrets/bitwarden-secrets-manager-storage.js.map +1 -0
  78. package/dist/core/secrets/credential-cli-command.d.ts +22 -0
  79. package/dist/core/secrets/credential-cli-command.d.ts.map +1 -0
  80. package/dist/core/secrets/credential-cli-command.js +82 -0
  81. package/dist/core/secrets/credential-cli-command.js.map +1 -0
  82. package/dist/core/secrets/credential-exposure-guard.d.ts +1 -1
  83. package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
  84. package/dist/core/secrets/credential-exposure-guard.js +5 -1
  85. package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
  86. package/dist/core/secrets/credential-machine-session.d.ts +13 -0
  87. package/dist/core/secrets/credential-machine-session.d.ts.map +1 -0
  88. package/dist/core/secrets/credential-machine-session.js +139 -0
  89. package/dist/core/secrets/credential-machine-session.js.map +1 -0
  90. package/dist/core/secrets/credential-manager.d.ts +11 -1
  91. package/dist/core/secrets/credential-manager.d.ts.map +1 -1
  92. package/dist/core/secrets/credential-manager.js +44 -9
  93. package/dist/core/secrets/credential-manager.js.map +1 -1
  94. package/dist/core/secrets/credential-profile-envelope.d.ts +10 -0
  95. package/dist/core/secrets/credential-profile-envelope.d.ts.map +1 -0
  96. package/dist/core/secrets/credential-profile-envelope.js +78 -0
  97. package/dist/core/secrets/credential-profile-envelope.js.map +1 -0
  98. package/dist/core/secrets/credential-session-connection.d.ts.map +1 -1
  99. package/dist/core/secrets/credential-session-connection.js +2 -1
  100. package/dist/core/secrets/credential-session-connection.js.map +1 -1
  101. package/dist/core/secrets/credential-source-discovery.d.ts +7 -3
  102. package/dist/core/secrets/credential-source-discovery.d.ts.map +1 -1
  103. package/dist/core/secrets/credential-source-discovery.js +48 -9
  104. package/dist/core/secrets/credential-source-discovery.js.map +1 -1
  105. package/dist/core/tools/delegate-status.d.ts +4 -0
  106. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  107. package/dist/core/tools/delegate-status.js +20 -4
  108. package/dist/core/tools/delegate-status.js.map +1 -1
  109. package/dist/core/tools/goal.d.ts +2 -2
  110. package/dist/core/tools/goal.d.ts.map +1 -1
  111. package/dist/core/tools/goal.js +30 -11
  112. package/dist/core/tools/goal.js.map +1 -1
  113. package/dist/core/tools/secret-store.d.ts.map +1 -1
  114. package/dist/core/tools/secret-store.js +6 -15
  115. package/dist/core/tools/secret-store.js.map +1 -1
  116. package/dist/core/tools/tool-task.d.ts.map +1 -1
  117. package/dist/core/tools/tool-task.js +6 -3
  118. package/dist/core/tools/tool-task.js.map +1 -1
  119. package/dist/core/util/bounded-value.d.ts +2 -0
  120. package/dist/core/util/bounded-value.d.ts.map +1 -1
  121. package/dist/core/util/bounded-value.js +13 -0
  122. package/dist/core/util/bounded-value.js.map +1 -1
  123. package/dist/index.d.ts +3 -1
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +2 -0
  126. package/dist/index.js.map +1 -1
  127. package/dist/utils/tools-manager.d.ts +2 -1
  128. package/dist/utils/tools-manager.d.ts.map +1 -1
  129. package/dist/utils/tools-manager.js +29 -0
  130. package/dist/utils/tools-manager.js.map +1 -1
  131. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  132. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  133. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  134. package/examples/extensions/sandbox/package-lock.json +2 -2
  135. package/examples/extensions/sandbox/package.json +1 -1
  136. package/examples/extensions/with-deps/package-lock.json +2 -2
  137. package/examples/extensions/with-deps/package.json +1 -1
  138. package/npm-shrinkwrap.json +12 -12
  139. package/package.json +4 -4
@@ -0,0 +1,22 @@
1
+ import { type CredentialProfileRecord, type CredentialProfileStorage, type CredentialStorageProvider, type StoredCredentialProfileSummary } from "./credential-manager.ts";
2
+ export interface BitwardenCredentialStorageRouterOptions {
3
+ passwordManager?: CredentialProfileStorage;
4
+ secretsManager?: CredentialProfileStorage;
5
+ secretsManagerCoordinationFile?: string;
6
+ }
7
+ /** Provider strategy owner selected once by CredentialManager's validated machine session. */
8
+ export declare class BitwardenCredentialStorageRouter implements CredentialProfileStorage {
9
+ private readonly passwordManager;
10
+ private readonly secretsManager;
11
+ private active;
12
+ constructor(options: BitwardenCredentialStorageRouterOptions);
13
+ connect(sessionKey: string, signal?: AbortSignal, provider?: CredentialStorageProvider): Promise<void>;
14
+ refresh(signal?: AbortSignal): Promise<void>;
15
+ listProfiles(signal?: AbortSignal): Promise<StoredCredentialProfileSummary[]>;
16
+ readProfile(profile: string, signal?: AbortSignal): Promise<CredentialProfileRecord>;
17
+ writeProfile(record: CredentialProfileRecord, signal?: AbortSignal): Promise<void>;
18
+ deleteProfile(profile: string, signal?: AbortSignal): Promise<void>;
19
+ lock(): void;
20
+ private requireActive;
21
+ }
22
+ //# sourceMappingURL=bitwarden-credential-storage-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitwarden-credential-storage-router.d.ts","sourceRoot":"","sources":["../../../src/core/secrets/bitwarden-credential-storage-router.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAE7B,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,EACnC,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,uCAAuC;IACvD,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,8BAA8B,CAAC,EAAE,MAAM,CAAC;CACxC;AAED,8FAA8F;AAC9F,qBAAa,gCAAiC,YAAW,wBAAwB;IAChF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2B;IAC3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAC1D,OAAO,CAAC,MAAM,CAAuC;IAErD,YAAY,OAAO,EAAE,uCAAuC,EAY3D;IAEK,OAAO,CACZ,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,GAAE,yBAAwD,GAChE,OAAO,CAAC,IAAI,CAAC,CAWf;IAEK,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjD;IAEK,YAAY,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,8BAA8B,EAAE,CAAC,CAElF;IAEK,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAEzF;IAEK,YAAY,CAAC,MAAM,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF;IAEK,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAExE;IAED,IAAI,IAAI,IAAI,CAIX;IAED,OAAO,CAAC,aAAa;CAIrB"}
@@ -0,0 +1,59 @@
1
+ import { BitwardenCredentialStorage } from "./bitwarden-credential-storage.js";
2
+ import { BitwardenSecretsManagerCredentialStorage } from "./bitwarden-secrets-manager-storage.js";
3
+ import { CredentialStorageError, } from "./credential-manager.js";
4
+ /** Provider strategy owner selected once by CredentialManager's validated machine session. */
5
+ export class BitwardenCredentialStorageRouter {
6
+ constructor(options) {
7
+ this.passwordManager = options.passwordManager ?? new BitwardenCredentialStorage();
8
+ if (options.secretsManager) {
9
+ this.secretsManager = options.secretsManager;
10
+ }
11
+ else {
12
+ if (!options.secretsManagerCoordinationFile) {
13
+ throw new TypeError("Bitwarden Secrets Manager requires a coordination file.");
14
+ }
15
+ this.secretsManager = new BitwardenSecretsManagerCredentialStorage({
16
+ coordinationFile: options.secretsManagerCoordinationFile,
17
+ });
18
+ }
19
+ }
20
+ async connect(sessionKey, signal, provider = "bitwarden_password_manager") {
21
+ this.lock();
22
+ const selected = provider === "bitwarden_secrets_manager" ? this.secretsManager : this.passwordManager;
23
+ this.active = selected;
24
+ try {
25
+ await selected.connect(sessionKey, signal, provider);
26
+ }
27
+ catch (error) {
28
+ selected.lock();
29
+ this.active = undefined;
30
+ throw error;
31
+ }
32
+ }
33
+ async refresh(signal) {
34
+ await this.requireActive().refresh?.(signal);
35
+ }
36
+ async listProfiles(signal) {
37
+ return this.requireActive().listProfiles(signal);
38
+ }
39
+ async readProfile(profile, signal) {
40
+ return this.requireActive().readProfile(profile, signal);
41
+ }
42
+ async writeProfile(record, signal) {
43
+ await this.requireActive().writeProfile(record, signal);
44
+ }
45
+ async deleteProfile(profile, signal) {
46
+ await this.requireActive().deleteProfile(profile, signal);
47
+ }
48
+ lock() {
49
+ this.passwordManager.lock();
50
+ this.secretsManager.lock();
51
+ this.active = undefined;
52
+ }
53
+ requireActive() {
54
+ if (!this.active)
55
+ throw new CredentialStorageError("not_connected", "Bitwarden is not connected.");
56
+ return this.active;
57
+ }
58
+ }
59
+ //# sourceMappingURL=bitwarden-credential-storage-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitwarden-credential-storage-router.js","sourceRoot":"","sources":["../../../src/core/secrets/bitwarden-credential-storage-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,wCAAwC,EAAE,MAAM,wCAAwC,CAAC;AAClG,OAAO,EAGN,sBAAsB,GAGtB,MAAM,yBAAyB,CAAC;AAQjC,8FAA8F;AAC9F,MAAM,OAAO,gCAAgC;IAK5C,YAAY,OAAgD;QAC3D,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,0BAA0B,EAAE,CAAC;QACnF,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC9C,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE,CAAC;gBAC7C,MAAM,IAAI,SAAS,CAAC,yDAAyD,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,CAAC,cAAc,GAAG,IAAI,wCAAwC,CAAC;gBAClE,gBAAgB,EAAE,OAAO,CAAC,8BAA8B;aACxD,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,KAAK,CAAC,OAAO,CACZ,UAAkB,EAClB,MAAoB,EACpB,QAAQ,GAA8B,4BAA4B;QAElE,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,QAAQ,KAAK,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;QACvG,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QACvB,IAAI,CAAC;YACJ,MAAM,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAoB;QACjC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAoB;QACtC,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,MAAoB;QACtD,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA+B,EAAE,MAAoB;QACvE,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,MAAoB;QACxD,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI;QACH,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IACzB,CAAC;IAEO,aAAa;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,sBAAsB,CAAC,eAAe,EAAE,6BAA6B,CAAC,CAAC;QACnG,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;CACD","sourcesContent":["import { BitwardenCredentialStorage } from \"./bitwarden-credential-storage.ts\";\nimport { BitwardenSecretsManagerCredentialStorage } from \"./bitwarden-secrets-manager-storage.ts\";\nimport {\n\ttype CredentialProfileRecord,\n\ttype CredentialProfileStorage,\n\tCredentialStorageError,\n\ttype CredentialStorageProvider,\n\ttype StoredCredentialProfileSummary,\n} from \"./credential-manager.ts\";\n\nexport interface BitwardenCredentialStorageRouterOptions {\n\tpasswordManager?: CredentialProfileStorage;\n\tsecretsManager?: CredentialProfileStorage;\n\tsecretsManagerCoordinationFile?: string;\n}\n\n/** Provider strategy owner selected once by CredentialManager's validated machine session. */\nexport class BitwardenCredentialStorageRouter implements CredentialProfileStorage {\n\tprivate readonly passwordManager: CredentialProfileStorage;\n\tprivate readonly secretsManager: CredentialProfileStorage;\n\tprivate active: CredentialProfileStorage | undefined;\n\n\tconstructor(options: BitwardenCredentialStorageRouterOptions) {\n\t\tthis.passwordManager = options.passwordManager ?? new BitwardenCredentialStorage();\n\t\tif (options.secretsManager) {\n\t\t\tthis.secretsManager = options.secretsManager;\n\t\t} else {\n\t\t\tif (!options.secretsManagerCoordinationFile) {\n\t\t\t\tthrow new TypeError(\"Bitwarden Secrets Manager requires a coordination file.\");\n\t\t\t}\n\t\t\tthis.secretsManager = new BitwardenSecretsManagerCredentialStorage({\n\t\t\t\tcoordinationFile: options.secretsManagerCoordinationFile,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync connect(\n\t\tsessionKey: string,\n\t\tsignal?: AbortSignal,\n\t\tprovider: CredentialStorageProvider = \"bitwarden_password_manager\",\n\t): Promise<void> {\n\t\tthis.lock();\n\t\tconst selected = provider === \"bitwarden_secrets_manager\" ? this.secretsManager : this.passwordManager;\n\t\tthis.active = selected;\n\t\ttry {\n\t\t\tawait selected.connect(sessionKey, signal, provider);\n\t\t} catch (error) {\n\t\t\tselected.lock();\n\t\t\tthis.active = undefined;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync refresh(signal?: AbortSignal): Promise<void> {\n\t\tawait this.requireActive().refresh?.(signal);\n\t}\n\n\tasync listProfiles(signal?: AbortSignal): Promise<StoredCredentialProfileSummary[]> {\n\t\treturn this.requireActive().listProfiles(signal);\n\t}\n\n\tasync readProfile(profile: string, signal?: AbortSignal): Promise<CredentialProfileRecord> {\n\t\treturn this.requireActive().readProfile(profile, signal);\n\t}\n\n\tasync writeProfile(record: CredentialProfileRecord, signal?: AbortSignal): Promise<void> {\n\t\tawait this.requireActive().writeProfile(record, signal);\n\t}\n\n\tasync deleteProfile(profile: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.requireActive().deleteProfile(profile, signal);\n\t}\n\n\tlock(): void {\n\t\tthis.passwordManager.lock();\n\t\tthis.secretsManager.lock();\n\t\tthis.active = undefined;\n\t}\n\n\tprivate requireActive(): CredentialProfileStorage {\n\t\tif (!this.active) throw new CredentialStorageError(\"not_connected\", \"Bitwarden is not connected.\");\n\t\treturn this.active;\n\t}\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { type ManagedToolResolver } from "../../utils/tools-manager.ts";
2
+ import { type CredentialCliCommandResult } from "./credential-cli-command.ts";
2
3
  import { type CredentialProfileRecord, type CredentialProfileStorage, CredentialStorageError, type StoredCredentialProfileSummary } from "./credential-manager.ts";
3
4
  export type BitwardenCredentialStorageErrorCode = "provider_command_failed" | "provider_unavailable" | "malformed_provider_data" | "not_connected" | "profile_not_found";
4
5
  export declare class BitwardenCredentialStorageError extends CredentialStorageError {
@@ -12,14 +13,7 @@ export interface BitwardenCommandRequest {
12
13
  sessionKey: string;
13
14
  signal?: AbortSignal;
14
15
  }
15
- export interface BitwardenCommandResult {
16
- exitCode: number;
17
- stdout: string;
18
- stderr: string;
19
- aborted?: boolean;
20
- timedOut?: boolean;
21
- outputLimitExceeded?: boolean;
22
- }
16
+ export type BitwardenCommandResult = CredentialCliCommandResult;
23
17
  export type BitwardenCommandRunner = (request: BitwardenCommandRequest) => Promise<BitwardenCommandResult>;
24
18
  export interface BitwardenCredentialStorageOptions {
25
19
  resolveTool?: ManagedToolResolver;
@@ -1 +1 @@
1
- {"version":3,"file":"bitwarden-credential-storage.d.ts","sourceRoot":"","sources":["../../../src/core/secrets/bitwarden-credential-storage.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnG,OAAO,EACN,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,sBAAsB,EACtB,KAAK,8BAA8B,EAGnC,MAAM,yBAAyB,CAAC;AAYjC,MAAM,MAAM,mCAAmC,GAC5C,yBAAyB,GACzB,sBAAsB,GACtB,yBAAyB,GACzB,eAAe,GACf,mBAAmB,CAAC;AAEvB,qBAAa,+BAAgC,SAAQ,sBAAsB;IAC1E,SAAiB,IAAI,EAAE,mCAAmC,CAAC;IAE3D,YAAY,IAAI,EAAE,mCAAmC,EAAE,OAAO,EAAE,MAAM,EAGrE;CACD;AAED,MAAM,WAAW,uBAAuB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,uBAAuB,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAE3G,MAAM,WAAW,iCAAiC;IACjD,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,UAAU,CAAC,EAAE,sBAAsB,CAAC;CACpC;AAiCD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkD3G;AA6GD,qBAAa,0BAA2B,YAAW,wBAAwB;IAC1E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IACtE,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAK;IAEvB,YAAY,OAAO,GAAE,iCAAsC,EAG1D;IAEK,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBrE;IAEK,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjD;IAEK,YAAY,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,8BAA8B,EAAE,CAAC,CAKlF;IAEK,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAOzF;IAEK,YAAY,CAAC,MAAM,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CvF;IAEK,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CASxE;IAED,IAAI,IAAI,IAAI,CAUX;IAED,OAAO,CAAC,eAAe;YAOT,YAAY;YAKZ,MAAM;IAsCpB,OAAO,CAAC,gBAAgB;YAQV,UAAU;CA0BxB"}
1
+ {"version":3,"file":"bitwarden-credential-storage.d.ts","sourceRoot":"","sources":["../../../src/core/secrets/bitwarden-credential-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnG,OAAO,EAAE,KAAK,0BAA0B,EAA2B,MAAM,6BAA6B,CAAC;AACvG,OAAO,EACN,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,sBAAsB,EACtB,KAAK,8BAA8B,EAGnC,MAAM,yBAAyB,CAAC;AAYjC,MAAM,MAAM,mCAAmC,GAC5C,yBAAyB,GACzB,sBAAsB,GACtB,yBAAyB,GACzB,eAAe,GACf,mBAAmB,CAAC;AAEvB,qBAAa,+BAAgC,SAAQ,sBAAsB;IAC1E,SAAiB,IAAI,EAAE,mCAAmC,CAAC;IAE3D,YAAY,IAAI,EAAE,mCAAmC,EAAE,OAAO,EAAE,MAAM,EAGrE;CACD;AAED,MAAM,WAAW,uBAAuB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AAEhE,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,uBAAuB,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAE3G,MAAM,WAAW,iCAAiC;IACjD,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,UAAU,CAAC,EAAE,sBAAsB,CAAC;CACpC;AAQD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAS3G;AAqDD,qBAAa,0BAA2B,YAAW,wBAAwB;IAC1E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IACtE,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAK;IAEvB,YAAY,OAAO,GAAE,iCAAsC,EAG1D;IAEK,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBrE;IAEK,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjD;IAEK,YAAY,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,8BAA8B,EAAE,CAAC,CAGlF;IAEK,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAOzF;IAEK,YAAY,CAAC,MAAM,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CvF;IAEK,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CASxE;IAED,IAAI,IAAI,IAAI,CAUX;IAED,OAAO,CAAC,eAAe;YAOT,YAAY;YAKZ,MAAM;IAsCpB,OAAO,CAAC,gBAAgB;YAQV,UAAU;CA0BxB"}
@@ -1,13 +1,8 @@
1
- import { spawnProcess, waitForChildProcessWithTermination } from "../../utils/child-process.js";
2
1
  import { ensureToolWithDiagnostics } from "../../utils/tools-manager.js";
2
+ import { runCredentialCliCommand } from "./credential-cli-command.js";
3
3
  import { CredentialStorageError, validateCredentialProfileName, validateCredentialProfileRecord, } from "./credential-manager.js";
4
- const ITEM_NAME_PREFIX = "Pi credential profile · ";
5
- const ENVELOPE_KIND = "pi.credential-profile";
6
- const ENVELOPE_SCHEMA = 1;
7
- const MAX_COMMAND_OUTPUT_BYTES = 4 * 1024 * 1024;
4
+ import { CREDENTIAL_PROFILE_KEY_PREFIX, parseCredentialProfileEnvelope, serializeCredentialProfileEnvelope, summarizeCredentialProfiles, } from "./credential-profile-envelope.js";
8
5
  const MAX_PROFILE_ITEMS = 256;
9
- const MAX_NOTE_BYTES = 1024 * 1024;
10
- const COMMAND_TIMEOUT_MS = 30_000;
11
6
  const SYNC_FRESHNESS_MS = 30_000;
12
7
  const ITEM_ID_PATTERN = /^[A-Za-z0-9-]{1,128}$/;
13
8
  export class BitwardenCredentialStorageError extends CredentialStorageError {
@@ -16,75 +11,15 @@ export class BitwardenCredentialStorageError extends CredentialStorageError {
16
11
  this.name = "BitwardenCredentialStorageError";
17
12
  }
18
13
  }
19
- function appendBounded(current, chunk, limit) {
20
- const text = typeof chunk === "string" ? chunk : chunk.toString("utf8");
21
- if (Buffer.byteLength(current, "utf8") + Buffer.byteLength(text, "utf8") <= limit) {
22
- return { value: current + text, exceeded: false };
23
- }
24
- return { value: current, exceeded: true };
25
- }
26
- function combineAbortSignal(source, controller) {
27
- if (!source)
28
- return () => { };
29
- const abort = () => controller.abort();
30
- if (source.aborted)
31
- abort();
32
- else
33
- source.addEventListener("abort", abort, { once: true });
34
- return () => source.removeEventListener("abort", abort);
35
- }
36
14
  export async function runBitwardenCommand(request) {
37
- const controller = new AbortController();
38
- const detachAbort = combineAbortSignal(request.signal, controller);
39
- let stdout = "";
40
- let stderr = "";
41
- let outputLimitExceeded = false;
42
- let child;
43
- try {
44
- child = spawnProcess(request.executable, request.args, {
45
- env: { ...process.env, BW_SESSION: request.sessionKey, NO_COLOR: "1" },
46
- stdio: ["pipe", "pipe", "pipe"],
47
- windowsHide: true,
48
- });
49
- child.stdout?.on("data", (chunk) => {
50
- const appended = appendBounded(stdout, chunk, MAX_COMMAND_OUTPUT_BYTES);
51
- stdout = appended.value;
52
- if (appended.exceeded) {
53
- outputLimitExceeded = true;
54
- controller.abort();
55
- }
56
- });
57
- child.stderr?.on("data", (chunk) => {
58
- const appended = appendBounded(stderr, chunk, MAX_COMMAND_OUTPUT_BYTES);
59
- stderr = appended.value;
60
- if (appended.exceeded) {
61
- outputLimitExceeded = true;
62
- controller.abort();
63
- }
64
- });
65
- child.stdin?.end(request.input);
66
- const terminal = await waitForChildProcessWithTermination(child, {
67
- signal: controller.signal,
68
- timeoutMs: COMMAND_TIMEOUT_MS,
69
- killGraceMs: 2_000,
70
- });
71
- return {
72
- exitCode: terminal.code ?? 1,
73
- stdout,
74
- stderr,
75
- ...(terminal.reason === "aborted" ? { aborted: true } : {}),
76
- ...(terminal.reason === "timeout" ? { timedOut: true } : {}),
77
- ...(outputLimitExceeded ? { outputLimitExceeded: true } : {}),
78
- };
79
- }
80
- catch {
81
- return { exitCode: 1, stdout: "", stderr: "" };
82
- }
83
- finally {
84
- detachAbort();
85
- stdout = "";
86
- stderr = "";
87
- }
15
+ return runCredentialCliCommand({
16
+ executable: request.executable,
17
+ args: request.args,
18
+ ...(request.input !== undefined ? { input: request.input } : {}),
19
+ authEnvironment: { name: "BW_SESSION", value: request.sessionKey },
20
+ omitEnvironmentVariables: ["BWS_ACCESS_TOKEN"],
21
+ ...(request.signal ? { signal: request.signal } : {}),
22
+ });
88
23
  }
89
24
  function isObject(value) {
90
25
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -97,42 +32,11 @@ function parseJson(value) {
97
32
  throw new BitwardenCredentialStorageError("malformed_provider_data", "Bitwarden returned malformed profile data.");
98
33
  }
99
34
  }
100
- function parseEnvelope(note, expectedProfile) {
101
- if (Buffer.byteLength(note, "utf8") > MAX_NOTE_BYTES) {
102
- throw new BitwardenCredentialStorageError("malformed_provider_data", "Bitwarden returned an oversized profile record.");
103
- }
104
- const value = parseJson(note);
105
- if (!isObject(value) ||
106
- value.kind !== ENVELOPE_KIND ||
107
- value.schema !== ENVELOPE_SCHEMA ||
108
- value.profile !== expectedProfile ||
109
- (value.description !== undefined && typeof value.description !== "string") ||
110
- !Array.isArray(value.variables) ||
111
- !Array.isArray(value.projectKeys) ||
112
- !value.variables.every((variable) => isObject(variable) && typeof variable.name === "string" && typeof variable.value === "string") ||
113
- !value.projectKeys.every((key) => typeof key === "string")) {
114
- throw new BitwardenCredentialStorageError("malformed_provider_data", "Bitwarden returned malformed profile data.");
115
- }
116
- const record = {
117
- profile: expectedProfile,
118
- ...(typeof value.description === "string" ? { description: value.description } : {}),
119
- variables: value.variables.map((variable) => ({
120
- name: variable.name,
121
- value: variable.value,
122
- })),
123
- projectKeys: value.projectKeys,
124
- };
125
- try {
126
- return validateCredentialProfileRecord(record);
127
- }
128
- catch {
129
- throw new BitwardenCredentialStorageError("malformed_provider_data", "Bitwarden returned malformed profile data.");
130
- }
131
- }
132
35
  function parseProfileItem(value) {
133
- if (!isObject(value) || typeof value.name !== "string" || !value.name.startsWith(ITEM_NAME_PREFIX))
36
+ if (!isObject(value) || typeof value.name !== "string" || !value.name.startsWith(CREDENTIAL_PROFILE_KEY_PREFIX)) {
134
37
  return undefined;
135
- const profile = value.name.slice(ITEM_NAME_PREFIX.length);
38
+ }
39
+ const profile = value.name.slice(CREDENTIAL_PROFILE_KEY_PREFIX.length);
136
40
  if (value.type !== 2 ||
137
41
  typeof value.id !== "string" ||
138
42
  !ITEM_ID_PATTERN.test(value.id) ||
@@ -147,25 +51,12 @@ function parseProfileItem(value) {
147
51
  catch {
148
52
  throw new BitwardenCredentialStorageError("malformed_provider_data", "Bitwarden returned malformed profile data.");
149
53
  }
150
- return { id: value.id, item: value, record: parseEnvelope(value.notes, profile) };
151
- }
152
- function profileSummary(record) {
153
- return {
154
- profile: record.profile,
155
- ...(record.description ? { description: record.description } : {}),
156
- variableNames: record.variables.map((variable) => variable.name),
157
- projectKeys: [...record.projectKeys],
158
- };
159
- }
160
- function createEnvelope(record) {
161
- return {
162
- kind: ENVELOPE_KIND,
163
- schema: ENVELOPE_SCHEMA,
164
- profile: record.profile,
165
- ...(record.description ? { description: record.description } : {}),
166
- variables: record.variables.map((variable) => ({ ...variable })),
167
- projectKeys: [...record.projectKeys],
168
- };
54
+ try {
55
+ return { id: value.id, item: value, record: parseCredentialProfileEnvelope(value.notes, profile) };
56
+ }
57
+ catch {
58
+ throw new BitwardenCredentialStorageError("malformed_provider_data", "Bitwarden returned malformed profile data.");
59
+ }
169
60
  }
170
61
  export class BitwardenCredentialStorage {
171
62
  constructor(options = {}) {
@@ -199,9 +90,7 @@ export class BitwardenCredentialStorage {
199
90
  }
200
91
  async listProfiles(signal) {
201
92
  await this.ensureLoaded(signal);
202
- return [...this.profiles.values()]
203
- .map((profile) => profileSummary(profile.record))
204
- .sort((left, right) => left.profile.localeCompare(right.profile));
93
+ return summarizeCredentialProfiles([...this.profiles.values()].map((profile) => profile.record));
205
94
  }
206
95
  async readProfile(profile, signal) {
207
96
  await this.ensureLoaded(signal);
@@ -227,8 +116,8 @@ export class BitwardenCredentialStorage {
227
116
  item = template;
228
117
  }
229
118
  item.type = 2;
230
- item.name = `${ITEM_NAME_PREFIX}${record.profile}`;
231
- item.notes = JSON.stringify(createEnvelope(record));
119
+ item.name = `${CREDENTIAL_PROFILE_KEY_PREFIX}${record.profile}`;
120
+ item.notes = serializeCredentialProfileEnvelope(record);
232
121
  item.secureNote = { type: 0 };
233
122
  let serialized = "";
234
123
  let encoded = "";
@@ -296,7 +185,7 @@ export class BitwardenCredentialStorage {
296
185
  // A network sync failure must not discard a locally available encrypted vault.
297
186
  }
298
187
  }
299
- const rawItems = parseJson(await this.runChecked(["list", "items", "--search", ITEM_NAME_PREFIX], undefined, signal));
188
+ const rawItems = parseJson(await this.runChecked(["list", "items", "--search", CREDENTIAL_PROFILE_KEY_PREFIX], undefined, signal));
300
189
  if (!Array.isArray(rawItems) || rawItems.length > MAX_PROFILE_ITEMS) {
301
190
  throw new BitwardenCredentialStorageError("malformed_provider_data", "Bitwarden returned an invalid number of profile items.");
302
191
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bitwarden-credential-storage.js","sourceRoot":"","sources":["../../../src/core/secrets/bitwarden-credential-storage.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ChildProcess } from \"node:child_process\";\nimport { spawnProcess, waitForChildProcessWithTermination } from \"../../utils/child-process.ts\";\nimport { ensureToolWithDiagnostics, type ManagedToolResolver } from \"../../utils/tools-manager.ts\";\nimport {\n\ttype CredentialProfileRecord,\n\ttype CredentialProfileStorage,\n\tCredentialStorageError,\n\ttype StoredCredentialProfileSummary,\n\tvalidateCredentialProfileName,\n\tvalidateCredentialProfileRecord,\n} from \"./credential-manager.ts\";\n\nconst ITEM_NAME_PREFIX = \"Pi credential profile · \";\nconst ENVELOPE_KIND = \"pi.credential-profile\";\nconst ENVELOPE_SCHEMA = 1;\nconst MAX_COMMAND_OUTPUT_BYTES = 4 * 1024 * 1024;\nconst MAX_PROFILE_ITEMS = 256;\nconst MAX_NOTE_BYTES = 1024 * 1024;\nconst COMMAND_TIMEOUT_MS = 30_000;\nconst SYNC_FRESHNESS_MS = 30_000;\nconst ITEM_ID_PATTERN = /^[A-Za-z0-9-]{1,128}$/;\n\nexport type BitwardenCredentialStorageErrorCode =\n\t| \"provider_command_failed\"\n\t| \"provider_unavailable\"\n\t| \"malformed_provider_data\"\n\t| \"not_connected\"\n\t| \"profile_not_found\";\n\nexport class BitwardenCredentialStorageError extends CredentialStorageError {\n\tdeclare readonly code: BitwardenCredentialStorageErrorCode;\n\n\tconstructor(code: BitwardenCredentialStorageErrorCode, message: string) {\n\t\tsuper(code, message);\n\t\tthis.name = \"BitwardenCredentialStorageError\";\n\t}\n}\n\nexport interface BitwardenCommandRequest {\n\texecutable: string;\n\targs: string[];\n\tinput?: string;\n\tsessionKey: string;\n\tsignal?: AbortSignal;\n}\n\nexport interface BitwardenCommandResult {\n\texitCode: number;\n\tstdout: string;\n\tstderr: string;\n\taborted?: boolean;\n\ttimedOut?: boolean;\n\toutputLimitExceeded?: boolean;\n}\n\nexport type BitwardenCommandRunner = (request: BitwardenCommandRequest) => Promise<BitwardenCommandResult>;\n\nexport interface BitwardenCredentialStorageOptions {\n\tresolveTool?: ManagedToolResolver;\n\trunCommand?: BitwardenCommandRunner;\n}\n\ninterface BitwardenProfileEnvelope {\n\tkind: typeof ENVELOPE_KIND;\n\tschema: typeof ENVELOPE_SCHEMA;\n\tprofile: string;\n\tdescription?: string;\n\tvariables: Array<{ name: string; value: string }>;\n\tprojectKeys: string[];\n}\n\ninterface CachedBitwardenProfile {\n\tid: string;\n\titem: Record<string, unknown>;\n\trecord: CredentialProfileRecord;\n}\n\nfunction appendBounded(current: string, chunk: Buffer | string, limit: number): { value: string; exceeded: boolean } {\n\tconst text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n\tif (Buffer.byteLength(current, \"utf8\") + Buffer.byteLength(text, \"utf8\") <= limit) {\n\t\treturn { value: current + text, exceeded: false };\n\t}\n\treturn { value: current, exceeded: true };\n}\n\nfunction combineAbortSignal(source: AbortSignal | undefined, controller: AbortController): () => void {\n\tif (!source) return () => {};\n\tconst abort = () => controller.abort();\n\tif (source.aborted) abort();\n\telse source.addEventListener(\"abort\", abort, { once: true });\n\treturn () => source.removeEventListener(\"abort\", abort);\n}\n\nexport async function runBitwardenCommand(request: BitwardenCommandRequest): Promise<BitwardenCommandResult> {\n\tconst controller = new AbortController();\n\tconst detachAbort = combineAbortSignal(request.signal, controller);\n\tlet stdout = \"\";\n\tlet stderr = \"\";\n\tlet outputLimitExceeded = false;\n\tlet child: ChildProcess;\n\ttry {\n\t\tchild = spawnProcess(request.executable, request.args, {\n\t\t\tenv: { ...process.env, BW_SESSION: request.sessionKey, NO_COLOR: \"1\" },\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\twindowsHide: true,\n\t\t});\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer | string) => {\n\t\t\tconst appended = appendBounded(stdout, chunk, MAX_COMMAND_OUTPUT_BYTES);\n\t\t\tstdout = appended.value;\n\t\t\tif (appended.exceeded) {\n\t\t\t\toutputLimitExceeded = true;\n\t\t\t\tcontroller.abort();\n\t\t\t}\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer | string) => {\n\t\t\tconst appended = appendBounded(stderr, chunk, MAX_COMMAND_OUTPUT_BYTES);\n\t\t\tstderr = appended.value;\n\t\t\tif (appended.exceeded) {\n\t\t\t\toutputLimitExceeded = true;\n\t\t\t\tcontroller.abort();\n\t\t\t}\n\t\t});\n\t\tchild.stdin?.end(request.input);\n\t\tconst terminal = await waitForChildProcessWithTermination(child, {\n\t\t\tsignal: controller.signal,\n\t\t\ttimeoutMs: COMMAND_TIMEOUT_MS,\n\t\t\tkillGraceMs: 2_000,\n\t\t});\n\t\treturn {\n\t\t\texitCode: terminal.code ?? 1,\n\t\t\tstdout,\n\t\t\tstderr,\n\t\t\t...(terminal.reason === \"aborted\" ? { aborted: true } : {}),\n\t\t\t...(terminal.reason === \"timeout\" ? { timedOut: true } : {}),\n\t\t\t...(outputLimitExceeded ? { outputLimitExceeded: true } : {}),\n\t\t};\n\t} catch {\n\t\treturn { exitCode: 1, stdout: \"\", stderr: \"\" };\n\t} finally {\n\t\tdetachAbort();\n\t\tstdout = \"\";\n\t\tstderr = \"\";\n\t}\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseJson(value: string): unknown {\n\ttry {\n\t\treturn JSON.parse(value) as unknown;\n\t} catch {\n\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\"malformed_provider_data\",\n\t\t\t\"Bitwarden returned malformed profile data.\",\n\t\t);\n\t}\n}\n\nfunction parseEnvelope(note: string, expectedProfile: string): CredentialProfileRecord {\n\tif (Buffer.byteLength(note, \"utf8\") > MAX_NOTE_BYTES) {\n\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\"malformed_provider_data\",\n\t\t\t\"Bitwarden returned an oversized profile record.\",\n\t\t);\n\t}\n\tconst value = parseJson(note);\n\tif (\n\t\t!isObject(value) ||\n\t\tvalue.kind !== ENVELOPE_KIND ||\n\t\tvalue.schema !== ENVELOPE_SCHEMA ||\n\t\tvalue.profile !== expectedProfile ||\n\t\t(value.description !== undefined && typeof value.description !== \"string\") ||\n\t\t!Array.isArray(value.variables) ||\n\t\t!Array.isArray(value.projectKeys) ||\n\t\t!value.variables.every(\n\t\t\t(variable) => isObject(variable) && typeof variable.name === \"string\" && typeof variable.value === \"string\",\n\t\t) ||\n\t\t!value.projectKeys.every((key) => typeof key === \"string\")\n\t) {\n\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\"malformed_provider_data\",\n\t\t\t\"Bitwarden returned malformed profile data.\",\n\t\t);\n\t}\n\tconst record: CredentialProfileRecord = {\n\t\tprofile: expectedProfile,\n\t\t...(typeof value.description === \"string\" ? { description: value.description } : {}),\n\t\tvariables: value.variables.map((variable) => ({\n\t\t\tname: (variable as Record<string, unknown>).name as string,\n\t\t\tvalue: (variable as Record<string, unknown>).value as string,\n\t\t})),\n\t\tprojectKeys: value.projectKeys as string[],\n\t};\n\ttry {\n\t\treturn validateCredentialProfileRecord(record);\n\t} catch {\n\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\"malformed_provider_data\",\n\t\t\t\"Bitwarden returned malformed profile data.\",\n\t\t);\n\t}\n}\n\nfunction parseProfileItem(value: unknown): CachedBitwardenProfile | undefined {\n\tif (!isObject(value) || typeof value.name !== \"string\" || !value.name.startsWith(ITEM_NAME_PREFIX)) return undefined;\n\tconst profile = value.name.slice(ITEM_NAME_PREFIX.length);\n\tif (\n\t\tvalue.type !== 2 ||\n\t\ttypeof value.id !== \"string\" ||\n\t\t!ITEM_ID_PATTERN.test(value.id) ||\n\t\ttypeof value.notes !== \"string\" ||\n\t\t!isObject(value.secureNote) ||\n\t\tvalue.secureNote.type !== 0\n\t) {\n\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\"malformed_provider_data\",\n\t\t\t\"Bitwarden returned malformed profile data.\",\n\t\t);\n\t}\n\ttry {\n\t\tvalidateCredentialProfileName(profile);\n\t} catch {\n\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\"malformed_provider_data\",\n\t\t\t\"Bitwarden returned malformed profile data.\",\n\t\t);\n\t}\n\treturn { id: value.id, item: value, record: parseEnvelope(value.notes, profile) };\n}\n\nfunction profileSummary(record: CredentialProfileRecord): StoredCredentialProfileSummary {\n\treturn {\n\t\tprofile: record.profile,\n\t\t...(record.description ? { description: record.description } : {}),\n\t\tvariableNames: record.variables.map((variable) => variable.name),\n\t\tprojectKeys: [...record.projectKeys],\n\t};\n}\n\nfunction createEnvelope(record: CredentialProfileRecord): BitwardenProfileEnvelope {\n\treturn {\n\t\tkind: ENVELOPE_KIND,\n\t\tschema: ENVELOPE_SCHEMA,\n\t\tprofile: record.profile,\n\t\t...(record.description ? { description: record.description } : {}),\n\t\tvariables: record.variables.map((variable) => ({ ...variable })),\n\t\tprojectKeys: [...record.projectKeys],\n\t};\n}\n\nexport class BitwardenCredentialStorage implements CredentialProfileStorage {\n\tprivate readonly resolveTool: ManagedToolResolver;\n\tprivate readonly runCommand: BitwardenCommandRunner;\n\tprivate readonly profiles = new Map<string, CachedBitwardenProfile>();\n\tprivate executable: string | undefined;\n\tprivate sessionKey: string | undefined;\n\tprivate loaded = false;\n\tprivate lastSyncAt = 0;\n\n\tconstructor(options: BitwardenCredentialStorageOptions = {}) {\n\t\tthis.resolveTool = options.resolveTool ?? ensureToolWithDiagnostics;\n\t\tthis.runCommand = options.runCommand ?? runBitwardenCommand;\n\t}\n\n\tasync connect(sessionKey: string, signal?: AbortSignal): Promise<void> {\n\t\tthis.lock();\n\t\tconst resolution = await this.resolveTool(\"bw\", true);\n\t\tif (resolution.status === \"unavailable\") {\n\t\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\t\"provider_unavailable\",\n\t\t\t\t`Bitwarden CLI could not be provisioned (${resolution.failureCode}).`,\n\t\t\t);\n\t\t}\n\t\tthis.executable = resolution.path;\n\t\tthis.sessionKey = sessionKey;\n\t\ttry {\n\t\t\tawait this.reload(signal, true);\n\t\t} catch (error) {\n\t\t\tthis.lock();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync refresh(signal?: AbortSignal): Promise<void> {\n\t\tthis.assertConnected();\n\t\tif (this.loaded && Date.now() - this.lastSyncAt < SYNC_FRESHNESS_MS) return;\n\t\tawait this.reload(signal, true);\n\t}\n\n\tasync listProfiles(signal?: AbortSignal): Promise<StoredCredentialProfileSummary[]> {\n\t\tawait this.ensureLoaded(signal);\n\t\treturn [...this.profiles.values()]\n\t\t\t.map((profile) => profileSummary(profile.record))\n\t\t\t.sort((left, right) => left.profile.localeCompare(right.profile));\n\t}\n\n\tasync readProfile(profile: string, signal?: AbortSignal): Promise<CredentialProfileRecord> {\n\t\tawait this.ensureLoaded(signal);\n\t\tconst cached = this.profiles.get(profile);\n\t\tif (!cached) {\n\t\t\tthrow new BitwardenCredentialStorageError(\"profile_not_found\", \"Credential profile was not found.\");\n\t\t}\n\t\treturn structuredClone(cached.record);\n\t}\n\n\tasync writeProfile(record: CredentialProfileRecord, signal?: AbortSignal): Promise<void> {\n\t\tvalidateCredentialProfileRecord(record);\n\t\tawait this.ensureLoaded(signal);\n\t\tconst existing = this.profiles.get(record.profile);\n\t\tlet item: Record<string, unknown>;\n\t\tif (existing) {\n\t\t\titem = structuredClone(existing.item);\n\t\t} else {\n\t\t\tconst template = parseJson(await this.runChecked([\"get\", \"template\", \"item\"], undefined, signal));\n\t\t\tif (!isObject(template)) {\n\t\t\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\t\t\"malformed_provider_data\",\n\t\t\t\t\t\"Bitwarden returned a malformed item template.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\titem = template;\n\t\t}\n\t\titem.type = 2;\n\t\titem.name = `${ITEM_NAME_PREFIX}${record.profile}`;\n\t\titem.notes = JSON.stringify(createEnvelope(record));\n\t\titem.secureNote = { type: 0 };\n\n\t\tlet serialized = \"\";\n\t\tlet encoded = \"\";\n\t\ttry {\n\t\t\tserialized = JSON.stringify(item);\n\t\t\tencoded = Buffer.from(serialized, \"utf8\").toString(\"base64\");\n\t\t\tconst output = existing\n\t\t\t\t? await this.runChecked([\"edit\", \"item\", existing.id], encoded, signal)\n\t\t\t\t: await this.runChecked([\"create\", \"item\"], encoded, signal);\n\t\t\tconst updated = parseProfileItem(parseJson(output));\n\t\t\tif (!updated || updated.record.profile !== record.profile) {\n\t\t\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\t\t\"malformed_provider_data\",\n\t\t\t\t\t\"Bitwarden returned malformed profile data.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.profiles.set(record.profile, updated);\n\t\t\tthis.lastSyncAt = Date.now();\n\t\t} finally {\n\t\t\tserialized = \"\";\n\t\t\tencoded = \"\";\n\t\t\titem.notes = \"\";\n\t\t}\n\t}\n\n\tasync deleteProfile(profile: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.ensureLoaded(signal);\n\t\tconst cached = this.profiles.get(profile);\n\t\tif (!cached) {\n\t\t\tthrow new BitwardenCredentialStorageError(\"profile_not_found\", \"Credential profile was not found.\");\n\t\t}\n\t\tawait this.runChecked([\"delete\", \"item\", cached.id], undefined, signal);\n\t\tthis.profiles.delete(profile);\n\t\tthis.lastSyncAt = Date.now();\n\t}\n\n\tlock(): void {\n\t\tthis.executable = undefined;\n\t\tthis.sessionKey = undefined;\n\t\tfor (const cached of this.profiles.values()) {\n\t\t\tfor (const variable of cached.record.variables) variable.value = \"\";\n\t\t\tcached.item.notes = \"\";\n\t\t}\n\t\tthis.profiles.clear();\n\t\tthis.loaded = false;\n\t\tthis.lastSyncAt = 0;\n\t}\n\n\tprivate assertConnected(): { executable: string; sessionKey: string } {\n\t\tif (!this.executable || !this.sessionKey) {\n\t\t\tthrow new BitwardenCredentialStorageError(\"not_connected\", \"Bitwarden is not connected.\");\n\t\t}\n\t\treturn { executable: this.executable, sessionKey: this.sessionKey };\n\t}\n\n\tprivate async ensureLoaded(signal?: AbortSignal): Promise<void> {\n\t\tthis.assertConnected();\n\t\tif (!this.loaded) await this.reload(signal, false);\n\t}\n\n\tprivate async reload(signal: AbortSignal | undefined, attemptSync: boolean): Promise<void> {\n\t\tif (attemptSync) {\n\t\t\ttry {\n\t\t\t\tawait this.runChecked([\"sync\"], undefined, signal);\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof BitwardenCredentialStorageError) || error.code !== \"provider_command_failed\") {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\t// A network sync failure must not discard a locally available encrypted vault.\n\t\t\t}\n\t\t}\n\t\tconst rawItems = parseJson(\n\t\t\tawait this.runChecked([\"list\", \"items\", \"--search\", ITEM_NAME_PREFIX], undefined, signal),\n\t\t);\n\t\tif (!Array.isArray(rawItems) || rawItems.length > MAX_PROFILE_ITEMS) {\n\t\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\t\"malformed_provider_data\",\n\t\t\t\t\"Bitwarden returned an invalid number of profile items.\",\n\t\t\t);\n\t\t}\n\t\tconst next = new Map<string, CachedBitwardenProfile>();\n\t\tfor (const rawItem of rawItems) {\n\t\t\tconst parsed = parseProfileItem(rawItem);\n\t\t\tif (!parsed) continue;\n\t\t\tif (next.has(parsed.record.profile)) {\n\t\t\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\t\t\"malformed_provider_data\",\n\t\t\t\t\t\"Bitwarden contains duplicate Pi credential profiles.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tnext.set(parsed.record.profile, parsed);\n\t\t}\n\t\tthis.lockProfileCache();\n\t\tfor (const [profile, cached] of next) this.profiles.set(profile, cached);\n\t\tthis.loaded = true;\n\t\tthis.lastSyncAt = Date.now();\n\t}\n\n\tprivate lockProfileCache(): void {\n\t\tfor (const cached of this.profiles.values()) {\n\t\t\tfor (const variable of cached.record.variables) variable.value = \"\";\n\t\t\tcached.item.notes = \"\";\n\t\t}\n\t\tthis.profiles.clear();\n\t}\n\n\tprivate async runChecked(\n\t\targs: string[],\n\t\tinput: string | undefined,\n\t\tsignal: AbortSignal | undefined,\n\t): Promise<string> {\n\t\tconst { executable, sessionKey } = this.assertConnected();\n\t\tconst result = await this.runCommand({\n\t\t\texecutable,\n\t\t\targs,\n\t\t\t...(input !== undefined ? { input } : {}),\n\t\t\tsessionKey,\n\t\t\t...(signal ? { signal } : {}),\n\t\t});\n\t\tif (\n\t\t\tresult.exitCode !== 0 ||\n\t\t\tresult.aborted === true ||\n\t\t\tresult.timedOut === true ||\n\t\t\tresult.outputLimitExceeded === true\n\t\t) {\n\t\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\t\"provider_command_failed\",\n\t\t\t\t\"Bitwarden command failed safely without exposing provider output.\",\n\t\t\t);\n\t\t}\n\t\treturn result.stdout;\n\t}\n}\n"]}
1
+ {"version":3,"file":"bitwarden-credential-storage.js","sourceRoot":"","sources":["../../../src/core/secrets/bitwarden-credential-storage.ts"],"names":[],"mappings":"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","sourcesContent":["import { ensureToolWithDiagnostics, type ManagedToolResolver } from \"../../utils/tools-manager.ts\";\nimport { type CredentialCliCommandResult, runCredentialCliCommand } from \"./credential-cli-command.ts\";\nimport {\n\ttype CredentialProfileRecord,\n\ttype CredentialProfileStorage,\n\tCredentialStorageError,\n\ttype StoredCredentialProfileSummary,\n\tvalidateCredentialProfileName,\n\tvalidateCredentialProfileRecord,\n} from \"./credential-manager.ts\";\nimport {\n\tCREDENTIAL_PROFILE_KEY_PREFIX,\n\tparseCredentialProfileEnvelope,\n\tserializeCredentialProfileEnvelope,\n\tsummarizeCredentialProfiles,\n} from \"./credential-profile-envelope.ts\";\n\nconst MAX_PROFILE_ITEMS = 256;\nconst SYNC_FRESHNESS_MS = 30_000;\nconst ITEM_ID_PATTERN = /^[A-Za-z0-9-]{1,128}$/;\n\nexport type BitwardenCredentialStorageErrorCode =\n\t| \"provider_command_failed\"\n\t| \"provider_unavailable\"\n\t| \"malformed_provider_data\"\n\t| \"not_connected\"\n\t| \"profile_not_found\";\n\nexport class BitwardenCredentialStorageError extends CredentialStorageError {\n\tdeclare readonly code: BitwardenCredentialStorageErrorCode;\n\n\tconstructor(code: BitwardenCredentialStorageErrorCode, message: string) {\n\t\tsuper(code, message);\n\t\tthis.name = \"BitwardenCredentialStorageError\";\n\t}\n}\n\nexport interface BitwardenCommandRequest {\n\texecutable: string;\n\targs: string[];\n\tinput?: string;\n\tsessionKey: string;\n\tsignal?: AbortSignal;\n}\n\nexport type BitwardenCommandResult = CredentialCliCommandResult;\n\nexport type BitwardenCommandRunner = (request: BitwardenCommandRequest) => Promise<BitwardenCommandResult>;\n\nexport interface BitwardenCredentialStorageOptions {\n\tresolveTool?: ManagedToolResolver;\n\trunCommand?: BitwardenCommandRunner;\n}\n\ninterface CachedBitwardenProfile {\n\tid: string;\n\titem: Record<string, unknown>;\n\trecord: CredentialProfileRecord;\n}\n\nexport async function runBitwardenCommand(request: BitwardenCommandRequest): Promise<BitwardenCommandResult> {\n\treturn runCredentialCliCommand({\n\t\texecutable: request.executable,\n\t\targs: request.args,\n\t\t...(request.input !== undefined ? { input: request.input } : {}),\n\t\tauthEnvironment: { name: \"BW_SESSION\", value: request.sessionKey },\n\t\tomitEnvironmentVariables: [\"BWS_ACCESS_TOKEN\"],\n\t\t...(request.signal ? { signal: request.signal } : {}),\n\t});\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseJson(value: string): unknown {\n\ttry {\n\t\treturn JSON.parse(value) as unknown;\n\t} catch {\n\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\"malformed_provider_data\",\n\t\t\t\"Bitwarden returned malformed profile data.\",\n\t\t);\n\t}\n}\n\nfunction parseProfileItem(value: unknown): CachedBitwardenProfile | undefined {\n\tif (!isObject(value) || typeof value.name !== \"string\" || !value.name.startsWith(CREDENTIAL_PROFILE_KEY_PREFIX)) {\n\t\treturn undefined;\n\t}\n\tconst profile = value.name.slice(CREDENTIAL_PROFILE_KEY_PREFIX.length);\n\tif (\n\t\tvalue.type !== 2 ||\n\t\ttypeof value.id !== \"string\" ||\n\t\t!ITEM_ID_PATTERN.test(value.id) ||\n\t\ttypeof value.notes !== \"string\" ||\n\t\t!isObject(value.secureNote) ||\n\t\tvalue.secureNote.type !== 0\n\t) {\n\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\"malformed_provider_data\",\n\t\t\t\"Bitwarden returned malformed profile data.\",\n\t\t);\n\t}\n\ttry {\n\t\tvalidateCredentialProfileName(profile);\n\t} catch {\n\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\"malformed_provider_data\",\n\t\t\t\"Bitwarden returned malformed profile data.\",\n\t\t);\n\t}\n\ttry {\n\t\treturn { id: value.id, item: value, record: parseCredentialProfileEnvelope(value.notes, profile) };\n\t} catch {\n\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\"malformed_provider_data\",\n\t\t\t\"Bitwarden returned malformed profile data.\",\n\t\t);\n\t}\n}\n\nexport class BitwardenCredentialStorage implements CredentialProfileStorage {\n\tprivate readonly resolveTool: ManagedToolResolver;\n\tprivate readonly runCommand: BitwardenCommandRunner;\n\tprivate readonly profiles = new Map<string, CachedBitwardenProfile>();\n\tprivate executable: string | undefined;\n\tprivate sessionKey: string | undefined;\n\tprivate loaded = false;\n\tprivate lastSyncAt = 0;\n\n\tconstructor(options: BitwardenCredentialStorageOptions = {}) {\n\t\tthis.resolveTool = options.resolveTool ?? ensureToolWithDiagnostics;\n\t\tthis.runCommand = options.runCommand ?? runBitwardenCommand;\n\t}\n\n\tasync connect(sessionKey: string, signal?: AbortSignal): Promise<void> {\n\t\tthis.lock();\n\t\tconst resolution = await this.resolveTool(\"bw\", true);\n\t\tif (resolution.status === \"unavailable\") {\n\t\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\t\"provider_unavailable\",\n\t\t\t\t`Bitwarden CLI could not be provisioned (${resolution.failureCode}).`,\n\t\t\t);\n\t\t}\n\t\tthis.executable = resolution.path;\n\t\tthis.sessionKey = sessionKey;\n\t\ttry {\n\t\t\tawait this.reload(signal, true);\n\t\t} catch (error) {\n\t\t\tthis.lock();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync refresh(signal?: AbortSignal): Promise<void> {\n\t\tthis.assertConnected();\n\t\tif (this.loaded && Date.now() - this.lastSyncAt < SYNC_FRESHNESS_MS) return;\n\t\tawait this.reload(signal, true);\n\t}\n\n\tasync listProfiles(signal?: AbortSignal): Promise<StoredCredentialProfileSummary[]> {\n\t\tawait this.ensureLoaded(signal);\n\t\treturn summarizeCredentialProfiles([...this.profiles.values()].map((profile) => profile.record));\n\t}\n\n\tasync readProfile(profile: string, signal?: AbortSignal): Promise<CredentialProfileRecord> {\n\t\tawait this.ensureLoaded(signal);\n\t\tconst cached = this.profiles.get(profile);\n\t\tif (!cached) {\n\t\t\tthrow new BitwardenCredentialStorageError(\"profile_not_found\", \"Credential profile was not found.\");\n\t\t}\n\t\treturn structuredClone(cached.record);\n\t}\n\n\tasync writeProfile(record: CredentialProfileRecord, signal?: AbortSignal): Promise<void> {\n\t\tvalidateCredentialProfileRecord(record);\n\t\tawait this.ensureLoaded(signal);\n\t\tconst existing = this.profiles.get(record.profile);\n\t\tlet item: Record<string, unknown>;\n\t\tif (existing) {\n\t\t\titem = structuredClone(existing.item);\n\t\t} else {\n\t\t\tconst template = parseJson(await this.runChecked([\"get\", \"template\", \"item\"], undefined, signal));\n\t\t\tif (!isObject(template)) {\n\t\t\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\t\t\"malformed_provider_data\",\n\t\t\t\t\t\"Bitwarden returned a malformed item template.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\titem = template;\n\t\t}\n\t\titem.type = 2;\n\t\titem.name = `${CREDENTIAL_PROFILE_KEY_PREFIX}${record.profile}`;\n\t\titem.notes = serializeCredentialProfileEnvelope(record);\n\t\titem.secureNote = { type: 0 };\n\n\t\tlet serialized = \"\";\n\t\tlet encoded = \"\";\n\t\ttry {\n\t\t\tserialized = JSON.stringify(item);\n\t\t\tencoded = Buffer.from(serialized, \"utf8\").toString(\"base64\");\n\t\t\tconst output = existing\n\t\t\t\t? await this.runChecked([\"edit\", \"item\", existing.id], encoded, signal)\n\t\t\t\t: await this.runChecked([\"create\", \"item\"], encoded, signal);\n\t\t\tconst updated = parseProfileItem(parseJson(output));\n\t\t\tif (!updated || updated.record.profile !== record.profile) {\n\t\t\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\t\t\"malformed_provider_data\",\n\t\t\t\t\t\"Bitwarden returned malformed profile data.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.profiles.set(record.profile, updated);\n\t\t\tthis.lastSyncAt = Date.now();\n\t\t} finally {\n\t\t\tserialized = \"\";\n\t\t\tencoded = \"\";\n\t\t\titem.notes = \"\";\n\t\t}\n\t}\n\n\tasync deleteProfile(profile: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.ensureLoaded(signal);\n\t\tconst cached = this.profiles.get(profile);\n\t\tif (!cached) {\n\t\t\tthrow new BitwardenCredentialStorageError(\"profile_not_found\", \"Credential profile was not found.\");\n\t\t}\n\t\tawait this.runChecked([\"delete\", \"item\", cached.id], undefined, signal);\n\t\tthis.profiles.delete(profile);\n\t\tthis.lastSyncAt = Date.now();\n\t}\n\n\tlock(): void {\n\t\tthis.executable = undefined;\n\t\tthis.sessionKey = undefined;\n\t\tfor (const cached of this.profiles.values()) {\n\t\t\tfor (const variable of cached.record.variables) variable.value = \"\";\n\t\t\tcached.item.notes = \"\";\n\t\t}\n\t\tthis.profiles.clear();\n\t\tthis.loaded = false;\n\t\tthis.lastSyncAt = 0;\n\t}\n\n\tprivate assertConnected(): { executable: string; sessionKey: string } {\n\t\tif (!this.executable || !this.sessionKey) {\n\t\t\tthrow new BitwardenCredentialStorageError(\"not_connected\", \"Bitwarden is not connected.\");\n\t\t}\n\t\treturn { executable: this.executable, sessionKey: this.sessionKey };\n\t}\n\n\tprivate async ensureLoaded(signal?: AbortSignal): Promise<void> {\n\t\tthis.assertConnected();\n\t\tif (!this.loaded) await this.reload(signal, false);\n\t}\n\n\tprivate async reload(signal: AbortSignal | undefined, attemptSync: boolean): Promise<void> {\n\t\tif (attemptSync) {\n\t\t\ttry {\n\t\t\t\tawait this.runChecked([\"sync\"], undefined, signal);\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof BitwardenCredentialStorageError) || error.code !== \"provider_command_failed\") {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\t// A network sync failure must not discard a locally available encrypted vault.\n\t\t\t}\n\t\t}\n\t\tconst rawItems = parseJson(\n\t\t\tawait this.runChecked([\"list\", \"items\", \"--search\", CREDENTIAL_PROFILE_KEY_PREFIX], undefined, signal),\n\t\t);\n\t\tif (!Array.isArray(rawItems) || rawItems.length > MAX_PROFILE_ITEMS) {\n\t\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\t\"malformed_provider_data\",\n\t\t\t\t\"Bitwarden returned an invalid number of profile items.\",\n\t\t\t);\n\t\t}\n\t\tconst next = new Map<string, CachedBitwardenProfile>();\n\t\tfor (const rawItem of rawItems) {\n\t\t\tconst parsed = parseProfileItem(rawItem);\n\t\t\tif (!parsed) continue;\n\t\t\tif (next.has(parsed.record.profile)) {\n\t\t\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\t\t\"malformed_provider_data\",\n\t\t\t\t\t\"Bitwarden contains duplicate Pi credential profiles.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tnext.set(parsed.record.profile, parsed);\n\t\t}\n\t\tthis.lockProfileCache();\n\t\tfor (const [profile, cached] of next) this.profiles.set(profile, cached);\n\t\tthis.loaded = true;\n\t\tthis.lastSyncAt = Date.now();\n\t}\n\n\tprivate lockProfileCache(): void {\n\t\tfor (const cached of this.profiles.values()) {\n\t\t\tfor (const variable of cached.record.variables) variable.value = \"\";\n\t\t\tcached.item.notes = \"\";\n\t\t}\n\t\tthis.profiles.clear();\n\t}\n\n\tprivate async runChecked(\n\t\targs: string[],\n\t\tinput: string | undefined,\n\t\tsignal: AbortSignal | undefined,\n\t): Promise<string> {\n\t\tconst { executable, sessionKey } = this.assertConnected();\n\t\tconst result = await this.runCommand({\n\t\t\texecutable,\n\t\t\targs,\n\t\t\t...(input !== undefined ? { input } : {}),\n\t\t\tsessionKey,\n\t\t\t...(signal ? { signal } : {}),\n\t\t});\n\t\tif (\n\t\t\tresult.exitCode !== 0 ||\n\t\t\tresult.aborted === true ||\n\t\t\tresult.timedOut === true ||\n\t\t\tresult.outputLimitExceeded === true\n\t\t) {\n\t\t\tthrow new BitwardenCredentialStorageError(\n\t\t\t\t\"provider_command_failed\",\n\t\t\t\t\"Bitwarden command failed safely without exposing provider output.\",\n\t\t\t);\n\t\t}\n\t\treturn result.stdout;\n\t}\n}\n"]}
@@ -0,0 +1,46 @@
1
+ import { type ManagedToolResolver } from "../../utils/tools-manager.ts";
2
+ import { type CredentialCliCommandResult } from "./credential-cli-command.ts";
3
+ import { type CredentialProfileRecord, type CredentialProfileStorage, CredentialStorageError, type StoredCredentialProfileSummary } from "./credential-manager.ts";
4
+ export declare class BitwardenSecretsManagerStorageError extends CredentialStorageError {
5
+ constructor(code: CredentialStorageError["code"], message: string);
6
+ }
7
+ export interface BitwardenSecretsManagerCommandRequest {
8
+ executable: string;
9
+ args: string[];
10
+ accessToken: string;
11
+ signal?: AbortSignal;
12
+ }
13
+ export type BitwardenSecretsManagerCommandResult = CredentialCliCommandResult;
14
+ export type BitwardenSecretsManagerCommandRunner = (request: BitwardenSecretsManagerCommandRequest) => Promise<BitwardenSecretsManagerCommandResult>;
15
+ export interface BitwardenSecretsManagerCredentialStorageOptions {
16
+ coordinationFile: string;
17
+ resolveTool?: ManagedToolResolver;
18
+ runCommand?: BitwardenSecretsManagerCommandRunner;
19
+ }
20
+ export declare function runBitwardenSecretsManagerCommand(request: BitwardenSecretsManagerCommandRequest): Promise<BitwardenSecretsManagerCommandResult>;
21
+ export declare class BitwardenSecretsManagerCredentialStorage implements CredentialProfileStorage {
22
+ private readonly coordinationFile;
23
+ private readonly resolveTool;
24
+ private readonly runCommand;
25
+ private readonly profiles;
26
+ private executable;
27
+ private accessToken;
28
+ private project;
29
+ private dataKey;
30
+ private lastSyncAt;
31
+ constructor(options: BitwardenSecretsManagerCredentialStorageOptions);
32
+ connect(accessToken: string, signal?: AbortSignal): Promise<void>;
33
+ refresh(signal?: AbortSignal): Promise<void>;
34
+ listProfiles(): Promise<StoredCredentialProfileSummary[]>;
35
+ readProfile(profile: string): Promise<CredentialProfileRecord>;
36
+ writeProfile(record: CredentialProfileRecord, signal?: AbortSignal): Promise<void>;
37
+ deleteProfile(profile: string, signal?: AbortSignal): Promise<void>;
38
+ lock(): void;
39
+ private assertConnected;
40
+ private reload;
41
+ private reloadUnderCoordination;
42
+ private ensureDataKeyUnderCoordination;
43
+ private withProviderCoordination;
44
+ private runChecked;
45
+ }
46
+ //# sourceMappingURL=bitwarden-secrets-manager-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitwarden-secrets-manager-storage.d.ts","sourceRoot":"","sources":["../../../src/core/secrets/bitwarden-secrets-manager-storage.ts"],"names":[],"mappings":"AACA,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnG,OAAO,EAAE,KAAK,0BAA0B,EAA2B,MAAM,6BAA6B,CAAC;AACvG,OAAO,EACN,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,sBAAsB,EACtB,KAAK,8BAA8B,EAGnC,MAAM,yBAAyB,CAAC;AAwBjC,qBAAa,mCAAoC,SAAQ,sBAAsB;IAC9E,YAAY,IAAI,EAAE,sBAAsB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAGhE;CACD;AAED,MAAM,WAAW,qCAAqC;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,MAAM,oCAAoC,GAAG,0BAA0B,CAAC;AAE9E,MAAM,MAAM,oCAAoC,GAAG,CAClD,OAAO,EAAE,qCAAqC,KAC1C,OAAO,CAAC,oCAAoC,CAAC,CAAC;AAEnD,MAAM,WAAW,+CAA+C;IAC/D,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,UAAU,CAAC,EAAE,oCAAoC,CAAC;CAClD;AA+JD,wBAAsB,iCAAiC,CACtD,OAAO,EAAE,qCAAqC,GAC5C,OAAO,CAAC,oCAAoC,CAAC,CAQ/C;AAED,qBAAa,wCAAyC,YAAW,wBAAwB;IACxF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuC;IAClE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkD;IAC3E,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAK;IAEvB,YAAY,OAAO,EAAE,+CAA+C,EAOnE;IAEK,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtE;IAEK,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjD;IAEK,YAAY,IAAI,OAAO,CAAC,8BAA8B,EAAE,CAAC,CAG9D;IAEK,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAOnE;IAEK,YAAY,CAAC,MAAM,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CvF;IAEK,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAaxE;IAED,IAAI,IAAI,IAAI,CAWX;IAED,OAAO,CAAC,eAAe;YAWT,MAAM;YAIN,uBAAuB;YAqFvB,8BAA8B;YA6B9B,wBAAwB;YAoBxB,UAAU;CAuBxB"}