@yiaany/ghostapi 0.1.8 → 0.2.0
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/CHANGELOG.md +21 -0
- package/CONTRIBUTING.md +132 -119
- package/LICENSE +21 -21
- package/PROVENANCE.md +13 -0
- package/README.md +78 -80
- package/SECURITY.md +56 -53
- package/dist/actions/gateway.js +320 -72
- package/dist/actions/gateway.js.map +1 -1
- package/dist/actions/index.d.ts +2 -2
- package/dist/actions/index.js +1 -1
- package/dist/actions/index.js.map +1 -1
- package/dist/agents/agentPrompt.js +7 -5
- package/dist/agents/agentPrompt.js.map +1 -1
- package/dist/ai/aiClient.js +5 -5
- package/dist/ai/aiClient.js.map +1 -1
- package/dist/ai/aiGenerator.js +66 -26
- package/dist/ai/aiGenerator.js.map +1 -1
- package/dist/ai/genericInference.js +151 -36
- package/dist/ai/genericInference.js.map +1 -1
- package/dist/ai/prompts.js +55 -49
- package/dist/ai/prompts.js.map +1 -1
- package/dist/approvals/approvalInbox.js +649 -133
- package/dist/approvals/approvalInbox.js.map +1 -1
- package/dist/approvals/index.d.ts +2 -2
- package/dist/approvals/index.js +1 -1
- package/dist/approvals/index.js.map +1 -1
- package/dist/behavior/behaviorStore.js +34 -14
- package/dist/behavior/behaviorStore.js.map +1 -1
- package/dist/cache/index.js +14 -5
- package/dist/cache/index.js.map +1 -1
- package/dist/cli/index.js +226 -93
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/openUrl.js +17 -3
- package/dist/cli/openUrl.js.map +1 -1
- package/dist/cli/parser.js +79 -18
- package/dist/cli/parser.js.map +1 -1
- package/dist/config/dataPaths.js +4 -2
- package/dist/config/dataPaths.js.map +1 -1
- package/dist/config/localConfig.js +5 -2
- package/dist/config/localConfig.js.map +1 -1
- package/dist/config/serverConfig.js +11 -5
- package/dist/config/serverConfig.js.map +1 -1
- package/dist/contracts/contract.js +311 -83
- package/dist/contracts/contract.js.map +1 -1
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/index.js.map +1 -1
- package/dist/credentials/credentialBroker.js +391 -79
- package/dist/credentials/credentialBroker.js.map +1 -1
- package/dist/credentials/index.d.ts +2 -2
- package/dist/credentials/index.js +1 -1
- package/dist/credentials/index.js.map +1 -1
- package/dist/dashboard/app.js +823 -685
- package/dist/dashboard/dashboard.js.map +1 -1
- package/dist/dashboard/index.html +704 -267
- package/dist/dashboard/styles.css +1040 -349
- package/dist/egress/capabilities.js +55 -25
- package/dist/egress/capabilities.js.map +1 -1
- package/dist/egress/linuxBootstrap.js +47 -11
- package/dist/egress/linuxBootstrap.js.map +1 -1
- package/dist/egress/run.js +170 -31
- package/dist/egress/run.js.map +1 -1
- package/dist/errors/errorEngine.js +15 -3
- package/dist/errors/errorEngine.js.map +1 -1
- package/dist/errors/providerErrors.js.map +1 -1
- package/dist/evals/evals.js +304 -78
- package/dist/evals/evals.js.map +1 -1
- package/dist/evals/index.d.ts +2 -2
- package/dist/evals/index.js +1 -1
- package/dist/evals/index.js.map +1 -1
- package/dist/evidence/index.d.ts +2 -2
- package/dist/evidence/index.js +1 -1
- package/dist/evidence/index.js.map +1 -1
- package/dist/evidence/report.d.ts +1 -1
- package/dist/evidence/report.js +263 -79
- package/dist/evidence/report.js.map +1 -1
- package/dist/fault/faultLab.js +24 -9
- package/dist/fault/faultLab.js.map +1 -1
- package/dist/index.d.ts +42 -42
- package/dist/index.js +21 -21
- package/dist/index.js.map +1 -1
- package/dist/inventory/analysis.d.ts +1 -1
- package/dist/inventory/analysis.js +174 -50
- package/dist/inventory/analysis.js.map +1 -1
- package/dist/inventory/index.d.ts +4 -4
- package/dist/inventory/index.js +3 -3
- package/dist/inventory/index.js.map +1 -1
- package/dist/inventory/inventoryController.js +362 -115
- package/dist/inventory/inventoryController.js.map +1 -1
- package/dist/inventory/types.js +680 -140
- package/dist/inventory/types.js.map +1 -1
- package/dist/ledger/actionLedger.js +355 -78
- package/dist/ledger/actionLedger.js.map +1 -1
- package/dist/ledger/index.d.ts +2 -2
- package/dist/ledger/index.js +1 -1
- package/dist/ledger/index.js.map +1 -1
- package/dist/mcp/server.js +26 -11
- package/dist/mcp/server.js.map +1 -1
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +1 -1
- package/dist/policy/index.js.map +1 -1
- package/dist/policy/policy.js +112 -32
- package/dist/policy/policy.js.map +1 -1
- package/dist/productTelemetry/index.js +71 -20
- package/dist/productTelemetry/index.js.map +1 -1
- package/dist/providers/conformance.js +10 -5
- package/dist/providers/conformance.js.map +1 -1
- package/dist/providers/discord.js +2 -2
- package/dist/providers/generic.js +3 -3
- package/dist/providers/github.js +2 -2
- package/dist/providers/index.d.ts +3 -3
- package/dist/providers/index.js +2 -2
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.js +3 -3
- package/dist/providers/packs/resendPack.js +51 -25
- package/dist/providers/packs/resendPack.js.map +1 -1
- package/dist/providers/packs/stripePack.js +590 -121
- package/dist/providers/packs/stripePack.js.map +1 -1
- package/dist/providers/registry.js +4 -4
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/runtime.js +7 -6
- package/dist/providers/runtime.js.map +1 -1
- package/dist/providers/stripeWebhook.js +39 -10
- package/dist/providers/stripeWebhook.js.map +1 -1
- package/dist/providers/twilio.js +2 -2
- package/dist/proxy/cacheKey.js +9 -2
- package/dist/proxy/cacheKey.js.map +1 -1
- package/dist/proxy/providerDetector.js +22 -9
- package/dist/proxy/providerDetector.js.map +1 -1
- package/dist/proxy/proxyHandler.js +57 -22
- package/dist/proxy/proxyHandler.js.map +1 -1
- package/dist/proxy/requestNormalizer.js +4 -2
- package/dist/proxy/requestNormalizer.js.map +1 -1
- package/dist/reliability/costGovernance.js +211 -49
- package/dist/reliability/costGovernance.js.map +1 -1
- package/dist/reliability/index.d.ts +8 -8
- package/dist/reliability/index.js +4 -4
- package/dist/reliability/index.js.map +1 -1
- package/dist/reliability/reconciliation.js +274 -65
- package/dist/reliability/reconciliation.js.map +1 -1
- package/dist/reliability/runtimeHealth.js +127 -35
- package/dist/reliability/runtimeHealth.js.map +1 -1
- package/dist/reliability/slo.js +257 -50
- package/dist/reliability/slo.js.map +1 -1
- package/dist/report/safetyReport.d.ts +6 -0
- package/dist/report/safetyReport.js +56 -12
- package/dist/report/safetyReport.js.map +1 -1
- package/dist/rules/aiRules.js +5 -5
- package/dist/rules/aiRules.js.map +1 -1
- package/dist/safety/index.d.ts +2 -2
- package/dist/safety/index.js +1 -1
- package/dist/safety/index.js.map +1 -1
- package/dist/safety/safetyController.js +675 -165
- package/dist/safety/safetyController.js.map +1 -1
- package/dist/scenarios/scenarioBundle.js +204 -71
- package/dist/scenarios/scenarioBundle.js.map +1 -1
- package/dist/scenarios/scenarioStore.js +88 -29
- package/dist/scenarios/scenarioStore.js.map +1 -1
- package/dist/security/headerSanitizer.js +52 -10
- package/dist/security/headerSanitizer.js.map +1 -1
- package/dist/security/secrets.js +10 -5
- package/dist/security/secrets.js.map +1 -1
- package/dist/server/accessControl.js +37 -10
- package/dist/server/accessControl.js.map +1 -1
- package/dist/server/createServer.js +1 -1
- package/dist/server/createServer.js.map +1 -1
- package/dist/server/eventsStore.js +15 -5
- package/dist/server/eventsStore.js.map +1 -1
- package/dist/server/routes.js +67 -19
- package/dist/server/routes.js.map +1 -1
- package/dist/server/sse.js +1 -1
- package/dist/server/sse.js.map +1 -1
- package/dist/setup/sdkDetector.js +7 -2
- package/dist/setup/sdkDetector.js.map +1 -1
- package/dist/setup/setupGenerator.js +136 -48
- package/dist/setup/setupGenerator.js.map +1 -1
- package/dist/state/stateExtractor.js +3 -1
- package/dist/state/stateExtractor.js.map +1 -1
- package/dist/state/stateResolver.js +10 -7
- package/dist/state/stateResolver.js.map +1 -1
- package/dist/state/stateStore.js +13 -4
- package/dist/state/stateStore.js.map +1 -1
- package/dist/storage/fileStore.js +12 -4
- package/dist/storage/fileStore.js.map +1 -1
- package/dist/teamControl/controlPlane.js +846 -174
- package/dist/teamControl/controlPlane.js.map +1 -1
- package/dist/teamControl/deployment.js +19 -5
- package/dist/teamControl/deployment.js.map +1 -1
- package/dist/teamControl/index.d.ts +4 -4
- package/dist/teamControl/index.js +2 -2
- package/dist/teamControl/index.js.map +1 -1
- package/dist/tests/testGenerator.js +15 -7
- package/dist/tests/testGenerator.js.map +1 -1
- package/dist/trust/index.d.ts +2 -2
- package/dist/trust/index.js +1 -1
- package/dist/trust/index.js.map +1 -1
- package/dist/trust/trustLadder.js +309 -63
- package/dist/trust/trustLadder.js.map +1 -1
- package/dist/worlds/index.d.ts +2 -2
- package/dist/worlds/index.js +1 -1
- package/dist/worlds/index.js.map +1 -1
- package/dist/worlds/worlds.js +364 -65
- package/dist/worlds/worlds.js.map +1 -1
- package/docs/assets/dashboard.png +0 -0
- package/docs/assets/ghostapi-avatar.png +0 -0
- package/docs/ci.md +49 -49
- package/docs/github-actions.md +84 -84
- package/docs/mcp.md +58 -52
- package/docs/policy.md +63 -61
- package/docs/providers/authoring-packs.md +180 -175
- package/docs/providers/stripe-core-pack.md +84 -82
- package/docs/releases/README.md +13 -0
- package/docs/security/action-gateway-threat-model.md +34 -34
- package/docs/security/action-ledger-incident-replay-threat-model.md +42 -42
- package/docs/security/approval-inbox-threat-model.md +35 -35
- package/docs/security/credential-broker-threat-model.md +52 -52
- package/docs/security/egress-threat-model.md +126 -126
- package/docs/security/inventory-threat-model.md +104 -104
- package/docs/security/kill-switch-budgets-threat-model.md +37 -37
- package/docs/security/reliability-threat-model.md +111 -111
- package/docs/security/trust-ladder-threat-model.md +33 -33
- package/docs/telemetry.md +14 -0
- package/docs/usage.md +680 -571
- package/examples/README.md +10 -10
- package/examples/agent-instructions/README.md +39 -39
- package/examples/ci-smoke/README.md +21 -21
- package/examples/ci-smoke/ghostapi.policy.yaml +22 -22
- package/examples/ci-smoke/package.json +9 -9
- package/examples/ci-smoke/production-egress.mjs +4 -2
- package/examples/ci-smoke/safe.mjs +21 -17
- package/examples/evals/README.md +24 -24
- package/examples/evals/retry-after.eval.json +71 -52
- package/examples/generic-rest/README.md +27 -27
- package/examples/github-fetch/README.md +38 -35
- package/examples/openai-streaming/README.md +16 -16
- package/examples/openai-streaming/streaming-tool-call.mjs +44 -31
- package/examples/policy/ghostapi.policy.yaml +27 -27
- package/examples/record-replay/README.md +19 -19
- package/examples/record-replay/replay-requests.json +22 -22
- package/examples/record-replay/stripe-checkout.har.json +30 -30
- package/examples/resend-node/README.md +22 -22
- package/examples/stripe-node/README.md +35 -35
- package/examples/stripe-node/checkout-flow.mjs +87 -61
- package/examples/twilio-node/README.md +21 -21
- package/examples/worlds/README.md +19 -19
- package/examples/worlds/subscription-recovery.mjs +21 -12
- package/package.json +28 -6
- package/dist/landing/assets/index-BXR41fAD.css +0 -1
- package/dist/landing/assets/index-CxWsopzP.css +0 -1
- package/dist/landing/assets/index-D8_ggMRE.js +0 -55
- package/dist/landing/assets/index-DZlpyhqd.js +0 -55
- package/dist/landing/assets/index-Dk-Xezs3.js +0 -55
- package/dist/landing/index.html +0 -15
- package/dist/landing/landing.d.ts +0 -3
- package/dist/landing/landing.js +0 -12
- package/dist/landing/landing.js.map +0 -1
- package/docs/commercial/README.md +0 -29
- package/docs/commercial/data-inventory.md +0 -36
- package/docs/commercial/manual-invoicing.md +0 -44
- package/docs/commercial/metrics.md +0 -51
- package/docs/commercial/pricing.md +0 -103
- package/docs/commercial/privacy-policy-draft.md +0 -41
- package/docs/commercial/terms-topics-for-counsel.md +0 -51
- package/docs/design-partners/README.md +0 -52
- package/docs/design-partners/demo-narratives.md +0 -33
- package/docs/design-partners/design-partner-offer.md +0 -39
- package/docs/design-partners/discovery-questions.md +0 -28
- package/docs/design-partners/feedback-capture-template.md +0 -48
- package/docs/design-partners/icp-one-pager.md +0 -43
- package/docs/design-partners/onboarding-checklist.md +0 -33
- package/docs/design-partners/pilot-success-criteria.md +0 -27
- package/docs/design-partners/pricing-interview-script.md +0 -18
- package/docs/design-partners/telemetry-plan.md +0 -48
- package/docs/development/baseline.md +0 -114
- package/docs/development/onboarding-smoke.md +0 -37
- package/docs/development/verification-0.1.8.md +0 -25
- package/docs/enterprise-product-roadmap-ru.md +0 -1879
- package/docs/fundraising/README.md +0 -87
- package/docs/fundraising/data-room-checklist.md +0 -72
- package/docs/fundraising/demo-script.md +0 -52
- package/docs/fundraising/design-partners-50.md +0 -74
- package/docs/fundraising/launch-posts.md +0 -37
- package/docs/fundraising/metrics-and-evidence.md +0 -30
- package/docs/fundraising/roadmap-12-month.md +0 -25
- package/docs/fundraising/technical-due-diligence-index.md +0 -37
- package/docs/fundraising/yc-application.md +0 -25
- package/docs/hosted-pilot.md +0 -111
- package/docs/operations/disaster-recovery-runbook.md +0 -81
- package/docs/operations/kill-switch-runbook.md +0 -32
- package/docs/release-checklist.md +0 -83
- package/docs/release-migration-and-rollback.md +0 -63
- package/docs/release-readiness.md +0 -39
- package/docs/team-control-plane.md +0 -72
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { lstat, rm } from "node:fs/promises";
|
|
2
2
|
import { getDataPaths } from "../config/dataPaths.js";
|
|
3
|
-
import { atomicWriteJson, readJsonFile, withFileLock } from "../storage/fileStore.js";
|
|
3
|
+
import { atomicWriteJson, readJsonFile, withFileLock, } from "../storage/fileStore.js";
|
|
4
4
|
import { isJsonObject } from "../utils/json.js";
|
|
5
5
|
const SCHEMA_VERSION = 1;
|
|
6
6
|
const MAX_ACTIVE_WEEKS = 8;
|
|
@@ -37,44 +37,61 @@ export async function recordProductTelemetry(event, now = new Date()) {
|
|
|
37
37
|
if (!current.enabled)
|
|
38
38
|
return current;
|
|
39
39
|
const timestamp = now.toISOString();
|
|
40
|
-
if (current.lastActivityAt !== undefined &&
|
|
40
|
+
if (current.lastActivityAt !== undefined &&
|
|
41
|
+
timestamp < current.lastActivityAt) {
|
|
41
42
|
throw new ProductTelemetryError("Local product telemetry clock moved backwards; refusing to write inconsistent activity state.");
|
|
42
43
|
}
|
|
43
44
|
if (current.counters[event] === Number.MAX_SAFE_INTEGER) {
|
|
44
45
|
throw new ProductTelemetryError("Local product telemetry counter capacity reached.");
|
|
45
46
|
}
|
|
46
47
|
const week = isoWeek(now);
|
|
47
|
-
const activeWeeks = [...new Set([...current.activeWeeks, week])]
|
|
48
|
-
|
|
48
|
+
const activeWeeks = [...new Set([...current.activeWeeks, week])]
|
|
49
|
+
.sort()
|
|
50
|
+
.slice(-MAX_ACTIVE_WEEKS);
|
|
51
|
+
const counters = {
|
|
52
|
+
...current.counters,
|
|
53
|
+
[event]: current.counters[event] + 1,
|
|
54
|
+
};
|
|
49
55
|
const activation = event === "enforced_run_completed" || event === "evidence_generated";
|
|
50
56
|
const next = {
|
|
51
57
|
schemaVersion: SCHEMA_VERSION,
|
|
52
58
|
enabled: true,
|
|
53
59
|
counters,
|
|
54
60
|
activeWeeks,
|
|
55
|
-
...(activation && current.firstActivationAt === undefined
|
|
56
|
-
|
|
61
|
+
...(activation && current.firstActivationAt === undefined
|
|
62
|
+
? { firstActivationAt: timestamp }
|
|
63
|
+
: current.firstActivationAt === undefined
|
|
64
|
+
? {}
|
|
65
|
+
: { firstActivationAt: current.firstActivationAt }),
|
|
66
|
+
lastActivityAt: timestamp,
|
|
57
67
|
};
|
|
58
68
|
await atomicWriteJson(path, next);
|
|
59
69
|
return next;
|
|
60
70
|
});
|
|
61
71
|
}
|
|
62
72
|
export function formatProductTelemetry(snapshot) {
|
|
63
|
-
const activation = snapshot.firstActivationAt === undefined
|
|
73
|
+
const activation = snapshot.firstActivationAt === undefined
|
|
74
|
+
? "not reached"
|
|
75
|
+
: `reached at ${snapshot.firstActivationAt}`;
|
|
64
76
|
return [
|
|
65
77
|
`Local product telemetry: ${snapshot.enabled ? "enabled" : "disabled"}`,
|
|
66
78
|
"Network export: disabled (this feature has no network transport).",
|
|
67
79
|
`Activation: ${activation}.`,
|
|
68
80
|
`Active weeks retained: ${snapshot.activeWeeks.length}/${MAX_ACTIVE_WEEKS}.`,
|
|
69
|
-
`Counters: init=${snapshot.counters.init_completed}, enforced-runs=${snapshot.counters.enforced_run_completed}, evidence=${snapshot.counters.evidence_generated}, evals=${snapshot.counters.eval_completed}
|
|
81
|
+
`Counters: init=${snapshot.counters.init_completed}, enforced-runs=${snapshot.counters.enforced_run_completed}, evidence=${snapshot.counters.evidence_generated}, evals=${snapshot.counters.eval_completed}.`,
|
|
70
82
|
].join("\n");
|
|
71
83
|
}
|
|
72
84
|
function emptySnapshot() {
|
|
73
85
|
return {
|
|
74
86
|
schemaVersion: SCHEMA_VERSION,
|
|
75
87
|
enabled: false,
|
|
76
|
-
counters: {
|
|
77
|
-
|
|
88
|
+
counters: {
|
|
89
|
+
init_completed: 0,
|
|
90
|
+
enforced_run_completed: 0,
|
|
91
|
+
evidence_generated: 0,
|
|
92
|
+
eval_completed: 0,
|
|
93
|
+
},
|
|
94
|
+
activeWeeks: [],
|
|
78
95
|
};
|
|
79
96
|
}
|
|
80
97
|
async function readSnapshot(path) {
|
|
@@ -88,20 +105,40 @@ async function readSnapshot(path) {
|
|
|
88
105
|
function parseSnapshot(value) {
|
|
89
106
|
if (!isJsonObject(value))
|
|
90
107
|
throw new ProductTelemetryError("Local product telemetry file must be a JSON object.");
|
|
91
|
-
assertExactKeys(value, [
|
|
92
|
-
|
|
108
|
+
assertExactKeys(value, [
|
|
109
|
+
"schemaVersion",
|
|
110
|
+
"enabled",
|
|
111
|
+
"counters",
|
|
112
|
+
"activeWeeks",
|
|
113
|
+
"firstActivationAt",
|
|
114
|
+
"lastActivityAt",
|
|
115
|
+
]);
|
|
116
|
+
if (value.schemaVersion !== SCHEMA_VERSION ||
|
|
117
|
+
typeof value.enabled !== "boolean")
|
|
93
118
|
throw new ProductTelemetryError("Local product telemetry file has an unsupported schema.");
|
|
94
119
|
if (!isJsonObject(value.counters))
|
|
95
120
|
throw new ProductTelemetryError("Local product telemetry counters must be an object.");
|
|
96
|
-
assertExactKeys(value.counters, [
|
|
121
|
+
assertExactKeys(value.counters, [
|
|
122
|
+
"init_completed",
|
|
123
|
+
"enforced_run_completed",
|
|
124
|
+
"evidence_generated",
|
|
125
|
+
"eval_completed",
|
|
126
|
+
]);
|
|
97
127
|
const counters = {};
|
|
98
|
-
for (const event of [
|
|
128
|
+
for (const event of [
|
|
129
|
+
"init_completed",
|
|
130
|
+
"enforced_run_completed",
|
|
131
|
+
"evidence_generated",
|
|
132
|
+
"eval_completed",
|
|
133
|
+
]) {
|
|
99
134
|
const count = value.counters[event];
|
|
100
135
|
if (typeof count !== "number" || !Number.isSafeInteger(count) || count < 0)
|
|
101
136
|
throw new ProductTelemetryError("Local product telemetry counters must be non-negative safe integers.");
|
|
102
137
|
counters[event] = count;
|
|
103
138
|
}
|
|
104
|
-
if (!Array.isArray(value.activeWeeks) ||
|
|
139
|
+
if (!Array.isArray(value.activeWeeks) ||
|
|
140
|
+
value.activeWeeks.length > MAX_ACTIVE_WEEKS ||
|
|
141
|
+
!value.activeWeeks.every((week) => typeof week === "string" && /^\d{4}-W\d{2}$/.test(week))) {
|
|
105
142
|
throw new ProductTelemetryError("Local product telemetry active weeks are invalid.");
|
|
106
143
|
}
|
|
107
144
|
const activeWeeks = [...new Set(value.activeWeeks)].sort();
|
|
@@ -109,10 +146,19 @@ function parseSnapshot(value) {
|
|
|
109
146
|
throw new ProductTelemetryError("Local product telemetry active weeks must be unique.");
|
|
110
147
|
const firstActivationAt = parseTimestamp(value.firstActivationAt);
|
|
111
148
|
const lastActivityAt = parseTimestamp(value.lastActivityAt);
|
|
112
|
-
if (firstActivationAt !== undefined &&
|
|
149
|
+
if (firstActivationAt !== undefined &&
|
|
150
|
+
lastActivityAt !== undefined &&
|
|
151
|
+
firstActivationAt > lastActivityAt) {
|
|
113
152
|
throw new ProductTelemetryError("Local product telemetry timestamps are out of order.");
|
|
114
153
|
}
|
|
115
|
-
return {
|
|
154
|
+
return {
|
|
155
|
+
schemaVersion: SCHEMA_VERSION,
|
|
156
|
+
enabled: value.enabled,
|
|
157
|
+
counters,
|
|
158
|
+
activeWeeks,
|
|
159
|
+
...(firstActivationAt === undefined ? {} : { firstActivationAt }),
|
|
160
|
+
...(lastActivityAt === undefined ? {} : { lastActivityAt }),
|
|
161
|
+
};
|
|
116
162
|
}
|
|
117
163
|
function assertExactKeys(value, allowed) {
|
|
118
164
|
if (Object.keys(value).some((key) => !allowed.includes(key)))
|
|
@@ -121,7 +167,9 @@ function assertExactKeys(value, allowed) {
|
|
|
121
167
|
function parseTimestamp(value) {
|
|
122
168
|
if (value === undefined)
|
|
123
169
|
return undefined;
|
|
124
|
-
if (typeof value !== "string" ||
|
|
170
|
+
if (typeof value !== "string" ||
|
|
171
|
+
Number.isNaN(Date.parse(value)) ||
|
|
172
|
+
new Date(value).toISOString() !== value)
|
|
125
173
|
throw new ProductTelemetryError("Local product telemetry timestamp is invalid.");
|
|
126
174
|
return value;
|
|
127
175
|
}
|
|
@@ -129,14 +177,17 @@ function isErrorCode(error, code) {
|
|
|
129
177
|
return error instanceof Error && "code" in error && error.code === code;
|
|
130
178
|
}
|
|
131
179
|
function isTelemetryEvent(value) {
|
|
132
|
-
return value === "init_completed" ||
|
|
180
|
+
return (value === "init_completed" ||
|
|
181
|
+
value === "enforced_run_completed" ||
|
|
182
|
+
value === "evidence_generated" ||
|
|
183
|
+
value === "eval_completed");
|
|
133
184
|
}
|
|
134
185
|
function isoWeek(date) {
|
|
135
186
|
const utc = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
|
|
136
187
|
const day = utc.getUTCDay() || 7;
|
|
137
188
|
utc.setUTCDate(utc.getUTCDate() + 4 - day);
|
|
138
189
|
const yearStart = new Date(Date.UTC(utc.getUTCFullYear(), 0, 1));
|
|
139
|
-
const week = Math.ceil(((
|
|
190
|
+
const week = Math.ceil(((utc.getTime() - yearStart.getTime()) / 86_400_000 + 1) / 7);
|
|
140
191
|
return `${utc.getUTCFullYear()}-W${String(week).padStart(2, "0")}`;
|
|
141
192
|
}
|
|
142
193
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/productTelemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/productTelemetry/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { assertProviderStateTransition, prepareProviderPackExecution } from "./runtime.js";
|
|
1
|
+
import { assertProviderStateTransition, prepareProviderPackExecution, } from "./runtime.js";
|
|
2
2
|
export function runProviderPackConformance(pack, runtime) {
|
|
3
|
-
if (pack.manifest.name !== pack.name ||
|
|
3
|
+
if (pack.manifest.name !== pack.name ||
|
|
4
|
+
pack.manifest.displayName !== pack.displayName) {
|
|
4
5
|
throw new Error(`Provider pack ${pack.name} manifest identity does not match the pack.`);
|
|
5
6
|
}
|
|
6
7
|
if (!pack.manifest.apiVersions.supported.includes(pack.manifest.apiVersions.default)) {
|
|
@@ -24,7 +25,7 @@ export function runProviderPackConformance(pack, runtime) {
|
|
|
24
25
|
request: fixture.request,
|
|
25
26
|
parsedRequest: prepared.parsedRequest,
|
|
26
27
|
apiVersion: prepared.apiVersion,
|
|
27
|
-
runtime
|
|
28
|
+
runtime,
|
|
28
29
|
});
|
|
29
30
|
const responseError = fixture.assertResponse(response);
|
|
30
31
|
if (responseError !== null) {
|
|
@@ -34,7 +35,7 @@ export function runProviderPackConformance(pack, runtime) {
|
|
|
34
35
|
request: fixture.request,
|
|
35
36
|
response,
|
|
36
37
|
apiVersion: prepared.apiVersion,
|
|
37
|
-
runtime
|
|
38
|
+
runtime,
|
|
38
39
|
});
|
|
39
40
|
if (transition !== null)
|
|
40
41
|
assertProviderStateTransition(pack, transition);
|
|
@@ -43,6 +44,10 @@ export function runProviderPackConformance(pack, runtime) {
|
|
|
43
44
|
throw new Error(`Conformance fixture "${fixture.name}" state transition: ${transitionError}`);
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
|
-
return {
|
|
47
|
+
return {
|
|
48
|
+
provider: pack.name,
|
|
49
|
+
apiVersion,
|
|
50
|
+
fixtures: pack.conformanceFixtures.length,
|
|
51
|
+
};
|
|
47
52
|
}
|
|
48
53
|
//# sourceMappingURL=conformance.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/providers/conformance.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/providers/conformance.ts"],"names":[],"mappings":"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"}
|
package/dist/providers/github.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { detectProviderPack, getProviderAdapter, getProviderManifests, getProviderPack, getProviderScenarios, isRegisteredProvider, providerRegistry } from "./registry.js";
|
|
1
|
+
export { detectProviderPack, getProviderAdapter, getProviderManifests, getProviderPack, getProviderScenarios, isRegisteredProvider, providerRegistry, } from "./registry.js";
|
|
2
2
|
export { runProviderPackConformance } from "./conformance.js";
|
|
3
|
-
export { assertProviderStateTransition, createProviderRuntime, getProviderPackHeaders, prepareProviderPackExecution } from "./runtime.js";
|
|
4
|
-
export type { ProviderAdapter, ProviderConformanceFixture, ProviderDetectionInput, ProviderName, ProviderPack, ProviderPackDetectionInput, ProviderPackExecution, ProviderPackManifest, ProviderResponse, ProviderRuntime, ProviderRuntimeCapabilities, ProviderScenario, ProviderScenarioStep, ProviderStateTransition, ProviderWebhookHook } from "./types.js";
|
|
3
|
+
export { assertProviderStateTransition, createProviderRuntime, getProviderPackHeaders, prepareProviderPackExecution, } from "./runtime.js";
|
|
4
|
+
export type { ProviderAdapter, ProviderConformanceFixture, ProviderDetectionInput, ProviderName, ProviderPack, ProviderPackDetectionInput, ProviderPackExecution, ProviderPackManifest, ProviderResponse, ProviderRuntime, ProviderRuntimeCapabilities, ProviderScenario, ProviderScenarioStep, ProviderStateTransition, ProviderWebhookHook, } from "./types.js";
|
package/dist/providers/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { detectProviderPack, getProviderAdapter, getProviderManifests, getProviderPack, getProviderScenarios, isRegisteredProvider, providerRegistry } from "./registry.js";
|
|
1
|
+
export { detectProviderPack, getProviderAdapter, getProviderManifests, getProviderPack, getProviderScenarios, isRegisteredProvider, providerRegistry, } from "./registry.js";
|
|
2
2
|
export { runProviderPackConformance } from "./conformance.js";
|
|
3
|
-
export { assertProviderStateTransition, createProviderRuntime, getProviderPackHeaders, prepareProviderPackExecution } from "./runtime.js";
|
|
3
|
+
export { assertProviderStateTransition, createProviderRuntime, getProviderPackHeaders, prepareProviderPackExecution, } from "./runtime.js";
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,cAAc,CAAC"}
|
package/dist/providers/openai.js
CHANGED
|
@@ -7,9 +7,9 @@ export const openaiAdapter = {
|
|
|
7
7
|
message: details.message,
|
|
8
8
|
type: details.type ?? "invalid_request_error",
|
|
9
9
|
param: details.param ?? null,
|
|
10
|
-
code: details.code ?? null
|
|
11
|
-
}
|
|
10
|
+
code: details.code ?? null,
|
|
11
|
+
},
|
|
12
12
|
};
|
|
13
|
-
}
|
|
13
|
+
},
|
|
14
14
|
};
|
|
15
15
|
//# sourceMappingURL=openai.js.map
|
|
@@ -12,10 +12,10 @@ const resendScenarios = [
|
|
|
12
12
|
method: "POST",
|
|
13
13
|
path: "/emails",
|
|
14
14
|
status: 200,
|
|
15
|
-
body: { id: "email_ghostapi_123", object: "email", status: "sent" }
|
|
16
|
-
}
|
|
17
|
-
]
|
|
18
|
-
}
|
|
15
|
+
body: { id: "email_ghostapi_123", object: "email", status: "sent" },
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
19
|
];
|
|
20
20
|
const resendConformanceFixtures = [
|
|
21
21
|
{
|
|
@@ -25,23 +25,33 @@ const resendConformanceFixtures = [
|
|
|
25
25
|
path: "/emails",
|
|
26
26
|
query: {},
|
|
27
27
|
headers: { "content-type": "application/json" },
|
|
28
|
-
body: {
|
|
29
|
-
|
|
28
|
+
body: {
|
|
29
|
+
from: "sender@example.com",
|
|
30
|
+
to: "reader@example.com",
|
|
31
|
+
subject: "Hello",
|
|
32
|
+
},
|
|
33
|
+
receivedAt: "2026-08-06T12:00:00.000Z",
|
|
30
34
|
},
|
|
31
35
|
assertResponse(response) {
|
|
32
|
-
if (!isJsonObject(response.body) ||
|
|
36
|
+
if (!isJsonObject(response.body) ||
|
|
37
|
+
typeof response.body.id !== "string" ||
|
|
38
|
+
!response.body.id.startsWith("email_mock_")) {
|
|
33
39
|
return "response body must contain an email_mock_ id";
|
|
34
40
|
}
|
|
35
41
|
return null;
|
|
36
42
|
},
|
|
37
43
|
assertStateTransition(transition, response) {
|
|
38
|
-
const id = isJsonObject(response.body) && typeof response.body.id === "string"
|
|
39
|
-
|
|
44
|
+
const id = isJsonObject(response.body) && typeof response.body.id === "string"
|
|
45
|
+
? response.body.id
|
|
46
|
+
: "";
|
|
47
|
+
if (transition === null ||
|
|
48
|
+
transition.key !== `resend:${id}` ||
|
|
49
|
+
transition.value !== response.body) {
|
|
40
50
|
return "state transition must persist the exact response under the resend response id key";
|
|
41
51
|
}
|
|
42
52
|
return null;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
53
|
+
},
|
|
54
|
+
},
|
|
45
55
|
];
|
|
46
56
|
export const resendPack = {
|
|
47
57
|
name: "resend",
|
|
@@ -52,7 +62,10 @@ export const resendPack = {
|
|
|
52
62
|
displayName: "Resend",
|
|
53
63
|
implementation: "pack",
|
|
54
64
|
packVersion: "1.0.0",
|
|
55
|
-
apiVersions: {
|
|
65
|
+
apiVersions: {
|
|
66
|
+
default: RESEND_API_VERSION,
|
|
67
|
+
supported: [RESEND_API_VERSION],
|
|
68
|
+
},
|
|
56
69
|
capabilities: {
|
|
57
70
|
detection: true,
|
|
58
71
|
requestParsing: true,
|
|
@@ -62,33 +75,35 @@ export const resendPack = {
|
|
|
62
75
|
providerErrors: true,
|
|
63
76
|
scenarios: true,
|
|
64
77
|
webhooks: false,
|
|
65
|
-
conformanceFixtures: true
|
|
66
|
-
}
|
|
78
|
+
conformanceFixtures: true,
|
|
79
|
+
},
|
|
67
80
|
},
|
|
68
81
|
detection: {
|
|
69
82
|
priority: 300,
|
|
70
83
|
matches(input) {
|
|
71
84
|
const path = input.path.toLowerCase();
|
|
72
85
|
return path === "/emails" || path.startsWith("/emails/");
|
|
73
|
-
}
|
|
86
|
+
},
|
|
74
87
|
},
|
|
75
88
|
parseRequest(request) {
|
|
76
89
|
return { body: isJsonObject(request.body) ? request.body : {} };
|
|
77
90
|
},
|
|
78
91
|
selectApiVersion(request) {
|
|
79
|
-
const requested = firstHeaderValue(request.headers["x-ghostapi-api-version"]) ??
|
|
92
|
+
const requested = firstHeaderValue(request.headers["x-ghostapi-api-version"]) ??
|
|
93
|
+
RESEND_API_VERSION;
|
|
80
94
|
if (requested === RESEND_API_VERSION)
|
|
81
95
|
return { version: requested };
|
|
82
96
|
return {
|
|
83
97
|
error: {
|
|
84
98
|
status: 400,
|
|
85
99
|
type: "invalid_api_version",
|
|
86
|
-
message: `Unsupported Resend API version: ${requested}. Supported versions: ${RESEND_API_VERSION}
|
|
87
|
-
}
|
|
100
|
+
message: `Unsupported Resend API version: ${requested}. Supported versions: ${RESEND_API_VERSION}.`,
|
|
101
|
+
},
|
|
88
102
|
};
|
|
89
103
|
},
|
|
90
104
|
validate(parsedRequest, request) {
|
|
91
|
-
if (request.method !== "POST" ||
|
|
105
|
+
if (request.method !== "POST" ||
|
|
106
|
+
(request.path !== "/emails" && !request.path.startsWith("/emails/")))
|
|
92
107
|
return null;
|
|
93
108
|
const body = readResendRequest(parsedRequest).body;
|
|
94
109
|
if (!body.from)
|
|
@@ -104,14 +119,21 @@ export const resendPack = {
|
|
|
104
119
|
return {
|
|
105
120
|
status: 200,
|
|
106
121
|
headers: { "content-type": "application/json" },
|
|
107
|
-
body: {
|
|
122
|
+
body: {
|
|
123
|
+
id,
|
|
124
|
+
provider: "resend",
|
|
125
|
+
method: request.method,
|
|
126
|
+
path: request.path,
|
|
127
|
+
},
|
|
108
128
|
};
|
|
109
129
|
},
|
|
110
130
|
createResponseHeaders() {
|
|
111
131
|
return {};
|
|
112
132
|
},
|
|
113
133
|
transitionState({ request, response }) {
|
|
114
|
-
if (!isMutation(request.method) ||
|
|
134
|
+
if (!isMutation(request.method) ||
|
|
135
|
+
!isJsonObject(response.body) ||
|
|
136
|
+
typeof response.body.id !== "string")
|
|
115
137
|
return null;
|
|
116
138
|
return { key: `resend:${response.body.id}`, value: response.body };
|
|
117
139
|
},
|
|
@@ -120,15 +142,15 @@ export const resendPack = {
|
|
|
120
142
|
return {
|
|
121
143
|
statusCode: details.status,
|
|
122
144
|
name: details.type ?? "validation_error",
|
|
123
|
-
message: details.message
|
|
145
|
+
message: details.message,
|
|
124
146
|
};
|
|
125
147
|
},
|
|
126
148
|
promptHints: [
|
|
127
149
|
"This is the Resend Email API.",
|
|
128
|
-
"The standard response for sending an email is a single object with an 'id' string."
|
|
150
|
+
"The standard response for sending an email is a single object with an 'id' string.",
|
|
129
151
|
],
|
|
130
152
|
scenarios: resendScenarios,
|
|
131
|
-
conformanceFixtures: resendConformanceFixtures
|
|
153
|
+
conformanceFixtures: resendConformanceFixtures,
|
|
132
154
|
};
|
|
133
155
|
function readResendRequest(value) {
|
|
134
156
|
if (!isJsonObject(value) || !isJsonObject(value.body))
|
|
@@ -136,7 +158,11 @@ function readResendRequest(value) {
|
|
|
136
158
|
return { body: value.body };
|
|
137
159
|
}
|
|
138
160
|
function validationError(field) {
|
|
139
|
-
return {
|
|
161
|
+
return {
|
|
162
|
+
status: 400,
|
|
163
|
+
message: `Missing required field: ${field}`,
|
|
164
|
+
type: "validation_error",
|
|
165
|
+
};
|
|
140
166
|
}
|
|
141
167
|
function firstHeaderValue(value) {
|
|
142
168
|
return Array.isArray(value) ? value[0] : value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resendPack.js","sourceRoot":"","sources":["../../../src/providers/packs/resendPack.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resendPack.js","sourceRoot":"","sources":["../../../src/providers/packs/resendPack.ts"],"names":[],"mappings":"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"}
|