@passioncode-ai/fabric-agent-adapter 0.73.0 → 0.74.0

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 (34) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/README.md +4 -3
  3. package/SECURITY.md +17 -0
  4. package/package.json +1 -1
  5. package/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +1 -1
  6. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +3 -3
  7. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/dashboard-links.md +6 -2
  8. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py +2 -2
  9. package/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +14 -15
  10. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/board.md +4 -1
  11. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/connectors.md +2 -1
  12. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/dashboard-links.md +6 -2
  13. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/delegation.md +3 -1
  14. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/interop.md +3 -1
  15. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/kit-modules.md +1 -0
  16. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/lifecycle.md +10 -4
  17. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/protocol.md +33 -4
  18. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/surfaces-and-auth.md +6 -4
  19. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_dashboard_layout.mjs +19 -2
  20. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service.py +37 -3
  21. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service_rules.py +38 -0
  22. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-http.mjs +53 -3
  23. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-hub.mjs +16 -5
  24. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-peer-owner.mjs +545 -0
  25. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-supervisors.mjs +43 -7
  26. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_http.py +29 -4
  27. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_hub.py +13 -4
  28. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_peer_owner.py +845 -0
  29. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_supervisors.py +35 -5
  30. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/kit.json +122 -9
  31. package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +3 -3
  32. package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/dashboard-links.md +6 -2
  33. package/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +1 -1
  34. package/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_env.py +1 -1
@@ -3,6 +3,7 @@ removed without touching what the operator turned off; release pruning (LC-15).
3
3
  (FAA-65, layer L3)."""
4
4
  from __future__ import annotations
5
5
 
6
+ import http.client
6
7
  import json
7
8
  import os
8
9
  import plistlib
@@ -13,14 +14,16 @@ import sys
13
14
  import tempfile
14
15
  import time
15
16
  import urllib.error
17
+ import urllib.parse
16
18
  import urllib.request
17
19
  from pathlib import Path, PurePath
18
- from typing import Any, Callable, Dict, List, Optional, Sequence
20
+ from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple
19
21
 
20
22
  import sys as _sys # noqa: E402
21
23
  from pathlib import Path as _Path # noqa: E402
22
24
  if str(_Path(__file__).resolve().parent) not in _sys.path: # the kit loads from any working directory (FAA-65)
23
25
  _sys.path.insert(0, str(_Path(__file__).resolve().parent))
26
+ import fabric_peer_owner as _po # noqa: E402 - the listener's owner (DEC-0154 HA-2)
24
27
  from fabric_base import (
25
28
  DRAIN_SECONDS,
26
29
  SUPERVISOR_ENV,
@@ -304,12 +307,34 @@ def launchd_loaded(label: str) -> bool:
304
307
  return _launchctl("print", "%s/%s" % (_domain(), label)).returncode == 0
305
308
 
306
309
 
307
- def fetch_well_known(origin: str, timeout: float = 2.0) -> Optional[Dict[str, Any]]:
310
+ def _read_well_known(origin: str, timeout: float = 2.0) -> Tuple[Optional[Dict[str, Any]], Optional[str]]:
311
+ """(the well-known answer or None, why the listener was refused or None). A loopback origin is read only on a
312
+ connection whose server end is this OS account's process (DEC-0154 HA-2): another account's, root's, or one whose
313
+ owner cannot be told is `foreign-user`, never this service's answer."""
314
+ parts = urllib.parse.urlsplit(origin)
315
+ if parts.scheme == "http" and parts.hostname == "127.0.0.1" and parts.port:
316
+ conn = _po.CheckedHTTPConnection("127.0.0.1", parts.port, timeout=timeout)
317
+ try:
318
+ conn.request("GET", "/.well-known/fabric-service", headers={"Host": "127.0.0.1:%d" % parts.port})
319
+ response = conn.getresponse()
320
+ return (json.loads(response.read().decode()) if response.status == 200 else None), None
321
+ except _po.ListenerRefused as exc:
322
+ return None, "foreign-user: %s" % exc
323
+ except (OSError, ValueError, http.client.HTTPException):
324
+ return None, None
325
+ finally:
326
+ conn.close()
308
327
  try:
309
328
  with urllib.request.urlopen(origin + "/.well-known/fabric-service", timeout=timeout) as response:
