@passioncode-ai/passioncode 0.2.38 → 0.2.40

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 (73) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/family.json +1 -1
  3. package/package.json +1 -1
  4. package/payload/.claude-plugin/marketplace.json +2 -2
  5. package/payload/manifest.json +8 -8
  6. package/payload/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +1 -1
  7. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +29 -11
  8. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/dashboard-links.md +58 -5
  9. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/operator-channel-and-repository.md +11 -3
  10. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py +2 -2
  11. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/check_dashboard_link.py +8 -6
  12. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +50 -12
  13. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/fabric-button.js +5 -4
  14. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/fabric-dashboard.css +1 -1
  15. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/fabric-dashboard.js +2 -2
  16. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/kit.json +9 -4
  17. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/recipes/support-agent/README.md +5 -3
  18. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/board.md +3 -1
  19. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/dashboard-kit.md +3 -2
  20. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/dashboard-links.md +58 -5
  21. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/dashboard.md +13 -4
  22. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/delegation.md +13 -1
  23. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/estate-record.md +60 -0
  24. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/interop.md +159 -2
  25. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/kit-modules.md +8 -2
  26. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/package.md +4 -2
  27. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/protocol.md +14 -2
  28. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/settings-backups.md +2 -1
  29. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/surfaces-and-auth.md +40 -3
  30. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_dashboard_link.py +8 -6
  31. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service.py +67 -2
  32. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service_rules.py +371 -2
  33. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-a2a.mjs +170 -0
  34. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-actions.mjs +275 -0
  35. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-backups.mjs +3 -1
  36. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-context.mjs +151 -0
  37. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-delegation.mjs +38 -8
  38. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-descriptor.mjs +31 -2
  39. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-estate.mjs +6 -0
  40. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-interop-rules.mjs +68 -3
  41. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-interop.mjs +31 -1
  42. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-mandate.mjs +247 -0
  43. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-page-links.mjs +144 -0
  44. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-paths.mjs +22 -1
  45. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-protocols.mjs +2 -2
  46. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-service.mjs +1 -0
  47. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-share.mjs +30 -2
  48. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-supervisors.mjs +5 -4
  49. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_a2a.py +209 -0
  50. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_actions.py +340 -0
  51. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_backups.py +2 -1
  52. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_context.py +170 -0
  53. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_delegation.py +36 -12
  54. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_descriptor.py +36 -3
  55. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_estate.py +7 -0
  56. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop.py +242 -11
  57. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop_rules.py +70 -2
  58. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_mandate.py +324 -0
  59. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_page_links.py +559 -0
  60. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_paths.py +21 -0
  61. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_protocols.py +2 -2
  62. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_service.py +9 -0
  63. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_share.py +35 -0
  64. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_supervisors.py +6 -4
  65. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/kit.json +413 -25
  66. package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +29 -11
  67. package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/dashboard-links.md +58 -5
  68. package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/operator-channel-and-repository.md +11 -3
  69. package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/scripts/check_dashboard_link.py +8 -6
  70. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +87 -10
  71. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/references/project-board.md +12 -0
  72. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_env.py +1 -1
  73. package/payload/plugins/passioncode/.claude-plugin/plugin.json +1 -1
@@ -158,6 +158,41 @@ def grant_usage_context_findings(value: Any) -> List[Dict[str, str]]:
158
158
  return findings
159
159
 
160
160
 
