@indigoai-us/hq-cloud 5.1.0 → 5.1.8

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 (100) hide show
  1. package/dist/bin/sync-runner.d.ts +111 -0
  2. package/dist/bin/sync-runner.d.ts.map +1 -0
  3. package/dist/bin/sync-runner.js +285 -0
  4. package/dist/bin/sync-runner.js.map +1 -0
  5. package/dist/bin/sync-runner.test.d.ts +10 -0
  6. package/dist/bin/sync-runner.test.d.ts.map +1 -0
  7. package/dist/bin/sync-runner.test.js +492 -0
  8. package/dist/bin/sync-runner.test.js.map +1 -0
  9. package/dist/cli/index.d.ts +1 -1
  10. package/dist/cli/index.d.ts.map +1 -1
  11. package/dist/cli/share.js +2 -2
  12. package/dist/cli/share.js.map +1 -1
  13. package/dist/cli/share.test.js +9 -1
  14. package/dist/cli/share.test.js.map +1 -1
  15. package/dist/cli/sync.d.ts +28 -0
  16. package/dist/cli/sync.d.ts.map +1 -1
  17. package/dist/cli/sync.js +33 -10
  18. package/dist/cli/sync.js.map +1 -1
  19. package/dist/cli/sync.test.js +15 -4
  20. package/dist/cli/sync.test.js.map +1 -1
  21. package/dist/cognito-auth.d.ts.map +1 -1
  22. package/dist/cognito-auth.js +19 -1
  23. package/dist/cognito-auth.js.map +1 -1
  24. package/dist/cognito-auth.test.d.ts +9 -0
  25. package/dist/cognito-auth.test.d.ts.map +1 -0
  26. package/dist/cognito-auth.test.js +113 -0
  27. package/dist/cognito-auth.test.js.map +1 -0
  28. package/dist/context.d.ts.map +1 -1
  29. package/dist/context.js +1 -0
  30. package/dist/context.js.map +1 -1
  31. package/dist/daemon-worker.d.ts +6 -1
  32. package/dist/daemon-worker.d.ts.map +1 -1
  33. package/dist/daemon-worker.js +12 -16
  34. package/dist/daemon-worker.js.map +1 -1
  35. package/dist/daemon.d.ts +2 -0
  36. package/dist/daemon.d.ts.map +1 -1
  37. package/dist/daemon.js +2 -0
  38. package/dist/daemon.js.map +1 -1
  39. package/dist/ignore.d.ts +13 -2
  40. package/dist/ignore.d.ts.map +1 -1
  41. package/dist/ignore.js +69 -12
  42. package/dist/ignore.js.map +1 -1
  43. package/dist/index.d.ts +24 -28
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +19 -134
  46. package/dist/index.js.map +1 -1
  47. package/dist/journal.d.ts +20 -4
  48. package/dist/journal.d.ts.map +1 -1
  49. package/dist/journal.js +45 -8
  50. package/dist/journal.js.map +1 -1
  51. package/dist/journal.test.d.ts +9 -0
  52. package/dist/journal.test.d.ts.map +1 -0
  53. package/dist/journal.test.js +114 -0
  54. package/dist/journal.test.js.map +1 -0
  55. package/dist/s3.d.ts +18 -6
  56. package/dist/s3.d.ts.map +1 -1
  57. package/dist/s3.js +57 -56
  58. package/dist/s3.js.map +1 -1
  59. package/dist/types.d.ts +34 -0
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/vault-client.d.ts +16 -0
  62. package/dist/vault-client.d.ts.map +1 -1
  63. package/dist/vault-client.js +19 -0
  64. package/dist/vault-client.js.map +1 -1
  65. package/dist/vault-client.test.js +25 -0
  66. package/dist/vault-client.test.js.map +1 -1
  67. package/dist/watcher.d.ts +7 -1
  68. package/dist/watcher.d.ts.map +1 -1
  69. package/dist/watcher.js +11 -5
  70. package/dist/watcher.js.map +1 -1
  71. package/package.json +15 -3
  72. package/src/bin/sync-runner.test.ts +617 -0
  73. package/src/bin/sync-runner.ts +390 -0
  74. package/src/cli/accept.ts +97 -0
  75. package/src/cli/conflict.ts +119 -0
  76. package/src/cli/index.ts +25 -0
  77. package/src/cli/invite.test.ts +247 -0
  78. package/src/cli/invite.ts +180 -0
  79. package/src/cli/promote.ts +123 -0
  80. package/src/cli/share.test.ts +155 -0
  81. package/src/cli/share.ts +212 -0
  82. package/src/cli/sync.test.ts +225 -0
  83. package/src/cli/sync.ts +225 -0
  84. package/src/cognito-auth.test.ts +156 -0
  85. package/src/cognito-auth.ts +18 -1
  86. package/src/context.test.ts +202 -0
  87. package/src/context.ts +178 -0
  88. package/src/daemon-worker.ts +13 -19
  89. package/src/daemon.ts +2 -0
  90. package/src/ignore.ts +76 -12
  91. package/src/index.ts +93 -165
  92. package/src/journal.test.ts +146 -0
  93. package/src/journal.ts +53 -11
  94. package/src/s3.ts +76 -66
  95. package/src/types.ts +37 -0
  96. package/src/vault-client.test.ts +390 -0
  97. package/src/vault-client.ts +400 -0
  98. package/src/watcher.ts +12 -5
  99. package/test/invite-flow.integration.test.ts +244 -0
  100. package/test/share-sync.integration.test.ts +210 -0
