@amalgm/automations 0.4.3 → 0.4.4-main.34257034777

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/AXIOMS.md CHANGED
@@ -65,6 +65,9 @@
65
65
  aliases for one another.
66
66
  23. Automations is a standalone hosted service. Gateway owns none of its API,
67
67
  scheduling, claim, execution, or persistence path.
68
+ Its host validates Core's complete environment binding before opening its
69
+ database, issuer, public API or webhook authority; local has no managed
70
+ service fallback.
68
71
  24. The durable run ledger is the offline queue. The platform never keeps a
69
72
  second online-machine delivery buffer and never drops an unclaimed run.
70
73
  25. A run advances through its immutable plan in order. Every step transition
package/PURPOSE.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## Purpose
4
4
 
5
+ Consumer assembly derives exact same-branch dependency pins from the declared
6
+ package manifests and registry candidate records. One pending composition per
7
+ branch preserves human edits; complete consumer checks for the exact merge tree govern its
8
+ merge, and publication never implies installed adoption.
9
+
10
+ Managed releases bind to one exact published Core version and build from the
11
+ locked dependency graph on the supported Node toolchain.
12
+
5
13
  Automations is the sole owner of Amalgm automation behavior and data. It lets an
6
14
  authenticated user create, inspect, change, delete, and manually run automation
7
15
  configuration — an automation belongs to one user and one target, may own any
@@ -10,6 +18,11 @@ have each trigger occurrence run on the selected existing Amalgm machine.
10
18
  Supabase holds everything except execution: the automation, its triggers, the
11
19
  complete workflow, and permanent run history.
12
20
 
21
+ Each hosted environment reaches only its declared UI issuer, database and
22
+ webhook authority. Main and preview initially share the database by owner
23
+ direction; their public API and issuer identities remain distinct. Durable
24
+ claims remain the single authority for work even when hosts share data.
25
+
13
26
  The initial launch is free, with no payment prerequisite or automatic paid
14
27
  cutover. Shared account limits protect the hosted service: ten configuration
15
28
  API writes and ten newly admitted runs per rolling minute, and at most one
@@ -149,3 +162,31 @@ authority. Shell calls the published machine-claim and execution contracts
149
162
  directly; the UI calls the hosted control plane through the published client.
150
163
  Any remaining Engine automation code is deprecated migration/parity evidence,
151
164
  not a cutover dependency or compatibility authority.
165
+
166
+ ## Managed package delivery
167
+
168
+ Managed package delivery starts from a clean, exact main or preview source
169
+ commit. The workflow occurrence supplies only its generated version and source
170
+ record; tests run against those candidate inputs before packing. Every native
171
+ gate and publication use that same tarball and integrity. A candidate tag makes
172
+ bytes available to release assembly; it never promotes an installed runtime.
173
+ Release tooling remains available inside each owner repository so a developer
174
+ or CI job never needs access to another private product repository.
175
+ Registry credentials are available only to the final protected publication job,
176
+ after every native examination proves the exact candidate bytes.
177
+ Native consumers install the archive as a dependency, so SDK development
178
+ dependencies never become an end-user installation requirement.
179
+ The repository token creates only its own dependency proposals and explicitly
180
+ dispatches checks and delivery; every admitted gate proves the actual checkout,
181
+ including the exact two-parent merge commit that becomes managed source.
182
+
183
+ Hosted delivery examines the final immutable image under both declared managed
184
+ bindings before deploying that exact digest to its source branch's Fly app.
185
+ The host's own pipeline owns replacement, health and provider verification;
186
+ no hosted process updates its package tree in place. A local image examination
187
+ proves image behavior, while Fly networking and durable product journeys retain
188
+ their separate provider proof.
189
+ Every retained Fly member has the examined digest and binding, whether started
190
+ or stopped. Every started member is healthy; the primary region has at least
191
+ the declared minimum of healthy started members with automatic stopping disabled,
192
+ and public readiness passes. Stopped capacity never counts toward that minimum.
package/README.md CHANGED
@@ -331,3 +331,37 @@ behavior, offline catch-up, retry deadlines, and abandoned claims.
331
331
 
332
332
  See [PURPOSE.md](./PURPOSE.md) and [AXIOMS.md](./AXIOMS.md) for the governing
333
333
  ownership and behavior laws.
