machinaos 0.0.82 → 0.0.84

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/cli/ports.py CHANGED
@@ -77,9 +77,22 @@ def kill_pid(pid: int, *, graceful_timeout: float = 3.0) -> bool:
77
77
  if sys.platform == "win32":
78
78
  try:
79
79
  os.kill(pid, signal.CTRL_BREAK_EVENT)
80
- except (OSError, ProcessLookupError):
81
- # Target wasn't in its own process group — fall back
82
- # to TerminateProcess via psutil.terminate.
80
+ except (OSError, ProcessLookupError, SystemError):
81
+ # Fall back to TerminateProcess via psutil.terminate.
82
+ # * ``OSError`` -- target wasn't in our process group.
83
+ # * ``SystemError`` -- CPython issue #106148: on
84
+ # Windows, ``os.kill`` returns success AND sets an
85
+ # ``OSError`` when ``GenerateConsoleCtrlEvent``
86
+ # fails with ERROR_INVALID_PARAMETER (e.g. the
87
+ # target process isn't in the caller's console
88
+ # group). CPython detects the inconsistency and
89
+ # raises ``SystemError`` instead of propagating
90
+ # the underlying OSError. ``kill_pid`` is used to
91
+ # clean up stale state (port squatters, orphans
92
+ # from a prior session) -- none of them are in
93
+ # our console group, so this path fires every
94
+ # time on Windows and used to crash
95
+ # ``machina stop``.
83
96
  proc.terminate()
84
97
  else:
85
98
  proc.terminate()
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react-flow-client",
3
3
  "private": true,
4
- "version": "0.0.82",
4
+ "version": "0.0.84",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "start": "vite --host 0.0.0.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "machinaos",
3
- "version": "0.0.82",
3
+ "version": "0.0.84",
4
4
  "description": "Open source workflow automation platform with AI agents, React Flow, and n8n-inspired architecture",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -126,16 +126,20 @@ if (uvVersion) {
126
126
  }
127
127
  }
128
128
 
129
- // Temporal binary: downloaded on first backend boot by
130
- // server/services/temporal/_install.py via pooch (~90 MB tarball
131
- // cached under platformdirs.user_cache). No global npm install.
132
- // User-installed `temporal` on PATH (brew / scoop / cargo) is still
133
- // honoured by the Python supervisor's shutil.which fallback.
129
+ // Temporal binary: downloaded eagerly during install (step [6/6])
130
+ // by ``python -m services.temporal._install``, same call ``machina
131
+ // build`` already makes. The pooch cache (~/.cache/MachinaOs/...)
132
+ // makes re-runs sub-second. Done eagerly because
133
+ // ``TemporalServerRuntime._pre_spawn`` unconditionally calls
134
+ // ``ensure_temporal_binaries`` -- the runtime always uses the
135
+ // pooch-downloaded binary regardless of any system ``temporal`` on
136
+ // PATH -- so pre-fetching here eliminates a 30-90 s stall on the
137
+ // user's first ``machina start``.
134
138
  let temporalVersion = getVersion('temporal --version');
135
139
  console.log(
136
140
  temporalVersion
137
- ? ` temporal: ${temporalVersion} (system install, will be reused)`
138
- : ' temporal: managed by Python backend (pooch download on first boot)',
141
+ ? ` temporal: ${temporalVersion} (system install, pooch copy installed below)`
142
+ : ' temporal: not on PATH, pooch copy installed below',
139
143
  );
140
144
 
141
145
  // agent-browser is managed by the Python backend