package/dist/ignore.d.ts CHANGED
@@ -1,6 +1,17 @@
1
1
  /**
2
- * Ignore file parser for .hqsyncignore
3
- * Uses gitignore-compatible syntax
2
+ * Ignore-file parser for cloud sync.
3
+ *
4
+ * Three layers, evaluated in order (later patterns override earlier ones):
5
+ * 1. Built-in defaults — things that should *never* sync (VCS, node_modules,
6
+ * build artifacts, caches, env files). Cover the common stacks so that a
7
+ * first-time sync over a random project folder doesn't try to push
8
+ * `target/`, `node_modules/`, or `.next/` to S3.
9
+ * 2. Repo `.gitignore` at hqRoot — reuses the user's existing exclusions so
10
+ * we don't re-list every build directory ourselves. Root-level only; we
11
+ * do not recurse like real git.
12
+ * 3. `.hqignore` (preferred) or `.hqsyncignore` (legacy name) at hqRoot —
13
+ * sync-specific overrides. Use `!pattern` to re-include something an
14
+ * earlier layer excluded.
4
15
  */
5
16
  export declare function createIgnoreFilter(hqRoot: string): (filePath: string) => boolean;
6
17
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../src/ignore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAkBhF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,SAAmB,GAC1B,OAAO,CAOT"}
1
+ {"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../src/ignore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAyEH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAsBhF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,SAAmB,GAC1B,OAAO,CAOT"}
package/dist/ignore.js CHANGED
@@ -1,37 +1,94 @@
1
1
  /**
2
- * Ignore file parser for .hqsyncignore
3
- * Uses gitignore-compatible syntax
2
+ * Ignore-file parser for cloud sync.
3
+ *
4
+ * Three layers, evaluated in order (later patterns override earlier ones):
5
+ * 1. Built-in defaults — things that should *never* sync (VCS, node_modules,
6
+ * build artifacts, caches, env files). Cover the common stacks so that a
7
+ * first-time sync over a random project folder doesn't try to push
8
+ * `target/`, `node_modules/`, or `.next/` to S3.
9
+ * 2. Repo `.gitignore` at hqRoot — reuses the user's existing exclusions so
10
+ * we don't re-list every build directory ourselves. Root-level only; we
11
+ * do not recurse like real git.
12
+ * 3. `.hqignore` (preferred) or `.hqsyncignore` (legacy name) at hqRoot —
13
+ * sync-specific overrides. Use `!pattern` to re-include something an
14
+ * earlier layer excluded.
4
15
  */
5
16
  import * as fs from "fs";
6
17
  import * as path from "path";
7
18
  import ignore from "ignore";
