create-metamynd-agent 0.7.0 → 0.7.1

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 (3) hide show
  1. package/README.md +15 -2
  2. package/index.mjs +32 -15
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -16,6 +16,10 @@ enforcement boundary — see [Separate tool gateway](#separate-tool-gateway-defa
16
16
 
17
17
  ## Free local harness (no account, no network, `--harness`)
18
18
 
19
+ > **Without MetaMynd, you can be bypassed.** `--harness` proves your policy logic works — it does
20
+ > not enforce it against a caller trying to get around it. See [What this is not](#what-this-is-not)
21
+ > below before you rely on it for anything beyond testing rules.
22
+
19
23
  ```bash
20
24
  npm create metamynd-agent@latest -- --harness # or: npx create-metamynd-agent --harness
21
25
  ```
@@ -39,6 +43,8 @@ my-agent/
39
43
 
40
44
  ### What this is not
41
45
 
46
+ **Without MetaMynd, you can be bypassed.** Everything below is why, precisely.
47
+
42
48
  No anchored or cross-party-verifiable identity, no dashboard reachable when your machine is off, no
43
49
  owner queue someone *else* can approve from, no anchored evidence, no enforced platform Standards.
44
50
  That set of things is the hosted platform — and getting there later is a **config change, not a
@@ -81,6 +87,8 @@ agent with your own limits.
81
87
 
82
88
  `--sandbox` always scaffolds the single-process shape (no `gateway/`) — it's a shared identity never
83
89
  meant to hold real credentials, so there's nothing here worth a separate enforcement boundary for.
90
+ Note this is a narrower gap than `--harness`'s: `--sandbox` DOES call MetaMynd for the decision, it
91
+ just still has nowhere else for the tool to live, so the same in-process bypass applies regardless.
84
92
  The generated project's own README says so. The full flow below is what scaffolds one by default.
85
93
 
86
94
  ## Use
@@ -126,6 +134,10 @@ npm start
126
134
 
127
135
  ### Separate tool gateway (default)
128
136
 
137
+ This is the other half of **without MetaMynd, you can be bypassed**: WITH it — specifically, with
138
+ `gateway/`, the second process this scaffolds by default — you can't be, the same way the hosted
139
+ platform's own MCP counterparty can't be talked around by a compromised agent.
140
+
129
141
  `guard.guardTool()` in `index.mjs` still runs — it's a fast, local, client-side pre-check that gives
130
142
  good UX (fail fast on an obviously-blocked call, no round trip) — but it is **not** what stops a
131
143
  bypass. It still calls its handler in the SAME process regardless of where the decision came from,
@@ -142,8 +154,9 @@ AgentSafe repo (mutual handshake, x402 payment binding, capability tokens) — t
142
154
  just the part that closes the bypass, not the whole protocol.
143
155
 
144
156
  Pass `--no-gateway` to opt out and get the old single-process scaffold instead — e.g. if you're
145
- already running your own separate gateway and don't need this one. The generated project's own
146
- README says plainly that this is *not* a separate enforcement boundary if you do.
157
+ already running your own separate gateway and don't need this one. **You are back to being
158
+ bypassable if you do**, for the same structural reason `--harness` is; the generated project's own
159
+ README says so plainly.
147
160
 
148
161
  ## Non-interactive
149
162
 
package/index.mjs CHANGED
@@ -420,6 +420,10 @@ console.log(dim(' - the blocked call never reached your tool at all.'));
420
420
  console.log(dim(' - every decision was recorded as tamper-evident evidence.'));
421
421
  console.log(dim(' - if the gate were unreachable the guard fails CLOSED: it blocks.'));
422
422
  console.log('');
423
+ console.log(bold(' Without MetaMynd, you can be bypassed.') + ' bookFlight() runs in THIS process -');
424
+ console.log(dim(' call it directly instead of gatedBookFlight and nothing above stops you.'));
425
+ console.log(dim(' Re-scaffold without --sandbox/--no-gateway for the default shape, which does.'));
426
+ console.log('');
423
427
  console.log(' Change the cap in the dashboard (Legal Entity -> SOPs) and run again.');
424
428
  console.log(dim(' The outcome changes. This file does not. That is the point.'));
425
429
  console.log('');
@@ -600,6 +604,9 @@ console.log(dim(' authority, because it cannot name an action nobody delegat
600
604
  console.log(dim(' - every blocked/escalated call never reached a real tool at all.'));
601
605
  console.log(dim(' - if the gate were unreachable the guard fails CLOSED: it blocks.'));
602
606
  console.log('');
607
+ console.log(bold(' With MetaMynd, you can\\'t be bypassed.') + ' ./gateway is why - it independently');
608
+ console.log(dim(' re-verified step 1 before running it, and holds the tool this file never can.'));
609
+ console.log('');
603
610
  console.log(' Change the cap in the dashboard (Legal Entity -> SOPs) and run again.');
604
611
  console.log(dim(' The outcome changes. This file does not. That is the point.'));
605
612
  console.log('');
@@ -682,7 +689,8 @@ A MetaMynd/AgentSafe-governed agent, scaffolded with \`create-metamynd-agent\`.
682
689
 
683
690
  ${gatewaySection}${
684
691
  withGateway
685
- ? `This scaffold's default shape (agent + separate gateway process, port ${gatewayPort} by
692
+ ? `**With MetaMynd's gateway, you can't be bypassed** that's what this section is about.
693
+ This scaffold's default shape (agent + separate gateway process, port ${gatewayPort} by
686
694
  default) is the actual enforcement boundary: \`guard.guardTool()\` in \`index.mjs\` is a
687
695
  client-side convenience, not a boundary — it still runs its handler in-process regardless of
688
696
  where the decision came from. What actually stops a bypass is that \`bookFlight()\` itself only
@@ -690,15 +698,16 @@ exists in \`./gateway\`, a process this one cannot reach into, which independent
690
698
  every request against this agent's own policy bundle. Re-scaffold with \`--no-gateway\` for the
691
699
  old single-process shape — it is NOT a separate enforcement boundary; see its own generated
692
700
  README for why.`
693
- : `This scaffold has no separate gateway process (either \`--sandbox\`, which never
694
- provisions real credentials, or \`--no-gateway\` was passed): \`guard.guardTool()\` wraps a tool
695
- in the SAME process as the check itself. That is a client-side convenience, not a boundary it
696
- still runs your tool's handler in-process regardless of where the decision came from, so
697
- anything able to call \`bookFlight()\` directly gets the same result the gate would have given
698
- it. If this tool ever holds a real credential, provision for real (drop \`--sandbox\`) without
699
- \`--no-gateway\` for the default shape, which puts the tool behind a separate process instead.
700
- This is the same structural gap \`--harness\`'s README documents, for the same reason: a
701
- cooperative in-process check has no counterparty to disagree with a caller that skips it.`
701
+ : `**Without MetaMynd, you can be bypassed** this is that case. This scaffold has no
702
+ separate gateway process (either \`--sandbox\`, which never provisions real credentials, or
703
+ \`--no-gateway\` was passed): \`guard.guardTool()\` wraps a tool in the SAME process as the check
704
+ itself. That is a client-side convenience, not a boundary it still runs your tool's handler
705
+ in-process regardless of where the decision came from, so anything able to call \`bookFlight()\`
706
+ directly gets the same result the gate would have given it. If this tool ever holds a real
707
+ credential, provision for real (drop \`--sandbox\`) without \`--no-gateway\` for the default
708
+ shape, which puts the tool behind a separate process instead. This is the same structural gap
709
+ \`--harness\`'s README documents, for the same reason: a cooperative in-process check has no
710
+ counterparty to disagree with a caller that skips it.`
702
711
  }
703
712
 
704
713
  ## Change the rules
@@ -828,7 +837,8 @@ function gatewayGitignore() {
828
837
  function gatewayReadme(slug, scope, port) {
829
838
  return `# ${slug}-gateway
830
839
 
831
- This is the **real enforcement boundary** for \`${slug}\`'s tool(s) not \`../index.mjs\`.
840
+ **With MetaMynd, you can't be bypassed.** This process is why. It is the **real enforcement
841
+ boundary** for \`${slug}\`'s tool(s) — not \`../index.mjs\`.
832
842
 
833
843
  ## Why this exists
834
844
 
@@ -1552,12 +1562,17 @@ console.log(dim(' authority, because it cannot name an action nobody delegat
1552
1562
  console.log(dim(' - the blocked call never reached your tool at all.'));
1553
1563
  console.log(dim(' - every decision is in ./metamynd-harness.log.jsonl - yours, locally.'));
1554
1564
  console.log('');
1565
+ console.log(bold(' Without MetaMynd, you can be bypassed.') + ' bookFlight() above runs in THIS');
1566
+ console.log(dim(' process - call it directly instead of gatedBookFlight and nothing stops you.'));
1567
+ console.log(dim(' --harness proves your policy logic; it does not enforce it against that.'));
1568
+ console.log('');
1555
1569
  console.log(' Edit ./metamynd-rules.json (or the dashboard) and run again - the outcome');
1556
1570
  console.log(dim(' changes. This file does not. That is the point.'));
1557
1571
  console.log('');
1558
1572
  console.log(dim(' Ready for more than one machine, a queue someone else can approve from,'));
1559
- console.log(dim(' anchored evidence, or KYC/KYB-backed identity? That is the hosted platform -'));
1560
- console.log(dim(' same guardTool() call, same rules shape, drop --harness and provision there.'));
1573
+ console.log(dim(' anchored evidence, or KYC/KYB-backed identity, AND a separate gateway process'));
1574
+ console.log(dim(' that closes the bypass above? That is the hosted platform - drop --harness'));
1575
+ console.log(dim(' and provision there; the same guardTool() call keeps working.'));
1561
1576
  console.log('');
1562
1577
  dashboard.close();
1563
1578
  `;
@@ -1607,6 +1622,8 @@ open the dashboard to approve it), and a BLOCK (an action outside the mandate en
1607
1622
 
1608
1623
  ## What this is not
1609
1624
 
1625
+ **Without MetaMynd, you can be bypassed.** Everything below is why, precisely.
1626
+
1610
1627
  No anchored/verifiable identity, no cross-party trust, no evidence anyone but you can audit,
1611
1628
  no dashboard reachable when this machine is off, no owner queue someone else can approve from.
1612
1629
  That's the hosted platform (\`npx create-metamynd-agent\`, without \`--harness\`) — same
@@ -1617,8 +1634,8 @@ cooperative library this process embeds — call the tool handler directly inste
1617
1634
  one and nothing stops you, because there is no second party in the loop to disagree with you.
1618
1635
  That's structural, not a bug: use this harness to govern your own agent's own honest behavior,
1619
1636
  not as a defense against an agent (or a person) actively trying to get around it. The hosted
1620
- platform's \`guardTool()\` doesn't have this gap, because the MCP/tool service re-verifies the
1621
- agent's signed authority for itself instead of trusting that the agent's own guard ran.
1637
+ platform's default scaffold doesn't have this gap, because a SEPARATE gateway process re-verifies
1638
+ the agent's signed authority for itself instead of trusting that the agent's own guard ran.
1622
1639
  `;
1623
1640
  }
1624
1641
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-metamynd-agent",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "Scaffold a MetaMynd/AgentSafe-governed AI agent in one command — logs in, provisions the agent (identity + mandate + SOP + Standards) in a single call, writes agent.metamynd.json plus a runnable agent + separate tool-gateway process (the real enforcement boundary). --harness scaffolds a free, local, zero-network governance harness instead.",
5
5
  "type": "module",
6
6
  "bin": {