@greatwait/contracts 0.1.0-alpha.3 → 0.1.0-alpha.4
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/README.md +11 -9
- package/dist/authority.d.ts +33 -27
- package/dist/authority.js +12 -2
- package/dist/billing.d.ts +1001 -0
- package/dist/billing.js +684 -0
- package/dist/callback-safety.d.ts +2 -2
- package/dist/callback-safety.js +2 -2
- package/dist/compatibility.d.ts +3 -3
- package/dist/compatibility.js +1 -1
- package/dist/data-export.d.ts +67 -0
- package/dist/data-export.js +182 -0
- package/dist/endpoints.d.ts +181 -240
- package/dist/endpoints.js +77 -81
- package/dist/events.d.ts +17 -17
- package/dist/events.js +1 -1
- package/dist/first-value-journey.d.ts +49 -55
- package/dist/first-value-journey.js +6 -13
- package/dist/forecast.d.ts +71 -71
- package/dist/forecast.js +1 -1
- package/dist/identifiers.d.ts +20 -20
- package/dist/identifiers.js +1 -1
- package/dist/identity.d.ts +41 -37
- package/dist/identity.js +5 -4
- package/dist/index.d.ts +10 -5
- package/dist/index.js +10 -5
- package/dist/mcp.d.ts +21 -19
- package/dist/mcp.js +1 -1
- package/dist/naming.d.ts +45 -0
- package/dist/naming.js +159 -0
- package/dist/oauth.d.ts +186 -172
- package/dist/oauth.js +1 -1
- package/dist/operation-definitions.d.ts +9 -0
- package/dist/operation-definitions.js +7 -0
- package/dist/operations.d.ts +4162 -2171
- package/dist/operations.js +2679 -908
- package/dist/organization-lifecycle.d.ts +34 -0
- package/dist/organization-lifecycle.js +122 -0
- package/dist/partition.d.ts +26 -0
- package/dist/policy.d.ts +4 -4
- package/dist/policy.js +9 -5
- package/dist/problems.d.ts +32 -26
- package/dist/problems.js +6 -2
- package/dist/protocol.d.ts +204 -75
- package/dist/protocol.js +108 -36
- package/dist/scheduling-records.d.ts +343 -285
- package/dist/scheduling-records.js +1 -1
- package/dist/scheduling.d.ts +670 -360
- package/dist/scheduling.js +382 -56
- package/dist/secrets.d.ts +119 -105
- package/dist/secrets.js +1 -1
- package/dist/signatures.d.ts +74 -74
- package/dist/signatures.js +1 -1
- package/dist/tenancy.d.ts +142 -68
- package/dist/tenancy.js +70 -17
- package/dist/test-sink.d.ts +127 -127
- package/dist/test-sink.js +1 -1
- package/dist/time.d.ts +4 -4
- package/dist/time.js +1 -1
- package/dist/timing.d.ts +65 -0
- package/dist/timing.js +82 -0
- package/dist/usage.d.ts +103 -47
- package/dist/usage.js +197 -31
- package/dist/workspace.d.ts +34 -34
- package/dist/workspace.js +1 -1
- package/dist/zod-values.d.ts +3 -0
- package/dist/zod-values.js +2 -0
- package/dist/zod.d.ts +2 -0
- package/dist/zod.js +2 -0
- package/generated/v1/examples/attempts.list.response.json +4 -0
- package/generated/v1/examples/attempts.read.response.json +4 -0
- package/generated/v1/examples/billing.autotopup.request.json +5 -0
- package/generated/v1/examples/billing.autotopup.response.json +120 -0
- package/generated/v1/examples/billing.autotopuppreview.request.json +19 -0
- package/generated/v1/examples/billing.autotopuppreview.response.json +45 -0
- package/generated/v1/examples/billing.budgets.request.json +13 -0
- package/generated/v1/examples/billing.budgets.response.json +22 -0
- package/generated/v1/examples/billing.ceiling.request.json +8 -0
- package/generated/v1/examples/billing.ceiling.response.json +120 -0
- package/generated/v1/examples/billing.change.request.json +5 -0
- package/generated/v1/examples/billing.change.response.json +12 -0
- package/generated/v1/examples/billing.funding.response.json +120 -0
- package/generated/v1/examples/billing.fundingquote.request.json +7 -0
- package/generated/v1/examples/billing.fundingquote.response.json +13 -0
- package/generated/v1/examples/billing.ledger.response.json +23 -0
- package/generated/v1/examples/billing.notices.response.json +41 -0
- package/generated/v1/examples/billing.notificationsettings.response.json +17 -0
- package/generated/v1/examples/billing.notificationsettingsupdate.request.json +9 -0
- package/generated/v1/examples/billing.notificationsettingsupdate.response.json +17 -0
- package/generated/v1/examples/billing.portal.response.json +3 -0
- package/generated/v1/examples/billing.projects.response.json +12 -0
- package/generated/v1/examples/billing.purchase.request.json +5 -0
- package/generated/v1/examples/billing.purchase.response.json +120 -0
- package/generated/v1/examples/billing.quote.request.json +4 -0
- package/generated/v1/examples/billing.quote.response.json +19 -0
- package/generated/v1/examples/billing.reconcile.response.json +73 -0
- package/generated/v1/examples/billing.refundrequest.request.json +10 -0
- package/generated/v1/examples/billing.refundrequest.response.json +11 -0
- package/generated/v1/examples/billing.refundresolution.request.json +4 -0
- package/generated/v1/examples/billing.refundresolution.response.json +120 -0
- package/generated/v1/examples/billing.summary.response.json +73 -0
- package/generated/v1/examples/endpoints.acknowledgeSigningKeyRotation.response.json +18 -0
- package/generated/v1/examples/endpoints.create.response.json +1 -1
- package/generated/v1/examples/endpoints.disable.response.json +0 -1
- package/generated/v1/examples/{endpoints.verify.response.json → endpoints.enable.response.json} +4 -5
- package/generated/v1/examples/endpoints.list.response.json +1 -2
- package/generated/v1/examples/endpoints.read.response.json +2 -2
- package/generated/v1/examples/endpoints.revealSigningSecret.response.json +7 -0
- package/generated/v1/examples/endpoints.rotateSigningKey.response.json +1 -2
- package/generated/v1/examples/endpoints.update.response.json +1 -1
- package/generated/v1/examples/executions.list.response.json +20 -0
- package/generated/v1/examples/exports.cancel.response.json +11 -0
- package/generated/v1/examples/exports.create.request.json +1 -0
- package/generated/v1/examples/exports.create.response.json +8 -0
- package/generated/v1/examples/exports.part.response.json +5 -0
- package/generated/v1/examples/exports.read.response.json +8 -0
- package/generated/v1/examples/occurrences.read.response.json +4 -0
- package/generated/v1/examples/organizations.close.request.json +5 -0
- package/generated/v1/examples/organizations.close.response.json +10 -0
- package/generated/v1/examples/organizations.lifecycle.response.json +10 -0
- package/generated/v1/examples/organizations.restore.request.json +3 -0
- package/generated/v1/examples/organizations.restore.response.json +10 -0
- package/generated/v1/examples/projects.archive.request.json +3 -0
- package/generated/v1/examples/projects.archive.response.json +14 -0
- package/generated/v1/examples/projects.create.response.json +10 -1
- package/generated/v1/examples/projects.delete.response.json +9 -0
- package/generated/v1/examples/projects.list.response.json +12 -2
- package/generated/v1/examples/projects.rename.request.json +3 -0
- package/generated/v1/examples/projects.rename.response.json +14 -0
- package/generated/v1/examples/schedules.archive.response.json +3 -0
- package/generated/v1/examples/schedules.cancel.response.json +3 -0
- package/generated/v1/examples/schedules.create.request.json +4 -0
- package/generated/v1/examples/schedules.create.response.json +3 -0
- package/generated/v1/examples/schedules.list.response.json +3 -0
- package/generated/v1/examples/schedules.pause.response.json +3 -0
- package/generated/v1/examples/schedules.read.response.json +6 -0
- package/generated/v1/examples/schedules.replace.request.json +4 -0
- package/generated/v1/examples/schedules.replace.response.json +3 -0
- package/generated/v1/examples/schedules.resume.response.json +3 -0
- package/generated/v1/examples/timing.summary.response.json +35 -0
- package/generated/v1/examples/usage.read.response.json +1 -0
- package/generated/v1/first-value-journey.json +19 -10
- package/generated/v1/manifest.json +936 -23
- package/generated/v1/openapi.json +29983 -5784
- package/generated/v1/policy-matrix.json +278 -47
- package/generated/v1/schemas/attempts.list.response.json +24 -1
- package/generated/v1/schemas/attempts.read.response.json +24 -1
- package/generated/v1/schemas/billing.autotopup.request-headers.json +13 -0
- package/generated/v1/schemas/billing.autotopup.request.json +22 -0
- package/generated/v1/schemas/billing.autotopup.response-headers.json +10 -0
- package/generated/v1/schemas/billing.autotopup.response.json +552 -0
- package/generated/v1/schemas/billing.autotopuppreview.request.json +77 -0
- package/generated/v1/schemas/billing.autotopuppreview.response.json +277 -0
- package/generated/v1/schemas/billing.budgets.request-headers.json +13 -0
- package/generated/v1/schemas/billing.budgets.request.json +66 -0
- package/generated/v1/schemas/billing.budgets.response-headers.json +10 -0
- package/generated/v1/schemas/billing.budgets.response.json +92 -0
- package/generated/v1/schemas/billing.ceiling.request-headers.json +13 -0
- package/generated/v1/schemas/billing.ceiling.request.json +40 -0
- package/generated/v1/schemas/billing.ceiling.response-headers.json +10 -0
- package/generated/v1/schemas/billing.ceiling.response.json +552 -0
- package/generated/v1/schemas/billing.change.request-headers.json +13 -0
- package/generated/v1/schemas/billing.change.request.json +22 -0
- package/generated/v1/schemas/billing.change.response.json +119 -0
- package/generated/v1/schemas/billing.funding.response.json +552 -0
- package/generated/v1/schemas/billing.fundingquote.request.json +28 -0
- package/generated/v1/schemas/billing.fundingquote.response.json +61 -0
- package/generated/v1/schemas/billing.ledger.query.json +16 -0
- package/generated/v1/schemas/billing.ledger.response.json +125 -0
- package/generated/v1/schemas/billing.notices.query.json +16 -0
- package/generated/v1/schemas/billing.notices.response.json +278 -0
- package/generated/v1/schemas/billing.notificationsettings.response.json +70 -0
- package/generated/v1/schemas/billing.notificationsettingsupdate.request-headers.json +13 -0
- package/generated/v1/schemas/billing.notificationsettingsupdate.request.json +36 -0
- package/generated/v1/schemas/billing.notificationsettingsupdate.response-headers.json +10 -0
- package/generated/v1/schemas/billing.notificationsettingsupdate.response.json +70 -0
- package/generated/v1/schemas/billing.portal.response.json +11 -0
- package/generated/v1/schemas/billing.projects.response.json +119 -0
- package/generated/v1/schemas/billing.purchase.request-headers.json +13 -0
- package/generated/v1/schemas/billing.purchase.request.json +22 -0
- package/generated/v1/schemas/billing.purchase.response-headers.json +10 -0
- package/generated/v1/schemas/billing.purchase.response.json +552 -0
- package/generated/v1/schemas/billing.quote.request.json +20 -0
- package/generated/v1/schemas/billing.quote.response.json +86 -0
- package/generated/v1/schemas/billing.reconcile.response.json +468 -0
- package/generated/v1/schemas/billing.refundrequest.request-headers.json +13 -0
- package/generated/v1/schemas/billing.refundrequest.request.json +42 -0
- package/generated/v1/schemas/billing.refundrequest.response-headers.json +10 -0
- package/generated/v1/schemas/billing.refundrequest.response.json +45 -0
- package/generated/v1/schemas/billing.refundresolution.request-headers.json +13 -0
- package/generated/v1/schemas/billing.refundresolution.request.json +61 -0
- package/generated/v1/schemas/billing.refundresolution.response-headers.json +10 -0
- package/generated/v1/schemas/billing.refundresolution.response.json +552 -0
- package/generated/v1/schemas/billing.summary.response.json +468 -0
- package/generated/v1/schemas/context.read.response.json +2 -0
- package/generated/v1/schemas/credentials.connection.response.json +2 -0
- package/generated/v1/schemas/credentials.create.request.json +2 -0
- package/generated/v1/schemas/credentials.create.response.json +2 -0
- package/generated/v1/schemas/credentials.list.response.json +2 -0
- package/generated/v1/schemas/credentials.revoke.response.json +2 -0
- package/generated/v1/schemas/credentials.rotate.response.json +4 -0
- package/generated/v1/schemas/{endpoints.verify.request-headers.json → endpoints.acknowledgeSigningKeyRotation.request-headers.json} +2 -1
- package/generated/v1/schemas/{endpoints.verify.response.json → endpoints.acknowledgeSigningKeyRotation.response.json} +8 -21
- package/generated/v1/schemas/endpoints.create.request.json +5 -0
- package/generated/v1/schemas/endpoints.create.response.json +8 -21
- package/generated/v1/schemas/endpoints.disable.response.json +8 -21
- package/generated/v1/schemas/endpoints.enable.response-headers.json +11 -0
- package/generated/v1/schemas/endpoints.enable.response.json +87 -0
- package/generated/v1/schemas/endpoints.list.response.json +8 -21
- package/generated/v1/schemas/endpoints.read.response.json +8 -21
- package/generated/v1/schemas/endpoints.revealSigningSecret.response.json +43 -0
- package/generated/v1/schemas/endpoints.rotateSigningKey.response.json +8 -21
- package/generated/v1/schemas/endpoints.update.request.json +5 -0
- package/generated/v1/schemas/endpoints.update.response.json +8 -21
- package/generated/v1/schemas/executions.list.query.json +46 -0
- package/generated/v1/schemas/executions.list.response.json +116 -0
- package/generated/v1/schemas/exports.cancel.response.json +48 -0
- package/generated/v1/schemas/exports.create.request.json +6 -0
- package/generated/v1/schemas/exports.create.response.json +38 -0
- package/generated/v1/schemas/exports.part.query.json +11 -0
- package/generated/v1/schemas/exports.part.response.json +22 -0
- package/generated/v1/schemas/exports.read.response.json +38 -0
- package/generated/v1/schemas/grants.list.response.json +2 -0
- package/generated/v1/schemas/grants.revoke.response.json +2 -0
- package/generated/v1/schemas/occurrences.list.query.json +5 -0
- package/generated/v1/schemas/occurrences.list.response.json +23 -0
- package/generated/v1/schemas/occurrences.read.response.json +23 -0
- package/generated/v1/schemas/occurrences.redeliver.response.json +24 -1
- package/generated/v1/schemas/organizations.close.request.json +20 -0
- package/generated/v1/schemas/organizations.close.response.json +68 -0
- package/generated/v1/schemas/organizations.lifecycle.response.json +68 -0
- package/generated/v1/schemas/organizations.restore.request.json +13 -0
- package/generated/v1/schemas/organizations.restore.response.json +68 -0
- package/generated/v1/schemas/projects.archive.request-headers.json +11 -0
- package/generated/v1/schemas/projects.archive.request.json +10 -0
- package/generated/v1/schemas/projects.archive.response-headers.json +11 -0
- package/generated/v1/schemas/projects.archive.response.json +79 -0
- package/generated/v1/schemas/projects.create.response.json +55 -1
- package/generated/v1/schemas/projects.delete.request-headers.json +11 -0
- package/generated/v1/schemas/projects.delete.response.json +37 -0
- package/generated/v1/schemas/projects.list.response.json +61 -2
- package/generated/v1/schemas/projects.rename.request-headers.json +11 -0
- package/generated/v1/schemas/projects.rename.request.json +12 -0
- package/generated/v1/schemas/projects.rename.response-headers.json +11 -0
- package/generated/v1/schemas/projects.rename.response.json +79 -0
- package/generated/v1/schemas/schedules.archive.response.json +90 -2
- package/generated/v1/schemas/schedules.cancel.response.json +90 -2
- package/generated/v1/schemas/schedules.create.request.json +24 -3
- package/generated/v1/schemas/schedules.create.response.json +90 -2
- package/generated/v1/schemas/schedules.list.query.json +13 -0
- package/generated/v1/schemas/schedules.list.response.json +67 -2
- package/generated/v1/schemas/schedules.pause.response.json +90 -2
- package/generated/v1/schemas/schedules.read.response.json +90 -2
- package/generated/v1/schemas/schedules.replace.request.json +24 -3
- package/generated/v1/schemas/schedules.replace.response.json +90 -2
- package/generated/v1/schemas/schedules.resume.response.json +90 -2
- package/generated/v1/schemas/timing.summary.response.json +191 -0
- package/generated/v1/schemas/usage.read.query.json +7 -0
- package/generated/v1/schemas/usage.read.response.json +36 -1
- package/generated/v1/snippets/billing.autotopup.json +6 -0
- package/generated/v1/snippets/billing.autotopuppreview.json +6 -0
- package/generated/v1/snippets/billing.budgets.json +6 -0
- package/generated/v1/snippets/billing.ceiling.json +6 -0
- package/generated/v1/snippets/billing.change.json +6 -0
- package/generated/v1/snippets/billing.funding.json +6 -0
- package/generated/v1/snippets/billing.fundingquote.json +6 -0
- package/generated/v1/snippets/billing.ledger.json +6 -0
- package/generated/v1/snippets/billing.notices.json +6 -0
- package/generated/v1/snippets/billing.notificationsettings.json +6 -0
- package/generated/v1/snippets/billing.notificationsettingsupdate.json +6 -0
- package/generated/v1/snippets/billing.portal.json +6 -0
- package/generated/v1/snippets/billing.projects.json +6 -0
- package/generated/v1/snippets/billing.purchase.json +6 -0
- package/generated/v1/snippets/billing.quote.json +6 -0
- package/generated/v1/snippets/billing.reconcile.json +6 -0
- package/generated/v1/snippets/billing.refundrequest.json +6 -0
- package/generated/v1/snippets/billing.refundresolution.json +6 -0
- package/generated/v1/snippets/billing.summary.json +6 -0
- package/generated/v1/snippets/endpoints.acknowledgeSigningKeyRotation.json +6 -0
- package/generated/v1/snippets/{endpoints.verify.json → endpoints.enable.json} +3 -3
- package/generated/v1/snippets/endpoints.revealSigningSecret.json +6 -0
- package/generated/v1/snippets/executions.list.json +6 -0
- package/generated/v1/snippets/exports.cancel.json +6 -0
- package/generated/v1/snippets/exports.create.json +6 -0
- package/generated/v1/snippets/exports.part.json +6 -0
- package/generated/v1/snippets/exports.read.json +6 -0
- package/generated/v1/snippets/organizations.close.json +6 -0
- package/generated/v1/snippets/organizations.lifecycle.json +6 -0
- package/generated/v1/snippets/organizations.restore.json +6 -0
- package/generated/v1/snippets/projects.archive.json +6 -0
- package/generated/v1/snippets/projects.delete.json +6 -0
- package/generated/v1/snippets/projects.rename.json +6 -0
- package/generated/v1/snippets/schedules.create.json +3 -3
- package/generated/v1/snippets/schedules.replace.json +3 -3
- package/generated/v1/snippets/timing.summary.json +6 -0
- package/package.json +1 -6
- package/dist/callback-ownership.d.ts +0 -58
- package/dist/callback-ownership.js +0 -71
- package/generated/v1/callback-endpoint-verification.json +0 -59
- /package/generated/v1/schemas/{endpoints.verify.response-headers.json → endpoints.acknowledgeSigningKeyRotation.response-headers.json} +0 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/billing/funding/purchase\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\" \\\n -H 'Content-Type: application/json' \\\n -H 'Idempotency-Key: $GREATWAIT_IDEMPOTENCY_KEY' \\\n --data-binary '{\"confirmed\":true,\"expectedRevision\":3,\"quote\":\"funding-quote-example\"}'",
|
|
3
|
+
"environments": ["live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst body = {\n \"confirmed\": true,\n \"expectedRevision\": 3,\n \"quote\": \"funding-quote-example\"\n};\n\nconst result = await greatwait.request(\"billing_purchase\", body, { \"Idempotency-Key\": process.env.GREATWAIT_IDEMPOTENCY_KEY });",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"Idempotency-Key\": \"$IDEMPOTENCY_KEY\",\n \"confirmed\": true,\n \"expectedRevision\": 3,\n \"quote\": \"funding-quote-example\"\n },\n \"name\": \"billing_purchase\"\n}"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/billing/projects/quote\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\" \\\n -H 'Content-Type: application/json' \\\n --data-binary '{\"action\":\"add\",\"project\":\"proj_00000000000000000000000000\"}'",
|
|
3
|
+
"environments": ["live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst body = {\n \"action\": \"add\",\n \"project\": \"proj_00000000000000000000000000\"\n};\n\nconst result = await greatwait.request(\"billing_quote\", body);",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"action\": \"add\",\n \"project\": \"proj_00000000000000000000000000\"\n },\n \"name\": \"billing_quote\"\n}"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/billing/reconcile\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\"",
|
|
3
|
+
"environments": ["live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst result = await greatwait.request(\"billing_reconcile\");",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {},\n \"name\": \"billing_reconcile\"\n}"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/billing/funding/refunds\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\" \\\n -H 'Content-Type: application/json' \\\n -H 'Idempotency-Key: $GREATWAIT_IDEMPOTENCY_KEY' \\\n --data-binary '{\"amount\":{\"currency\":\"USD\",\"microdollars\":\"5000000\",\"scale\":6},\"confirmed\":true,\"paymentOperation\":\"funding-operation-example\",\"reason\":\"Duplicate manual purchase\"}'",
|
|
3
|
+
"environments": ["live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst body = {\n \"amount\": {\n \"currency\": \"USD\",\n \"microdollars\": \"5000000\",\n \"scale\": 6\n },\n \"confirmed\": true,\n \"paymentOperation\": \"funding-operation-example\",\n \"reason\": \"Duplicate manual purchase\"\n};\n\nconst result = await greatwait.request(\"billing_refundrequest\", body, { \"Idempotency-Key\": process.env.GREATWAIT_IDEMPOTENCY_KEY });",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"Idempotency-Key\": \"$IDEMPOTENCY_KEY\",\n \"amount\": {\n \"currency\": \"USD\",\n \"microdollars\": \"5000000\",\n \"scale\": 6\n },\n \"confirmed\": true,\n \"paymentOperation\": \"funding-operation-example\",\n \"reason\": \"Duplicate manual purchase\"\n },\n \"name\": \"billing_refundrequest\"\n}"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X PATCH \"$GREATWAIT_API_URL/v1/billing/funding/refunds/$GREATWAIT_REFUNDREQUEST\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\" \\\n -H 'Content-Type: application/json' \\\n -H 'Idempotency-Key: $GREATWAIT_IDEMPOTENCY_KEY' \\\n --data-binary '{\"confirmed\":true,\"decision\":\"declined\"}'",
|
|
3
|
+
"environments": ["live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst refundRequest = process.env.GREATWAIT_REFUNDREQUEST;\n\nconst body = {\n \"confirmed\": true,\n \"decision\": \"declined\"\n};\n\nconst result = await greatwait.request(\"billing_refundresolution\", refundRequest, body, { \"Idempotency-Key\": process.env.GREATWAIT_IDEMPOTENCY_KEY });",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"Idempotency-Key\": \"$IDEMPOTENCY_KEY\",\n \"confirmed\": true,\n \"decision\": \"declined\",\n \"refundRequest\": \"$REFUNDREQUEST\"\n },\n \"name\": \"billing_refundresolution\"\n}"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X GET \"$GREATWAIT_API_URL/v1/billing/summary\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\"",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst result = await greatwait.request(\"billing_summary\");",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {},\n \"name\": \"billing_summary\"\n}"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/endpoints/$GREATWAIT_ENDPOINTID/signing-keys/acknowledge\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\" \\\n -H 'If-Match: $GREATWAIT_IF_MATCH'",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst endpointId = process.env.GREATWAIT_ENDPOINTID;\n\nconst result = await greatwait.request(\"endpoints_acknowledgeSigningKeyRotation\", endpointId, { \"If-Match\": process.env.GREATWAIT_IF_MATCH });",
|
|
5
|
+
"mcp": "// endpoints.acknowledgeSigningKeyRotation is not on the MCP surface.\n// This is a human assertion about a server outside GreatWait; an agent cannot observe that the server has accepted the new secret."
|
|
6
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/endpoints/$GREATWAIT_ENDPOINTID/
|
|
2
|
+
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/endpoints/$GREATWAIT_ENDPOINTID/enable\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\"",
|
|
3
3
|
"environments": ["test", "live"],
|
|
4
|
-
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst endpointId = process.env.GREATWAIT_ENDPOINTID;\n\nconst result = await greatwait.request(\"
|
|
5
|
-
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"endpointId\": \"$ENDPOINTID\"\n },\n \"name\": \"
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst endpointId = process.env.GREATWAIT_ENDPOINTID;\n\nconst result = await greatwait.request(\"endpoints_enable\", endpointId);",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"endpointId\": \"$ENDPOINTID\"\n },\n \"name\": \"endpoints_enable\"\n}"
|
|
6
6
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X GET \"$GREATWAIT_API_URL/v1/endpoints/$GREATWAIT_ENDPOINTID/signing-secret\" \\\n --variable %GREATWAIT_SESSION_TOKEN \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_SESSION_TOKEN}}\" \\\n -H 'Greatwait-Project: $GREATWAIT_PROJECT' \\\n -H 'Greatwait-Environment: $GREATWAIT_ENVIRONMENT'",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst named = (input, init = {}) =>\n fetch(input, {\n ...init,\n headers: {\n ...init.headers,\n \"Greatwait-Project\": process.env.GREATWAIT_PROJECT,\n \"Greatwait-Environment\": process.env.GREATWAIT_ENVIRONMENT,\n },\n });\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_SESSION_TOKEN,\n fetch: named,\n});\n\nconst endpointId = process.env.GREATWAIT_ENDPOINTID;\n\nconst result = await greatwait.request(\"endpoints_revealSigningSecret\", endpointId);",
|
|
5
|
+
"mcp": "// endpoints.revealSigningSecret is not on the MCP surface.\n// The response is an endpoint signing secret, which MCP has no secure-result channel for — and the route accepts only a signed-in member, which MCP never carries."
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X GET \"$GREATWAIT_API_URL/v1/occurrences\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\"",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst result = await greatwait.request(\"executions_list\");",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {},\n \"name\": \"executions_list\"\n}"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/exports/$GREATWAIT_EXPORTID/cancel\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\"",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst exportId = process.env.GREATWAIT_EXPORTID;\n\nconst result = await greatwait.request(\"exports_cancel\", exportId);",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"exportId\": \"$EXPORTID\"\n },\n \"name\": \"exports_cancel\"\n}"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/exports\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\" \\\n -H 'Content-Type: application/json' \\\n --data-binary '{}'",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst body = {};\n\nconst result = await greatwait.request(\"exports_create\", body);",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {},\n \"name\": \"exports_create\"\n}"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X GET \"$GREATWAIT_API_URL/v1/exports/$GREATWAIT_EXPORTID/parts\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\"",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst exportId = process.env.GREATWAIT_EXPORTID;\n\nconst result = await greatwait.request(\"exports_part\", exportId);",
|
|
5
|
+
"mcp": "// exports.part is not on the MCP surface.\n// A file part may contain customer payload plaintext; MCP exposes export metadata but never raw export content."
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X GET \"$GREATWAIT_API_URL/v1/exports/$GREATWAIT_EXPORTID\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\"",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst exportId = process.env.GREATWAIT_EXPORTID;\n\nconst result = await greatwait.request(\"exports_read\", exportId);",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"exportId\": \"$EXPORTID\"\n },\n \"name\": \"exports_read\"\n}"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/organization/close\" \\\n --variable %GREATWAIT_SESSION_TOKEN \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_SESSION_TOKEN}}\" \\\n -H 'Content-Type: application/json' \\\n --data-binary '{\"expectedGeneration\":0,\"immediate\":false,\"confirmation\":\"delete organization\"}'",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_SESSION_TOKEN,\n fetch,\n});\n\nconst body = {\n \"expectedGeneration\": 0,\n \"immediate\": false,\n \"confirmation\": \"delete organization\"\n};\n\nconst result = await greatwait.request(\"organizations_close\", body);",
|
|
5
|
+
"mcp": "// organizations.close is not on the MCP surface.\n// Organization closure and recovery require a signed-in administrator; delegated credentials cannot acquire organization-wide authority."
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X GET \"$GREATWAIT_API_URL/v1/organization/lifecycle\" \\\n --variable %GREATWAIT_SESSION_TOKEN \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_SESSION_TOKEN}}\"",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_SESSION_TOKEN,\n fetch,\n});\n\nconst result = await greatwait.request(\"organizations_lifecycle\");",
|
|
5
|
+
"mcp": "// organizations.lifecycle is not on the MCP surface.\n// Organization closure and recovery require a signed-in administrator; delegated credentials cannot acquire organization-wide authority."
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/organization/restore\" \\\n --variable %GREATWAIT_SESSION_TOKEN \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_SESSION_TOKEN}}\" \\\n -H 'Content-Type: application/json' \\\n --data-binary '{\"expectedGeneration\":1}'",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_SESSION_TOKEN,\n fetch,\n});\n\nconst body = {\n \"expectedGeneration\": 1\n};\n\nconst result = await greatwait.request(\"organizations_restore\", body);",
|
|
5
|
+
"mcp": "// organizations.restore is not on the MCP surface.\n// Organization closure and recovery require a signed-in administrator; delegated credentials cannot acquire organization-wide authority."
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/projects/$GREATWAIT_PROJECTID/archive\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\" \\\n -H 'Content-Type: application/json' \\\n -H 'If-Match: $GREATWAIT_IF_MATCH' \\\n --data-binary '{\"archived\":true}'",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst projectId = process.env.GREATWAIT_PROJECTID;\n\nconst body = {\n \"archived\": true\n};\n\nconst result = await greatwait.request(\"projects_archive\", projectId, body, { \"If-Match\": process.env.GREATWAIT_IF_MATCH });",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"If-Match\": \"$IF_MATCH\",\n \"archived\": true,\n \"projectId\": \"$PROJECTID\"\n },\n \"name\": \"projects_archive\"\n}"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X DELETE \"$GREATWAIT_API_URL/v1/projects/$GREATWAIT_PROJECTID\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\" \\\n -H 'If-Match: $GREATWAIT_IF_MATCH'",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst projectId = process.env.GREATWAIT_PROJECTID;\n\nconst result = await greatwait.request(\"projects_delete\", projectId, { \"If-Match\": process.env.GREATWAIT_IF_MATCH });",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"If-Match\": \"$IF_MATCH\",\n \"projectId\": \"$PROJECTID\"\n },\n \"name\": \"projects_delete\"\n}"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X PATCH \"$GREATWAIT_API_URL/v1/projects/$GREATWAIT_PROJECTID\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\" \\\n -H 'Content-Type: application/json' \\\n -H 'If-Match: $GREATWAIT_IF_MATCH' \\\n --data-binary '{\"name\":\"Customer reminders\"}'",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst projectId = process.env.GREATWAIT_PROJECTID;\n\nconst body = {\n \"name\": \"Customer reminders\"\n};\n\nconst result = await greatwait.request(\"projects_rename\", projectId, body, { \"If-Match\": process.env.GREATWAIT_IF_MATCH });",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"If-Match\": \"$IF_MATCH\",\n \"name\": \"Customer reminders\",\n \"projectId\": \"$PROJECTID\"\n },\n \"name\": \"projects_rename\"\n}"
|
|
6
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/schedules\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\" \\\n -H 'Content-Type: application/json' \\\n --data-binary '{\"cron\":\"0 9 * * 1-5\",\"data\":{\"report\":\"daily\"},\"endpoint\":\"ep_01h8xyz9k2m4n6p8r0t2v4w6y8\",\"partitionKey\":\"campaign.spring\",\"timeZone\":\"Europe/London\"}'",
|
|
2
|
+
"curl": "curl -sS -X POST \"$GREATWAIT_API_URL/v1/schedules\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\" \\\n -H 'Content-Type: application/json' \\\n --data-binary '{\"cron\":\"0 9 * * 1-5\",\"data\":{\"report\":\"daily\"},\"endpoint\":\"ep_01h8xyz9k2m4n6p8r0t2v4w6y8\",\"lateness\":{\"maxStalenessSeconds\":3600,\"policy\":\"catchUp\"},\"partitionKey\":\"campaign.spring\",\"timeZone\":\"Europe/London\"}'",
|
|
3
3
|
"environments": ["test", "live"],
|
|
4
|
-
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst body = {\n \"cron\": \"0 9 * * 1-5\",\n \"data\": {\n \"report\": \"daily\"\n },\n \"endpoint\": \"ep_01h8xyz9k2m4n6p8r0t2v4w6y8\",\n \"partitionKey\": \"campaign.spring\",\n \"timeZone\": \"Europe/London\"\n};\n\nconst result = await greatwait.request(\"schedules_create\", body);",
|
|
5
|
-
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"cron\": \"0 9 * * 1-5\",\n \"data\": {\n \"report\": \"daily\"\n },\n \"endpoint\": \"ep_01h8xyz9k2m4n6p8r0t2v4w6y8\",\n \"partitionKey\": \"campaign.spring\",\n \"timeZone\": \"Europe/London\"\n },\n \"name\": \"schedules_create\"\n}"
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst body = {\n \"cron\": \"0 9 * * 1-5\",\n \"data\": {\n \"report\": \"daily\"\n },\n \"endpoint\": \"ep_01h8xyz9k2m4n6p8r0t2v4w6y8\",\n \"lateness\": {\n \"maxStalenessSeconds\": 3600,\n \"policy\": \"catchUp\"\n },\n \"partitionKey\": \"campaign.spring\",\n \"timeZone\": \"Europe/London\"\n};\n\nconst result = await greatwait.request(\"schedules_create\", body);",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"cron\": \"0 9 * * 1-5\",\n \"data\": {\n \"report\": \"daily\"\n },\n \"endpoint\": \"ep_01h8xyz9k2m4n6p8r0t2v4w6y8\",\n \"lateness\": {\n \"maxStalenessSeconds\": 3600,\n \"policy\": \"catchUp\"\n },\n \"partitionKey\": \"campaign.spring\",\n \"timeZone\": \"Europe/London\"\n },\n \"name\": \"schedules_create\"\n}"
|
|
6
6
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"curl": "curl -sS -X PUT \"$GREATWAIT_API_URL/v1/schedules/$GREATWAIT_SCHEDULEID\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\" \\\n -H 'Content-Type: application/json' \\\n --data-binary '{\"data\":{\"report\":\"weekly\"},\"everySeconds\":86400,\"endpoint\":\"ep_01h8xyz9k2m4n6p8r0t2v4w6y8\",\"partitionKey\":\"campaign.spring\"}'",
|
|
2
|
+
"curl": "curl -sS -X PUT \"$GREATWAIT_API_URL/v1/schedules/$GREATWAIT_SCHEDULEID\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\" \\\n -H 'Content-Type: application/json' \\\n --data-binary '{\"data\":{\"report\":\"weekly\"},\"everySeconds\":86400,\"endpoint\":\"ep_01h8xyz9k2m4n6p8r0t2v4w6y8\",\"lateness\":{\"maxStalenessSeconds\":7200,\"policy\":\"catchUp\"},\"partitionKey\":\"campaign.spring\"}'",
|
|
3
3
|
"environments": ["test", "live"],
|
|
4
|
-
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst scheduleId = process.env.GREATWAIT_SCHEDULEID;\n\nconst body = {\n \"data\": {\n \"report\": \"weekly\"\n },\n \"everySeconds\": 86400,\n \"endpoint\": \"ep_01h8xyz9k2m4n6p8r0t2v4w6y8\",\n \"partitionKey\": \"campaign.spring\"\n};\n\nconst result = await greatwait.request(\"schedules_replace\", scheduleId, body);",
|
|
5
|
-
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"scheduleId\": \"$SCHEDULEID\",\n \"data\": {\n \"report\": \"weekly\"\n },\n \"everySeconds\": 86400,\n \"endpoint\": \"ep_01h8xyz9k2m4n6p8r0t2v4w6y8\",\n \"partitionKey\": \"campaign.spring\"\n },\n \"name\": \"schedules_replace\"\n}"
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst scheduleId = process.env.GREATWAIT_SCHEDULEID;\n\nconst body = {\n \"data\": {\n \"report\": \"weekly\"\n },\n \"everySeconds\": 86400,\n \"endpoint\": \"ep_01h8xyz9k2m4n6p8r0t2v4w6y8\",\n \"lateness\": {\n \"maxStalenessSeconds\": 7200,\n \"policy\": \"catchUp\"\n },\n \"partitionKey\": \"campaign.spring\"\n};\n\nconst result = await greatwait.request(\"schedules_replace\", scheduleId, body);",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {\n \"scheduleId\": \"$SCHEDULEID\",\n \"data\": {\n \"report\": \"weekly\"\n },\n \"everySeconds\": 86400,\n \"endpoint\": \"ep_01h8xyz9k2m4n6p8r0t2v4w6y8\",\n \"lateness\": {\n \"maxStalenessSeconds\": 7200,\n \"policy\": \"catchUp\"\n },\n \"partitionKey\": \"campaign.spring\"\n },\n \"name\": \"schedules_replace\"\n}"
|
|
6
6
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"curl": "curl -sS -X GET \"$GREATWAIT_API_URL/v1/timing/summary\" \\\n --variable %GREATWAIT_API_KEY \\\n --expand-header \"Authorization: Bearer {{GREATWAIT_API_KEY}}\"",
|
|
3
|
+
"environments": ["test", "live"],
|
|
4
|
+
"javascript": "import { createGreatwaitClient } from \"@greatwait/api-client\";\n\nconst greatwait = createGreatwaitClient({\n baseUrl: process.env.GREATWAIT_API_URL,\n credential: process.env.GREATWAIT_API_KEY,\n fetch,\n});\n\nconst result = await greatwait.request(\"timing_summary\");",
|
|
5
|
+
"mcp": "// Any MCP client, against $GREATWAIT_API_URL/mcp.\n{\n \"arguments\": {},\n \"name\": \"timing_summary\"\n}"
|
|
6
|
+
}
|
package/package.json
CHANGED
|
@@ -20,11 +20,6 @@
|
|
|
20
20
|
"import": "./dist/authority.js",
|
|
21
21
|
"default": "./dist/authority.js"
|
|
22
22
|
},
|
|
23
|
-
"./callback-ownership": {
|
|
24
|
-
"types": "./dist/callback-ownership.d.ts",
|
|
25
|
-
"import": "./dist/callback-ownership.js",
|
|
26
|
-
"default": "./dist/callback-ownership.js"
|
|
27
|
-
},
|
|
28
23
|
"./callback-receiver": {
|
|
29
24
|
"types": "./dist/callback-receiver.d.ts",
|
|
30
25
|
"import": "./dist/callback-receiver.js",
|
|
@@ -154,5 +149,5 @@
|
|
|
154
149
|
},
|
|
155
150
|
"sideEffects": false,
|
|
156
151
|
"type": "module",
|
|
157
|
-
"version": "0.1.0-alpha.
|
|
152
|
+
"version": "0.1.0-alpha.4"
|
|
158
153
|
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Whether a receiver has to prove it owns a destination before Greatwait
|
|
3
|
-
* delivers anything there.
|
|
4
|
-
*
|
|
5
|
-
* **Zod-free and dependency-free on purpose.** Both the API Worker and the
|
|
6
|
-
* Scheduler Worker enforce this, and `apps/scheduler/src/contract-runtime.ts`
|
|
7
|
-
* records what reaching the contract barrel costs a Durable Object cold start.
|
|
8
|
-
* This module is an enumeration and two pure functions, so the subpath export
|
|
9
|
-
* `@greatwait/contracts/callback-ownership` costs the scheduler nothing.
|
|
10
|
-
*
|
|
11
|
-
* **Why the rule is stated once rather than twice.** Two sites resolve a
|
|
12
|
-
* destination for sending — `apps/api` when a schedule is created, and
|
|
13
|
-
* `apps/scheduler` at the moment of delivery — and they live in different
|
|
14
|
-
* workspaces. If each wrote its own status predicate they would eventually
|
|
15
|
-
* disagree, and the shape of that disagreement is a schedule the product
|
|
16
|
-
* accepts and then silently never delivers. `sendableStatuses` is the single
|
|
17
|
-
* statement both build their query from.
|
|
18
|
-
*/
|
|
19
|
-
/**
|
|
20
|
-
* The answers this product understands, in the order a person would read them
|
|
21
|
-
* as increasing strictness.
|
|
22
|
-
*
|
|
23
|
-
* `not-required` does **not** mean verification is gone. A destination may
|
|
24
|
-
* still answer its ownership challenge, and doing so still records the instant
|
|
25
|
-
* it proved possession of the secret. It means nothing waits for that.
|
|
26
|
-
*/
|
|
27
|
-
export declare const CALLBACK_OWNERSHIP_POLICIES: readonly ["not-required", "required"];
|
|
28
|
-
export type CallbackOwnershipPolicy = (typeof CALLBACK_OWNERSHIP_POLICIES)[number];
|
|
29
|
-
/**
|
|
30
|
-
* What an unset variable means.
|
|
31
|
-
*
|
|
32
|
-
* Not required, decided on 2026-08-18 after the first invited customers walked
|
|
33
|
-
* the product: nobody writes an HMAC responder to try a scheduler, so requiring
|
|
34
|
-
* one before the first delivery cost the whole top of the funnel to buy a
|
|
35
|
-
* property that `evaluateCallbackUrl`, the delivery rate limits and the request
|
|
36
|
-
* signature already defend from other directions. See W4-09.
|
|
37
|
-
*/
|
|
38
|
-
export declare const DEFAULT_CALLBACK_OWNERSHIP_POLICY: CallbackOwnershipPolicy;
|
|
39
|
-
/**
|
|
40
|
-
* Read the policy a deployment declares, or refuse to run.
|
|
41
|
-
*
|
|
42
|
-
* **An unrecognised value throws rather than falling back.** The entire reason
|
|
43
|
-
* this is configuration is that turning the requirement on or off should be a
|
|
44
|
-
* visible decision; a typo, a rename, or a half-finished edit silently read as
|
|
45
|
-
* `not-required` would hand back exactly the off-switch the setting exists to
|
|
46
|
-
* make visible. Absent is a decision — it is the documented default — and
|
|
47
|
-
* `"requred"` is not.
|
|
48
|
-
*/
|
|
49
|
-
export declare function readCallbackOwnershipPolicy(value: string | undefined): CallbackOwnershipPolicy;
|
|
50
|
-
/**
|
|
51
|
-
* The destination statuses a send may resolve under a policy, as a query
|
|
52
|
-
* builds its `IN` list from.
|
|
53
|
-
*
|
|
54
|
-
* `disabled` is absent from both and always will be: disabling is terminal and
|
|
55
|
-
* is the one refusal this setting does not reach. A caller that widened this to
|
|
56
|
-
* include it would be delivering to a destination somebody turned off.
|
|
57
|
-
*/
|
|
58
|
-
export declare function sendableStatuses(policy: CallbackOwnershipPolicy): readonly string[];
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Whether a receiver has to prove it owns a destination before Greatwait
|
|
3
|
-
* delivers anything there.
|
|
4
|
-
*
|
|
5
|
-
* **Zod-free and dependency-free on purpose.** Both the API Worker and the
|
|
6
|
-
* Scheduler Worker enforce this, and `apps/scheduler/src/contract-runtime.ts`
|
|
7
|
-
* records what reaching the contract barrel costs a Durable Object cold start.
|
|
8
|
-
* This module is an enumeration and two pure functions, so the subpath export
|
|
9
|
-
* `@greatwait/contracts/callback-ownership` costs the scheduler nothing.
|
|
10
|
-
*
|
|
11
|
-
* **Why the rule is stated once rather than twice.** Two sites resolve a
|
|
12
|
-
* destination for sending — `apps/api` when a schedule is created, and
|
|
13
|
-
* `apps/scheduler` at the moment of delivery — and they live in different
|
|
14
|
-
* workspaces. If each wrote its own status predicate they would eventually
|
|
15
|
-
* disagree, and the shape of that disagreement is a schedule the product
|
|
16
|
-
* accepts and then silently never delivers. `sendableStatuses` is the single
|
|
17
|
-
* statement both build their query from.
|
|
18
|
-
*/
|
|
19
|
-
/**
|
|
20
|
-
* The answers this product understands, in the order a person would read them
|
|
21
|
-
* as increasing strictness.
|
|
22
|
-
*
|
|
23
|
-
* `not-required` does **not** mean verification is gone. A destination may
|
|
24
|
-
* still answer its ownership challenge, and doing so still records the instant
|
|
25
|
-
* it proved possession of the secret. It means nothing waits for that.
|
|
26
|
-
*/
|
|
27
|
-
export const CALLBACK_OWNERSHIP_POLICIES = [
|
|
28
|
-
"not-required",
|
|
29
|
-
"required",
|
|
30
|
-
];
|
|
31
|
-
/**
|
|
32
|
-
* What an unset variable means.
|
|
33
|
-
*
|
|
34
|
-
* Not required, decided on 2026-08-18 after the first invited customers walked
|
|
35
|
-
* the product: nobody writes an HMAC responder to try a scheduler, so requiring
|
|
36
|
-
* one before the first delivery cost the whole top of the funnel to buy a
|
|
37
|
-
* property that `evaluateCallbackUrl`, the delivery rate limits and the request
|
|
38
|
-
* signature already defend from other directions. See W4-09.
|
|
39
|
-
*/
|
|
40
|
-
export const DEFAULT_CALLBACK_OWNERSHIP_POLICY = "not-required";
|
|
41
|
-
/**
|
|
42
|
-
* Read the policy a deployment declares, or refuse to run.
|
|
43
|
-
*
|
|
44
|
-
* **An unrecognised value throws rather than falling back.** The entire reason
|
|
45
|
-
* this is configuration is that turning the requirement on or off should be a
|
|
46
|
-
* visible decision; a typo, a rename, or a half-finished edit silently read as
|
|
47
|
-
* `not-required` would hand back exactly the off-switch the setting exists to
|
|
48
|
-
* make visible. Absent is a decision — it is the documented default — and
|
|
49
|
-
* `"requred"` is not.
|
|
50
|
-
*/
|
|
51
|
-
export function readCallbackOwnershipPolicy(value) {
|
|
52
|
-
if (value === undefined || value === "") {
|
|
53
|
-
return DEFAULT_CALLBACK_OWNERSHIP_POLICY;
|
|
54
|
-
}
|
|
55
|
-
const known = CALLBACK_OWNERSHIP_POLICIES.find((policy) => policy === value);
|
|
56
|
-
if (known === undefined) {
|
|
57
|
-
throw new Error(`GREATWAIT_CALLBACK_OWNERSHIP is ${JSON.stringify(value)}, which this service does not understand. Known values: ${CALLBACK_OWNERSHIP_POLICIES.join(", ")}. Leave it unset for ${DEFAULT_CALLBACK_OWNERSHIP_POLICY}.`);
|
|
58
|
-
}
|
|
59
|
-
return known;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* The destination statuses a send may resolve under a policy, as a query
|
|
63
|
-
* builds its `IN` list from.
|
|
64
|
-
*
|
|
65
|
-
* `disabled` is absent from both and always will be: disabling is terminal and
|
|
66
|
-
* is the one refusal this setting does not reach. A caller that widened this to
|
|
67
|
-
* include it would be delivering to a destination somebody turned off.
|
|
68
|
-
*/
|
|
69
|
-
export function sendableStatuses(policy) {
|
|
70
|
-
return policy === "required" ? ["verified"] : ["pending", "verified"];
|
|
71
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"purpose": "Prove that the receiver possesses the one-time endpoint secret before Greatwait marks the endpoint verified.",
|
|
3
|
-
"request": {
|
|
4
|
-
"bodyEncoding": "UTF-8 bytes of the compact JSON object in schema property order: challenge, endpointId, type, version.",
|
|
5
|
-
"contentType": "application/json",
|
|
6
|
-
"method": "POST",
|
|
7
|
-
"redirectPolicy": "manual; every 3xx response is refused",
|
|
8
|
-
"signature": {
|
|
9
|
-
"algorithm": "HMAC-SHA-256",
|
|
10
|
-
"format": "v1=<64 lowercase hexadecimal characters>",
|
|
11
|
-
"header": "Callback-Verification-Signature",
|
|
12
|
-
"input": "the exact request body bytes",
|
|
13
|
-
"key": "the one-time endpoint secret returned by REST endpoint creation"
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
"response": {
|
|
17
|
-
"body": "ignored after enforcing the 1024-byte response limit; return an empty body",
|
|
18
|
-
"proof": {
|
|
19
|
-
"algorithm": "HMAC-SHA-256",
|
|
20
|
-
"format": "v1=<64 lowercase hexadecimal characters>",
|
|
21
|
-
"header": "Callback-Verification-Response",
|
|
22
|
-
"input": "the UTF-8 bytes of the challenge string",
|
|
23
|
-
"key": "the same endpoint secret"
|
|
24
|
-
},
|
|
25
|
-
"status": "any 2xx status"
|
|
26
|
-
},
|
|
27
|
-
"testVector": {
|
|
28
|
-
"challenge": "cvc_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
|
|
29
|
-
"endpointId": "ep_00000000000000000000000000",
|
|
30
|
-
"exactBodyBase64": "eyJjaGFsbGVuZ2UiOiJjdmNfQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIsImVuZHBvaW50SWQiOiJlcF8wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsInR5cGUiOiJjYWxsYmFjay5lbmRwb2ludC52ZXJpZmljYXRpb24iLCJ2ZXJzaW9uIjoiMjAyNi0wOC0wNSJ9",
|
|
31
|
-
"requestSignature": "v1=0d24c7fed4d752411b88025a9923627b329e0eb9d53978a6ebcf92c0678c731e",
|
|
32
|
-
"responseSignature": "v1=efc690a23f1870930ff3388313162c0e06406902a7a4d3f9273ffe0abcef86bd",
|
|
33
|
-
"secret": "verification-vector-secret"
|
|
34
|
-
},
|
|
35
|
-
"version": "2026-08-05",
|
|
36
|
-
"challengeSchema": {
|
|
37
|
-
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
38
|
-
"type": "object",
|
|
39
|
-
"properties": {
|
|
40
|
-
"challenge": {
|
|
41
|
-
"type": "string",
|
|
42
|
-
"pattern": "^cvc_[A-Za-z0-9_-]{43}$"
|
|
43
|
-
},
|
|
44
|
-
"endpointId": {
|
|
45
|
-
"type": "string",
|
|
46
|
-
"pattern": "^ep_[0-9abcdefghjkmnpqrstvwxyz]{26}$"
|
|
47
|
-
},
|
|
48
|
-
"type": {
|
|
49
|
-
"type": "string",
|
|
50
|
-
"const": "callback.endpoint.verification"
|
|
51
|
-
},
|
|
52
|
-
"version": {
|
|
53
|
-
"type": "string",
|
|
54
|
-
"const": "2026-08-05"
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
"required": ["challenge", "endpointId", "type", "version"]
|
|
58
|
-
}
|
|
59
|
-
}
|