8
- // Default patterns that should never sync
19
+ // Patterns that must never sync regardless of project type.
20
+ // Grouped by ecosystem so new stacks are easy to add.
9
21
  const DEFAULT_IGNORES = [
22
+ // VCS + OS
10
23
  ".git/",
11
24
  ".git",
12
- "node_modules/",
13
- "dist/",
14
25
  ".DS_Store",
15
26
  "Thumbs.db",
27
+ // Node / JS
28
+ "node_modules/",
29
+ "dist/",
30
+ "build/",
31
+ ".next/",
32
+ ".nuxt/",
33
+ ".svelte-kit/",
34
+ ".turbo/",
35
+ ".parcel-cache/",
36
+ ".vite/",
37
+ "coverage/",
38
+ // Rust / Tauri
39
+ "target/",
40
+ // Python
41
+ "__pycache__/",
42
+ "*.pyc",
43
+ ".pytest_cache/",
44
+ ".mypy_cache/",
45
+ ".ruff_cache/",
46
+ ".venv/",
47
+ "venv/",
48
+ // Go / JVM / other
49
+ "vendor/",
50
+ "out/",
51
+ "*.class",
52
+ // Generic caches / temp
53
+ ".cache/",
54
+ "tmp/",
55
+ ".tmp/",
56
+ // HQ sync internal state (never round-trip these)
16
57
  "*.pid",
17
58
  ".hq-sync.pid",
18
59
  ".hq-sync-journal.json",
19
60
  ".hq-sync-state.json",
20
61
  "modules.lock",
62
+ // HQ repos directory (managed separately, not synced)
21
63
  "repos/",
64
+ // Secrets / env
22
65
  ".env",
23
66
  ".env.*",
24
67
  ];