310
- return json.loads(response.read().decode())
329
+ return json.loads(response.read().decode()), None
311
330
  except (urllib.error.URLError, OSError, ValueError):
312
- return None
331
+ return None, None
332
+
333
+
334
+ def fetch_well_known(origin: str, timeout: float = 2.0) -> Optional[Dict[str, Any]]:
335
+ """The well-known answer at `origin`, or None: nothing answers, the answer is not JSON, or the listener is not this
336
+ OS account's process (DEC-0154 HA-2)."""
337
+ return _read_well_known(origin, timeout)[0]
313
338
 
314
339
 
315
340
  _OVERRIDE_ROW = re.compile(r'^\s*"([^"]+)"\s*=>\s*(\S+)\s*\Z')
@@ -367,11 +392,16 @@ def launchd_install(label: str, plist_path: Path, plist_bytes: bytes, *, origin:
367
392
  else:
368
393
  raise ServiceError("launchctl bootstrap failed: %s" % last)
369
394
  deadline = time.time() + timeout
395
+ foreign = None
370
396
  while time.time() < deadline:
371
- doc = fetch_well_known(origin)
397
+ doc, foreign = _read_well_known(origin)
372
398
  if doc and doc.get("service", {}).get("id") == service_id and doc.get("service", {}).get("instance") == instance:
373
399
  return doc
374
400
  time.sleep(0.5)
401
+ if foreign:
402
+ # DEC-0154 HA-2 and service.md's Install row: a listener of another account is never a successful install.
403
+ raise ServiceError("%s is not this service's: %s (DEC-0154 HA-2); the port is another OS account's or its owner "
404
+ "cannot be told." % (origin, foreign))
375
405
  raise ServiceError("%s did not answer as %s.%s within %.0f s; read its log." % (origin, service_id, instance, timeout))
376
406
 
377
407
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fabric-service-kit",
3
- "version": "0.73.0",
3
+ "version": "0.74.0",
4
4
  "about": "The service kit's modules in dependency order: a module imports only modules listed before it. Written by fabric_kit.py build; edit the order and layers by hand, never the digests.",
5
5
  "python": [
6
6
  {
@@ -33,6 +33,13 @@
33
33
  "imports": [],
34
34
  "sha256": "53c5df8d6f2c87433c288853bfaad9a43f544789bdf1e39bda8d3ff14485c89d"
35
35
  },
36
+ {
37
+ "module": "fabric_peer_owner",
38
+ "file": "fabric_peer_owner.py",
39
+ "layer": "L0",
40
+ "imports": [],
41
+ "sha256": "3d66b1084c0b8b11ccfc4c66c1b32751ea237df03d864bfc0661d1a2e4665338"
42
+ },
36
43
  {
37
44
  "module": "fabric_crypto",
38
45
  "file": "fabric_crypto.py",
@@ -328,9 +335,10 @@
328
335
  "fabric_base",
329
336
  "fabric_lock",
330
337
  "fabric_paths",
338
+ "fabric_peer_owner",
331
339
  "fabric_secrets"
332
340
  ],
333
- "sha256": "3c5b2e8c310738720b1c1b779be4710e90251013d9be4c68f9952edc0bf55d5f"
341
+ "sha256": "bf5aac4034468f966cefae28dcbdca7f04f42fe73aefd1bac1b377cf4bda2b74"
334
342
  },
335
343
  {
336
344
  "module": "fabric_service",
@@ -406,9 +414,10 @@
406
414
  "layer": "L4",
407
415
  "imports": [
408
416
  "fabric_estate",
417
+ "fabric_peer_owner",
409
418
  "fabric_service"
410
419
  ],
411
- "sha256": "b9ac852e601b1d54cf61351677a628afc69faeed7d1fc74ebe541c1cf38e0c2a"
420
+ "sha256": "c261a81616c52f603eb28cc12ec4034dc479f0517328a65f0dc48d436cf0708b"
412
421
  },
413
422
  {
414
423
  "module": "fabric_board_shapes",
@@ -482,9 +491,10 @@
482
491
  "file": "fabric_http.py",
483
492
  "layer": "L4",
484
493
  "imports": [
485
- "fabric_jsvalue"
494
+ "fabric_jsvalue",
495
+ "fabric_peer_owner"
486
496
  ],
487
- "sha256": "8b443477dc29d5a1fe908b9dccaf68f05fab837eae0670074051a1dd2dfb71ad"
497
+ "sha256": "e02b049b40eaabd994d93c7b084ee34ef3a78b5cbb61303b8e519b906af3c27a"
488
498
  },
489
499
  {
490
500
  "module": "fabric_openrouter",
@@ -527,6 +537,13 @@
527
537
  "imports": [],
528
538
  "sha256": "5822a7e25ecf2e87b5bab4f99c1074af7379d8b49e2784283b5d7d8c25022cde"
529
539
  },
540
+ {
541
+ "module": "fabric-peer-owner",
542
+ "file": "fabric-peer-owner.mjs",
543
+ "layer": "L0",
544
+ "imports": [],
545
+ "sha256": "0e65d59bc1048a5635c8ac04e73fe4fd1f34094902ced1580859017e5ca5a991"
546
+ },
530
547
  {
531
548
  "module": "fabric-crypto",
532
549
  "file": "fabric-crypto.mjs",
@@ -821,9 +838,10 @@
821
838
  "fabric-base",
822
839
  "fabric-lock",
823
840
  "fabric-paths",
841
+ "fabric-peer-owner",
824
842
  "fabric-secrets"
825
843
  ],
826
- "sha256": "d45c38de0cb3ed85e083496c2d3c51dab004454accdd87f4762a512a6d442573"
844
+ "sha256": "e33b2b8916aeed617eee6233e05bd637bb4ecd87064248fd7ea08fdfcd45d375"
827
845
  },
