@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
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
SIGNAL_TYPES,
|
|
4
|
-
isSignalType,
|
|
5
|
-
assertSignalType,
|
|
6
|
-
InvalidSignalTypeError,
|
|
7
|
-
} from "./signal-types.js";
|
|
8
|
-
import type { SignalType } from "./signal-types.js";
|
|
9
|
-
|
|
10
|
-
describe("SIGNAL_TYPES", () => {
|
|
11
|
-
it("contains the six canonical types", () => {
|
|
12
|
-
expect([...SIGNAL_TYPES]).toEqual([
|
|
13
|
-
"action_item",
|
|
14
|
-
"commitment",
|
|
15
|
-
"decision",
|
|
16
|
-
"key_point",
|
|
17
|
-
"risk",
|
|
18
|
-
"summary",
|
|
19
|
-
]);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it("is frozen (readonly at runtime)", () => {
|
|
23
|
-
expect(Object.isFrozen(SIGNAL_TYPES)).toBe(true);
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
describe("isSignalType", () => {
|
|
28
|
-
it.each(SIGNAL_TYPES)("returns true for '%s'", (type) => {
|
|
29
|
-
expect(isSignalType(type)).toBe(true);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it("returns false for an invalid string", () => {
|
|
33
|
-
expect(isSignalType("ramble")).toBe(false);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it("returns false for non-string values", () => {
|
|
37
|
-
expect(isSignalType(42)).toBe(false);
|
|
38
|
-
expect(isSignalType(null)).toBe(false);
|
|
39
|
-
expect(isSignalType(undefined)).toBe(false);
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
describe("assertSignalType", () => {
|
|
44
|
-
it.each(SIGNAL_TYPES)("does not throw for '%s'", (type) => {
|
|
45
|
-
expect(() => assertSignalType(type)).not.toThrow();
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it("throws InvalidSignalTypeError for invalid value", () => {
|
|
49
|
-
expect(() => assertSignalType("ramble")).toThrow(InvalidSignalTypeError);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it("error message contains the offending value", () => {
|
|
53
|
-
expect(() => assertSignalType("ramble")).toThrow("'ramble'");
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it("error message lists all valid types", () => {
|
|
57
|
-
try {
|
|
58
|
-
assertSignalType("ramble");
|
|
59
|
-
} catch (err) {
|
|
60
|
-
const msg = (err as Error).message;
|
|
61
|
-
for (const type of SIGNAL_TYPES) {
|
|
62
|
-
expect(msg).toContain(type);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it("error message matches snapshot", () => {
|
|
68
|
-
expect(() => assertSignalType("ramble")).toThrowErrorMatchingInlineSnapshot(
|
|
69
|
-
`[InvalidSignalTypeError: Invalid signal type: 'ramble'. Valid types: action_item, commitment, decision, key_point, risk, summary]`,
|
|
70
|
-
);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
describe("SignalType type", () => {
|
|
75
|
-
it("narrows correctly via type guard", () => {
|
|
76
|
-
const value: unknown = "action_item";
|
|
77
|
-
if (isSignalType(value)) {
|
|
78
|
-
const _type: SignalType = value;
|
|
79
|
-
expect(_type).toBe("action_item");
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
});
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Signal type schema — single source of truth.
|
|
3
|
-
*
|
|
4
|
-
* Closed enum: the six canonical signal types.
|
|
5
|
-
* assertSignalType is the agent-mitigation lever — prevents LLMs
|
|
6
|
-
* from fabricating signal types.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
export const SIGNAL_TYPES = Object.freeze([
|
|
10
|
-
"action_item",
|
|
11
|
-
"commitment",
|
|
12
|
-
"decision",
|
|
13
|
-
"key_point",
|
|
14
|
-
"risk",
|
|
15
|
-
"summary",
|
|
16
|
-
] as const);
|
|
17
|
-
|
|
18
|
-
export type SignalType = (typeof SIGNAL_TYPES)[number];
|
|
19
|
-
|
|
20
|
-
export class InvalidSignalTypeError extends Error {
|
|
21
|
-
override readonly name = "InvalidSignalTypeError";
|
|
22
|
-
|
|
23
|
-
constructor(value: unknown) {
|
|
24
|
-
super(
|
|
25
|
-
`Invalid signal type: '${String(value)}'. Valid types: ${SIGNAL_TYPES.join(", ")}`,
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function isSignalType(value: unknown): value is SignalType {
|
|
31
|
-
return typeof value === "string" && (SIGNAL_TYPES as readonly string[]).includes(value);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function assertSignalType(value: unknown): asserts value is SignalType {
|
|
35
|
-
if (!isSignalType(value)) {
|
|
36
|
-
throw new InvalidSignalTypeError(value);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
SOURCE_CHANNELS,
|
|
4
|
-
isSourceChannel,
|
|
5
|
-
assertSourceChannel,
|
|
6
|
-
InvalidSourceChannelError,
|
|
7
|
-
} from "./source-channels.js";
|
|
8
|
-
import type { SourceChannel } from "./source-channels.js";
|
|
9
|
-
|
|
10
|
-
describe("SOURCE_CHANNELS", () => {
|
|
11
|
-
it("contains the five canonical channels", () => {
|
|
12
|
-
expect([...SOURCE_CHANNELS]).toEqual([
|
|
13
|
-
"meeting",
|
|
14
|
-
"email",
|
|
15
|
-
"slack",
|
|
16
|
-
"linear",
|
|
17
|
-
"notion",
|
|
18
|
-
]);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it("is frozen (readonly at runtime)", () => {
|
|
22
|
-
expect(Object.isFrozen(SOURCE_CHANNELS)).toBe(true);
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
describe("isSourceChannel", () => {
|
|
27
|
-
it.each(SOURCE_CHANNELS)("returns true for '%s'", (channel) => {
|
|
28
|
-
expect(isSourceChannel(channel)).toBe(true);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it("returns false for an invalid string", () => {
|
|
32
|
-
expect(isSourceChannel("pigeon")).toBe(false);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it("returns false for non-string values", () => {
|
|
36
|
-
expect(isSourceChannel(42)).toBe(false);
|
|
37
|
-
expect(isSourceChannel(null)).toBe(false);
|
|
38
|
-
expect(isSourceChannel(undefined)).toBe(false);
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
describe("assertSourceChannel", () => {
|
|
43
|
-
it.each(SOURCE_CHANNELS)("does not throw for '%s'", (channel) => {
|
|
44
|
-
expect(() => assertSourceChannel(channel)).not.toThrow();
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it("throws InvalidSourceChannelError for invalid value", () => {
|
|
48
|
-
expect(() => assertSourceChannel("pigeon")).toThrow(InvalidSourceChannelError);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it("error message contains the offending value", () => {
|
|
52
|
-
expect(() => assertSourceChannel("pigeon")).toThrow("'pigeon'");
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it("error message lists all valid channels", () => {
|
|
56
|
-
try {
|
|
57
|
-
assertSourceChannel("pigeon");
|
|
58
|
-
} catch (err) {
|
|
59
|
-
const msg = (err as Error).message;
|
|
60
|
-
for (const channel of SOURCE_CHANNELS) {
|
|
61
|
-
expect(msg).toContain(channel);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it("error message matches snapshot", () => {
|
|
67
|
-
expect(() => assertSourceChannel("pigeon")).toThrowErrorMatchingInlineSnapshot(
|
|
68
|
-
`[InvalidSourceChannelError: Invalid source channel: 'pigeon'. Valid channels: meeting, email, slack, linear, notion]`,
|
|
69
|
-
);
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
describe("SourceChannel type", () => {
|
|
74
|
-
it("narrows correctly via type guard", () => {
|
|
75
|
-
const value: unknown = "meeting";
|
|
76
|
-
if (isSourceChannel(value)) {
|
|
77
|
-
// TypeScript narrows to SourceChannel — compile-time check
|
|
78
|
-
const _channel: SourceChannel = value;
|
|
79
|
-
expect(_channel).toBe("meeting");
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
});
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Source channel schema — single source of truth.
|
|
3
|
-
*
|
|
4
|
-
* Closed enum: extension requires a code change (PR).
|
|
5
|
-
* Matches the sources-pipeline SourceChannel type.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
export const SOURCE_CHANNELS = Object.freeze([
|
|
9
|
-
"meeting",
|
|
10
|
-
"email",
|
|
11
|
-
"slack",
|
|
12
|
-
"linear",
|
|
13
|
-
"notion",
|
|
14
|
-
] as const);
|
|
15
|
-
|
|
16
|
-
export type SourceChannel = (typeof SOURCE_CHANNELS)[number];
|
|
17
|
-
|
|
18
|
-
export class InvalidSourceChannelError extends Error {
|
|
19
|
-
override readonly name = "InvalidSourceChannelError";
|
|
20
|
-
|
|
21
|
-
constructor(value: unknown) {
|
|
22
|
-
super(
|
|
23
|
-
`Invalid source channel: '${String(value)}'. Valid channels: ${SOURCE_CHANNELS.join(", ")}`,
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function isSourceChannel(value: unknown): value is SourceChannel {
|
|
29
|
-
return typeof value === "string" && (SOURCE_CHANNELS as readonly string[]).includes(value);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function assertSourceChannel(value: unknown): asserts value is SourceChannel {
|
|
33
|
-
if (!isSourceChannel(value)) {
|
|
34
|
-
throw new InvalidSourceChannelError(value);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Map a source channel (singular enum value) to the S3 path segment used by
|
|
40
|
-
* sources-pipeline writers. The sources-pipeline (hq-pro) uses plural for
|
|
41
|
-
* meetings only; the other channels pass through:
|
|
42
|
-
*
|
|
43
|
-
* meeting → meetings
|
|
44
|
-
* email → email
|
|
45
|
-
* slack → slack
|
|
46
|
-
* linear → linear
|
|
47
|
-
* notion → notion
|
|
48
|
-
*
|
|
49
|
-
* Keep in sync with hq-pro/src/sources/s3-paths.ts:sourcePathSegment().
|
|
50
|
-
*/
|
|
51
|
-
export function sourcePathSegment(channel: SourceChannel): string {
|
|
52
|
-
return channel === "meeting" ? "meetings" : channel;
|
|
53
|
-
}
|