68
+ function readIgnoreFile(filePath) {
69
+ if (!fs.existsSync(filePath))
70
+ return null;
71
+ try {
72
+ return fs.readFileSync(filePath, "utf-8");
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ }
25
78
  export function createIgnoreFilter(hqRoot) {
26
79
  const ig = ignore();
27
- // Add defaults
80
+ // Layer 1: baseline defaults
28
81
  ig.add(DEFAULT_IGNORES);
29
- // Read .hqsyncignore if it exists
30
- const ignorePath = path.join(hqRoot, ".hqsyncignore");
31
- if (fs.existsSync(ignorePath)) {
32
- const content = fs.readFileSync(ignorePath, "utf-8");
33
- ig.add(content);
34
- }
82
+ // Layer 2: repo's .gitignore (common case — covers most build dirs already)
83
+ const gitignore = readIgnoreFile(path.join(hqRoot, ".gitignore"));
84
+ if (gitignore)
85
+ ig.add(gitignore);
86
+ // Layer 3: sync-specific overrides. .hqignore is the documented name;
87
+ // .hqsyncignore is the legacy name we still honor.
88
+ const hqignore = readIgnoreFile(path.join(hqRoot, ".hqignore")) ??
89
+ readIgnoreFile(path.join(hqRoot, ".hqsyncignore"));
90
+ if (hqignore)
91
+ ig.add(hqignore);
35
92
  return (filePath) => {
36
93
  const relative = path.relative(hqRoot, filePath);
37
94
  if (!relative || relative.startsWith(".."))
@@ -1 +1 @@
1
- {"version":3,"file":"ignore.js","sourceRoot":"","sources":["../src/ignore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,0CAA0C;AAC1C,MAAM,eAAe,GAAG;IACtB,OAAO;IACP,MAAM;IACN,eAAe;IACf,OAAO;IACP,WAAW;IACX,WAAW;IACX,OAAO;IACP,cAAc;IACd,uBAAuB;IACvB,qBAAqB;IACrB,cAAc;IACd,QAAQ;IACR,MAAM;IACN,QAAQ;CACT,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAEpB,eAAe;IACf,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAExB,kCAAkC;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACtD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,QAAgB,EAAW,EAAE;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,kBAAkB;QAC3E,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,QAAQ,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;IAE3B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"ignore.js","sourceRoot":"","sources":["../src/ignore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,4DAA4D;AAC5D,sDAAsD;AACtD,MAAM,eAAe,GAAG;IACtB,WAAW;IACX,OAAO;IACP,MAAM;IACN,WAAW;IACX,WAAW;IAEX,YAAY;IACZ,eAAe;IACf,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,cAAc;IACd,SAAS;IACT,gBAAgB;IAChB,QAAQ;IACR,WAAW;IAEX,eAAe;IACf,SAAS;IAET,SAAS;IACT,cAAc;IACd,OAAO;IACP,gBAAgB;IAChB,cAAc;IACd,cAAc;IACd,QAAQ;IACR,OAAO;IAEP,mBAAmB;IACnB,SAAS;IACT,MAAM;IACN,SAAS;IAET,wBAAwB;IACxB,SAAS;IACT,MAAM;IACN,OAAO;IAEP,kDAAkD;IAClD,OAAO;IACP,cAAc;IACd,uBAAuB;IACvB,qBAAqB;IACrB,cAAc;IAEd,sDAAsD;IACtD,QAAQ;IAER,gBAAgB;IAChB,MAAM;IACN,QAAQ;CACT,CAAC;AAEF,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAEpB,6BAA6B;IAC7B,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAExB,4EAA4E;IAC5E,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAClE,IAAI,SAAS;QAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEjC,sEAAsE;IACtE,mDAAmD;IACnD,MAAM,QAAQ,GACZ,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC9C,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IACrD,IAAI,QAAQ;QAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE/B,OAAO,CAAC,QAAgB,EAAW,EAAE;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,kBAAkB;QAC3E,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,QAAQ,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;IAE3B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,33 +1,29 @@
1
1
  /**
2
2
  * @indigoai-us/hq-cloud — public API
3
- * Used by @indigoai-us/hq-cli to manage cloud sync
3
+ *
4
+ * VLT-5: Entity-aware sync engine. Operations resolve their target bucket
5
+ * and credentials from the vault-service entity registry + STS vending.
4
6
  */
5
- import type { SyncStatus, PushResult, PullResult } from "./types.js";
6
- export type { SyncStatus, PushResult, PullResult } from "./types.js";
7
- export { browserLogin, refreshTokens, getValidAccessToken, loadCachedTokens, saveCachedTokens, clearCachedTokens, isExpiring, CognitoAuthError, } from "./cognito-auth.js";
7
+ export { resolveEntityContext, refreshEntityContext, clearContextCache, isExpiringSoon, } from "./context.js";
8
+ export { uploadFile, downloadFile, listRemoteFiles, deleteRemoteFile, headRemoteFile, } from "./s3.js";
9
+ export type { RemoteFile } from "./s3.js";
10
+ export { readJournal, writeJournal, hashFile, updateEntry, getEntry, removeEntry, getJournalPath, } from "./journal.js";
11
+ export { createIgnoreFilter, isWithinSizeLimit, } from "./ignore.js";
12
+ export { browserLogin, refreshTokens, loadCachedTokens, saveCachedTokens, clearCachedTokens, isExpiring, getValidAccessToken, CognitoAuthError, } from "./cognito-auth.js";
8
13
  export type { CognitoAuthConfig, CognitoTokens } from "./cognito-auth.js";
9
- /**
10
- * Initialize cloud sync authenticate and provision bucket
11
- */
12
- export declare function initSync(hqRoot: string): Promise<void>;
13
- /**
14
- * Start the background sync daemon
15
- */
16
- export declare function startDaemon(hqRoot: string): Promise<void>;
17
- /**
18
- * Stop the background sync daemon
19
- */
20
- export declare function stopDaemon(hqRoot: string): Promise<void>;
21
- /**
22
- * Get current sync status
23
- */
24
- export declare function getStatus(hqRoot: string): Promise<SyncStatus>;
25
- /**
26
- * Force push all local files to S3
27
- */
28
- export declare function pushAll(hqRoot: string): Promise<PushResult>;
29
- /**
30
- * Force pull all remote files to local
31
- */
32
- export declare function pullAll(hqRoot: string): Promise<PullResult>;
14
+ export { VaultClient } from "./vault-client.js";
15
+ export { VaultClientError, VaultAuthError, VaultPermissionDeniedError, VaultNotFoundError, VaultConflictError, } from "./vault-client.js";
16
+ export type { MembershipRole, MembershipStatus, Membership, CreateInviteInput, CreateInviteResult, AcceptInviteResult, UpdateRoleInput, EntityInfo, CreateEntityInput, CreateEntityResult, } from "./vault-client.js";
17
+ export type { TaskAction, TaskScope, VendChildInput, VendChildResult, StsChildCredentials, } from "./vault-client.js";
18
+ export { share, sync } from "./cli/index.js";
19
+ export type { ShareOptions, ShareResult, SyncOptions, SyncResult, SyncProgressEvent } from "./cli/index.js";
20
+ export { resolveConflict, showDiff } from "./cli/index.js";
21
+ export type { ConflictStrategy, ConflictInfo, ConflictResolution } from "./cli/index.js";
22
+ export { invite, listInvites, revokeInvite } from "./cli/index.js";
23
+ export type { InviteOptions, InviteResult, InviteListOptions, InviteRevokeOptions } from "./cli/index.js";
24
+ export { accept, parseToken } from "./cli/index.js";
25
+ export type { AcceptOptions, AcceptResult } from "./cli/index.js";
26
+ export { promote } from "./cli/index.js";
27
+ export type { PromoteOptions, PromoteResult } from "./cli/index.js";
28
+ export type { EntityContext, VaultCredentials, VaultServiceConfig, SyncConfig, Credentials, JournalEntry, SyncJournal, SyncStatus, PushResult, PullResult, DaemonState, } from "./types.js";
33
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAErE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIrE,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE1E;;GAEG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa5D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAiBnE;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA4BjE;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAyBjE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG1E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EACV,UAAU,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC5G,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpE,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,GACZ,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,138 +1,23 @@
1
1
  /**
2
2
  * @indigoai-us/hq-cloud — public API
3
- * Used by @indigoai-us/hq-cli to manage cloud sync
3
+ *
4
+ * VLT-5: Entity-aware sync engine. Operations resolve their target bucket
5
+ * and credentials from the vault-service entity registry + STS vending.
4
6
  */
5
- import * as fs from "fs";
6
- import * as path from "path";
7
- import { authenticate, hasCredentials, readCredentials } from "./auth.js";
8
- import { startDaemon as _startDaemon, stopDaemon as _stopDaemon, isDaemonRunning, } from "./daemon.js";
9
- import { readJournal, writeJournal, hashFile, updateEntry } from "./journal.js";
10
- import { uploadFile, downloadFile, listRemoteFiles } from "./s3.js";
11
- import { createIgnoreFilter, isWithinSizeLimit } from "./ignore.js";
12
- // Cognito identity helpers used by `hq auth refresh` and any consumer
13
- // that needs a valid HQ access token (deploy skill, onboarding, etc.).
14
- export { browserLogin, refreshTokens, getValidAccessToken, loadCachedTokens, saveCachedTokens, clearCachedTokens, isExpiring, CognitoAuthError, } from "./cognito-auth.js";
15
- /**
16
- * Initialize cloud sync authenticate and provision bucket
17
- */
18
- export async function initSync(hqRoot) {
19
- if (hasCredentials()) {
20
- console.log(" Already authenticated. Use 'hq sync start' to begin syncing.");
21
- return;
22
- }
23
- console.log(" Setting up IndigoAI cloud sync...");
24
- const creds = await authenticate();
25
- console.log(` ✓ Authenticated as ${creds.userId}`);
26
- console.log(` ✓ Bucket: ${creds.bucket}`);
27
- console.log(` ✓ Region: ${creds.region}`);
28
- console.log();
29
- console.log(" Run 'hq sync start' to begin syncing.");
30
- }
31
- /**
32
- * Start the background sync daemon
33
- */
34
- export async function startDaemon(hqRoot) {
35
- if (!hasCredentials()) {
36
- throw new Error("Not authenticated. Run 'hq sync init' first.");
37
- }
38
- _startDaemon(hqRoot);
39
- }
40
- /**
41
- * Stop the background sync daemon
42
- */
43
- export async function stopDaemon(hqRoot) {
44
- _stopDaemon(hqRoot);
45
- }
46
- /**
47
- * Get current sync status
48
- */
49
- export async function getStatus(hqRoot) {
50
- const journal = readJournal(hqRoot);
51
- const creds = readCredentials();
52
- const running = isDaemonRunning(hqRoot);
53
- const errors = [];
54
- if (!creds) {
55
- errors.push("Not authenticated — run 'hq sync init'");
56
- }
57
- return {
58
- running,
59
- lastSync: journal.lastSync || null,
60
- fileCount: Object.keys(journal.files).length,
61
- bucket: creds?.bucket || null,
62
- errors,
63
- };
64
- }
65
- /**
66
- * Force push all local files to S3
67
- */
68
- export async function pushAll(hqRoot) {
69
- const shouldSync = createIgnoreFilter(hqRoot);
70
- const journal = readJournal(hqRoot);
71
- let filesUploaded = 0;
72
- let bytesUploaded = 0;
73
- const files = walkDir(hqRoot, hqRoot, shouldSync);
74
- for (const { absolutePath, relativePath } of files) {
75
- if (!isWithinSizeLimit(absolutePath))
76
- continue;
77
- try {
78
- const hash = hashFile(absolutePath);
79
- const stat = fs.statSync(absolutePath);
80
- await uploadFile(absolutePath, relativePath);
81
- updateEntry(journal, relativePath, hash, stat.size, "up");
82
- filesUploaded++;
83
- bytesUploaded += stat.size;
84
- }
85
- catch (err) {
86
- console.error(` Failed: ${relativePath} — ${err instanceof Error ? err.message : err}`);
87
- }
88
- }
89
- writeJournal(hqRoot, journal);
90
- return { filesUploaded, bytesUploaded };
91
- }
92
- /**
93
- * Force pull all remote files to local
94
- */
95
- export async function pullAll(hqRoot) {
96
- const journal = readJournal(hqRoot);
97
- let filesDownloaded = 0;
98
- let bytesDownloaded = 0;
99
- const remoteFiles = await listRemoteFiles();
100
- for (const file of remoteFiles) {
101
- try {
102
- const localPath = path.join(hqRoot, file.relativePath);
103
- await downloadFile(file.relativePath, localPath);
104
- const hash = hashFile(localPath);
105
- updateEntry(journal, file.relativePath, hash, file.size, "down");
106
- filesDownloaded++;
107
- bytesDownloaded += file.size;
108
- }
109
- catch (err) {
110
- console.error(` Failed: ${file.relativePath} — ${err instanceof Error ? err.message : err}`);
111
- }
112
- }
113
- writeJournal(hqRoot, journal);
114
- return { filesDownloaded, bytesDownloaded };
115
- }
116
- // Helper: recursively walk a directory
117
- function walkDir(dir, root, filter) {
118
- const results = [];
119
- if (!fs.existsSync(dir))
120
- return results;
121
- const entries = fs.readdirSync(dir, { withFileTypes: true });
122
- for (const entry of entries) {
123
- const absolutePath = path.join(dir, entry.name);
124
- if (!filter(absolutePath))
125
- continue;
126
- if (entry.isDirectory()) {
127
- results.push(...walkDir(absolutePath, root, filter));
128
- }
129
- else if (entry.isFile()) {
130
- results.push({
131
- absolutePath,
132
- relativePath: path.relative(root, absolutePath),
133
- });
134
- }
135
- }
136
- return results;
137
- }
7
+ export { resolveEntityContext, refreshEntityContext, clearContextCache, isExpiringSoon, } from "./context.js";
8
+ export { uploadFile, downloadFile, listRemoteFiles, deleteRemoteFile, headRemoteFile, } from "./s3.js";
9
+ export { readJournal, writeJournal, hashFile, updateEntry, getEntry, removeEntry, getJournalPath, } from "./journal.js";
10
+ export { createIgnoreFilter, isWithinSizeLimit, } from "./ignore.js";
11
+ // Cognito browser-OAuth (VLT-9)
12
+ export { browserLogin, refreshTokens, loadCachedTokens, saveCachedTokens, clearCachedTokens, isExpiring, getValidAccessToken, CognitoAuthError, } from "./cognito-auth.js";
13
+ // VaultClient SDK (VLT-7)
14
+ export { VaultClient } from "./vault-client.js";
15
+ export { VaultClientError, VaultAuthError, VaultPermissionDeniedError, VaultNotFoundError, VaultConflictError, } from "./vault-client.js";
16
+ // CLI commands
17
+ export { share, sync } from "./cli/index.js";
18
+ export { resolveConflict, showDiff } from "./cli/index.js";
19
+ // Membership CLI commands (VLT-7)
20
+ export { invite, listInvites, revokeInvite } from "./cli/index.js";
21
+ export { accept, parseToken } from "./cli/index.js";
22
+ export { promote } from "./cli/index.js";
138
23
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,SAAS,CAAC;AAIjB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,gCAAgC;AAChC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAG3B,0BAA0B;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAuB3B,eAAe;AACf,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG3D,kCAAkC;AAClC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/journal.d.ts CHANGED
@@ -1,10 +1,26 @@
1
1
  /**
2
- * Sync journal — tracks file state for conflict detection
2
+ * Sync journal — tracks per-file state (hash, size, last-synced direction) so
3
+ * sync/share can detect local edits that would be clobbered by a blind pull.
4
+ *
5
+ * ADR-0001 Phase 5: the journal is sharded by company slug and lives in
6
+ * `~/.hq/`, not inside the HQ content root. One monolithic journal per HQ
7
+ * install conflates state across companies and forces every runner to
8
+ * serialize through the same file — splitting it lets `hq-sync-runner
9
+ * --companies` fan out without contention, and a corrupted shard only affects
10
+ * one company.
11
+ *
12
+ * Path: `{stateDir}/sync-journal.{slug}.json`, where `stateDir` resolves to
13
+ * `HQ_STATE_DIR` (if set) or `~/.hq`.
3
14
  */
4
15
  import type { SyncJournal, JournalEntry } from "./types.js";
5
- export declare function getJournalPath(hqRoot: string): string;
6
- export declare function readJournal(hqRoot: string): SyncJournal;
7
- export declare function writeJournal(hqRoot: string, journal: SyncJournal): void;
16
+ /**
17
+ * Where per-company journals are stored. Honors `HQ_STATE_DIR` for tests and
18
+ * non-standard installs; otherwise falls back to `~/.hq`.
19
+ */
20
+ export declare function getStateDir(): string;
21
+ export declare function getJournalPath(slug: string): string;
22
+ export declare function readJournal(slug: string): SyncJournal;
23
+ export declare function writeJournal(slug: string, journal: SyncJournal): void;
8
24
  export declare function hashFile(filePath: string): string;
9
25
  export declare function updateEntry(journal: SyncJournal, relativePath: string, hash: string, size: number, direction: "up" | "down"): void;
10
26
  export declare function getEntry(journal: SyncJournal, relativePath: string): JournalEntry | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI5D,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAOvD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAGvE;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,IAAI,GAAG,MAAM,GACvB,IAAI,CAQN;AAED,wBAAgB,QAAQ,CACtB,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,MAAM,GACnB,YAAY,GAAG,SAAS,CAE1B;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,MAAM,GACnB,IAAI,CAEN"}
1
+ {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK5D;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAmBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAOrD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAIrE;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,IAAI,GAAG,MAAM,GACvB,IAAI,CAQN;AAED,wBAAgB,QAAQ,CACtB,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,MAAM,GACnB,YAAY,GAAG,SAAS,CAE1B;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,MAAM,GACnB,IAAI,CAEN"}
package/dist/journal.js CHANGED
@@ -1,23 +1,60 @@
1
1
  /**
2
- * Sync journal — tracks file state for conflict detection
2
+ * Sync journal — tracks per-file state (hash, size, last-synced direction) so
3
+ * sync/share can detect local edits that would be clobbered by a blind pull.
4
+ *
5
+ * ADR-0001 Phase 5: the journal is sharded by company slug and lives in
6
+ * `~/.hq/`, not inside the HQ content root. One monolithic journal per HQ
7
+ * install conflates state across companies and forces every runner to
8
+ * serialize through the same file — splitting it lets `hq-sync-runner
9
+ * --companies` fan out without contention, and a corrupted shard only affects
10
+ * one company.
11
+ *
12
+ * Path: `{stateDir}/sync-journal.{slug}.json`, where `stateDir` resolves to
13
+ * `HQ_STATE_DIR` (if set) or `~/.hq`.
3
14
  */
4
15
  import * as fs from "fs";
16
+ import * as os from "os";
5
17
  import * as path from "path";
6
18
  import * as crypto from "crypto";
7
- const JOURNAL_FILE = ".hq-sync-journal.json";
8
- export function getJournalPath(hqRoot) {
9
- return path.join(hqRoot, JOURNAL_FILE);
19
+ const JOURNAL_FILE_PREFIX = "sync-journal.";
20
+ const JOURNAL_FILE_SUFFIX = ".json";
21
+ /**
22
+ * Where per-company journals are stored. Honors `HQ_STATE_DIR` for tests and
23
+ * non-standard installs; otherwise falls back to `~/.hq`.
24
+ */
25
+ export function getStateDir() {
26
+ return process.env.HQ_STATE_DIR ?? path.join(os.homedir(), ".hq");
27
+ }
28
+ /**
29
+ * Filename-safe form of a slug. Slugs from vault-service are already
30
+ * URL-safe, but this guards against paths, dots, or anything the filesystem
31
+ * might interpret. Empty-or-invalid slugs throw rather than silently writing
32
+ * to a shared "sync-journal..json" file.
33
+ */
34
+ function sanitizeSlug(slug) {
35
+ if (!slug) {
36
+ throw new Error("journal: slug is required (empty or undefined)");
37
+ }
38
+ const cleaned = slug.replace(/[^a-zA-Z0-9_-]/g, "_");
39
+ if (!cleaned || /^[_-]+$/.test(cleaned)) {
40
+ throw new Error(`journal: slug "${slug}" sanitizes to an empty identifier`);
41
+ }
42
+ return cleaned;
43
+ }
44
+ export function getJournalPath(slug) {
45
+ return path.join(getStateDir(), `${JOURNAL_FILE_PREFIX}${sanitizeSlug(slug)}${JOURNAL_FILE_SUFFIX}`);
10
46
  }
11
- export function readJournal(hqRoot) {
12
- const journalPath = getJournalPath(hqRoot);
47
+ export function readJournal(slug) {
48
+ const journalPath = getJournalPath(slug);
13
49
  if (fs.existsSync(journalPath)) {
14
50
  const content = fs.readFileSync(journalPath, "utf-8");
15
51
  return JSON.parse(content);
16
52
  }
17
53
  return { version: "1", lastSync: "", files: {} };
18
54
  }
19
- export function writeJournal(hqRoot, journal) {
20
- const journalPath = getJournalPath(hqRoot);
55
+ export function writeJournal(slug, journal) {
56
+ const journalPath = getJournalPath(slug);
57
+ fs.mkdirSync(path.dirname(journalPath), { recursive: true });
21
58
  fs.writeFileSync(journalPath, JSON.stringify(journal, null, 2));
22
59
  }
23
60
  export function hashFile(filePath) {
@@ -1 +1 @@
1
- {"version":3,"file":"journal.js","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAGjC,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAE7C,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,OAAoB;IAC/D,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC3C,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAoB,EACpB,YAAoB,EACpB,IAAY,EACZ,IAAY,EACZ,SAAwB;IAExB,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG;QAC5B,IAAI;QACJ,IAAI;QACJ,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAClC,SAAS;KACV,CAAC;IACF,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,OAAoB,EACpB,YAAoB;IAEpB,OAAO,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAoB,EACpB,YAAoB;IAEpB,OAAO,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"journal.js","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Unit tests for the sync journal (ADR-0001 Phase 5).
3
+ *
4
+ * Verifies per-company isolation, HQ_STATE_DIR override, and filename
5
+ * sanitization — all behaviors that the pre-Phase-5 monolithic journal
6
+ * didn't need.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=journal.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.test.d.ts","sourceRoot":"","sources":["../src/journal.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}