@officexapp/vidfarm-devcli 0.21.50 → 0.21.51

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.
@@ -17,10 +17,33 @@
17
17
  // Windows-on-ARM note: neither ffprobe-installer nor ffmpeg-static publishes a
18
18
  // win32-arm64 build, so steps 2/3 return null there and PATH is the only route.
19
19
  // That is not a regression — ffmpeg-static already had the same gap.
20
- import { existsSync } from "node:fs";
20
+ import { accessSync, chmodSync, constants as fsConstants, existsSync, statSync } from "node:fs";
21
21
  import { createRequire } from "node:module";
22
22
  const requireFrom = createRequire(import.meta.url);
23
23
  let cached;
24
+ /**
25
+ * The @ffprobe-installer/<platform> tarballs ship `ffprobe` with mode 0644 (and
26
+ * no `bin` entry, so npm never adds the execute bit) — the old `ffprobe-static`
27
+ * chmod'd it in a postinstall script, this one does not. Without the bit every
28
+ * spawn fails with EACCES. Best-effort: a read-only filesystem (Lambda
29
+ * /var/task) throws, and there the image build must set the bit instead.
30
+ */
31
+ function ensureExecutable(binPath) {
32
+ try {
33
+ accessSync(binPath, fsConstants.X_OK);
34
+ return;
35
+ }
36
+ catch {
37
+ // not executable — try to fix it below
38
+ }
39
+ try {
40
+ chmodSync(binPath, statSync(binPath).mode | 0o111);
41
+ }
42
+ catch {
43
+ // read-only install (container image, nix store, root-owned global) — the
44
+ // caller still gets the path and the spawn error stays explicit.
45
+ }
46
+ }
24
47
  /** Pull `.path` off whichever module shape the installer package exports. */
25
48
  function readPath(mod) {
26
49
  if (typeof mod === "string")
@@ -48,8 +71,10 @@ export function resolveBundledFfprobe() {
48
71
  for (const pkg of ["@ffprobe-installer/ffprobe", "ffprobe-static"]) {
49
72
  try {
50
73
  const resolved = readPath(requireFrom(pkg));
51
- if (resolved && existsSync(resolved))
74
+ if (resolved && existsSync(resolved)) {
75
+ ensureExecutable(resolved);
52
76
  return (cached = resolved);
77
+ }
53
78
  }
54
79
  catch {
55
80
  // not installed for this platform — try the next candidate
package/marketplace.md CHANGED
@@ -86,6 +86,16 @@ So a free account is not locked out of the marketplace, it is on the other side
86
86
 
87
87
  Practical rule: **run both**. Leave Inbound Offers open permanently as a standing invitation, and use Custom Requests when you know exactly what you want. Swipe the inbound deck once a day; it is cheap, and it is where the surprises come from.
88
88
 
89
+ **Your pitch box starts with four $0 tutorial videos.** vidfarm seeds every Inbound Offers machine with four short explainers, submitted by the `onboarding@vidfarm.cc` gigworker as ordinary inbound proofs. They carry `task_identifier: vidfarm_onboarding_*` and `asking_price: 0`, so the swipe deck has real cards on your very first visit and you learn the product by swiping it. Watch them, then keep or pass exactly as you would a real pitch. They sit at the TOP of the deck in their authored order, so you meet the product before the pitches. Everything under them is **oldest first** — the swipe stack is a queue, and the pitch that has waited longest comes up next.
90
+
91
+ They are free **only if you approve at the ask**. dollarplatoon never lets a submission lock at `$0` by itself, so `locked_price` still shows the machine price of `$0.10`; the $0 is the worker's quote. The swipe page pre-selects it for you. An agent approving by API must name it:
92
+
93
+ ```bash
94
+ curl -s -X PATCH -H "x-api-key: $DOLLARPLATOON_API_KEY" -H "Content-Type: application/json" \
95
+ -d '{"action":"approve","amount":0,"feedback":"Watched, thanks."}' \
96
+ "https://dollarplatoon.com/api/gigs/$INBOUND_GIG/proofs/$PROOF_ID"
97
+ ```
98
+
89
99
  Both machines are ordinary dollarplatoon gigs underneath — same proofs, same approvals, same rollups, same USDC on Base. `/marketplace` is only a friendlier face on them. Anything below can also be done from `dollarplatoon.com` directly.
90
100
 
91
101
  ### Telling your AI agent to work the marketplace
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@officexapp/vidfarm-devcli",
3
- "version": "0.21.50",
3
+ "version": "0.21.51",
4
4
  "description": "Local bridge for the Vidfarm Trackpad Editor. `vidfarm serve <template_id>` boots the FULL editor on localhost (disk-backed records/storage, free in-process render); edit composition.html on disk (Claude Code, Codex, etc.) and the browser live-morphs it.",
5
5
  "type": "module",
6
6
  "bin": {