334
+
335
+ ## Managed package delivery
336
+
337
+ Managed npm delivery uses `.github/workflows/publish-package.yml` after the
338
+ exact main/preview owner checks pass. The occurrence generates a unique
339
+ prerelease version and records its source SHA; it reruns the owner suite, packs
340
+ once, and installs that tarball on Linux, macOS and Windows before publication.
341
+ The `candidate-main`/`candidate-preview` tags are release-assembly inputs and
342
+ never select installed runtimes. `package.json` declares this owner's gates,
343
+ CLI probes, peer-only exports and lifecycle permissions. The standalone runner
344
+ under `scripts/release/` is intentionally copied across owners to preserve
345
+ private repository access boundaries. The final publish step uses the `NPM_TOKEN`
346
+ secret in the `npm-release` environment. Where npm trusted publishing is
347
+ configured for this repository's `publish-package.yml` and that environment,
348
+ the token can be omitted. Authentication does not replace native certification,
349
+ exact source records or artifact integrity; private source repositories do not
350
+ receive npm's public-source provenance.
351
+
352
+ Hosted delivery is separately wired in `release-hosted.yml`: it builds the exact
353
+ source image, tests both declared bindings without network access, deploys the
354
+ same digest to the selected Fly app, then verifies machine identity and public
355
+ readiness. `package.json` owns the host declaration. The Python effect runner is
356
+ an intentional standalone copy from UI; no other private repository is required.
357
+ Live provider and durable product-flow proof remain separate release obligations.
358
+
359
+ Managed dependency reconciliation reads this owner’s declared manifests and
360
+ updates exact same-branch registry candidates in one pending composition PR per
361
+ branch. The repository token explicitly dispatches the owner checks. Every declared gate must
362
+ pass for the exact merge tree; an atomic expected-base update prevents merging
363
+ with untested concurrent source. Human additions or amendments are preserved.
364
+ The half-hour CI reconciliation recovers missed dispatch hints. Assembly runs
365
+ no dependency code or lifecycle hooks, and repeated owner checks do not publish
366
+ another candidate for unchanged source. Repository policy must allow GitHub Actions to create pull requests; no
367
+ cross-repository credential or paid auto-merge feature is required.
@@ -1,12 +1,16 @@
1
+ import { isLoopbackEndpoint, resolveRuntimeEndpoint, validateRuntimeEndpointEnvironment } from '@amalgm/core/binding';
1
2
  export function automationsHostConfig(env = process.env) {
3
+ const publicOrigin = required(env.AMALGAM_PUBLIC_ORIGIN, 'AMALGAM_PUBLIC_ORIGIN');
4
+ const isolatedOrigin = isLoopbackEndpoint(publicOrigin) ? publicOrigin : undefined;
5
+ const binding = validateRuntimeEndpointEnvironment(env, isolatedOrigin);
2
6
  return Object.freeze({
3
7
  port: integer(env.PORT, 8080, 1, 65_535),
4
- publicOrigin: url(env.AMALGAM_PUBLIC_ORIGIN, 'AMALGAM_PUBLIC_ORIGIN'),
5
- webhookOrigin: url(env.AUTOMATIONS_WEBHOOK_ORIGIN, 'AUTOMATIONS_WEBHOOK_ORIGIN'),
8
+ publicOrigin: resolveRuntimeEndpoint(binding, 'automations', publicOrigin, isolatedOrigin),
9
+ webhookOrigin: resolveRuntimeEndpoint(binding, 'automations', required(env.AUTOMATIONS_WEBHOOK_ORIGIN, 'AUTOMATIONS_WEBHOOK_ORIGIN'), isolatedOrigin),
6
10
  webhookTokenKey: secret(env.AUTOMATIONS_WEBHOOK_TOKEN_KEY, 'AUTOMATIONS_WEBHOOK_TOKEN_KEY'),
7
- supabaseUrl: url(env.SUPABASE_URL ?? env.NEXT_PUBLIC_SUPABASE_URL, 'SUPABASE_URL'),
11
+ supabaseUrl: resolveRuntimeEndpoint(binding, 'supabase', required(env.SUPABASE_URL ?? env.NEXT_PUBLIC_SUPABASE_URL, 'SUPABASE_URL'), isolatedOrigin),
8
12
  supabaseServiceRoleKey: required(env.SUPABASE_SERVICE_ROLE_KEY, 'SUPABASE_SERVICE_ROLE_KEY'),
9
- authorizationIssuer: url(env.AMALGM_AUTHORIZATION_ISSUER, 'AMALGM_AUTHORIZATION_ISSUER'),
13
+ authorizationIssuer: resolveRuntimeEndpoint(binding, 'app', required(env.AMALGM_AUTHORIZATION_ISSUER, 'AMALGM_AUTHORIZATION_ISSUER'), isolatedOrigin),
10
14
  schedulerIntervalMs: integer(env.AUTOMATIONS_SCHEDULER_INTERVAL_MS, 1_000, 250, 60_000),
11
15
  });
12
16
  }
@@ -21,14 +25,6 @@ function secret(value, name) {
21
25
  throw new Error(`${name} must contain at least 32 bytes`);
22
26
  return result;
23
27
  }
