sporades 0.9.35 → 0.9.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGES.md +5 -22
  2. package/bin/sporades-host-helper.js +118 -95
  3. package/bin/sporades.js +99901 -99100
  4. package/dist/ai-config.d.ts +34 -0
  5. package/dist/ai-config.d.ts.map +1 -0
  6. package/dist/ai-config.js +121 -0
  7. package/dist/ai-config.js.map +1 -0
  8. package/dist/ai-runtime.d.ts +35 -0
  9. package/dist/ai-runtime.d.ts.map +1 -0
  10. package/dist/ai-runtime.js +433 -0
  11. package/dist/ai-runtime.js.map +1 -0
  12. package/dist/bundle-pipeline.d.ts.map +1 -1
  13. package/dist/bundle-pipeline.js +2 -0
  14. package/dist/bundle-pipeline.js.map +1 -1
  15. package/dist/cli/cli-version.d.ts +1 -1
  16. package/dist/cli/cli-version.js +1 -1
  17. package/dist/cli/project-config.d.ts +1 -0
  18. package/dist/cli/project-config.d.ts.map +1 -1
  19. package/dist/cli/project-config.js +8 -0
  20. package/dist/cli/project-config.js.map +1 -1
  21. package/dist/cli/sporades.js +4 -0
  22. package/dist/cli/sporades.js.map +1 -1
  23. package/dist/generated-source-manifest.json +22 -2
  24. package/dist/mcp-config.d.ts +20 -0
  25. package/dist/mcp-config.d.ts.map +1 -0
  26. package/dist/mcp-config.js +74 -0
  27. package/dist/mcp-config.js.map +1 -0
  28. package/dist/mcp-runtime.d.ts +26 -0
  29. package/dist/mcp-runtime.d.ts.map +1 -0
  30. package/dist/mcp-runtime.js +263 -0
  31. package/dist/mcp-runtime.js.map +1 -0
  32. package/dist/resource-runtime.js +2 -2
  33. package/dist/resource-runtime.js.map +1 -1
  34. package/dist/runtime-telemetry.d.ts.map +1 -1
  35. package/dist/runtime-telemetry.js +6 -0
  36. package/dist/runtime-telemetry.js.map +1 -1
  37. package/dist/server-runtime-source.d.ts.map +1 -1
  38. package/dist/server-runtime-source.js +22 -2
  39. package/dist/server-runtime-source.js.map +1 -1
  40. package/dist/server.d.ts +4 -0
  41. package/dist/server.d.ts.map +1 -1
  42. package/dist/server.js +2 -0
  43. package/dist/server.js.map +1 -1
  44. package/dist/templates/server-bundle-entry.d.ts.map +1 -1
  45. package/dist/templates/server-bundle-entry.js +3 -0
  46. package/dist/templates/server-bundle-entry.js.map +1 -1
  47. package/package.json +1 -1
  48. package/src/types/server.d.ts +88 -0
package/CHANGES.md CHANGED
@@ -1,29 +1,10 @@
1
1
  # Changes
2
2
 
3
- ## Unreleased - 2026-10-20
3
+ ## Unreleased - 2026-10-22
4
4
 
5
- Changes since v0.9.34.
5
+ Changes since v0.9.36.
6
6
 