828
846
  {
829
847
  "module": "fabric-service",
@@ -891,9 +909,10 @@
891
909
  "layer": "L4",
892
910
  "imports": [
893
911
  "fabric-estate",
912
+ "fabric-peer-owner",
894
913
  "fabric-service"
895
914
  ],
896
- "sha256": "c005115a864cfd67daa4862097bb14acfe5a60bf653897e5bf8a570dd80f1070"
915
+ "sha256": "73ab07f72320a50042f39b52893b563157be2ac94615614416df45a796eac988"
897
916
  },
898
917
  {
899
918
  "module": "fabric-board-shapes",
@@ -966,8 +985,10 @@
966
985
  "module": "fabric-http",
967
986
  "file": "fabric-http.mjs",
968
987
  "layer": "L4",
969
- "imports": [],
970
- "sha256": "317d7668c291570d4d93bc73295312f2853eb93940f4cf754a4a4619cb87ace9"
988
+ "imports": [
989
+ "fabric-peer-owner"
990
+ ],
991
+ "sha256": "b83b4c0c208763d56c3eebda5fe9e4a46d595cd91227699bf6876e65a3c7f9b9"
971
992
  },
972
993
  {
973
994
  "module": "fabric-openrouter",
@@ -5856,6 +5877,98 @@
5856
5877
  "fabric-openrouter.mjs": "6041f3ab30f516658e1dbab4897a651cc8509b2136cfa8e769802c6b40ec2f35",
5857
5878
  "fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
5858
5879
  "share-registration.schema.json": "34b3997eeaf936ebc861342a23045634a7c18c19f01d7ed4198310d81989f5b0"
5880
+ },
5881
+ "0.74.0": {
5882
+ "fabric_jsvalue.py": "052f1b40bab18600b3731dbdca27cbff17588c21d9458fa6241efd1340d0e09a",
5883
+ "fabric_time.py": "588f383da4ac6a243ea95b6ffc3a0aa99ca94245732dc4937734f190b7af4ae9",
5884
+ "fabric_identifiers.py": "0fd814d521ac3aa39907458265870753046a73f48af3d8581ab864b93b211607",
5885
+ "fabric_secrets.py": "53c5df8d6f2c87433c288853bfaad9a43f544789bdf1e39bda8d3ff14485c89d",
5886
+ "fabric_peer_owner.py": "3d66b1084c0b8b11ccfc4c66c1b32751ea237df03d864bfc0661d1a2e4665338",
5887
+ "fabric_crypto.py": "9c34aee20dbe4d6742e4fdbaab68ceb934bbe7dbd3a904c0010824ace16cdeaa",
5888
+ "fabric_base.py": "f62bcc2ed9912660fa875d27a09f60867260cc4925f79873501fd9620be59611",
5889
+ "fabric_platform.py": "a9350dff55ef0fb3a23cdb4d0320a15868b15a8deb10d2eb74d72c58740c284b",
5890
+ "fabric_paths.py": "8a1ee742f80f436e9f28c61b4f049a9545de2a9e0d66bfc61faa6ee5d1ba3734",
5891
+ "fabric_estate_rules.py": "8b36a7f4108d9c2b1fb38c8bff344778c807bed631a99b4a563ecb0a49c10b1c",
5892
+ "fabric_estate.py": "0737ae1d1bb12586bae49de1f15ef1348bc207b5007cced9dad4c55bb5870874",
5893
+ "fabric_mandate.py": "fb19ce5359606bd6e3352ab02b2a12f49605ec6e5c49b55cce1f79c831325044",
5894
+ "fabric_delegation.py": "716f0ff7ac01095f54b24970beac1962128e8ff33026b243fc0467876142ab03",
5895
+ "fabric_share.py": "da36a466426fc29dd7dd40013167f3959a18375f8fedd228bf64f298cec1040c",
5896
+ "fabric_ceremonies.py": "a59e83cf4adb2669a9b98008e3d3a0cba991a35cbff97bc604fc82fe81cfd49f",
5897
+ "fabric_package_schema.py": "e623f0408d38e3343ed66222fb812907c6c52e1a286eb1c1176ab2e64640c9ad",
5898
+ "fabric_package.py": "1f2b9e73b2b32a7e1e887d4b69f87c6e21b4d1227ad924a235334223e6dd51ca",
5899
+ "fabric_protocols.py": "077c6f03f3b887a2e22d9ce6b5bd3750199d71a29d4c82b1d5af8a615b509d93",
5900
+ "fabric_actions.py": "ae21d1199614c4f74d1dcd1e0a87107a9d52434cd9e2d64aa24a7b1e196fb723",
5901
+ "fabric_connections.py": "7de55cb7d808f756d650effabfaa12027d40a5bd5d2f6d448c32969d47529ecb",
5902
+ "fabric_a2a.py": "8b01502131215bb4de1c01866187c56e99b791543923ed8577535573db33b919",
5903
+ "fabric_page_links.py": "1b57ea573c550e2f90d1ec3edcc655917ceaa0db9dd1635fccf422ec3024d25e",
5904
+ "fabric_lock.py": "dfaf92a7086cbb097d832a305869b7964e2d2a9da0e3365c8ec1685a7bb4fef9",
5905
+ "fabric_usage.py": "5cc2e03ccc5b06e81987ed7bc3eead7a7e6cbf1a7cb8e05c6c64315eed9d91b6",
5906
+ "fabric_backups.py": "1f3f0d7ecf361b29e9101e07f1c53e5dc304d598bf26fd59ec89f16b9fed2420",
5907
+ "fabric_descriptor.py": "c08c91ca0960c694ed7677e7e9247d6307c7b63f37a7e614db022c080cd92ccc",
5908
+ "fabric_context.py": "6ae311ddc7217a4aff915e7ce2646486931acd128462b7bebe4a52bbb5fbb6c7",
5909
+ "fabric_auth.py": "74ccc10239b65a3567cec5213a7b344cbd88d6eee1fd1c5f7be1d6daf985993c",
5910
+ "fabric_events.py": "cd94b186e2a8f8cb4ad2b6bd44d83ec5021933075e28c5d655f387f16dff42b8",
5911
+ "fabric_logs.py": "86dc55bfafa2a57264722e2403510a249b95de0e4a722b2e4bc3948e3bd93da9",
5912
+ "fabric_supervisors.py": "bf5aac4034468f966cefae28dcbdca7f04f42fe73aefd1bac1b377cf4bda2b74",
5913
+ "fabric_service.py": "4b13f90aa26881fbfe0d9f3077fbb3552f3ce0a3c59279d6baa92df872867d8d",
5914
+ "fabric_profiles.py": "26e21ec29c016000f8ca8053b7b489184854a73be1b7fdc0a18d12990203db9b",
5915
+ "fabric_interop_rules.py": "9bdb7989e57b9d0b0d15eb9982d396499823a5e2c528230b71c67866c736e0f5",
5916
+ "fabric_interop.py": "d27e31834611a37cf2a117746f2f60fc187ccc48718eb546ff923c5d0fce7dea",
5917
+ "fabric_hub.py": "c261a81616c52f603eb28cc12ec4034dc479f0517328a65f0dc48d436cf0708b",
5918
+ "fabric_board_shapes.py": "0a0e8d3d40e33dfd8c457aedb85330b2ff25f8c49a33eb6cbd5a5cc8a5007f7e",
5919
+ "fabric_board_link.py": "052bc3c474ece835bb428c37ca864810d04e394d991ddb9c93989a7a825073a5",
5920
+ "fabric_board_slots.py": "92b065e3df935547cf46653245f1129e4a1f8b59b0a41e8fa9ffdc41596ee592",
5921
+ "fabric_board_session.py": "1fd3c3884f3044b56a40f78b33ff88dcac9272284f6681ea359c662879826f7e",
5922
+ "fabric_board_fixture.py": "69761ce205ec640762ec9b591c6903e5a87f844e8d423b041681924027e39d1e",
5923
+ "fabric_board.py": "f86c40b8291f8c818f6924910f4022b013d5fd107abaf8825dd0aa6c5e418638",
5924
+ "fabric_http.py": "e02b049b40eaabd994d93c7b084ee34ef3a78b5cbb61303b8e519b906af3c27a",
5925
+ "fabric_openrouter.py": "d06a40f83f2fb8bd441ab3485ae882f1fbdd9cd7a9c1ec175eb47cb8ae2cce81",
5926
+ "fabric-jsvalue.mjs": "dfbdb8c41584972c9389750a41719374a1cfc5652ed438dd1623025190b0106e",
5927
+ "fabric-time.mjs": "3ff932069038a720df1c68c6492976906737b2e67e5c12d9c81c418597f661de",
5928
+ "fabric-identifiers.mjs": "a18c2a501a4aa170bfd3d99e571ad6b7662649b4d3b9d2a540c002ea42811bbf",
5929
+ "fabric-secrets.mjs": "5822a7e25ecf2e87b5bab4f99c1074af7379d8b49e2784283b5d7d8c25022cde",
5930
+ "fabric-peer-owner.mjs": "0e65d59bc1048a5635c8ac04e73fe4fd1f34094902ced1580859017e5ca5a991",
5931
+ "fabric-crypto.mjs": "038e03689701e3c9721a1e7f8e0a4d02a52d6a5d1661b0dc84035edc3ebbfcf6",
5932
+ "fabric-base.mjs": "7804b2df7715dbbf9702a9b61b6b8cef2110f9a52b04cabd8fb0a66458d87512",
5933
+ "fabric-platform.mjs": "a8119d95ebba4d589a9e401f5d6fc8dda62d59d44e4c1ff811d97fac3771ac0c",
5934
+ "fabric-paths.mjs": "aa630d611e748a899e7043480f4a4e46b444f2e15ff945f30c2fbef21c1ceea5",
5935
+ "fabric-estate-rules.mjs": "7476be71174aa5b1026134f2b335abf647feaa55584e2f9de8618e3054aa8e1e",
5936
+ "fabric-estate.mjs": "e8a2e62d2313121e6cb502f6e6abad94d1d546a44b4d9b3ce2be29e7808e8cf3",
5937
+ "fabric-mandate.mjs": "b70f3de03a659e60bba7b5a0580b3582825cd7b8a8e30a28c79621919ec5b7bb",
5938
+ "fabric-delegation.mjs": "8f63a63aab9a8746b7f664720b87e9398137d01b8d50880974d5070038e414a0",
5939
+ "fabric-share.mjs": "bfb26581c21ad984c2a337da02429f9f3a165cc582f8ba48de4d3dfb7d163a59",
5940
+ "fabric-ceremonies.mjs": "117d4374c9e95c930a38de7adbd4323774798f4fe6ec6f24afcd6f2c7298ca44",
5941
+ "fabric-package-schema.mjs": "cd28092375db0fc21ffab1f0bb7794f7f8979ee08c64d3b9faf4b3845357caa6",
5942
+ "fabric-package.mjs": "8cfb32eebbd4e1bcf28a6e4437344ae2dd54479b0e7c820f002e9f94ab9ecaad",
5943
+ "fabric-protocols.mjs": "a560b7d6eb0d26204c5536711c3dda9daae90cc91e07cdc75412e75c86272767",
5944
+ "fabric-actions.mjs": "06e42f5e24c96311d5417d0d1effa93479ef7128a7ab139903b2bcf59253f6be",
5945
+ "fabric-connections.mjs": "303432e547ce563e90ca9ffcd827f5612f51d3582929834e1add0fdaf6485dcc",
5946
+ "fabric-a2a.mjs": "51b72fe1d80649d659fcad3a8f96370db3476c4a7b30cbabd8522c138be69346",
5947
+ "fabric-page-links.mjs": "a8834926e9d4bbf7c4857f551451d2ebf6ac8873bbccaaf89c5e30cf45b17ee6",
5948
+ "fabric-lock.mjs": "02cf833c97a07a8b3c788f9c93f70c4b9c9066efa25318dccf0038e0fc79717f",
5949
+ "fabric-usage.mjs": "1c4d18004639409624ac3516a02f2b60bbf55abdb612e9a96c37e83666eb87a7",
5950
+ "fabric-backups.mjs": "cfd8c9085e3d597a783099c2bd2ffe2f3faa0daaadab46dedd30523894cfeb06",
5951
+ "fabric-descriptor.mjs": "7c0ef7d245c037eb9e859ab481f6e66fb3e5ef2cf6d1e0a8d32b6d303097ca43",
5952
+ "fabric-context.mjs": "1112d695e872f9825cbc94f08484974bff3880087bc29b8be59f885f03e8f7be",
5953
+ "fabric-auth.mjs": "10ff37a39f9e3adb4d0f05db66c45f49b10eef582e9220c213907964109d7e52",
5954
+ "fabric-events.mjs": "c463d6ffcae24229a5c608d8fcea4268d2ccc5024b19fa10e5a452284068fa71",
5955
+ "fabric-logs.mjs": "58467e5719c16e099d05bbedec47a95712506ab03c33f3cd4be1252e8498a946",
5956
+ "fabric-supervisors.mjs": "e33b2b8916aeed617eee6233e05bd637bb4ecd87064248fd7ea08fdfcd45d375",
5957
+ "fabric-service.mjs": "297fef11ac76dc831d12d24c5581b7a93587c300c20664db703b3f924c0f9f1a",
5958
+ "fabric-profiles.mjs": "314376cf2deb87f235fb18b11d3b532e211f585b9af0a9302b5f4cc39971b532",
5959
+ "fabric-interop-rules.mjs": "b4e386c359a48e49ffff8a842215760c18a7c98a0af4754a808a35fb2820d458",
5960
+ "fabric-interop.mjs": "989040aed33b2712a258244192bdf70e811a51076aa1b62f2adc2a6db051dbed",
5961
+ "fabric-hub.mjs": "73ab07f72320a50042f39b52893b563157be2ac94615614416df45a796eac988",
5962
+ "fabric-board-shapes.mjs": "c1db7b7bd0d58d82bb6d8dfbc3cd1547a256a333052d367e82ff1b3edf2804d7",
5963
+ "fabric-board-link.mjs": "6e7d51f4fd9730d93455f50dd30e97907b8b9e1ca65a1d69f036f2e8ec05cc0d",
5964
+ "fabric-board-slots.mjs": "fc77a3c6e62aa18575568bef4f703cce2edaba8cef648813ebcdbb21bdc27a11",
5965
+ "fabric-board-session.mjs": "18555962e5f6d18080a3e7971c4c6640452542f6042d07917e7ebc073721c415",
5966
+ "fabric-board-fixture.mjs": "83c4b7e33ee47b68385faf2569d38d5c8a0c5cb0f8656090f41e1b0eed2f436e",
5967
+ "fabric-board.mjs": "15fbb4441fcf7d2f285375b75de64ad6cffea129c515084c110245376b07775f",
5968
+ "fabric-http.mjs": "b83b4c0c208763d56c3eebda5fe9e4a46d595cd91227699bf6876e65a3c7f9b9",
5969
+ "fabric-openrouter.mjs": "6041f3ab30f516658e1dbab4897a651cc8509b2136cfa8e769802c6b40ec2f35",
5970
+ "fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
5971
+ "share-registration.schema.json": "34b3997eeaf936ebc861342a23045634a7c18c19f01d7ed4198310d81989f5b0"
5859
5972
  }