24
- function url(value, name) {
25
- const parsed = new URL(required(value, name));
26
- const local = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';
27
- if (parsed.protocol !== 'https:' && !(local && parsed.protocol === 'http:')) {
28
- throw new Error(`${name} must use HTTPS`);
29
- }
30
- return parsed.toString().replace(/\/$/, '');
31
- }
32
28
  function integer(value, fallback, minimum, maximum) {
33
29
  const parsed = value === undefined ? fallback : Number(value);
34
30
  if (!Number.isInteger(parsed) || parsed < minimum || parsed > maximum) {
@@ -1 +1 @@
1
- {"$schema":"https://schemas.agentskills.io/discovery/0.2.0/schema.json","skills":[{"name":"amalgm-automations","description":"Set up and use Amalgm to schedule workflows, run native agents and scripts, receive webhooks, and inspect automation results through the amalgm CLI or an existing MCP connection.","type":"archive","url":"./amalgm-automations.97a9eb82d8185b0730c018c7e82479f2597efd19e2a828cfb256d64ac27082af.tgz","digest":"sha256:97a9eb82d8185b0730c018c7e82479f2597efd19e2a828cfb256d64ac27082af"}]}
1
+ {"$schema":"https://schemas.agentskills.io/discovery/0.2.0/schema.json","skills":[{"name":"amalgm-automations","description":"Set up and use Amalgm to schedule workflows, run native agents and scripts, receive webhooks, and inspect automation results through the amalgm CLI or an existing MCP connection.","type":"archive","url":"./amalgm-automations.0eb8fa39c0270d1604168a27f545d14b2bddc14f1cf015d40f504d59a4472115.tgz","digest":"sha256:0eb8fa39c0270d1604168a27f545d14b2bddc14f1cf015d40f504d59a4472115"}]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amalgm/automations",
3
- "version": "0.4.3",
3
+ "version": "0.4.4-main.34257034777",
4
4
  "description": "Amalgm's automation SDK: durable trigger admission and target-machine execution.",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
@@ -45,7 +45,7 @@
45
45
  "README.md"
46
46
  ],
47
47
  "scripts": {
48
- "build": "rm -rf dist && tsc -p tsconfig.build.json && tsx scripts/mark-executables.ts && tsx scripts/build-public-skill.ts",
48
+ "build": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.build.json && tsx scripts/mark-executables.ts && tsx scripts/build-public-skill.ts",
49
49
  "check": "tsx scripts/check-tree.ts && tsc -p tsconfig.json --noEmit",
50
50
  "test": "tsx --test test/*.test.ts",
51
51
  "test:supabase": "tsx --test test/integration/postgres.test.ts",
@@ -53,13 +53,19 @@
53
53
  "verify": "npm run check && npm test && npm run build && tsx scripts/check-cli-artifact.ts",
54
54
  "release:check": "npm run verify && npm run test:supabase",
55
55
  "prepack": "npm run build",
56
- "start": "node dist/host/main.js"
56
+ "start": "node dist/host/main.js",
57
+ "release:admit": "node scripts/release/package.mjs admit",
58
+ "release:prepare": "node scripts/release/package.mjs prepare",
59
+ "release:examine": "node scripts/release/package.mjs examine",
60
+ "release:publish": "node scripts/release/package.mjs publish",
61
+ "release:compose": "node scripts/release/compose.mjs",
62
+ "test:release": "node --test scripts/release/*.test.mjs"
57
63
  },
58
64
  "engines": {
59
- "node": ">=20"
65
+ "node": ">=24"
60
66
  },
61
67
  "dependencies": {
62
- "@amalgm/core": "0.4.4",
68
+ "@amalgm/core": "0.4.8-main.34168902443",
63
69
  "@modelcontextprotocol/sdk": "^1.30.0",
64
70
  "@supabase/supabase-js": "2.57.4",
65
71
  "cron-parser": "^5.4.0",
@@ -72,5 +78,45 @@
72
78
  "pg": "^8.16.3",
73
79
  "tsx": "^4.23.1",
74
80
  "typescript": "5.9.3"
81
+ },
82
+ "amalgmRelease": {
83
+ "schema": 1,
84
+ "workflow": "verify.yml",
85
+ "jobs": [
86
+ "product",
87
+ "notifications"
88
+ ],
89
+ "verify": "verify",
90
+ "cli": [
91
+ "amalgm-automations"
92
+ ]
93
+ },
94
+ "allowScripts": {
95
+ "esbuild@0.28.1": true,
96
+ "fsevents@2.3.3": false
97
+ },
98
+ "amalgmHosts": {
99
+ "automations": {
100
+ "directory": ".",
101
+ "context": ".",
102
+ "dockerfile": "Dockerfile"
103
+ }
104
+ },
105
+ "amalgmComposition": {
106
+ "schema": 1,
107
+ "manifests": [
108
+ "package.json"
109
+ ],
110
+ "afterMergeWorkflows": [
111
+ "publish-package.yml",
112
+ "release-hosted.yml"
113
+ ]
114
+ },
115
+ "gitHead": "cc53b8eb2358f0bb7613a348150a2e0b1c067129",
116
+ "amalgmSource": {
117
+ "repository": "amalgm-inc/amalgm-automations",
118
+ "branch": "main",
119
+ "commit": "cc53b8eb2358f0bb7613a348150a2e0b1c067129",
120
+ "occurrence": "34257034777"
75
121
  }
76
122
  }