@indigoai-us/hq-cloud 6.15.0 → 6.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/sync-mutation.d.ts +16 -0
- package/dist/bin/sync-mutation.d.ts.map +1 -0
- package/dist/bin/sync-mutation.js +60 -0
- package/dist/bin/sync-mutation.js.map +1 -0
- package/dist/bin/sync-mutation.test.d.ts +2 -0
- package/dist/bin/sync-mutation.test.d.ts.map +1 -0
- package/dist/bin/sync-mutation.test.js +165 -0
- package/dist/bin/sync-mutation.test.js.map +1 -0
- package/dist/bin/sync-runner-company.d.ts +8 -0
- package/dist/bin/sync-runner-company.d.ts.map +1 -1
- package/dist/bin/sync-runner-company.js +16 -0
- package/dist/bin/sync-runner-company.js.map +1 -1
- package/dist/bin/sync-runner-company.test.d.ts +2 -0
- package/dist/bin/sync-runner-company.test.d.ts.map +1 -0
- package/dist/bin/sync-runner-company.test.js +36 -0
- package/dist/bin/sync-runner-company.test.js.map +1 -0
- package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -1
- package/dist/bin/sync-runner-watch-loop.js +98 -8
- package/dist/bin/sync-runner-watch-loop.js.map +1 -1
- package/dist/bin/sync-runner.d.ts +17 -0
- package/dist/bin/sync-runner.d.ts.map +1 -1
- package/dist/bin/sync-runner.js.map +1 -1
- package/dist/bin/sync-runner.test.js +109 -0
- package/dist/bin/sync-runner.test.js.map +1 -1
- package/dist/cli/conflict-recovery.test.d.ts +2 -0
- package/dist/cli/conflict-recovery.test.d.ts.map +1 -0
- package/dist/cli/conflict-recovery.test.js +201 -0
- package/dist/cli/conflict-recovery.test.js.map +1 -0
- package/dist/cli/conflict.d.ts +60 -0
- package/dist/cli/conflict.d.ts.map +1 -1
- package/dist/cli/conflict.js +333 -0
- package/dist/cli/conflict.js.map +1 -1
- package/dist/cli/sync.d.ts +35 -0
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +100 -0
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/sync.test.js +85 -1
- package/dist/cli/sync.test.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/skill-telemetry.d.ts +6 -0
- package/dist/skill-telemetry.d.ts.map +1 -1
- package/dist/skill-telemetry.js +14 -2
- package/dist/skill-telemetry.js.map +1 -1
- package/dist/skill-telemetry.test.js +79 -0
- package/dist/skill-telemetry.test.js.map +1 -1
- package/dist/sync/candidate-uploader.d.ts +88 -0
- package/dist/sync/candidate-uploader.d.ts.map +1 -0
- package/dist/sync/candidate-uploader.js +212 -0
- package/dist/sync/candidate-uploader.js.map +1 -0
- package/dist/sync/candidate-uploader.test.d.ts +2 -0
- package/dist/sync/candidate-uploader.test.d.ts.map +1 -0
- package/dist/sync/candidate-uploader.test.js +132 -0
- package/dist/sync/candidate-uploader.test.js.map +1 -0
- package/dist/sync/delta-client.d.ts +73 -0
- package/dist/sync/delta-client.d.ts.map +1 -0
- package/dist/sync/delta-client.js +201 -0
- package/dist/sync/delta-client.js.map +1 -0
- package/dist/sync/delta-client.test.d.ts +2 -0
- package/dist/sync/delta-client.test.d.ts.map +1 -0
- package/dist/sync/delta-client.test.js +97 -0
- package/dist/sync/delta-client.test.js.map +1 -0
- package/dist/sync/durable-apply.d.ts +76 -0
- package/dist/sync/durable-apply.d.ts.map +1 -0
- package/dist/sync/durable-apply.js +530 -0
- package/dist/sync/durable-apply.js.map +1 -0
- package/dist/sync/durable-apply.test.d.ts +2 -0
- package/dist/sync/durable-apply.test.d.ts.map +1 -0
- package/dist/sync/durable-apply.test.js +180 -0
- package/dist/sync/durable-apply.test.js.map +1 -0
- package/dist/sync/event-sync.d.ts +33 -1
- package/dist/sync/event-sync.d.ts.map +1 -1
- package/dist/sync/event-sync.js +149 -1
- package/dist/sync/event-sync.js.map +1 -1
- package/dist/sync/event-sync.test.js +142 -1
- package/dist/sync/event-sync.test.js.map +1 -1
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/multipart-uploader.d.ts +99 -0
- package/dist/sync/multipart-uploader.d.ts.map +1 -0
- package/dist/sync/multipart-uploader.js +447 -0
- package/dist/sync/multipart-uploader.js.map +1 -0
- package/dist/sync/multipart-uploader.test.d.ts +2 -0
- package/dist/sync/multipart-uploader.test.d.ts.map +1 -0
- package/dist/sync/multipart-uploader.test.js +119 -0
- package/dist/sync/multipart-uploader.test.js.map +1 -0
- package/dist/sync/mutation-client.d.ts +85 -0
- package/dist/sync/mutation-client.d.ts.map +1 -0
- package/dist/sync/mutation-client.js +245 -0
- package/dist/sync/mutation-client.js.map +1 -0
- package/dist/sync/mutation-client.test.d.ts +2 -0
- package/dist/sync/mutation-client.test.d.ts.map +1 -0
- package/dist/sync/mutation-client.test.js +51 -0
- package/dist/sync/mutation-client.test.js.map +1 -0
- package/dist/sync/push-receiver.d.ts +45 -0
- package/dist/sync/push-receiver.d.ts.map +1 -1
- package/dist/sync/push-receiver.js +101 -0
- package/dist/sync/push-receiver.js.map +1 -1
- package/dist/sync/push-receiver.test.js +54 -2
- package/dist/sync/push-receiver.test.js.map +1 -1
- package/dist/sync/scope-inventory-client.d.ts +69 -0
- package/dist/sync/scope-inventory-client.d.ts.map +1 -0
- package/dist/sync/scope-inventory-client.js +210 -0
- package/dist/sync/scope-inventory-client.js.map +1 -0
- package/dist/sync/scope-inventory-client.test.d.ts +2 -0
- package/dist/sync/scope-inventory-client.test.d.ts.map +1 -0
- package/dist/sync/scope-inventory-client.test.js +94 -0
- package/dist/sync/scope-inventory-client.test.js.map +1 -0
- package/dist/sync/snapshot-client.d.ts +98 -0
- package/dist/sync/snapshot-client.d.ts.map +1 -0
- package/dist/sync/snapshot-client.js +402 -0
- package/dist/sync/snapshot-client.js.map +1 -0
- package/dist/sync/snapshot-client.test.d.ts +2 -0
- package/dist/sync/snapshot-client.test.d.ts.map +1 -0
- package/dist/sync/snapshot-client.test.js +169 -0
- package/dist/sync/snapshot-client.test.js.map +1 -0
- package/dist/sync/uploader-finalization.d.ts +97 -0
- package/dist/sync/uploader-finalization.d.ts.map +1 -0
- package/dist/sync/uploader-finalization.js +273 -0
- package/dist/sync/uploader-finalization.js.map +1 -0
- package/dist/sync/uploader-finalization.test.d.ts +2 -0
- package/dist/sync/uploader-finalization.test.d.ts.map +1 -0
- package/dist/sync/uploader-finalization.test.js +92 -0
- package/dist/sync/uploader-finalization.test.js.map +1 -0
- package/dist/telemetry.d.ts +11 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +21 -2
- package/dist/telemetry.js.map +1 -1
- package/dist/telemetry.test.js +80 -0
- package/dist/telemetry.test.js.map +1 -1
- package/package.json +6 -1
- package/.claude/policies/hq-cloud-esm-cannot-spy-fs-builtins.md +0 -30
- package/.claude/policies/hq-cloud-strip-types-no-parameter-properties.md +0 -22
- package/.github/workflows/ci.yml +0 -84
- package/.github/workflows/publish.yml +0 -56
- package/.github/workflows/unreleased-commits-nag.yml +0 -256
- package/eslint.config.js +0 -67
- package/pnpm-workspace.yaml +0 -2
- package/scripts/presign-transport-e2e.mjs +0 -250
- package/scripts/vault-rebaseline.sh +0 -323
- package/scripts/vault-rescue.sh +0 -332
- package/src/active-company.test.ts +0 -188
- package/src/active-company.ts +0 -168
- package/src/agent-codex-instructions.test.ts +0 -332
- package/src/agent-codex-instructions.ts +0 -309
- package/src/auth.ts +0 -146
- package/src/backup-prune.test.ts +0 -98
- package/src/backup-prune.ts +0 -182
- package/src/bin/backup-prune-runner.ts +0 -33
- package/src/bin/rescue-runner.ts +0 -25
- package/src/bin/sync-runner-company.ts +0 -695
- package/src/bin/sync-runner-events.test.ts +0 -143
- package/src/bin/sync-runner-events.ts +0 -55
- package/src/bin/sync-runner-planning.test.ts +0 -311
- package/src/bin/sync-runner-planning.ts +0 -258
- package/src/bin/sync-runner-rollup.test.ts +0 -37
- package/src/bin/sync-runner-rollup.ts +0 -97
- package/src/bin/sync-runner-telemetry.ts +0 -15
- package/src/bin/sync-runner-watch-loop.ts +0 -1235
- package/src/bin/sync-runner-watch-routes.test.ts +0 -71
- package/src/bin/sync-runner-watch-routes.ts +0 -184
- package/src/bin/sync-runner.test.ts +0 -8767
- package/src/bin/sync-runner.ts +0 -2190
- package/src/cli/accept.ts +0 -124
- package/src/cli/conflict.ts +0 -119
- package/src/cli/doctor.test.ts +0 -581
- package/src/cli/doctor.ts +0 -642
- package/src/cli/index.ts +0 -49
- package/src/cli/invite.test.ts +0 -250
- package/src/cli/invite.ts +0 -214
- package/src/cli/promote.ts +0 -157
- package/src/cli/reindex-knowledge.test.ts +0 -307
- package/src/cli/reindex-knowledge.ts +0 -450
- package/src/cli/reindex.test.ts +0 -957
- package/src/cli/reindex.ts +0 -979
- package/src/cli/rescue-classify-ordering.test.ts +0 -548
- package/src/cli/rescue-clone-diagnostics.test.ts +0 -120
- package/src/cli/rescue-core.ts +0 -3011
- package/src/cli/rescue-drift-reconcile.test.ts +0 -179
- package/src/cli/rescue-drop-dir-symlink.test.ts +0 -224
- package/src/cli/rescue-exec-bit-preserve.test.ts +0 -187
- package/src/cli/rescue-hq-root-guard.test.ts +0 -232
- package/src/cli/rescue-journal-reconcile.test.ts +0 -215
- package/src/cli/rescue-mtime-preserve.test.ts +0 -203
- package/src/cli/rescue-settings-reconcile.test.ts +0 -637
- package/src/cli/rescue-snapshot.test.ts +0 -57
- package/src/cli/rescue-snapshot.ts +0 -51
- package/src/cli/rescue.reindex.test.ts +0 -63
- package/src/cli/rescue.test.ts +0 -131
- package/src/cli/rescue.ts +0 -182
- package/src/cli/share.test.ts +0 -7843
- package/src/cli/share.ts +0 -3663
- package/src/cli/sync-scope.test.ts +0 -652
- package/src/cli/sync.test.ts +0 -5207
- package/src/cli/sync.ts +0 -3470
- package/src/cli/tombstones.ts +0 -106
- package/src/cli/watch-event-push-conflict.test.ts +0 -234
- package/src/client-info.test.ts +0 -214
- package/src/client-info.ts +0 -121
- package/src/cognito-auth.test.ts +0 -712
- package/src/cognito-auth.ts +0 -1422
- package/src/company-resolver.test.ts +0 -618
- package/src/company-resolver.ts +0 -521
- package/src/context.test.ts +0 -583
- package/src/context.ts +0 -378
- package/src/daemon-worker.ts +0 -26
- package/src/daemon.ts +0 -99
- package/src/entity-resolver.test.ts +0 -315
- package/src/entity-resolver.ts +0 -180
- package/src/ignore.test.ts +0 -466
- package/src/ignore.ts +0 -469
- package/src/index.ts +0 -439
- package/src/journal.test.ts +0 -968
- package/src/journal.ts +0 -765
- package/src/lib/cloud-authoritative.test.ts +0 -45
- package/src/lib/cloud-authoritative.ts +0 -59
- package/src/lib/conflict-file.ts +0 -86
- package/src/lib/conflict-index.ts +0 -289
- package/src/lib/conflict.test.ts +0 -348
- package/src/lib/describe-error.test.ts +0 -100
- package/src/lib/describe-error.ts +0 -58
- package/src/lib/exit-codes.ts +0 -24
- package/src/lib/machine-id.test.ts +0 -231
- package/src/lib/machine-id.ts +0 -175
- package/src/lib/net-errors.test.ts +0 -65
- package/src/lib/net-errors.ts +0 -86
- package/src/lib/readlink-safe.test.ts +0 -43
- package/src/lib/readlink-safe.ts +0 -29
- package/src/local-path-codec.test.ts +0 -138
- package/src/local-path-codec.ts +0 -161
- package/src/machine-auth.test.ts +0 -1323
- package/src/manifest-reconcile.test.ts +0 -1123
- package/src/manifest-reconcile.ts +0 -518
- package/src/object-io.test.ts +0 -1221
- package/src/object-io.ts +0 -1306
- package/src/operation-lock.test.ts +0 -484
- package/src/operation-lock.ts +0 -680
- package/src/outcome-telemetry.test.ts +0 -498
- package/src/outcome-telemetry.ts +0 -639
- package/src/personal-vault-exclusions.test.ts +0 -308
- package/src/personal-vault-exclusions.ts +0 -354
- package/src/personal-vault.test.ts +0 -756
- package/src/personal-vault.ts +0 -496
- package/src/prefix-coalesce.test.ts +0 -240
- package/src/prefix-coalesce.ts +0 -273
- package/src/public-surface.test.ts +0 -117
- package/src/qmd-reindex.test.ts +0 -877
- package/src/qmd-reindex.ts +0 -842
- package/src/read-only-state-dir.test.ts +0 -188
- package/src/remote-pull.test.ts +0 -1130
- package/src/remote-pull.ts +0 -618
- package/src/s3.symlink-materialize.test.ts +0 -492
- package/src/s3.test.ts +0 -1789
- package/src/s3.ts +0 -1532
- package/src/schemas/signal-types.test.ts +0 -82
- package/src/schemas/signal-types.ts +0 -38
- package/src/schemas/source-channels.test.ts +0 -82
- package/src/schemas/source-channels.ts +0 -53
- package/src/scope-shrink.test.ts +0 -633
- package/src/scope-shrink.ts +0 -481
- package/src/signals/get.test.ts +0 -310
- package/src/signals/get.ts +0 -75
- package/src/signals/internals.ts +0 -195
- package/src/signals/list.test.ts +0 -420
- package/src/signals/list.ts +0 -79
- package/src/signals/parse.ts +0 -8
- package/src/signals/types.ts +0 -91
- package/src/skill-telemetry.test.ts +0 -1825
- package/src/skill-telemetry.ts +0 -1439
- package/src/sources/get.test.ts +0 -293
- package/src/sources/get.ts +0 -66
- package/src/sources/internals.ts +0 -198
- package/src/sources/list.test.ts +0 -402
- package/src/sources/list.ts +0 -84
- package/src/sources/parse.ts +0 -43
- package/src/sources/types.ts +0 -84
- package/src/sync/event-sync.test.ts +0 -594
- package/src/sync/event-sync.ts +0 -545
- package/src/sync/feature-flags.test.ts +0 -378
- package/src/sync/feature-flags.ts +0 -62
- package/src/sync/index.ts +0 -76
- package/src/sync/lease-client.test.ts +0 -128
- package/src/sync/lease-client.ts +0 -207
- package/src/sync/logger.test.ts +0 -242
- package/src/sync/logger.ts +0 -79
- package/src/sync/metrics.test.ts +0 -462
- package/src/sync/metrics.ts +0 -213
- package/src/sync/pull-scope.ts +0 -265
- package/src/sync/push-event.test.ts +0 -266
- package/src/sync/push-event.ts +0 -224
- package/src/sync/push-receiver.test.ts +0 -566
- package/src/sync/push-receiver.ts +0 -1048
- package/src/sync/push-transport.ts +0 -231
- package/src/sync/realtime-rollout.test.ts +0 -86
- package/src/sync/realtime-rollout.ts +0 -262
- package/src/sync/state-store.test.ts +0 -194
- package/src/sync/state-store.ts +0 -727
- package/src/sync-core.ts +0 -58
- package/src/sync-progress.test.ts +0 -94
- package/src/sync-progress.ts +0 -140
- package/src/telemetry-events.test.ts +0 -88
- package/src/telemetry-events.ts +0 -205
- package/src/telemetry.test.ts +0 -1280
- package/src/telemetry.ts +0 -1109
- package/src/types.ts +0 -314
- package/src/vault-client.test.ts +0 -1380
- package/src/vault-client.ts +0 -1694
- package/src/version.ts +0 -24
- package/src/watch-roots.test.ts +0 -278
- package/src/watch-roots.ts +0 -162
- package/src/watcher-event-gate.test.ts +0 -212
- package/src/watcher.test.ts +0 -1079
- package/src/watcher.ts +0 -1741
- package/test/e2e/sync/cross-tenant-isolation.test.ts +0 -630
- package/test/e2e/sync/skill-telemetry-oversized-transcript.test.ts +0 -124
- package/test/e2e/sync/transient-company-leg.test.ts +0 -384
- package/test/e2e/sync/windows-unreadable-link-leg.test.ts +0 -191
- package/test/e2e/watcher-real-chokidar.test.ts +0 -165
- package/test/e2e/watcher-recursive-backend.test.ts +0 -181
- package/test/e2e/watcher-scoped-coverage.test.ts +0 -381
- package/test/invite-flow.integration.test.ts +0 -244
- package/test/joiner-manifest-reconcile.integration.test.ts +0 -322
- package/test/share-sync.integration.test.ts +0 -213
- package/tsconfig.json +0 -19
- package/vitest.config.ts +0 -22
package/src/cli/accept.ts
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `hq accept` command — accept a membership invite (VLT-7 US-003).
|
|
3
|
-
*
|
|
4
|
-
* Parses magic links (hq://accept/<token> or raw tokens), resolves the
|
|
5
|
-
* caller's identity from Cognito, and calls VaultClient.acceptInvite().
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { VaultServiceConfig } from "../types.js";
|
|
9
|
-
import {
|
|
10
|
-
VaultClient,
|
|
11
|
-
VaultAuthError,
|
|
12
|
-
VaultNotFoundError,
|
|
13
|
-
VaultConflictError,
|
|
14
|
-
VaultPermissionDeniedError,
|
|
15
|
-
} from "../vault-client.js";
|
|
16
|
-
import type { Membership } from "../vault-client.js";
|
|
17
|
-
import { emitCloudTelemetry } from "../telemetry-events.js";
|
|
18
|
-
|
|
19
|
-
export interface AcceptOptions {
|
|
20
|
-
/** Raw token or magic link (hq://accept/<token>) */
|
|
21
|
-
tokenOrLink: string;
|
|
22
|
-
/** Caller's person UID (from Cognito) */
|
|
23
|
-
callerUid: string;
|
|
24
|
-
/** Vault service config */
|
|
25
|
-
vaultConfig: VaultServiceConfig;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface AcceptResult {
|
|
29
|
-
membership: Membership;
|
|
30
|
-
companySlug?: string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Parse a magic link or raw token into the raw invite token.
|
|
35
|
-
*/
|
|
36
|
-
export function parseToken(tokenOrLink: string): string {
|
|
37
|
-
const trimmed = tokenOrLink.trim();
|
|
38
|
-
|
|
39
|
-
// hq://accept/<token>
|
|
40
|
-
if (trimmed.startsWith("hq://accept/")) {
|
|
41
|
-
return trimmed.slice("hq://accept/".length);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// https://example.com/accept/<token> (future web route)
|
|
45
|
-
const httpsPrefix = "https://example.com/accept/";
|
|
46
|
-
if (trimmed.startsWith(httpsPrefix)) {
|
|
47
|
-
return trimmed.slice(httpsPrefix.length);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Raw token
|
|
51
|
-
return trimmed;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Accept a membership invite.
|
|
56
|
-
*/
|
|
57
|
-
export async function accept(options: AcceptOptions): Promise<AcceptResult> {
|
|
58
|
-
const { tokenOrLink, callerUid, vaultConfig } = options;
|
|
59
|
-
const token = parseToken(tokenOrLink);
|
|
60
|
-
|
|
61
|
-
if (!token) {
|
|
62
|
-
throw new Error("No invite token provided. Usage: /accept <token-or-magic-link>");
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const client = new VaultClient(vaultConfig);
|
|
66
|
-
|
|
67
|
-
try {
|
|
68
|
-
const result = await client.acceptInvite(token, callerUid);
|
|
69
|
-
const membership = result.membership;
|
|
70
|
-
|
|
71
|
-
// Try to resolve company slug for display
|
|
72
|
-
let companySlug: string | undefined;
|
|
73
|
-
if (membership.companyUid) {
|
|
74
|
-
try {
|
|
75
|
-
const entity = await client.entity.get(membership.companyUid);
|
|
76
|
-
companySlug = entity.slug;
|
|
77
|
-
} catch {
|
|
78
|
-
// Non-critical — just display UID instead
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
void emitCloudTelemetry(client, {
|
|
83
|
-
eventName: "membership_accept",
|
|
84
|
-
source: "hq-cli",
|
|
85
|
-
companyUid: membership.companyUid,
|
|
86
|
-
properties: {
|
|
87
|
-
role: membership.role,
|
|
88
|
-
result: "success",
|
|
89
|
-
},
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
return { membership, companySlug };
|
|
93
|
-
} catch (err) {
|
|
94
|
-
void emitCloudTelemetry(client, {
|
|
95
|
-
eventName: "membership_accept",
|
|
96
|
-
source: "hq-cli",
|
|
97
|
-
properties: {
|
|
98
|
-
result: "failure",
|
|
99
|
-
errorCode: classifyAcceptError(err),
|
|
100
|
-
},
|
|
101
|
-
});
|
|
102
|
-
if (err instanceof VaultAuthError) {
|
|
103
|
-
throw new Error("Authentication failed — run `hq auth` to refresh your session");
|
|
104
|
-
}
|
|
105
|
-
if (err instanceof VaultConflictError) {
|
|
106
|
-
throw new Error("This invite was already accepted");
|
|
107
|
-
}
|
|
108
|
-
if (err instanceof VaultNotFoundError) {
|
|
109
|
-
throw new Error("Invite not found or expired");
|
|
110
|
-
}
|
|
111
|
-
if (err instanceof VaultPermissionDeniedError) {
|
|
112
|
-
throw new Error("This invite was for a different person");
|
|
113
|
-
}
|
|
114
|
-
throw err;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
function classifyAcceptError(err: unknown): string {
|
|
119
|
-
if (err instanceof VaultAuthError) return "auth";
|
|
120
|
-
if (err instanceof VaultConflictError) return "conflict";
|
|
121
|
-
if (err instanceof VaultNotFoundError) return "not_found";
|
|
122
|
-
if (err instanceof VaultPermissionDeniedError) return "permission";
|
|
123
|
-
return "error";
|
|
124
|
-
}
|
package/src/cli/conflict.ts
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Conflict resolution for hq share/sync (VLT-5 US-002).
|
|
3
|
-
*
|
|
4
|
-
* Interactive prompts in terminal mode; deterministic resolution via
|
|
5
|
-
* --on-conflict flag for worker/skill callers.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import * as fs from "fs";
|
|
9
|
-
import * as readline from "readline";
|
|
10
|
-
|
|
11
|
-
export type ConflictStrategy = "overwrite" | "keep" | "abort";
|
|
12
|
-
|
|
13
|
-
export interface ConflictInfo {
|
|
14
|
-
path: string;
|
|
15
|
-
localHash?: string;
|
|
16
|
-
remoteHash?: string;
|
|
17
|
-
localModified?: Date;
|
|
18
|
-
remoteModified?: Date;
|
|
19
|
-
direction: "push" | "pull";
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export type ConflictResolution = "overwrite" | "keep" | "skip" | "diff" | "abort";
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Resolve a conflict interactively or via strategy flag.
|
|
26
|
-
*
|
|
27
|
-
* In non-interactive mode (strategy provided), returns deterministically:
|
|
28
|
-
* overwrite → "overwrite"
|
|
29
|
-
* keep → "keep"
|
|
30
|
-
* abort → "abort"
|
|
31
|
-
*
|
|
32
|
-
* In interactive mode (strategy undefined), prompts the user.
|
|
33
|
-
*/
|
|
34
|
-
export async function resolveConflict(
|
|
35
|
-
conflict: ConflictInfo,
|
|
36
|
-
strategy?: ConflictStrategy,
|
|
37
|
-
): Promise<ConflictResolution> {
|
|
38
|
-
if (strategy) {
|
|
39
|
-
return strategy === "abort" ? "abort" : strategy;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return promptConflict(conflict);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
async function promptConflict(conflict: ConflictInfo): Promise<ConflictResolution> {
|
|
46
|
-
const rl = readline.createInterface({
|
|
47
|
-
input: process.stdin,
|
|
48
|
-
output: process.stderr,
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
const direction = conflict.direction === "push"
|
|
52
|
-
? "Remote has a newer version"
|
|
53
|
-
: "Local file has uncommitted edits";
|
|
54
|
-
|
|
55
|
-
console.error(`\n Conflict: ${conflict.path}`);
|
|
56
|
-
console.error(` ${direction}`);
|
|
57
|
-
if (conflict.localModified) {
|
|
58
|
-
console.error(` Local modified: ${conflict.localModified.toISOString()}`);
|
|
59
|
-
}
|
|
60
|
-
if (conflict.remoteModified) {
|
|
61
|
-
console.error(` Remote modified: ${conflict.remoteModified.toISOString()}`);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const options = conflict.direction === "push"
|
|
65
|
-
? "[o]verwrite remote / [k]eep remote / [d]iff / [a]bort"
|
|
66
|
-
: "[o]verwrite local / [k]eep local / [d]iff / [s]kip";
|
|
67
|
-
|
|
68
|
-
const answer = await new Promise<string>((resolve) => {
|
|
69
|
-
rl.question(` ${options}: `, (ans) => {
|
|
70
|
-
rl.close();
|
|
71
|
-
resolve(ans.trim().toLowerCase());
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
switch (answer) {
|
|
76
|
-
case "o":
|
|
77
|
-
case "overwrite":
|
|
78
|
-
return "overwrite";
|
|
79
|
-
case "k":
|
|
80
|
-
case "keep":
|
|
81
|
-
return "keep";
|
|
82
|
-
case "d":
|
|
83
|
-
case "diff":
|
|
84
|
-
return "diff";
|
|
85
|
-
case "s":
|
|
86
|
-
case "skip":
|
|
87
|
-
return "skip";
|
|
88
|
-
case "a":
|
|
89
|
-
case "abort":
|
|
90
|
-
return "abort";
|
|
91
|
-
default:
|
|
92
|
-
// Default to keep (safe option)
|
|
93
|
-
console.error(" Unrecognized choice, keeping current version.");
|
|
94
|
-
return "keep";
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Show a simple diff between local and remote content.
|
|
100
|
-
* Returns the content strings for display.
|
|
101
|
-
*/
|
|
102
|
-
export function showDiff(
|
|
103
|
-
localPath: string,
|
|
104
|
-
remoteContent: Buffer,
|
|
105
|
-
): void {
|
|
106
|
-
const localContent = fs.existsSync(localPath)
|
|
107
|
-
? fs.readFileSync(localPath, "utf-8")
|
|
108
|
-
: "(file does not exist locally)";
|
|
109
|
-
const remoteStr = remoteContent.toString("utf-8");
|
|
110
|
-
|
|
111
|
-
console.error("\n--- LOCAL ---");
|
|
112
|
-
console.error(localContent.slice(0, 2000));
|
|
113
|
-
if (localContent.length > 2000) console.error("... (truncated)");
|
|
114
|
-
|
|
115
|
-
console.error("\n--- REMOTE ---");
|
|
116
|
-
console.error(remoteStr.slice(0, 2000));
|
|
117
|
-
if (remoteStr.length > 2000) console.error("... (truncated)");
|
|
118
|
-
console.error("");
|
|
119
|
-
}
|