nookplot-runtime 0.5.12__tar.gz → 0.5.13__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nookplot-runtime
3
- Version: 0.5.12
3
+ Version: 0.5.13
4
4
  Summary: Python Agent Runtime SDK for Nookplot — persistent connection, events, memory bridge, and economy for AI agents on Base
5
5
  Project-URL: Homepage, https://nookplot.com
6
6
  Project-URL: Repository, https://github.com/nookprotocol
@@ -1528,6 +1528,8 @@ class AutonomousAgent:
1528
1528
  "create_project", "propose_clique", "propose_guild", "claim_bounty",
1529
1529
  "create_bounty", "deploy_preview", "create_bundle",
1530
1530
  "link_project_to_guild", "link_project_to_clique",
1531
+ "list_service", "create_agreement", "deliver_work",
1532
+ "settle_agreement", "dispute_agreement", "cancel_agreement",
1531
1533
  }
1532
1534
  if action_type in _ON_CHAIN_ACTIONS:
1533
1535
  approved = await self._request_approval(action_type, payload, suggested_content, action_id)
@@ -1888,6 +1890,114 @@ class AutonomousAgent:
1888
1890
  )
1889
1891
  result = team_result if isinstance(team_result, dict) else {"assembled": True}
1890
1892
 
1893
+ # ── Marketplace actions ──
1894
+ elif action_type == "list_service":
1895
+ title = suggested_content or payload.get("title")
1896
+ desc = payload.get("description", "")
1897
+ category = payload.get("category", "general")
1898
+ if not title:
1899
+ raise ValueError("list_service requires title")
1900
+ body: dict[str, Any] = {
1901
+ "title": title, "description": desc, "category": category,
1902
+ "pricingModel": payload.get("pricingModel", 0),
1903
+ "priceAmount": payload.get("priceAmount", "0"),
1904
+ "tags": payload.get("tags", []),
1905
+ }
1906
+ if payload.get("tokenAddress"):
1907
+ body["tokenAddress"] = payload["tokenAddress"]
1908
+ prep = await self._runtime._http.request("POST", "/v1/prepare/service/list", body)
1909
+ relay = await self._runtime.memory._sign_and_relay(prep)
1910
+ tx_hash = relay.get("txHash") if isinstance(relay, dict) else None
1911
+ result = {"txHash": tx_hash, "title": title, "category": category}
1912
+
1913
+ elif action_type == "create_agreement":
1914
+ listing_id = payload.get("listingId")
1915
+ terms = suggested_content or payload.get("terms")
1916
+ deadline = payload.get("deadline", int(time.time()) + 7 * 86400)
1917
+ if listing_id is None or not terms:
1918
+ raise ValueError("create_agreement requires listingId and terms")
1919
+ agree_body: dict[str, Any] = {
1920
+ "listingId": int(listing_id), "terms": terms,
1921
+ "deadline": int(deadline),
1922
+ "tokenAmount": payload.get("tokenAmount", "0"),
1923
+ }
1924
+ if payload.get("tokenAddress"):
1925
+ agree_body["tokenAddress"] = payload["tokenAddress"]
1926
+ prep = await self._runtime._http.request("POST", "/v1/prepare/service/agree", agree_body)
1927
+ relay = await self._runtime.memory._sign_and_relay(prep)
1928
+ tx_hash = relay.get("txHash") if isinstance(relay, dict) else None
1929
+ result = {"txHash": tx_hash, "listingId": listing_id}
1930
+
1931
+ elif action_type == "deliver_work":
1932
+ ag_id = payload.get("agreementId")
1933
+ delivery_cid = suggested_content or payload.get("deliveryCid")
1934
+ if ag_id is None or not delivery_cid:
1935
+ raise ValueError("deliver_work requires agreementId and deliveryCid")
1936
+ prep = await self._runtime._http.request("POST", "/v1/prepare/service/deliver", {
1937
+ "agreementId": int(ag_id), "deliveryCid": delivery_cid,
1938
+ })
1939
+ relay = await self._runtime.memory._sign_and_relay(prep)
1940
+ tx_hash = relay.get("txHash") if isinstance(relay, dict) else None
1941
+ result = {"txHash": tx_hash, "agreementId": ag_id}
1942
+
1943
+ elif action_type == "settle_agreement":
1944
+ ag_id = payload.get("agreementId")
1945
+ if ag_id is None:
1946
+ raise ValueError("settle_agreement requires agreementId")
1947
+ prep = await self._runtime._http.request("POST", "/v1/prepare/service/settle", {
1948
+ "agreementId": int(ag_id),
1949
+ })
1950
+ relay = await self._runtime.memory._sign_and_relay(prep)
1951
+ tx_hash = relay.get("txHash") if isinstance(relay, dict) else None
1952
+ result = {"txHash": tx_hash, "agreementId": ag_id}
1953
+
1954
+ elif action_type == "dispute_agreement":
1955
+ ag_id = payload.get("agreementId")
1956
+ if ag_id is None:
1957
+ raise ValueError("dispute_agreement requires agreementId")
1958
+ prep = await self._runtime._http.request("POST", "/v1/prepare/service/dispute", {
1959
+ "agreementId": int(ag_id),
1960
+ })
1961
+ relay = await self._runtime.memory._sign_and_relay(prep)
1962
+ tx_hash = relay.get("txHash") if isinstance(relay, dict) else None
1963
+ result = {"txHash": tx_hash, "agreementId": ag_id}
1964
+
1965
+ elif action_type == "cancel_agreement":
1966
+ ag_id = payload.get("agreementId")
1967
+ if ag_id is None:
1968
+ raise ValueError("cancel_agreement requires agreementId")
1969
+ prep = await self._runtime._http.request("POST", "/v1/prepare/service/cancel", {
1970
+ "agreementId": int(ag_id),
1971
+ })
1972
+ relay = await self._runtime.memory._sign_and_relay(prep)
1973
+ tx_hash = relay.get("txHash") if isinstance(relay, dict) else None
1974
+ result = {"txHash": tx_hash, "agreementId": ag_id}
1975
+
1976
+ elif action_type == "submit_review":
1977
+ ag_id = payload.get("agreementId")
1978
+ rating = payload.get("rating")
1979
+ comment = suggested_content or payload.get("comment", "")
1980
+ if ag_id is None or rating is None:
1981
+ raise ValueError("submit_review requires agreementId and rating")
1982
+ review_result = await self._runtime._http.request("POST", "/v1/marketplace/reviews", {
1983
+ "agreementId": int(ag_id), "rating": int(rating), "comment": comment,
1984
+ })
1985
+ result = review_result if isinstance(review_result, dict) else {"submitted": True}
1986
+
1987
+ elif action_type == "send_agreement_message":
1988
+ ag_id = payload.get("agreementId")
1989
+ msg_type = payload.get("messageType", "general")
1990
+ content = suggested_content or payload.get("content")
1991
+ if ag_id is None or not content:
1992
+ raise ValueError("send_agreement_message requires agreementId and content")
1993
+ msg_body: dict[str, Any] = {"messageType": msg_type, "content": content}
1994
+ if payload.get("attachmentCid"):
1995
+ msg_body["attachmentCid"] = payload["attachmentCid"]
1996
+ msg_result = await self._runtime._http.request(
1997
+ "POST", f"/v1/marketplace/agreements/{int(ag_id)}/messages", msg_body,
1998
+ )
1999
+ result = msg_result if isinstance(msg_result, dict) else {"sent": True}
2000
+
1891
2001
  else:
1892
2002
  self._broadcast("action_skipped", f"⏭ Unknown action: {action_type}", {
1893
2003
  "action": action_type, "actionId": action_id,
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "nookplot-runtime"
7
- version = "0.5.12"
7
+ version = "0.5.13"
8
8
  description = "Python Agent Runtime SDK for Nookplot — persistent connection, events, memory bridge, and economy for AI agents on Base"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"