161
+ def instance_share_grant(record: Any, machine_id: Any, agent_ref: Any, context: Any, at_ms: float) -> Dict[str, Any]:
162
+ """Whether an organization's instance may run on ``machine_id`` now (FAA-125, N-11): the placement of ``agent_ref``
163
+ in ``context`` (as written; absent is personal) among that machine's packages, FAC-SEM-111 on it, and the grant's
164
+ window at ``at_ms`` (``startsAt`` <= at < ``expiresAt``; an unreadable instant or clock is outside it). Answers
165
+ ``{"ok": True, "grant": {"id", "startsAt"?, "expiresAt"?}}`` (``{"ok": True}`` for a personal placement) or ``{"ok": False, "code", "detail"}`` with code
166
+ ``placement-missing``, ``grant-refused`` or ``grant-window``; never raises. It reads the revision it is given, as
167
+ FAC-SEM-111 does: the caller verified it (``verify_estate_record``); a revocation delta is the hub's and the meter's."""
168
+ record = record if isinstance(record, dict) else {}
169
+ machine = next((m for m in _objects(record.get("machines")) if _jsv.same(m.get("id", _jsv.MISSING), machine_id)), {})
170
+ placement = next((p for p in _objects(machine.get("packages"))
171
+ if _jsv.same(p.get("agentRef", _jsv.MISSING), agent_ref)
172
+ and _jsv.same(p.get("context", _estate.PERSONAL_CONTEXT), context)), None)
173
+ if placement is None:
174
+ return {"ok": False, "code": "placement-missing", "detail": "this machine places no such agent in that context (FAC-SEM-074)"}
175
+ findings = _estate.placement_grant_findings(record, placement)
176
+ if findings:
177
+ return {"ok": False, "code": "grant-refused", "detail": "; ".join(f["message"] for f in findings)}
178
+ if not isinstance(placement.get("grant"), str):
179
+ return {"ok": True} # a personal placement, which names no grant
180
+ ident = _ids.normal_identifier(placement["grant"])
181
+ grant = next((g for g in _objects(record.get("shareGrants")) if _jsv.same(g.get("context", _jsv.MISSING), context)
182
+ and isinstance(g.get("meta"), dict) and isinstance(g["meta"].get("id"), str)
183
+ and _ids.normal_identifier(g["meta"]["id"]) == ident), None)
184
+ if grant is None: # defensive: FAC-SEM-111 has already matched one, so this answers rather than raises
185
+ return {"ok": False, "code": "grant-refused", "detail": "the record has no share grant for this placement"}
186
+ answer = {"id": grant["meta"]["id"]}
187
+ for name in ("startsAt", "expiresAt"):
188
+ if name in grant:
189
+ answer[name] = grant[name]
190
+ starts, expires = (_ftime.parse_rfc3339_ms(answer[n]) if n in answer else None for n in ("startsAt", "expiresAt"))
191
+ if (starts is not None and not starts <= at_ms) or (expires is not None and not at_ms < expires):
192
+ return {"ok": False, "code": "grant-window", "detail": "now is outside the share grant's window, or an instant cannot be read"}
193
+ return {"ok": True, "grant": answer}
194
+
195
+
161
196
  def share_rules(kind: str, value: Any) -> Optional[List[Dict[str, str]]]:
162
197
  """Kinds ``grant`` (FAC-SEM-110, 117), ``org-share-grants`` (117 with parent), ``share-registration`` (118) and
163
198
  ``device-attribution`` (045's grant.usage clause only); None for another kind."""
@@ -30,7 +30,7 @@ from fabric_base import (
30
30
  )
31
31
  from fabric_paths import (
32
32
  atomic_write,
33
- service_dirs,
33
+ instance_dirs,
34
34
  )
35
35
  from fabric_lock import (
36
36
  SUPERVISOR_ARG,
@@ -376,14 +376,16 @@ def launchd_install(label: str, plist_path: Path, plist_bytes: bytes, *, origin:
376
376
 
377
377
 
378
378
  def launchd_uninstall(label: str, plist_path: Path, *, timeout: float = 30.0, purge: bool = False,
379
- service_id: Optional[str] = None) -> Dict[str, Any]:
379
+ service_id: Optional[str] = None, instance: str = "default") -> Dict[str, Any]:
380
380
  """Symmetric with ``launchd_install`` (LC-14): bootout and WAIT until the job is gone, remove
381
381
  the plist, and reset the override to ``enabled`` — launchctl has no verb that deletes an
382
382
  override, and a leftover ``disabled`` would make a later fresh install stay off. Data stays
383
- unless ``purge`` (then ``service_id`` names whose data, logs and cache go). A job still
383
+ unless ``purge`` (then ``service_id`` names whose data, logs and cache go, and ``instance`` which
384
+ instance's: ``instance_dirs``, so one context's purge never reaches another's, FAA-125). A job still
384
385
  loaded at ``timeout`` raises, leaving the plist and data in place."""
385
386
  if purge and not service_id:
386
387
  raise ServiceError("purge needs the service id whose data, logs and cache to remove.")
388
+ dirs = instance_dirs(str(service_id), instance) if purge else {}
387
389
  target = "%s/%s" % (_domain(), label)
388
390
  _launchctl("bootout", target)
389
391
  deadline = time.monotonic() + timeout
@@ -399,7 +401,7 @@ def launchd_uninstall(label: str, plist_path: Path, *, timeout: float = 30.0, pu
399
401
  _launchctl("enable", target)
400
402
  purged: List[str] = []
401
403
  if purge:
402
- for directory in service_dirs(str(service_id)).values():
404
+ for directory in dirs.values():
403
405
  if directory.is_symlink():
404
406
  directory.unlink()
405
407
  elif directory.exists():