5860
5973
  },
5861
5974
  "data": {
@@ -5,9 +5,9 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
5
5
  compatibility: Requires filesystem access and Python 3.9+. Exact schema checks additionally need git, Node.js, pnpm, and the pinned fabric-agent-contract checkout (a public repository). Works without those tools in an explicitly degraded structural-check mode. Ships in one plugin with adapting-projects-to-fabric, whose scripts it reuses.
6
6
  metadata:
7
7
  author: PassionCode.ai
8
- version: "0.73.0"
8
+ version: "0.74.0"
9
9
  contract-version: "0.1.0"
10
- contract-commit: "eac1a594aa131851f079da8bb7b2149e1951f35f"
10
+ contract-commit: "18f8d48762edc5bfb1433657cbfe1c16196df1a6"
11
11
  ---
12
12
 
13
13
  # Creating Fabric-compatible agents
@@ -156,7 +156,7 @@ python3 <plugin-dir>/skills/adapting-projects-to-fabric/scripts/adapt_project.py
156
156
  The effect class is declared, never defaulted: ask the author what the agent does outside itself when the request
157
157
  does not say. Cost presets are only for a run whose cost varies; their amounts come from the author or measured runs.
158
158
 
159
- Pin exactly contract `0.1.0` at commit `eac1a594aa131851f079da8bb7b2149e1951f35f` and
159
+ Pin exactly contract `0.1.0` at commit `18f8d48762edc5bfb1433657cbfe1c16196df1a6` and
160
160
  read the pinned guide before implementing protocol details. If this skill is installed
161
161
  without its sibling, the scaffolder is absent: create the bundle by hand from the pinned
162
162
  contract's `docs/guides/connecting-compatible-agents.md` and mark the structural check
@@ -62,8 +62,12 @@ the fabric-dashboards MCP (`list_services`, never guessed) and hand over the
62
62
  `open_link` its `link` tool returns for the page's path; to open it, call the
63
63
  host's `open` with `fallback=never`. Never `open <url>`, `open -a Safari`,
64
64
  `xdg-open`, `start <url>`, `webbrowser.open` or `shell.openExternal` on this
65
- agent's pages. A browser only when `host_status` confirms `not_installed`; an
66
- installed host that failed to open is reported, not replaced by HTTP. Links
65
+ agent's pages. A browser only when `host_status` confirms `not_installed`, and
66
+ a raw `http://127.0.0.1:<port>` address only after the listener on that port is
67
+ this OS account's (DEC-0154 PL-3 and HA-2; the adapter's `building-fabric-services/scripts/fabric_peer_owner.py`: `server_end` of a connection it opens and sends nothing on; `check_service.py <id>.<instance>` prints it as `listener.owner`): a
68
+ `foreign-user` listener is reported, never opened (the link gate below does not
69
+ read the owner yet, FAA-251). An installed host that failed
70
+ to open is reported, not replaced by HTTP. Links
67
71
  carry no token or login code. Every completion and notification action passes
68
72
  the Fabric Agent Adapter's link gate before delivery: `check_dashboard_link.py`
69
73
  in its `building-fabric-services/scripts`, run from that skill's directory;
@@ -18,7 +18,7 @@ compatibility: >-
18
18
  this plugin; Codex/Kimi use command hooks; Hermes/OpenCode/OpenClaw/Pi use native context plugins after opt-in.
19
19
  metadata:
20
20
  author: PassionCode.ai
21
- version: "0.73.0"
21
+ version: "0.74.0"
22
22
  ---
23
23
 
24
24
  # Working with Fabric
@@ -58,7 +58,7 @@ SESSION_ID = re.compile(r"[A-Za-z0-9._:-]{1,128}")
58
58
  LOOPBACK_ORIGIN = re.compile(r"http://127\.0\.0\.1:(\d{1,5})")
59
59
 
60
60
 
61
- VERSION = "0.73.0"
61
+ VERSION = "0.74.0"
62
62
 
63
63
 
64
64
  HOSTS = {"claude": "Claude Code", "codex": "Codex", "kimi": "Kimi Code",