@@ -156,7 +160,7 @@ try {
156
160
  // Calculate total steps
157
161
  let totalSteps = 1; // .env always
158
162
  if (!clientDistExists) totalSteps += 2; // client deps + build
159
- totalSteps += 3; // Python deps + bytecode compile + CLI venv
163
+ totalSteps += 4; // Python deps + bytecode compile + CLI venv + Temporal binary
160
164
  let step = 0;
161
165
 
162
166
  // Create .env if needed
@@ -228,6 +232,18 @@ try {
228
232
  }
229
233
  run(`uv pip install --python "${cliVenvPython}" --quiet -e .`, ROOT);
230
234
 
235
+ // Eagerly fetch the official Temporal CLI binary (~90 MB tarball
236
+ // from temporal.download/cli/archive/latest). Same call ``machina
237
+ // build`` step [6/6] makes. The runtime supervisor unconditionally
238
+ // uses this pooch-cached copy via
239
+ // ``TemporalServerRuntime._pre_spawn`` -- it ignores any system
240
+ // ``temporal`` on PATH -- so pre-fetching at install time turns a
241
+ // 30-90 s stall on first ``machina start`` into a sub-second
242
+ // cache hit. Idempotent on re-install (pooch cache).
243
+ step++;
244
+ console.log(`[${step}/${totalSteps}] Installing Temporal binaries...`);
245
+ run('uv run python -m services.temporal._install', serverDir, 600000);
246
+
231
247
  // WhatsApp RPC is now an npm dependency - binary downloaded via postinstall
232
248
  console.log('');
233
249
  console.log('Done!');
package/server/uv.lock CHANGED
@@ -250,30 +250,30 @@ lxml = [
250
250
 
251
251
  [[package]]
252
252
  name = "boto3"
253
- version = "1.43.14"
253
+ version = "1.43.15"
254
254
  source = { registry = "https://pypi.org/simple" }
255
255
  dependencies = [
256
256
  { name = "botocore" },
257
257
  { name = "jmespath" },
258
258
  { name = "s3transfer" },
259
259
  ]
260
- sdist = { url = "https://files.pythonhosted.org/packages/79/4b/616367e871ce3f1cb3e8545a97736b6331b9fb081497f2d44c5b2aa6959d/boto3-1.43.14.tar.gz", hash = "sha256:5c0a994b3182061ee101812e721100717a4d664f9f4ceaf4a86b6d032ce9fc2d", size = 113142, upload-time = "2026-05-22T19:28:47.861Z" }
260
+ sdist = { url = "https://files.pythonhosted.org/packages/4f/1f/ef8f2967570c221681056134d02e70ebd490b795c17cf44d52f898344fbd/boto3-1.43.15.tar.gz", hash = "sha256:8dbb1a129c693313218a099d4f086f3bb48f50159b74b5bd8869e1037fde4101", size = 113161, upload-time = "2026-05-26T19:45:14.203Z" }
261
261
  wheels = [
262
- { url = "https://files.pythonhosted.org/packages/cb/00/59cb9329c18e2d3aa23062ceaa87d065f2e81e7d2931df24d64e9a7815aa/boto3-1.43.14-py3-none-any.whl", hash = "sha256:574335744656cfed0b362a0a0467aaf2eb2bf15526edcd02d31d3c661f4b09e4", size = 140536, upload-time = "2026-05-22T19:28:46.49Z" },
262
+ { url = "https://files.pythonhosted.org/packages/af/8f/373833a5ca86f5b89c7d918c6130aece8d5e43b0c8bdbefac75145abf3f3/boto3-1.43.15-py3-none-any.whl", hash = "sha256:67510ef57a79f0d53b963b0dd1d1741d1e3de1eb2ef6cf1737b6a6bddd34b8cb", size = 140537, upload-time = "2026-05-26T19:45:11.152Z" },
263
263
  ]
264
264
 
265
265
  [[package]]
266
266
  name = "botocore"
267
- version = "1.43.14"
267
+ version = "1.43.15"
268
268
  source = { registry = "https://pypi.org/simple" }
269
269
  dependencies = [
270
270
  { name = "jmespath" },
271
271
  { name = "python-dateutil" },
272
272
  { name = "urllib3" },
273
273
  ]
274
- sdist = { url = "https://files.pythonhosted.org/packages/78/3c/798d2f7deb118241930c7c6bcfb0b970d3f0245bf580700663199aeed2c3/botocore-1.43.14.tar.gz", hash = "sha256:b9e500737e43d2f147c9d4e23b54360335e77d4c0ba90a318f51b65e06cb8516", size = 15382604, upload-time = "2026-05-22T19:28:36.363Z" }
274
+ sdist = { url = "https://files.pythonhosted.org/packages/93/06/4eb6a40f2a5861cd48743765a80e5a6534f26ec0e9884502572cfadeca50/botocore-1.43.15.tar.gz", hash = "sha256:eed2e24962af03ec361a1dc6924f6b2cff0215a0a2f5c690eab655f43d1f700f", size = 15383526, upload-time = "2026-05-26T19:44:57.627Z" }
275
275
  wheels = [
276
- { url = "https://files.pythonhosted.org/packages/27/7e/6e64821077cd2efc4aa51b7d638fb6d48e1c7c450201c529fbaf1de8bfd3/botocore-1.43.14-py3-none-any.whl", hash = "sha256:1f4a2a95ea78c10398e78431e98c1fe47adb54a7b10a32975144c1f541186658", size = 15061424, upload-time = "2026-05-22T19:28:32.682Z" },
276
+ { url = "https://files.pythonhosted.org/packages/51/34/dfdd494cf22a88be269bcf648d28a65f85dcc0f914f52a02f8e740d6ccaf/botocore-1.43.15-py3-none-any.whl", hash = "sha256:bda4923998d1bf17f8eb6bc767a0923fbb9e525ecd50f839b041e469b46e1c94", size = 15063140, upload-time = "2026-05-26T19:44:54.54Z" },
277
277
  ]
278
278
 
279
279
  [[package]]
@@ -2853,14 +2853,14 @@ wheels = [
2853
2853
 
2854
2854
  [[package]]
2855
2855
  name = "s3transfer"
2856
- version = "0.17.0"
2856
+ version = "0.17.1"
2857
2857
  source = { registry = "https://pypi.org/simple" }
2858
2858
  dependencies = [
2859
2859
  { name = "botocore" },
2860
2860
  ]
2861
- sdist = { url = "https://files.pythonhosted.org/packages/9b/ec/7c692cde9125b77e84b307354d4fb705f98b8ccad59a036d5957ca75bfc3/s3transfer-0.17.0.tar.gz", hash = "sha256:9edeb6d1c3c2f89d6050348548834ad8289610d886e5bf7b7207728bd43ce33a", size = 155337, upload-time = "2026-04-29T22:07:36.33Z" }
2861
+ sdist = { url = "https://files.pythonhosted.org/packages/11/b3/bcdc2f58fa92592db511beda154c2c08d28f21f6c4637f06a42a24b10c21/s3transfer-0.17.1.tar.gz", hash = "sha256:042dd5e3b1b512355e35a23f0223e426b7042e80b97830ea2680ddce327fc45e", size = 159439, upload-time = "2026-05-26T19:45:01.714Z" }
2862
2862
  wheels = [
2863
- { url = "https://files.pythonhosted.org/packages/87/72/c6c32d2b657fa3dad1de340254e14390b1e334ce38268b7ad51abda3c8c2/s3transfer-0.17.0-py3-none-any.whl", hash = "sha256:ce3801712acf4ad3e89fb9990df97b4972e93f4b3b0004d214be5bce12814c20", size = 86811, upload-time = "2026-04-29T22:07:34.966Z" },
2863
+ { url = "https://files.pythonhosted.org/packages/85/dd/904873250a6554fbae40cddbf9198e3cc37a2f1319d5e1a5ce82fe269c17/s3transfer-0.17.1-py3-none-any.whl", hash = "sha256:5b9827d1044159bbb01b86ef8902760ea39281927f5de31de75e1d657177bf4c", size = 88264, upload-time = "2026-05-26T19:45:00.452Z" },
2864
2864
  ]
2865
2865
 
2866
2866
  [[package]]