7
- ### 🚀 Features
8
-
9
- - Add atomic human identity termination (ADR 0057) (#273) (769df876).
10
- - Add day-based Host backup retention (retentionDays / keep-within) (#275) (3724e2ad).
11
- - Allow loopback Stripe API origins in Dev sessions (#270) (57a9aec3).
12
-
13
- ### 🐛 Bug Fixes
14
-
15
- - Fix runtime injection on secondary HTML documents (#274) (91e06995).
16
-
17
- ### 🔧 Improvements
18
-
19
- - Bump ignore (b2e1be97).
20
-
21
- ### 📝 Documentation
22
-
23
- - Ship a stateful Stripe Team Billing fake (#269) (bceed0bc).
24
- - Propose a supported Team Billing test-provider boundary (ADR 0058) (#268) (e62eaf87).
25
- - Propose atomic human identity termination in ADR 0057 (#267) (29995233).
26
- - Forbid Compose merge keys and value-bind Host elevation in ADR 0056 (#261) (edf701a6).
7
+ No changes detected.
27
8
 
28
9
  ## v0.9.11 - 2026-09-02
29
10
 
@@ -128,3 +109,5 @@ generated artifacts, and documentation.
128
109
 
129
110
 
130
111
 
112
+
113
+
@@ -28884,25 +28884,43 @@ function redactDiagnosticText(value, serverEnv = {}) {
28884
28884
  return safe;
28885
28885
  }
28886
28886
 
28887
- // src/file-policy.ts
28888
- var signatures = [
28889
- ["image/png", [137, 80, 78, 71, 13, 10, 26, 10], 0],
28890
- ["image/jpeg", [255, 216, 255], 0],
28891
- ["image/gif", [71, 73, 70, 56, 55, 97], 0],
28892
- ["image/gif", [71, 73, 70, 56, 57, 97], 0],
28893
- ["image/bmp", [66, 77], 0],
28894
- ["application/pdf", [37, 80, 68, 70, 45], 0],
28895
- ["application/gzip", [31, 139], 0],
28896
- ["application/zip", [80, 75, 3, 4], 0],
28897
- ["application/zip", [80, 75, 5, 6], 0],
28898
- ["application/zip", [80, 75, 7, 8], 0]
28899
- ];
28900
- var signedTypes = /* @__PURE__ */ new Set([...signatures.map(([type]) => type), "image/webp", "image/avif"]);
28887
+ // src/resource-runtime.ts
28888
+ var RESOURCE_ADAPTER_SUPPORT = Object.freeze({
28889
+ sqlite: "supported",
28890
+ postgres: "supported",
28891
+ libsql: "unsupported"
28892
+ });
28893
+ var resourceAbort = Symbol("resourceAbort");
28894
+ function resourceError(code) {
28895
+ return Object.assign(new Error(code === "RESOURCE_BUSY" ? "Resource transaction is busy." : "Resource operation could not complete."), {
28896
+ code,
28897
+ ...code === "RESOURCE_BUSY" ? { retryable: true } : {}
28898
+ });
28899
+ }
28900
+ var unsupportedResources = Object.freeze({
28901
+ async run() {
28902
+ throw resourceError("RESOURCE_CONTEXT_UNSUPPORTED");
28903
+ },
28904
+ async status() {
28905
+ throw resourceError("RESOURCE_CONTEXT_UNSUPPORTED");
28906
+ }
28907
+ });
28908
+
28909
+ // src/live-query-invalidation.ts
28910
+ var { AsyncLocalStorage } = process.getBuiltinModule("node:async_hooks");
28911
+ var liveQueryTablesTracked = Symbol.for("sporades.database.liveQueryTablesTracked");
28912
+ var liveQueryReads = new AsyncLocalStorage();
28913
+ var quotedIdentifier = String.raw`(?:\[([^\]]+)\]|"([^"]+)")`;
28914
+ var readTablePattern = new RegExp(String.raw`\b(?:FROM|JOIN)\s+${quotedIdentifier}`, "gi");
28915
+ var writeTablePattern = new RegExp(
28916
+ String.raw`^\s*(?:INSERT(?:\s+OR\s+\w+)?\s+INTO|REPLACE\s+INTO|UPDATE(?:\s+OR\s+\w+)?|DELETE\s+FROM)\s+${quotedIdentifier}`,
28917
+ "i"
28918
+ );
28901
28919
 
28902
28920
  // src/runtime-request-context.ts
28903
- import { AsyncLocalStorage } from "node:async_hooks";
28904
- var runtimeRequestScope = new AsyncLocalStorage();
28905
- var runtimeJobScope = new AsyncLocalStorage();
28921
+ import { AsyncLocalStorage as AsyncLocalStorage2 } from "node:async_hooks";
28922
+ var runtimeRequestScope = new AsyncLocalStorage2();
28923
+ var runtimeJobScope = new AsyncLocalStorage2();
28906
28924
 
28907
28925
  // src/html.ts
28908
28926
  function escapeHtml(value) {
@@ -28938,33 +28956,19 @@ function html(strings2, ...values) {
28938
28956
  html2.raw = raw;
28939
28957
  })(html || (html = {}));
28940
28958
 
28941
- // src/resource-runtime.ts
28942
- var RESOURCE_ADAPTER_SUPPORT = Object.freeze({
28943
- sqlite: "supported",
28944
- postgres: "supported",
28945
- libsql: "unsupported"
28946
- });
28947
- var resourceAbort = Symbol("resourceAbort");
28948
- function resourceError(code) {
28949
- return Object.assign(new Error(code === "RESOURCE_BUSY" ? "Resource transaction is busy." : "Resource operation could not complete."), {
28950
- code,
28951
- ...code === "RESOURCE_BUSY" ? { retryable: true } : {}
28952
- });
28953
- }
28954
- var unsupportedResources = Object.freeze({
28955
- async run() {
28956
- throw resourceError("RESOURCE_CONTEXT_UNSUPPORTED");
28957
- },
28958
- async status() {
28959
- throw resourceError("RESOURCE_CONTEXT_UNSUPPORTED");
28960
- }
28961
- });
28959
+ // src/auth-admission.ts
28960
+ var AUTH_REQUIREMENTS = Symbol.for("sporades.auth.requirements");
28961
+ var ACCESS_KEY_SCOPE_LIMIT = 1024;
28962
+ var ACCESS_KEY_SCOPE_BYTE_LIMIT = 256;
28962
28963
 
28963
- // src/log-envelope.ts
28964
- import { randomUUID as randomUUID4 } from "node:crypto";
28964
+ // src/access-keys-runtime.ts
28965
+ var UNKNOWN_ACCESS_KEY_DIGEST = Buffer.from("4f7c77f7b9231094754542ed50fdfd62a2cf24a5e961b61f899b85b6fe33c72b", "hex");
28965
28966
 
28966
- // src/runtime-telemetry.ts
28967
- import { randomUUID as randomUUID3 } from "node:crypto";
28967
+ // src/teams-runtime.ts
28968
+ var TEAM_JOIN_LINK_DEFAULT_TTL_SECONDS = 60 * 60 * 24;
28969
+ var TEAM_JOIN_LINK_MIN_TTL_SECONDS = 5 * 60;
28970
+ var TEAM_JOIN_LINK_MAX_TTL_SECONDS = 60 * 60 * 24 * 7;
28971
+ var transactionBeforeCommitChecks = Symbol.for("sporades.database.transactionBeforeCommitChecks");
28968
28972
 
28969
28973
  // node_modules/.pnpm/parse5@8.0.1/node_modules/parse5/dist/common/unicode.js
28970
28974
  var CODE_POINTS;
@@ -29994,30 +29998,20 @@ var VOID_ELEMENTS = /* @__PURE__ */ new Set([
29994
29998
  TAG_NAMES.WBR
29995
29999
  ]);
29996
30000
 
29997
- // src/auth-admission.ts
29998
- var AUTH_REQUIREMENTS = Symbol.for("sporades.auth.requirements");
29999
- var ACCESS_KEY_SCOPE_LIMIT = 1024;
30000
- var ACCESS_KEY_SCOPE_BYTE_LIMIT = 256;
30001
-
30002
- // src/access-keys-runtime.ts
30003
- var UNKNOWN_ACCESS_KEY_DIGEST = Buffer.from("4f7c77f7b9231094754542ed50fdfd62a2cf24a5e961b61f899b85b6fe33c72b", "hex");
30004
-
30005
- // src/teams-runtime.ts
30006
- var TEAM_JOIN_LINK_DEFAULT_TTL_SECONDS = 60 * 60 * 24;
30007
- var TEAM_JOIN_LINK_MIN_TTL_SECONDS = 5 * 60;
30008
- var TEAM_JOIN_LINK_MAX_TTL_SECONDS = 60 * 60 * 24 * 7;
30009
- var transactionBeforeCommitChecks = Symbol.for("sporades.database.transactionBeforeCommitChecks");
30010
-
30011
- // src/auth-runtime.ts
30012
- var nodeCryptoModule = process.getBuiltinModule("node:crypto");
30013
- var EMAIL_SIGN_IN_THROTTLE_WINDOW_MS = 15 * 60 * 1e3;
30014
- var PASSWORD_RESET_DEFAULT_TTL_MS = 60 * 60 * 1e3;
30015
- var PASSWORD_RESET_MIN_TTL_MS = 5 * 60 * 1e3;
30016
- var PASSWORD_RESET_MAX_TTL_MS = 24 * 60 * 60 * 1e3;
30017
- var registrationDeniedRollbackMarker = Symbol("sporades.registrationDeniedRollback");
30018
- var invalidRegistrationAdmission = Symbol("sporades.invalidRegistrationAdmission");
30019
- var OAUTH_REGISTRATION_KEY_GRACE_MS = 10 * 60 * 1e3;
30020
- var oauthRegistrationUnsealFailed = Symbol("sporades.oauthRegistrationUnsealFailed");
30001
+ // src/file-policy.ts
30002
+ var signatures = [
30003
+ ["image/png", [137, 80, 78, 71, 13, 10, 26, 10], 0],
30004
+ ["image/jpeg", [255, 216, 255], 0],
30005
+ ["image/gif", [71, 73, 70, 56, 55, 97], 0],
30006
+ ["image/gif", [71, 73, 70, 56, 57, 97], 0],
30007
+ ["image/bmp", [66, 77], 0],
30008
+ ["application/pdf", [37, 80, 68, 70, 45], 0],
30009
+ ["application/gzip", [31, 139], 0],
30010
+ ["application/zip", [80, 75, 3, 4], 0],
30011
+ ["application/zip", [80, 75, 5, 6], 0],
30012
+ ["application/zip", [80, 75, 7, 8], 0]
30013
+ ];
30014
+ var signedTypes = /* @__PURE__ */ new Set([...signatures.map(([type]) => type), "image/webp", "image/avif"]);
30021
30015
 
30022
30016
  // src/team-billing-management.ts
30023
30017
  var CLAIM_TTL_MS = 5 * 60 * 1e3;
@@ -30033,7 +30027,7 @@ var CHECKOUT_CONTINUATION_TTL_MAX_SECONDS = 30 * 60;
30033
30027
  var CLAIM_TTL_MS2 = 5 * 6e4;
30034
30028
 
30035
30029
  // src/jobs-runtime.ts
30036
- var nodeCryptoModule2 = process.getBuiltinModule("node:crypto");
30030
+ var nodeCryptoModule = process.getBuiltinModule("node:crypto");
30037
30031
  var STRIPE_EVENT_PAYLOAD_RETENTION_MS = 30 * 24 * 60 * 60 * 1e3;
30038
30032
  var REDACTED_STRIPE_EVENT_PAYLOAD = JSON.stringify({ kind: "stripe-event", retained: false });
30039
30033
  var STRIPE_EVENT_PAYLOAD_SENTINEL_RECHECK_MS = 24 * 60 * 60 * 1e3;
@@ -30118,7 +30112,7 @@ function auditString(value, fallback) {
30118
30112
  var ACL_HELPER_STATE = Symbol("sporades.aclHelperState");
30119
30113
 
30120
30114
  // src/file-storage-runtime.ts
30121
- var nodeCryptoModule3 = process.getBuiltinModule("node:crypto");
30115
+ var nodeCryptoModule2 = process.getBuiltinModule("node:crypto");
30122
30116
 
30123
30117
  // src/file-ingress-runtime.ts
30124
30118
  var import_pdf_lib = __toESM(require_cjs(), 1);
@@ -45816,6 +45810,54 @@ var clamavRefreshIntervalMs = 60 * 60 * 1e3;
45816
45810
  var clamavRefreshRetryMs = 15 * 60 * 1e3;
45817
45811
  var clamavRefreshTimeoutMs = 5 * 60 * 1e3;
45818
45812
 
45813
+ // src/auth-runtime.ts
45814
+ var nodeCryptoModule3 = process.getBuiltinModule("node:crypto");
45815
+ var EMAIL_SIGN_IN_THROTTLE_WINDOW_MS = 15 * 60 * 1e3;
45816
+ var PASSWORD_RESET_DEFAULT_TTL_MS = 60 * 60 * 1e3;
45817
+ var PASSWORD_RESET_MIN_TTL_MS = 5 * 60 * 1e3;
45818
+ var PASSWORD_RESET_MAX_TTL_MS = 24 * 60 * 60 * 1e3;
45819
+ var registrationDeniedRollbackMarker = Symbol("sporades.registrationDeniedRollback");
45820
+ var invalidRegistrationAdmission = Symbol("sporades.invalidRegistrationAdmission");
45821
+ var OAUTH_REGISTRATION_KEY_GRACE_MS = 10 * 60 * 1e3;
45822
+ var oauthRegistrationUnsealFailed = Symbol("sporades.oauthRegistrationUnsealFailed");
45823
+
45824
+ // src/database-telemetry.ts
45825
+ import { AsyncLocalStorage as AsyncLocalStorage3 } from "node:async_hooks";
45826
+ var databaseTelemetry = Symbol("sporades.database.telemetry");
45827
+ var operationScope = new AsyncLocalStorage3();
45828
+
45829
+ // src/database-runtime.ts
45830
+ var nodeCryptoModule4 = process.getBuiltinModule("node:crypto");
45831
+ var nodeFsModule = process.getBuiltinModule("node:fs");
45832
+ var transactionOperations = Symbol.for("sporades.database.transactionOperations");
45833
+ var transactionBeforeCommitChecks2 = Symbol.for("sporades.database.transactionBeforeCommitChecks");
45834
+ var resourceTransactionMechanics = Symbol.for("sporades.database.resourceTransactionMechanics");
45835
+ var resourceBootstrapMechanics = Symbol.for("sporades.database.resourceBootstrapMechanics");
45836
+ var resourceConsumptionMechanics = Symbol.for("sporades.database.resourceConsumptionMechanics");
45837
+ var resourceSchemaPublished = Symbol.for("sporades.database.resourceSchemaPublished");
45838
+ var resourceCancelActiveQuery = Symbol.for("sporades.database.resourceCancelActiveQuery");
45839
+
45840
+ // src/mcp-runtime.ts
45841
+ var MCP_OPERATOR_ROUTES = Object.freeze([
45842
+ { tool: "sporades_logs", method: "GET", path: "/__sporades/ops/logs", description: "Recent indexed runtime log events." },
45843
+ { tool: "sporades_logs_tail", method: "GET", path: "/__sporades/ops/logs/tail", description: "Latest events from the durable JSONL log stream." },
45844
+ { tool: "sporades_db_list", method: "GET", path: "/__sporades/ops/db/list", description: "List inspectable database tables." },
45845
+ { tool: "sporades_db_dump", method: "GET", path: "/__sporades/ops/db/dump", description: "Dump every inspectable database table." },
45846
+ {
45847
+ tool: "sporades_db_query",
45848
+ method: "POST",
45849
+ path: "/__sporades/ops/db/query",
45850
+ description: "Run one read-only SQL query against the Capsule database.",
45851
+ input: { type: "object", properties: { sql: { type: "string" } }, required: ["sql"], additionalProperties: false }
45852
+ }
45853
+ ]);
45854
+
45855
+ // src/log-envelope.ts
45856
+ import { randomUUID as randomUUID4 } from "node:crypto";
45857
+
45858
+ // src/runtime-telemetry.ts
45859
+ import { randomUUID as randomUUID3 } from "node:crypto";
45860
+
45819
45861
  // src/runtime-fetch-telemetry.ts
45820
45862
  var fetchStateKey = Symbol.for("sporades.runtime.fetch-telemetry.v1");
45821
45863
  var nativeAborted = Object.getOwnPropertyDescriptor(AbortSignal.prototype, "aborted").get;
@@ -45866,16 +45908,13 @@ function logPayloadMaxBytes(config = {}) {
45866
45908
  return config.logs?.payloadMaxBytes ?? config.logging?.payloadMaxBytes ?? 4096;
45867
45909
  }
45868
45910
 
45869
- // src/live-query-invalidation.ts
45870
- var { AsyncLocalStorage: AsyncLocalStorage2 } = process.getBuiltinModule("node:async_hooks");
45871
- var liveQueryTablesTracked = Symbol.for("sporades.database.liveQueryTablesTracked");
45872
- var liveQueryReads = new AsyncLocalStorage2();
45873
- var quotedIdentifier = String.raw`(?:\[([^\]]+)\]|"([^"]+)")`;
45874
- var readTablePattern = new RegExp(String.raw`\b(?:FROM|JOIN)\s+${quotedIdentifier}`, "gi");
45875
- var writeTablePattern = new RegExp(
45876
- String.raw`^\s*(?:INSERT(?:\s+OR\s+\w+)?\s+INTO|REPLACE\s+INTO|UPDATE(?:\s+OR\s+\w+)?|DELETE\s+FROM)\s+${quotedIdentifier}`,
45877
- "i"
45878
- );
45911
+ // src/ai-config.ts
45912
+ var AI_API_KINDS = Object.freeze(["chat-completions", "responses"]);
45913
+
45914
+ // src/ai-runtime.ts
45915
+ var AI_MAX_PROMPT_BYTES = 256 * 1024;
45916
+ var AI_MAX_SCHEMA_BYTES = 64 * 1024;
45917
+ var AI_MAX_RESPONSE_BYTES = 1024 * 1024;
45879
45918
 
45880
45919
  // src/cli/access-key-operator-envelope.ts
45881
45920
  import { createInterface } from "node:readline/promises";
@@ -46039,22 +46078,6 @@ function sanitizeAccessKeyOperatorEnvelope(value, action, input, invalid4) {
46039
46078
  return { ok: false, data: null, error: canonicalError(value.error, invalid4) };
46040
46079
  }
46041
46080
 
46042
- // src/database-telemetry.ts
46043
- import { AsyncLocalStorage as AsyncLocalStorage3 } from "node:async_hooks";
46044
- var databaseTelemetry = Symbol("sporades.database.telemetry");
46045
- var operationScope = new AsyncLocalStorage3();
46046
-
46047
- // src/database-runtime.ts
46048
- var nodeCryptoModule4 = process.getBuiltinModule("node:crypto");
46049
- var nodeFsModule = process.getBuiltinModule("node:fs");
46050
- var transactionOperations = Symbol.for("sporades.database.transactionOperations");
46051
- var transactionBeforeCommitChecks2 = Symbol.for("sporades.database.transactionBeforeCommitChecks");
46052
- var resourceTransactionMechanics = Symbol.for("sporades.database.resourceTransactionMechanics");
46053
- var resourceBootstrapMechanics = Symbol.for("sporades.database.resourceBootstrapMechanics");
46054
- var resourceConsumptionMechanics = Symbol.for("sporades.database.resourceConsumptionMechanics");
46055
- var resourceSchemaPublished = Symbol.for("sporades.database.resourceSchemaPublished");
46056
- var resourceCancelActiveQuery = Symbol.for("sporades.database.resourceCancelActiveQuery");
46057
-
46058
46081
  // src/server-runtime-source.ts
46059
46082
  var trustedReadTransactionAdapter = Symbol("sporades.trustedReadTransactionAdapter");
46060
46083
  var runtimeOwnedJobEnqueueHandler = Symbol("sporades.runtimeOwnedJobEnqueueHandler");
@@ -46160,7 +46183,7 @@ var mutationExecution = new MutationExecutionStorage();
46160
46183
  init_cli_support();
46161
46184
 
46162
46185
  // src/cli/cli-version.ts
46163
- var CLI_VERSION = "0.9.35";
46186
+ var CLI_VERSION = "0.9.37";
46164
46187
 
46165
46188
  // src/cli/schedule-inspection-envelope.ts
46166
46189
  var SCHEDULE_DIAGNOSTIC_FIELDS = /* @__PURE__ */ new Set([