@provenonce/mcp 1.0.4 β†’ 1.0.6

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.
package/README.md CHANGED
@@ -1,153 +1,126 @@
1
- # MCP Registry
2
-
3
- The MCP registry provides MCP clients with a list of MCP servers, like an app store for MCP servers.
4
-
5
- [**πŸ“€ Publish my MCP server**](docs/modelcontextprotocol-io/quickstart.mdx) | [**⚑️ Live API docs**](https://registry.modelcontextprotocol.io/docs) | [**πŸ‘€ Ecosystem vision**](docs/design/ecosystem-vision.md) | πŸ“– **[Full documentation](./docs)**
6
-
7
- ## Development Status
8
-
9
- **2025-10-24 update**: The Registry API has entered an **API freeze (v0.1)** πŸŽ‰. For the next month or more, the API will remain stable with no breaking changes, allowing integrators to confidently implement support. This freeze applies to v0.1 while development continues on v0. We'll use this period to validate the API in real-world integrations and gather feedback to shape v1 for general availability. Thank you to everyone for your contributions and patienceβ€”your involvement has been key to getting us here!
10
-
11
- **2025-09-08 update**: The registry has launched in preview πŸŽ‰ ([announcement blog post](https://blog.modelcontextprotocol.io/posts/2025-09-08-mcp-registry-preview/)). While the system is now more stable, this is still a preview release and breaking changes or data resets may occur. A general availability (GA) release will follow later. We'd love your feedback in [GitHub discussions](https://github.com/modelcontextprotocol/registry/discussions/new?category=ideas) or in the [#registry-dev Discord](https://discord.com/channels/1358869848138059966/1369487942862504016) ([joining details here](https://modelcontextprotocol.io/community/communication)).
12
-
13
- Current key maintainers:
14
- - **Adam Jones** (Anthropic) [@domdomegg](https://github.com/domdomegg)
15
- - **Tadas Antanavicius** (PulseMCP) [@tadasant](https://github.com/tadasant)
16
- - **Toby Padilla** (GitHub) [@toby](https://github.com/toby)
17
- - **Radoslav (Rado) Dimitrov** (Stacklok) [@rdimitrov](https://github.com/rdimitrov)
18
-
19
- ## Contributing
20
-
21
- We use multiple channels for collaboration - see [modelcontextprotocol.io/community/communication](https://modelcontextprotocol.io/community/communication).
22
-
23
- Often (but not always) ideas flow through this pipeline:
24
-
25
- - **[Discord](https://modelcontextprotocol.io/community/communication)** - Real-time community discussions
26
- - **[Discussions](https://github.com/modelcontextprotocol/registry/discussions)** - Propose and discuss product/technical requirements
27
- - **[Issues](https://github.com/modelcontextprotocol/registry/issues)** - Track well-scoped technical work
28
- - **[Pull Requests](https://github.com/modelcontextprotocol/registry/pulls)** - Contribute work towards issues
29
-
30
- ### Quick start:
31
-
32
- #### Pre-requisites
33
-
34
- - **Docker**
35
- - **Go 1.24.x**
36
- - **ko** - Container image builder for Go ([installation instructions](https://ko.build/install/))
37
- - **golangci-lint v2.4.0**
38
-
39
- #### Running the server
40
-
41
- ```bash
42
- # Start full development environment
43
- make dev-compose
44
- ```
45
-
46
- This starts the registry at [`localhost:8080`](http://localhost:8080) with PostgreSQL. The database uses ephemeral storage and is reset each time you restart the containers, ensuring a clean state for development and testing.
47
-
48
- **Note:** The registry uses [ko](https://ko.build) to build container images. The `make dev-compose` command automatically builds the registry image with ko and loads it into your local Docker daemon before starting the services.
49
-
50
- By default, the registry seeds from the production API with a filtered subset of servers (to keep startup fast). This ensures your local environment mirrors production behavior and all seed data passes validation. For offline development you can seed from a file without validation with `MCP_REGISTRY_SEED_FROM=data/seed.json MCP_REGISTRY_ENABLE_REGISTRY_VALIDATION=false make dev-compose`.
51
-
52
- The setup can be configured with environment variables in [docker-compose.yml](./docker-compose.yml) - see [.env.example](./.env.example) for a reference.
53
-
54
- <details>
55
- <summary>Alternative: Running a pre-built Docker image</summary>
56
-
57
- Pre-built Docker images are automatically published to GitHub Container Registry:
58
-
59
- ```bash
60
- # Run latest stable release
61
- docker run -p 8080:8080 ghcr.io/modelcontextprotocol/registry:latest
62
-
63
- # Run latest from main branch (continuous deployment)
64
- docker run -p 8080:8080 ghcr.io/modelcontextprotocol/registry:main
65
-
66
- # Run specific release version
67
- docker run -p 8080:8080 ghcr.io/modelcontextprotocol/registry:v1.0.0
68
-
69
- # Run development build from main branch
70
- docker run -p 8080:8080 ghcr.io/modelcontextprotocol/registry:main-20250906-abc123d
71
- ```
72
-
73
- **Available tags:**
74
- - **Releases**: `latest`, `v1.0.0`, `v1.1.0`, etc.
75
- - **Continuous**: `main` (latest main branch build)
76
- - **Development**: `main-<date>-<sha>` (specific commit builds)
77
-
78
- </details>
79
-
80
- #### Publishing a server
81
-
82
- To publish a server, we've built a simple CLI. You can use it with:
83
-
84
- ```bash
85
- # Build the latest CLI
86
- make publisher
87
-
88
- # Use it!
89
- ./bin/mcp-publisher --help
90
- ```
91
-
92
- See [the publisher guide](./docs/modelcontextprotocol-io/quickstart.mdx) for more details.
93
-
94
- #### Other commands
95
-
96
- ```bash
97
- # Run lint, unit tests and integration tests
98
- make check
99
- ```
100
-
101
- There are also a few more helpful commands for development. Run `make help` to learn more, or look in [Makefile](./Makefile).
102
-
103
- <!--
104
- For Claude and other AI tools: Always prefer make targets over custom commands where possible.
105
- -->
106
-
107
- ## Architecture
108
-
109
- ### Project Structure
110
-
111
- ```
112
- β”œβ”€β”€ cmd/ # Application entry points
113
- β”‚ └── publisher/ # Server publishing tool
114
- β”œβ”€β”€ data/ # Seed data
115
- β”œβ”€β”€ deploy/ # Deployment configuration (Pulumi)
116
- β”œβ”€β”€ docs/ # Documentation
117
- β”œβ”€β”€ internal/ # Private application code
118
- β”‚ β”œβ”€β”€ api/ # HTTP handlers and routing
119
- β”‚ β”œβ”€β”€ auth/ # Authentication (GitHub OAuth, JWT, namespace blocking)
120
- β”‚ β”œβ”€β”€ config/ # Configuration management
121
- β”‚ β”œβ”€β”€ database/ # Data persistence (PostgreSQL)
122
- β”‚ β”œβ”€β”€ service/ # Business logic
123
- β”‚ β”œβ”€β”€ telemetry/ # Metrics and monitoring
124
- β”‚ └── validators/ # Input validation
125
- β”œβ”€β”€ pkg/ # Public packages
126
- β”‚ β”œβ”€β”€ api/ # API types and structures
127
- β”‚ β”‚ └── v0/ # Version 0 API types
128
- β”‚ └── model/ # Data models for server.json
129
- β”œβ”€β”€ scripts/ # Development and testing scripts
130
- β”œβ”€β”€ tests/ # Integration tests
131
- └── tools/ # CLI tools and utilities
132
- └── validate-*.sh # Schema validation tools
133
- ```
134
-
135
- ### Authentication
136
-
137
- Publishing supports multiple authentication methods:
138
- - **GitHub OAuth** - For publishing by logging into GitHub
139
- - **GitHub OIDC** - For publishing from GitHub Actions
140
- - **DNS verification** - For proving ownership of a domain and its subdomains
141
- - **HTTP verification** - For proving ownership of a domain
142
-
143
- The registry validates namespace ownership when publishing. E.g. to publish...:
144
- - `io.github.domdomegg/my-cool-mcp` you must login to GitHub as `domdomegg`, or be in a GitHub Action on domdomegg's repos
145
- - `me.adamjones/my-cool-mcp` you must prove ownership of `adamjones.me` via DNS or HTTP challenge
146
-
147
- ## Community Projects
148
-
149
- Check out [community projects](docs/community-projects.md) to explore notable registry-related work created by the community.
150
-
151
- ## More documentation
152
-
153
- See the [documentation](./docs) for more details if your question has not been answered here!
1
+ # @provenonce/mcp
2
+
3
+ **Provenonce Skill** β€” Give any AI agent cryptographic identity in under 60 seconds.
4
+
5
+ Add this skill to your agent and it gets:
6
+ - A permanent cryptographic hash (identity)
7
+ - A SIGIL (verified identity class + tier)
8
+ - A signed Passport (verifiable offline by any third party)
9
+ - Heartbeat (continuous liveness proof)
10
+ - Beats proofs (evidence of computational work)
11
+ - Lineage (full ancestry chain)
12
+
13
+ ## Quick Start
14
+
15
+ ### Claude Desktop / Claude Code
16
+
17
+ Add to `~/.claude/claude_desktop_config.json`:
18
+
19
+ ```json
20
+ {
21
+ "mcpServers": {
22
+ "provenonce": {
23
+ "command": "npx",
24
+ "args": ["-y", "@provenonce/mcp"]
25
+ }
26
+ }
27
+ }
28
+ ```
29
+
30
+ That's it. On first use, your agent calls `provenonce_register` and gets a permanent identity.
31
+
32
+ ### With pre-existing credentials
33
+
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "provenonce": {
38
+ "command": "npx",
39
+ "args": ["-y", "@provenonce/mcp"],
40
+ "env": {
41
+ "PROVENONCE_API_KEY": "pvn_...",
42
+ "PROVENONCE_AGENT_HASH": "0x..."
43
+ }
44
+ }
45
+ }
46
+ }
47
+ ```
48
+
49
+ ### As a skill developer (earn rev share)
50
+
51
+ If you're a developer embedding this skill in your framework, include your partner ref token:
52
+
53
+ ```json
54
+ {
55
+ "env": {
56
+ "PROVENONCE_SKILL_REF": "your16hextoken"
57
+ }
58
+ }
59
+ ```
60
+
61
+ You earn 30% of every SIGIL purchased by agents you deploy. Register at `POST /api/v1/skill/register`.
62
+
63
+ ## The 9 Tools
64
+
65
+ | Tool | What it does | Auth needed |
66
+ |------|-------------|-------------|
67
+ | `provenonce_register` | Auto-register agent, get hash + API key | None |
68
+ | `provenonce_status` | Full current state (SIGIL, balance, hints) | Yes |
69
+ | `provenonce_purchase_sigil` | Buy SIGIL, unlock heartbeat + passport | Yes + SOL tx |
70
+ | `provenonce_heartbeat` | Submit liveness proof | Yes + SOL tx |
71
+ | `provenonce_get_passport` | Get signed identity document | Yes |
72
+ | `provenonce_beats_proof` | Compute local work proof | None |
73
+ | `provenonce_verify_agent` | Check another agent's identity | None |
74
+ | `provenonce_spawn` | Spawn a child agent | Yes |
75
+ | `provenonce_get_lineage` | Get full ancestry chain | None |
76
+
77
+ ## Agent Flow
78
+
79
+ ```
80
+ Day 1: provenonce_register β†’ hash minted, credentials saved
81
+ provenonce_beats_proof β†’ works immediately, no SIGIL needed
82
+ provenonce_status β†’ { sigil: null, _hint: "Call provenonce_purchase_sigil..." }
83
+
84
+ Day 7: provenonce_purchase_sigil β†’ pay SOL, SIGIL issued
85
+ provenonce_heartbeat β†’ now unlocked
86
+ provenonce_get_passport β†’ signed identity doc, share with anyone
87
+ provenonce_verify_agent β†’ verify a counterparty before trusting them
88
+ ```
89
+
90
+ ## Environment Variables
91
+
92
+ | Variable | Description | Default |
93
+ |----------|-------------|---------|
94
+ | `PROVENONCE_API_KEY` | Agent API key (pvn_...) | Read from ~/.provenonce/config.json |
95
+ | `PROVENONCE_AGENT_HASH` | Agent hash (0x...) | Read from ~/.provenonce/config.json |
96
+ | `PROVENONCE_SKILL_REF` | Your partner ref token (for rev share) | None |
97
+ | `PROVENONCE_REGISTRY_URL` | Registry URL override | https://provenonce.io |
98
+
99
+ ## Framework-Agnostic Usage
100
+
101
+ ```typescript
102
+ import { PROVENONCE_TOOLS } from '@provenonce/mcp/tools';
103
+
104
+ // OpenAI
105
+ const tools = PROVENONCE_TOOLS.map(t => ({ type: 'function', function: t }));
106
+
107
+ // LangChain / custom β€” use PROVENONCE_TOOLS for schema, implement handlers yourself
108
+ ```
109
+
110
+ ## Credential Storage
111
+
112
+ Credentials are stored in `~/.provenonce/config.json` with `chmod 600` permissions (Unix).
113
+
114
+ On Windows, use environment variables (`PROVENONCE_API_KEY` + `PROVENONCE_AGENT_HASH`) β€” file permissions are not enforced.
115
+
116
+ ## What's Coming
117
+
118
+ - `provenonce_kyc` β€” KYC / identity class upgrade
119
+ - Auto-heartbeat timer (opt-in)
120
+ - Python SDK (`provenonce-mcp`)
121
+
122
+ ## Links
123
+
124
+ - Registry: [provenonce.io](https://provenonce.io)
125
+ - Docs: [provenonce.dev](https://provenonce.dev)
126
+ - API: [provenonce.io/openapi.yaml](https://provenonce.io/openapi.yaml)
@@ -90,15 +90,21 @@ var PROVENONCE_TOOLS = [
90
90
  },
91
91
  {
92
92
  name: "provenonce_beats_proof",
93
- description: "Compute a local Beats work-proof \u2014 cryptographic evidence of computational effort by this agent. Returns a hash chain proof that can be shared as evidence of work. No network call required.",
93
+ description: "Compute a Beats work-proof \u2014 cryptographic evidence of computational effort by this agent. Computes sequential hash chains at the current network difficulty, submits to the Beats service for a signed receipt. The receipt can be used for spawn authorization and other operations.",
94
94
  inputSchema: {
95
95
  type: "object",
96
96
  properties: {
97
97
  count: {
98
98
  type: "integer",
99
- description: "Number of beats to compute (min 10, max 1000)",
99
+ description: "Number of beats to compute (min 10, max 10000)",
100
100
  minimum: 10,
101
- maximum: 1e3
101
+ maximum: 1e4
102
+ },
103
+ difficulty: {
104
+ type: "integer",
105
+ description: "Hash iterations per beat (default 1000, min 100, max 5000). Usually auto-detected from network.",
106
+ minimum: 100,
107
+ maximum: 5e3
102
108
  }
103
109
  },
104
110
  required: ["count"]
@@ -153,4 +159,4 @@ var PROVENONCE_TOOLS = [
153
159
  export {
154
160
  PROVENONCE_TOOLS
155
161
  };
156
- //# sourceMappingURL=chunk-COVXPAEW.js.map
162
+ //# sourceMappingURL=chunk-ONDCXFYW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools.ts"],"sourcesContent":["/** Provenonce Skill β€” 9 MCP tool definitions (JSON Schema) */\r\nexport const PROVENONCE_TOOLS = [\r\n {\r\n name: 'provenonce_register',\r\n description:\r\n 'Register this agent with Provenonce to get a cryptographic identity (hash + API key). ' +\r\n 'Safe to call multiple times β€” returns existing identity if already registered. ' +\r\n 'No wallet required. Free.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n name: {\r\n type: 'string',\r\n description: 'Human-readable name for this agent (optional, max 64 chars)',\r\n maxLength: 64,\r\n },\r\n skill_ref: {\r\n type: 'string',\r\n description:\r\n '16-character hex ref token of the skill that deployed you β€” for rev-share attribution (optional)',\r\n pattern: '^[0-9a-f]{16}$',\r\n },\r\n },\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_status',\r\n description:\r\n 'Get this agent\\'s current Provenonce status: identity, SIGIL, beats balance, and next steps. ' +\r\n 'Requires prior provenonce_register call.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_purchase_sigil',\r\n description:\r\n 'Purchase a Provenonce SIGIL to unlock full provenance: heartbeat access, signed passport, ' +\r\n 'and a permanent identity record. Requires a Solana payment transaction. ' +\r\n 'SIGIL format: name*principal*tier (e.g. my-agent*acme*ind).',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n name: {\r\n type: 'string',\r\n description: 'SIGIL name segment β€” identifies this specific agent (e.g. \"my-agent\")',\r\n },\r\n principal: {\r\n type: 'string',\r\n description: 'Principal segment β€” identifies the operator or organisation (e.g. \"acme\")',\r\n },\r\n identity_class: {\r\n type: 'string',\r\n enum: ['narrow_task', 'autonomous', 'orchestrator'],\r\n description:\r\n 'Agent identity class (pricing axis): narrow_task=single-purpose, autonomous=independent decision-maker, orchestrator=coordinates other agents',\r\n },\r\n tier: {\r\n type: 'string',\r\n enum: ['sov', 'org', 'ind', 'eph', 'sbx'],\r\n description:\r\n 'Trust governance tier: sov=sovereign/root, org=organisation, ind=individual, eph=ephemeral, sbx=sandbox',\r\n },\r\n payment_tx: {\r\n type: 'string',\r\n description: 'Solana transaction signature for the SIGIL fee payment',\r\n },\r\n },\r\n required: ['name', 'principal', 'identity_class', 'tier', 'payment_tx'],\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_heartbeat',\r\n description:\r\n 'Submit a heartbeat to prove this agent is alive. Requires a SIGIL (call provenonce_purchase_sigil first). ' +\r\n 'Requires a Solana payment transaction for the heartbeat fee.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n payment_tx: {\r\n type: 'string',\r\n description: 'Solana transaction signature for the heartbeat fee payment',\r\n },\r\n },\r\n required: ['payment_tx'],\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_get_passport',\r\n description:\r\n 'Get this agent\\'s cryptographically signed Passport β€” a verifiable identity document ' +\r\n 'any third party can verify offline using the Provenonce authority public key. ' +\r\n 'Requires an active SIGIL and at least one heartbeat.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n payment_tx: {\r\n type: 'string',\r\n description: 'Solana transaction signature for the passport reissue fee (if applicable)',\r\n },\r\n },\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_beats_proof',\r\n description:\r\n 'Compute a Beats work-proof β€” cryptographic evidence of computational effort by this agent. ' +\r\n 'Computes sequential hash chains at the current network difficulty, submits to the Beats service ' +\r\n 'for a signed receipt. The receipt can be used for spawn authorization and other operations.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n count: {\r\n type: 'integer',\r\n description: 'Number of beats to compute (min 10, max 10000)',\r\n minimum: 10,\r\n maximum: 10000,\r\n },\r\n difficulty: {\r\n type: 'integer',\r\n description: 'Hash iterations per beat (default 1000, min 100, max 5000). Usually auto-detected from network.',\r\n minimum: 100,\r\n maximum: 5000,\r\n },\r\n },\r\n required: ['count'],\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_verify_agent',\r\n description:\r\n 'Verify another agent\\'s Provenonce identity. Returns their SIGIL, identity class, and registration status. ' +\r\n 'Public β€” no authentication required.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n hash: {\r\n type: 'string',\r\n description: 'The agent hash to verify (0x + 64 hex chars)',\r\n pattern: '^0x[0-9a-fA-F]{64}$',\r\n },\r\n },\r\n required: ['hash'],\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_spawn',\r\n description:\r\n 'Spawn a child agent under this agent\\'s identity. The child inherits lineage from the parent. ' +\r\n 'Returns the child\\'s hash and API key. Requires sufficient beats balance or a work-proof receipt.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n child_name: {\r\n type: 'string',\r\n description: 'Name for the child agent (max 64 chars)',\r\n maxLength: 64,\r\n },\r\n },\r\n required: ['child_name'],\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_get_lineage',\r\n description:\r\n 'Get the full lineage chain for an agent β€” all events in its provenance history ' +\r\n '(registration, SIGIL issuance, heartbeats, spawns). Public β€” no authentication required.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n hash: {\r\n type: 'string',\r\n description:\r\n 'The agent hash to get lineage for (0x + 64 hex chars). Defaults to this agent if omitted.',\r\n pattern: '^0x[0-9a-fA-F]{64}$',\r\n },\r\n },\r\n },\r\n },\r\n] as const;\r\n\r\nexport type ToolName = (typeof PROVENONCE_TOOLS)[number]['name'];\r\n"],"mappings":";;;AACO,IAAM,mBAAmB;AAAA,EAC9B;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IAGF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW;AAAA,QACb;AAAA,QACA,WAAW;AAAA,UACT,MAAM;AAAA,UACN,aACE;AAAA,UACF,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IAEF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY,CAAC;AAAA,IACf;AAAA,EACF;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IAGF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,WAAW;AAAA,UACT,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,gBAAgB;AAAA,UACd,MAAM;AAAA,UACN,MAAM,CAAC,eAAe,cAAc,cAAc;AAAA,UAClD,aACE;AAAA,QACJ;AAAA,QACA,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM,CAAC,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,UACxC,aACE;AAAA,QACJ;AAAA,QACA,YAAY;AAAA,UACV,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,QAAQ,aAAa,kBAAkB,QAAQ,YAAY;AAAA,IACxE;AAAA,EACF;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IAEF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,YAAY;AAAA,UACV,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,YAAY;AAAA,IACzB;AAAA,EACF;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IAGF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,YAAY;AAAA,UACV,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IAGF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,QACA,YAAY;AAAA,UACV,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IAEF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IAEF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,YAAY;AAAA,UACV,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MACA,UAAU,CAAC,YAAY;AAAA,IACzB;AAAA,EACF;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IAEF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aACE;AAAA,UACF,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // @provenonce/mcp β€” Provenonce Skill for AI agents
2
2
  import {
3
3
  PROVENONCE_TOOLS
4
- } from "./chunk-COVXPAEW.js";
4
+ } from "./chunk-ONDCXFYW.js";
5
5
 
6
6
  // src/index.ts
7
7
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
@@ -12,7 +12,7 @@ import {
12
12
  } from "@modelcontextprotocol/sdk/types.js";
13
13
 
14
14
  // src/handlers.ts
15
- import { createHash } from "crypto";
15
+ import { createHash, randomBytes } from "crypto";
16
16
 
17
17
  // src/credentials.ts
18
18
  import { readFileSync, writeFileSync, mkdirSync, chmodSync, existsSync } from "fs";
@@ -61,6 +61,7 @@ function saveCredentials(creds) {
61
61
 
62
62
  // src/client.ts
63
63
  var REGISTRY_URL = process.env.PROVENONCE_REGISTRY_URL || "https://provenonce.io";
64
+ var BEATS_URL = process.env.PROVENONCE_BEATS_URL || "https://beats.provenonce.dev";
64
65
  async function apiFetch(path, opts = {}) {
65
66
  const headers = { "Content-Type": "application/json" };
66
67
  if (opts.apiKey) headers["Authorization"] = `Bearer ${opts.apiKey}`;
@@ -80,15 +81,56 @@ async function apiFetch(path, opts = {}) {
80
81
  return { data: null, error: err2.message };
81
82
  }
82
83
  }
84
+ async function fetchAnchor() {
85
+ return apiFetch("/api/v1/beat/anchor");
86
+ }
87
+ async function submitWorkProof(proof) {
88
+ try {
89
+ const res = await fetch(`${BEATS_URL}/api/v1/beat/work-proof`, {
90
+ method: "POST",
91
+ headers: { "Content-Type": "application/json" },
92
+ body: JSON.stringify({ work_proof: proof })
93
+ });
94
+ const json = await res.json();
95
+ if (!res.ok) {
96
+ const msg = json.error ?? `HTTP ${res.status}`;
97
+ return { data: null, error: msg };
98
+ }
99
+ return { data: json, error: null };
100
+ } catch (err2) {
101
+ return { data: null, error: err2.message };
102
+ }
103
+ }
83
104
  async function registerAgent(opts) {
84
- return apiFetch("/api/v1/register", {
105
+ const tokenRes = await apiFetch("/api/v1/register/token", {
85
106
  method: "POST",
86
- body: {
87
- name: opts.name,
88
- wallet: "none",
89
- ...opts.skillRef ? { ref: opts.skillRef } : {}
90
- }
107
+ body: {}
91
108
  });
109
+ if (tokenRes.error || !tokenRes.data?.token) {
110
+ return { data: null, error: tokenRes.error ?? "Failed to obtain registration token" };
111
+ }
112
+ const headers = {
113
+ "Content-Type": "application/json",
114
+ "x-registration-token": tokenRes.data.token
115
+ };
116
+ try {
117
+ const res = await fetch(`${REGISTRY_URL}/api/v1/register`, {
118
+ method: "POST",
119
+ headers,
120
+ body: JSON.stringify({
121
+ name: opts.name,
122
+ wallet: "none",
123
+ ...opts.skillRef ? { ref: opts.skillRef } : {}
124
+ })
125
+ });
126
+ const json = await res.json();
127
+ if (!res.ok) {
128
+ return { data: null, error: json.error ?? `HTTP ${res.status}` };
129
+ }
130
+ return { data: json, error: null };
131
+ } catch (err2) {
132
+ return { data: null, error: err2.message };
133
+ }
92
134
  }
93
135
  async function getStatus(apiKey) {
94
136
  return apiFetch("/api/v1/skill/bootstrap", {
@@ -132,10 +174,14 @@ async function getLineage(hash) {
132
174
  return apiFetch(`/api/v1/agent/lineage/${encodeURIComponent(hash)}`);
133
175
  }
134
176
  async function spawnChild(apiKey, opts) {
177
+ const step1Body = { child_name: opts.childName };
178
+ if (opts.beatsReceipt) {
179
+ step1Body.beats_receipt = opts.beatsReceipt;
180
+ }
135
181
  const step1 = await apiFetch("/api/v1/agent/spawn", {
136
182
  method: "POST",
137
183
  apiKey,
138
- body: { child_name: opts.childName }
184
+ body: step1Body
139
185
  });
140
186
  if (step1.error || !step1.data?.spawn_authorization) {
141
187
  return { data: null, error: step1.error ?? "Spawn step 1 failed: no authorization returned" };
@@ -268,24 +314,98 @@ async function handleGetPassport(args) {
268
314
  _verify: "Verify at: GET https://provenonce.io/.well-known/provenonce-authority.json for the authority public key."
269
315
  });
270
316
  }
271
- async function handleBeatsProof(args) {
272
- const count = Math.max(10, Math.min(1e3, args.count));
273
- const creds = loadCredentials();
274
- const seed = creds?.agent_hash ?? `provenonce:beats:${Date.now()}`;
317
+ function computeBeatHash(prevHash, beatIndex, difficulty, anchorHash) {
318
+ const seed = anchorHash ? `${prevHash}:${beatIndex}::${anchorHash}` : `${prevHash}:${beatIndex}:`;
319
+ let current = createHash("sha256").update(seed, "utf8").digest("hex");
320
+ for (let i = 0; i < difficulty; i++) {
321
+ current = createHash("sha256").update(current, "utf8").digest("hex");
322
+ }
323
+ return current;
324
+ }
325
+ async function computeWorkProof(count, difficulty) {
326
+ const anchorRes = await fetchAnchor();
327
+ const anchor = anchorRes.data?.anchor;
328
+ const anchorHash = anchor?.hash;
329
+ const anchorIndex = anchor?.beat_index ?? 0;
330
+ const genesisInput = `provenonce:beats:${randomBytes(16).toString("hex")}`;
331
+ const genesisHash = createHash("sha256").update(genesisInput, "utf8").digest("hex");
332
+ const spotCheckIndices = selectSpotCheckIndices(count);
333
+ const spotChecks = [];
275
334
  const start = Date.now();
276
- let hash = createHash("sha256").update(seed).digest("hex");
277
- const fromHash = `0x${hash}`;
278
- for (let i = 1; i < count; i++) {
279
- hash = createHash("sha256").update(hash).digest("hex");
335
+ let prevHash = genesisHash;
336
+ for (let i = 1; i <= count; i++) {
337
+ const hash = computeBeatHash(prevHash, i, difficulty, anchorHash);
338
+ if (spotCheckIndices.has(i)) {
339
+ spotChecks.push({ index: i, hash, prev: prevHash });
340
+ }
341
+ prevHash = hash;
280
342
  }
281
- const toHash = `0x${hash}`;
282
343
  const duration = Date.now() - start;
283
- return ok({
344
+ const fromHash = genesisHash;
345
+ const toHash = prevHash;
346
+ const localProof = {
347
+ from_hash: fromHash,
348
+ to_hash: toHash,
349
+ beats_computed: count,
350
+ duration_ms: duration
351
+ };
352
+ const submitRes = await submitWorkProof({
284
353
  from_hash: fromHash,
285
354
  to_hash: toHash,
286
355
  beats_computed: count,
287
- duration_ms: duration,
288
- message: `Computed ${count} beats in ${duration}ms. This is cryptographic proof of computational work.`
356
+ difficulty,
357
+ anchor_index: anchorIndex,
358
+ anchor_hash: anchorHash,
359
+ spot_checks: spotChecks
360
+ });
361
+ if (submitRes.error) {
362
+ return { receipt: null, localProof, error: `Beats submission failed: ${submitRes.error}` };
363
+ }
364
+ if (!submitRes.data?.valid) {
365
+ return { receipt: null, localProof, error: `Beats rejected proof: ${submitRes.data?.reason ?? "unknown"}` };
366
+ }
367
+ return { receipt: submitRes.data.receipt ?? null, localProof };
368
+ }
369
+ function selectSpotCheckIndices(count) {
370
+ const minChecks = 3;
371
+ const density = 1e3;
372
+ const maxChecks = 25;
373
+ const needed = Math.max(
374
+ Math.min(count, minChecks),
375
+ Math.min(Math.ceil(count / density), maxChecks)
376
+ );
377
+ const indices = /* @__PURE__ */ new Set();
378
+ indices.add(1);
379
+ indices.add(count);
380
+ if (needed > 2 && count > 2) {
381
+ const interiorNeeded = needed - 2;
382
+ for (let j = 1; j <= interiorNeeded; j++) {
383
+ const idx = Math.round(1 + j * (count - 1) / (interiorNeeded + 1));
384
+ if (idx > 1 && idx < count) {
385
+ indices.add(idx);
386
+ }
387
+ }
388
+ }
389
+ return indices;
390
+ }
391
+ async function handleBeatsProof(args) {
392
+ const count = Math.max(10, Math.min(1e4, args.count));
393
+ const difficulty = Math.max(100, Math.min(5e3, args.difficulty ?? 1e3));
394
+ const { receipt, localProof, error } = await computeWorkProof(count, difficulty);
395
+ if (receipt) {
396
+ return ok({
397
+ ...localProof,
398
+ difficulty,
399
+ receipt,
400
+ message: `Computed ${count} beats at difficulty ${difficulty} in ${localProof.duration_ms}ms. Signed receipt obtained from Beats service.`
401
+ });
402
+ }
403
+ return ok({
404
+ ...localProof,
405
+ difficulty,
406
+ receipt: null,
407
+ _warning: error ?? "Could not obtain signed receipt from Beats service.",
408
+ message: `Computed ${count} beats locally in ${localProof.duration_ms}ms but receipt not available. ${error ?? ""}`
289
409
  });
290
410
  }
291
411
  async function handleVerifyAgent(args) {
@@ -295,9 +415,18 @@ async function handleVerifyAgent(args) {
295
415
  }
296
416
  async function handleSpawn(args) {
297
417
  const creds = requireCredentials();
418
+ const SPAWN_BEATS = 1050;
419
+ const SPAWN_DIFFICULTY = 1e3;
420
+ const { receipt, error: proofError } = await computeWorkProof(SPAWN_BEATS, SPAWN_DIFFICULTY);
421
+ if (!receipt) {
422
+ return err(
423
+ `Failed to obtain Beats work-proof receipt for spawn. ${proofError ?? "Unknown error"}. You can try calling provenonce_beats_proof with count=1050 manually, then retry spawn.`
424
+ );
425
+ }
298
426
  const { data, error } = await spawnChild(creds.api_key, {
299
427
  childName: args.child_name,
300
- parentHash: creds.agent_hash
428
+ parentHash: creds.agent_hash,
429
+ beatsReceipt: receipt
301
430
  });
302
431
  if (error || !data) return err(error ?? "Spawn failed");
303
432
  return ok({
@@ -353,7 +482,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
353
482
  case "provenonce_get_passport":
354
483
  return handleGetPassport({ payment_tx: a.payment_tx });
355
484
  case "provenonce_beats_proof":
356
- return handleBeatsProof({ count: a.count });
485
+ return handleBeatsProof({
486
+ count: a.count,
487
+ difficulty: a.difficulty
488
+ });
357
489
  case "provenonce_verify_agent":
358
490
  return handleVerifyAgent({ hash: a.hash });
359
491
  case "provenonce_spawn":
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/handlers.ts","../src/credentials.ts","../src/client.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport {\r\n CallToolRequestSchema,\r\n ListToolsRequestSchema,\r\n} from '@modelcontextprotocol/sdk/types.js';\r\n\r\nimport { PROVENONCE_TOOLS } from './tools.js';\r\nimport {\r\n handleRegister,\r\n handleStatus,\r\n handlePurchaseSigil,\r\n handleHeartbeat,\r\n handleGetPassport,\r\n handleBeatsProof,\r\n handleVerifyAgent,\r\n handleSpawn,\r\n handleGetLineage,\r\n} from './handlers.js';\r\n\r\nconst server = new Server(\r\n { name: 'provenonce', version: '1.0.0' },\r\n { capabilities: { tools: {} } },\r\n);\r\n\r\n// List available tools\r\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({\r\n tools: PROVENONCE_TOOLS.map((t) => ({\r\n name: t.name,\r\n description: t.description,\r\n inputSchema: t.inputSchema,\r\n })),\r\n}));\r\n\r\n// Handle tool calls\r\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\r\n const { name, arguments: args = {} } = request.params;\r\n const a = args as Record<string, unknown>;\r\n\r\n switch (name) {\r\n case 'provenonce_register':\r\n return handleRegister({\r\n name: a.name as string | undefined,\r\n skill_ref: a.skill_ref as string | undefined,\r\n });\r\n\r\n case 'provenonce_status':\r\n return handleStatus();\r\n\r\n case 'provenonce_purchase_sigil':\r\n return handlePurchaseSigil({\r\n name: a.name as string,\r\n principal: a.principal as string,\r\n identity_class: a.identity_class as string,\r\n tier: a.tier as string,\r\n payment_tx: a.payment_tx as string,\r\n });\r\n\r\n case 'provenonce_heartbeat':\r\n return handleHeartbeat({ payment_tx: a.payment_tx as string });\r\n\r\n case 'provenonce_get_passport':\r\n return handleGetPassport({ payment_tx: a.payment_tx as string | undefined });\r\n\r\n case 'provenonce_beats_proof':\r\n return handleBeatsProof({ count: a.count as number });\r\n\r\n case 'provenonce_verify_agent':\r\n return handleVerifyAgent({ hash: a.hash as string });\r\n\r\n case 'provenonce_spawn':\r\n return handleSpawn({ child_name: a.child_name as string });\r\n\r\n case 'provenonce_get_lineage':\r\n return handleGetLineage({ hash: a.hash as string | undefined });\r\n\r\n default:\r\n return {\r\n content: [{ type: 'text', text: `Unknown tool: ${name}` }],\r\n isError: true,\r\n };\r\n }\r\n});\r\n\r\n// Start stdio transport\r\nasync function main() {\r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n}\r\n\r\nmain().catch((err) => {\r\n process.stderr.write(`Fatal: ${(err as Error).message}\\n`);\r\n process.exit(1);\r\n});\r\n","import { createHash } from 'crypto';\r\nimport { loadCredentials, saveCredentials } from './credentials.js';\r\nimport * as api from './client.js';\r\n\r\nfunction requireCredentials() {\r\n const creds = loadCredentials();\r\n if (!creds) {\r\n throw new Error(\r\n 'Not registered. Call provenonce_register first.',\r\n );\r\n }\r\n return creds;\r\n}\r\n\r\nfunction ok(data: unknown): { content: [{ type: 'text'; text: string }] } {\r\n return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };\r\n}\r\n\r\nfunction err(message: string): { content: [{ type: 'text'; text: string }]; isError: true } {\r\n return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };\r\n}\r\n\r\n// ── provenonce_register ───────────────────────────────────────────────────────\r\n\r\nexport async function handleRegister(args: { name?: string; skill_ref?: string }) {\r\n // Return existing identity if already registered\r\n const existing = loadCredentials();\r\n if (existing) {\r\n const { data, error } = await api.getStatus(existing.api_key);\r\n if (data) {\r\n return ok({\r\n registered: false,\r\n message: 'Already registered β€” returning existing identity.',\r\n hash: existing.agent_hash,\r\n sigil: data.sigil,\r\n identity_class: data.identity_class,\r\n _hint: data._hint,\r\n });\r\n }\r\n if (error) {\r\n // Credentials stale or invalid β€” fall through to re-register\r\n }\r\n }\r\n\r\n const { data, error } = await api.registerAgent({\r\n name: args.name,\r\n skillRef: args.skill_ref,\r\n });\r\n\r\n if (error || !data) return err(error ?? 'Registration failed');\r\n\r\n saveCredentials({ api_key: data.api_key, agent_hash: data.hash });\r\n\r\n return ok({\r\n registered: true,\r\n hash: data.hash,\r\n api_key: data.api_key,\r\n depth: data.depth,\r\n message: 'Agent registered. Credentials saved. Call provenonce_status to see your full state.',\r\n _warning: 'Save your api_key securely. It will not be shown again after this session.',\r\n });\r\n}\r\n\r\n// ── provenonce_status ─────────────────────────────────────────────────────────\r\n\r\nexport async function handleStatus() {\r\n const creds = requireCredentials();\r\n const { data, error } = await api.getStatus(creds.api_key);\r\n if (error || !data) return err(error ?? 'Failed to get status');\r\n return ok(data);\r\n}\r\n\r\n// ── provenonce_purchase_sigil ─────────────────────────────────────────────────\r\n\r\nexport async function handlePurchaseSigil(args: {\r\n name: string;\r\n principal: string;\r\n identity_class: string;\r\n tier: string;\r\n payment_tx: string;\r\n}) {\r\n const creds = requireCredentials();\r\n const skillRef = process.env.PROVENONCE_SKILL_REF;\r\n\r\n const { data, error } = await api.purchaseSigil(creds.api_key, {\r\n name: args.name,\r\n principal: args.principal,\r\n identity_class: args.identity_class,\r\n tier: args.tier,\r\n payment_tx: args.payment_tx,\r\n skillRef,\r\n });\r\n\r\n if (error || !data) return err(error ?? 'SIGIL purchase failed');\r\n\r\n return ok({\r\n ...data,\r\n heartbeat_unlocked: true,\r\n message: `SIGIL issued: ${data.sigil}. You can now call provenonce_heartbeat and provenonce_get_passport.`,\r\n });\r\n}\r\n\r\n// ── provenonce_heartbeat ──────────────────────────────────────────────────────\r\n\r\nexport async function handleHeartbeat(args: { payment_tx: string }) {\r\n const creds = requireCredentials();\r\n const { data, error } = await api.heartbeat(creds.api_key, args.payment_tx);\r\n if (error || !data) return err(error ?? 'Heartbeat failed');\r\n\r\n if (!data.ok && data.sigil_required) {\r\n return err('SIGIL required. Call provenonce_purchase_sigil first.');\r\n }\r\n\r\n return ok({\r\n ok: data.ok,\r\n message: data.ok ? 'Heartbeat recorded. Agent liveness confirmed.' : 'Heartbeat failed.',\r\n });\r\n}\r\n\r\n// ── provenonce_get_passport ───────────────────────────────────────────────────\r\n\r\nexport async function handleGetPassport(args: { payment_tx?: string }) {\r\n const creds = requireCredentials();\r\n const { data, error } = await api.getPassport(creds.api_key, args.payment_tx);\r\n if (error || !data) return err(error ?? 'Passport retrieval failed');\r\n\r\n return ok({\r\n passport: data.lineage_proof,\r\n message:\r\n 'Passport issued. Share this signed document with any third party to prove your identity offline.',\r\n _verify:\r\n 'Verify at: GET https://provenonce.io/.well-known/provenonce-authority.json for the authority public key.',\r\n });\r\n}\r\n\r\n// ── provenonce_beats_proof ────────────────────────────────────────────────────\r\n\r\nexport async function handleBeatsProof(args: { count: number }) {\r\n const count = Math.max(10, Math.min(1000, args.count));\r\n const creds = loadCredentials();\r\n const seed = creds?.agent_hash ?? `provenonce:beats:${Date.now()}`;\r\n\r\n const start = Date.now();\r\n let hash = createHash('sha256').update(seed).digest('hex');\r\n const fromHash = `0x${hash}`;\r\n\r\n for (let i = 1; i < count; i++) {\r\n hash = createHash('sha256').update(hash).digest('hex');\r\n }\r\n\r\n const toHash = `0x${hash}`;\r\n const duration = Date.now() - start;\r\n\r\n return ok({\r\n from_hash: fromHash,\r\n to_hash: toHash,\r\n beats_computed: count,\r\n duration_ms: duration,\r\n message: `Computed ${count} beats in ${duration}ms. This is cryptographic proof of computational work.`,\r\n });\r\n}\r\n\r\n// ── provenonce_verify_agent ───────────────────────────────────────────────────\r\n\r\nexport async function handleVerifyAgent(args: { hash: string }) {\r\n const { data, error } = await api.verifyAgent(args.hash);\r\n if (error || !data) return err(error ?? 'Verification failed');\r\n return ok(data);\r\n}\r\n\r\n// ── provenonce_spawn ──────────────────────────────────────────────────────────\r\n\r\nexport async function handleSpawn(args: { child_name: string }) {\r\n const creds = requireCredentials();\r\n\r\n const { data, error } = await api.spawnChild(creds.api_key, {\r\n childName: args.child_name,\r\n parentHash: creds.agent_hash,\r\n });\r\n\r\n if (error || !data) return err(error ?? 'Spawn failed');\r\n\r\n return ok({\r\n ...data,\r\n message: `Child agent spawned: ${data.child_hash}. Save the child_api_key β€” it will not be shown again.`,\r\n _warning: 'The child agent has its own identity. Configure it with PROVENONCE_API_KEY + PROVENONCE_AGENT_HASH.',\r\n });\r\n}\r\n\r\n// ── provenonce_get_lineage ────────────────────────────────────────────────────\r\n\r\nexport async function handleGetLineage(args: { hash?: string }) {\r\n const creds = loadCredentials();\r\n const targetHash = args.hash ?? creds?.agent_hash;\r\n\r\n if (!targetHash) {\r\n return err('No hash provided and agent is not registered. Call provenonce_register first or provide a hash.');\r\n }\r\n\r\n const { data, error } = await api.getLineage(targetHash);\r\n if (error || !data) return err(error ?? 'Lineage retrieval failed');\r\n return ok(data);\r\n}\r\n","import { readFileSync, writeFileSync, mkdirSync, chmodSync, existsSync } from 'fs';\r\nimport { join } from 'path';\r\nimport { homedir } from 'os';\r\nimport type { StoredCredentials } from './types.js';\r\n\r\nfunction getConfigDir(): string {\r\n return join(homedir(), '.provenonce');\r\n}\r\n\r\nfunction getConfigPath(): string {\r\n return join(getConfigDir(), 'config.json');\r\n}\r\n\r\n/** Load credentials β€” env vars take priority over config file */\r\nexport function loadCredentials(): StoredCredentials | null {\r\n const apiKey = process.env.PROVENONCE_API_KEY;\r\n const agentHash = process.env.PROVENONCE_AGENT_HASH;\r\n\r\n if (apiKey && agentHash) {\r\n return { api_key: apiKey, agent_hash: agentHash };\r\n }\r\n\r\n const configPath = getConfigPath();\r\n if (!existsSync(configPath)) return null;\r\n\r\n try {\r\n const raw = readFileSync(configPath, 'utf-8');\r\n const parsed = JSON.parse(raw) as Partial<StoredCredentials>;\r\n if (parsed.api_key && parsed.agent_hash) {\r\n return { api_key: parsed.api_key, agent_hash: parsed.agent_hash };\r\n }\r\n } catch {\r\n // Corrupt config β€” treat as missing\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/** Persist credentials to ~/.provenonce/config.json (chmod 600) */\r\nexport function saveCredentials(creds: StoredCredentials): void {\r\n const dir = getConfigDir();\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n\r\n const configPath = getConfigPath();\r\n const data: StoredCredentials = {\r\n api_key: creds.api_key,\r\n agent_hash: creds.agent_hash,\r\n };\r\n\r\n writeFileSync(configPath, JSON.stringify(data, null, 2), 'utf-8');\r\n\r\n // chmod 600 β€” owner read/write only (Unix only; no-op on Windows)\r\n try {\r\n chmodSync(configPath, 0o600);\r\n } catch {\r\n // Windows β€” chmod not supported; recommend env var instead\r\n }\r\n}\r\n\r\n/** Clear stored credentials */\r\nexport function clearCredentials(): void {\r\n const configPath = getConfigPath();\r\n if (existsSync(configPath)) {\r\n writeFileSync(configPath, '{}', 'utf-8');\r\n }\r\n}\r\n","import type {\r\n RegisterResult,\r\n AgentStatus,\r\n HeartbeatResult,\r\n PassportResult,\r\n SigilResult,\r\n VerifyAgentResult,\r\n LineageResult,\r\n SpawnResult,\r\n} from './types.js';\r\n\r\nconst REGISTRY_URL = process.env.PROVENONCE_REGISTRY_URL || 'https://provenonce.io';\r\n\r\nasync function apiFetch<T>(\r\n path: string,\r\n opts: { method?: string; body?: unknown; apiKey?: string; isPublic?: boolean } = {},\r\n): Promise<{ data: T | null; error: string | null }> {\r\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\r\n if (opts.apiKey) headers['Authorization'] = `Bearer ${opts.apiKey}`;\r\n\r\n try {\r\n const res = await fetch(`${REGISTRY_URL}${path}`, {\r\n method: opts.method ?? 'GET',\r\n headers,\r\n body: opts.body ? JSON.stringify(opts.body) : undefined,\r\n });\r\n\r\n const json = await res.json() as Record<string, unknown>;\r\n\r\n if (!res.ok) {\r\n const msg = (json.error as string) ?? `HTTP ${res.status}`;\r\n return { data: null, error: msg };\r\n }\r\n\r\n return { data: json as T, error: null };\r\n } catch (err) {\r\n return { data: null, error: (err as Error).message };\r\n }\r\n}\r\n\r\n/** Register a new agent (no-wallet path) */\r\nexport async function registerAgent(opts: {\r\n name?: string;\r\n skillRef?: string;\r\n}): Promise<{ data: RegisterResult | null; error: string | null }> {\r\n return apiFetch<RegisterResult>('/api/v1/register', {\r\n method: 'POST',\r\n body: {\r\n name: opts.name,\r\n wallet: 'none',\r\n ...(opts.skillRef ? { ref: opts.skillRef } : {}),\r\n },\r\n });\r\n}\r\n\r\n/** Get full agent status */\r\nexport async function getStatus(apiKey: string): Promise<{ data: AgentStatus | null; error: string | null }> {\r\n return apiFetch<AgentStatus>('/api/v1/skill/bootstrap', {\r\n method: 'POST',\r\n apiKey,\r\n body: {},\r\n });\r\n}\r\n\r\n/** Submit heartbeat */\r\nexport async function heartbeat(apiKey: string, paymentTx?: string): Promise<{ data: HeartbeatResult | null; error: string | null }> {\r\n return apiFetch<HeartbeatResult>('/api/v1/agent/heartbeat', {\r\n method: 'POST',\r\n apiKey,\r\n body: { payment_tx: paymentTx },\r\n });\r\n}\r\n\r\n/** Reissue passport / lineage proof */\r\nexport async function getPassport(apiKey: string, paymentTx?: string): Promise<{ data: { lineage_proof: PassportResult } | null; error: string | null }> {\r\n return apiFetch<{ lineage_proof: PassportResult }>('/api/v1/agent/reissue-proof', {\r\n method: 'POST',\r\n apiKey,\r\n body: paymentTx ? { payment_tx: paymentTx } : {},\r\n });\r\n}\r\n\r\n/** Purchase a SIGIL */\r\nexport async function purchaseSigil(apiKey: string, opts: {\r\n name: string;\r\n principal: string;\r\n identity_class: string;\r\n tier: string;\r\n payment_tx: string;\r\n skillRef?: string;\r\n}): Promise<{ data: SigilResult | null; error: string | null }> {\r\n return apiFetch<SigilResult>('/api/v1/sigil', {\r\n method: 'POST',\r\n apiKey,\r\n body: {\r\n name: opts.name,\r\n principal: opts.principal,\r\n identity_class: opts.identity_class,\r\n tier: opts.tier,\r\n payment_tx: opts.payment_tx,\r\n ...(opts.skillRef ? { ref: opts.skillRef } : {}),\r\n },\r\n });\r\n}\r\n\r\n/** Verify another agent's identity (public) */\r\nexport async function verifyAgent(hash: string): Promise<{ data: VerifyAgentResult | null; error: string | null }> {\r\n return apiFetch<VerifyAgentResult>(`/api/v1/verify/${encodeURIComponent(hash)}`);\r\n}\r\n\r\n/** Get agent lineage chain (public) */\r\nexport async function getLineage(hash: string): Promise<{ data: LineageResult | null; error: string | null }> {\r\n return apiFetch<LineageResult>(`/api/v1/agent/lineage/${encodeURIComponent(hash)}`);\r\n}\r\n\r\n/** Spawn a child agent β€” handles full 3-step flow internally */\r\nexport async function spawnChild(apiKey: string, opts: {\r\n childName: string;\r\n parentHash: string;\r\n}): Promise<{ data: SpawnResult | null; error: string | null }> {\r\n // Step 1: Get spawn authorization\r\n const step1 = await apiFetch<{\r\n spawn_authorization: string;\r\n child_name?: string;\r\n }>('/api/v1/agent/spawn', {\r\n method: 'POST',\r\n apiKey,\r\n body: { child_name: opts.childName },\r\n });\r\n\r\n if (step1.error || !step1.data?.spawn_authorization) {\r\n return { data: null, error: step1.error ?? 'Spawn step 1 failed: no authorization returned' };\r\n }\r\n\r\n const spawnAuth = step1.data.spawn_authorization;\r\n\r\n // Step 2: Register the child with the spawn_authorization\r\n const reg = await apiFetch<RegisterResult>('/api/v1/register', {\r\n method: 'POST',\r\n apiKey,\r\n body: {\r\n name: opts.childName,\r\n wallet: 'none',\r\n spawn_authorization: spawnAuth,\r\n },\r\n });\r\n\r\n if (reg.error || !reg.data?.hash) {\r\n return { data: null, error: reg.error ?? 'Spawn step 2 (child registration) failed' };\r\n }\r\n\r\n const childHash = reg.data.hash;\r\n const childApiKey = reg.data.api_key;\r\n\r\n // Step 3: Finalize the spawn\r\n const step3 = await apiFetch<{ ok: boolean }>('/api/v1/agent/spawn', {\r\n method: 'POST',\r\n apiKey,\r\n body: { child_hash: childHash },\r\n });\r\n\r\n if (step3.error) {\r\n return { data: null, error: step3.error };\r\n }\r\n\r\n return {\r\n data: {\r\n child_hash: childHash,\r\n child_api_key: childApiKey,\r\n child_depth: reg.data.depth,\r\n parent_hash: opts.parentHash,\r\n },\r\n error: null,\r\n };\r\n}\r\n"],"mappings":";;;;;;AAAA,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,OACK;;;ACLP,SAAS,kBAAkB;;;ACA3B,SAAS,cAAc,eAAe,WAAW,WAAW,kBAAkB;AAC9E,SAAS,YAAY;AACrB,SAAS,eAAe;AAGxB,SAAS,eAAuB;AAC9B,SAAO,KAAK,QAAQ,GAAG,aAAa;AACtC;AAEA,SAAS,gBAAwB;AAC/B,SAAO,KAAK,aAAa,GAAG,aAAa;AAC3C;AAGO,SAAS,kBAA4C;AAC1D,QAAM,SAAS,QAAQ,IAAI;AAC3B,QAAM,YAAY,QAAQ,IAAI;AAE9B,MAAI,UAAU,WAAW;AACvB,WAAO,EAAE,SAAS,QAAQ,YAAY,UAAU;AAAA,EAClD;AAEA,QAAM,aAAa,cAAc;AACjC,MAAI,CAAC,WAAW,UAAU,EAAG,QAAO;AAEpC,MAAI;AACF,UAAM,MAAM,aAAa,YAAY,OAAO;AAC5C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,OAAO,WAAW,OAAO,YAAY;AACvC,aAAO,EAAE,SAAS,OAAO,SAAS,YAAY,OAAO,WAAW;AAAA,IAClE;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAGO,SAAS,gBAAgB,OAAgC;AAC9D,QAAM,MAAM,aAAa;AACzB,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AAEA,QAAM,aAAa,cAAc;AACjC,QAAM,OAA0B;AAAA,IAC9B,SAAS,MAAM;AAAA,IACf,YAAY,MAAM;AAAA,EACpB;AAEA,gBAAc,YAAY,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,OAAO;AAGhE,MAAI;AACF,cAAU,YAAY,GAAK;AAAA,EAC7B,QAAQ;AAAA,EAER;AACF;;;AChDA,IAAM,eAAe,QAAQ,IAAI,2BAA2B;AAE5D,eAAe,SACb,MACA,OAAiF,CAAC,GAC/B;AACnD,QAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,MAAI,KAAK,OAAQ,SAAQ,eAAe,IAAI,UAAU,KAAK,MAAM;AAEjE,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,YAAY,GAAG,IAAI,IAAI;AAAA,MAChD,QAAQ,KAAK,UAAU;AAAA,MACvB;AAAA,MACA,MAAM,KAAK,OAAO,KAAK,UAAU,KAAK,IAAI,IAAI;AAAA,IAChD,CAAC;AAED,UAAM,OAAO,MAAM,IAAI,KAAK;AAE5B,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MAAO,KAAK,SAAoB,QAAQ,IAAI,MAAM;AACxD,aAAO,EAAE,MAAM,MAAM,OAAO,IAAI;AAAA,IAClC;AAEA,WAAO,EAAE,MAAM,MAAW,OAAO,KAAK;AAAA,EACxC,SAASA,MAAK;AACZ,WAAO,EAAE,MAAM,MAAM,OAAQA,KAAc,QAAQ;AAAA,EACrD;AACF;AAGA,eAAsB,cAAc,MAG+B;AACjE,SAAO,SAAyB,oBAAoB;AAAA,IAClD,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,MAAM,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,GAAI,KAAK,WAAW,EAAE,KAAK,KAAK,SAAS,IAAI,CAAC;AAAA,IAChD;AAAA,EACF,CAAC;AACH;AAGA,eAAsB,UAAU,QAA6E;AAC3G,SAAO,SAAsB,2BAA2B;AAAA,IACtD,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,CAAC;AAAA,EACT,CAAC;AACH;AAGA,eAAsB,UAAU,QAAgB,WAAqF;AACnI,SAAO,SAA0B,2BAA2B;AAAA,IAC1D,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,EAAE,YAAY,UAAU;AAAA,EAChC,CAAC;AACH;AAGA,eAAsB,YAAY,QAAgB,WAAuG;AACvJ,SAAO,SAA4C,+BAA+B;AAAA,IAChF,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,YAAY,EAAE,YAAY,UAAU,IAAI,CAAC;AAAA,EACjD,CAAC;AACH;AAGA,eAAsB,cAAc,QAAgB,MAOY;AAC9D,SAAO,SAAsB,iBAAiB;AAAA,IAC5C,QAAQ;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACJ,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,MAChB,gBAAgB,KAAK;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,YAAY,KAAK;AAAA,MACjB,GAAI,KAAK,WAAW,EAAE,KAAK,KAAK,SAAS,IAAI,CAAC;AAAA,IAChD;AAAA,EACF,CAAC;AACH;AAGA,eAAsB,YAAY,MAAiF;AACjH,SAAO,SAA4B,kBAAkB,mBAAmB,IAAI,CAAC,EAAE;AACjF;AAGA,eAAsB,WAAW,MAA6E;AAC5G,SAAO,SAAwB,yBAAyB,mBAAmB,IAAI,CAAC,EAAE;AACpF;AAGA,eAAsB,WAAW,QAAgB,MAGe;AAE9D,QAAM,QAAQ,MAAM,SAGjB,uBAAuB;AAAA,IACxB,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,EAAE,YAAY,KAAK,UAAU;AAAA,EACrC,CAAC;AAED,MAAI,MAAM,SAAS,CAAC,MAAM,MAAM,qBAAqB;AACnD,WAAO,EAAE,MAAM,MAAM,OAAO,MAAM,SAAS,iDAAiD;AAAA,EAC9F;AAEA,QAAM,YAAY,MAAM,KAAK;AAG7B,QAAM,MAAM,MAAM,SAAyB,oBAAoB;AAAA,IAC7D,QAAQ;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACJ,MAAM,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,qBAAqB;AAAA,IACvB;AAAA,EACF,CAAC;AAED,MAAI,IAAI,SAAS,CAAC,IAAI,MAAM,MAAM;AAChC,WAAO,EAAE,MAAM,MAAM,OAAO,IAAI,SAAS,2CAA2C;AAAA,EACtF;AAEA,QAAM,YAAY,IAAI,KAAK;AAC3B,QAAM,cAAc,IAAI,KAAK;AAG7B,QAAM,QAAQ,MAAM,SAA0B,uBAAuB;AAAA,IACnE,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,EAAE,YAAY,UAAU;AAAA,EAChC,CAAC;AAED,MAAI,MAAM,OAAO;AACf,WAAO,EAAE,MAAM,MAAM,OAAO,MAAM,MAAM;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,aAAa,IAAI,KAAK;AAAA,MACtB,aAAa,KAAK;AAAA,IACpB;AAAA,IACA,OAAO;AAAA,EACT;AACF;;;AF1KA,SAAS,qBAAqB;AAC5B,QAAM,QAAQ,gBAAgB;AAC9B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,GAAG,MAA8D;AACxE,SAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC,EAAE;AAC5E;AAEA,SAAS,IAAI,SAA+E;AAC1F,SAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AACjF;AAIA,eAAsB,eAAe,MAA6C;AAEhF,QAAM,WAAW,gBAAgB;AACjC,MAAI,UAAU;AACZ,UAAM,EAAE,MAAAC,OAAM,OAAAC,OAAM,IAAI,MAAU,UAAU,SAAS,OAAO;AAC5D,QAAID,OAAM;AACR,aAAO,GAAG;AAAA,QACR,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,MAAM,SAAS;AAAA,QACf,OAAOA,MAAK;AAAA,QACZ,gBAAgBA,MAAK;AAAA,QACrB,OAAOA,MAAK;AAAA,MACd,CAAC;AAAA,IACH;AACA,QAAIC,QAAO;AAAA,IAEX;AAAA,EACF;AAEA,QAAM,EAAE,MAAM,MAAM,IAAI,MAAU,cAAc;AAAA,IAC9C,MAAM,KAAK;AAAA,IACX,UAAU,KAAK;AAAA,EACjB,CAAC;AAED,MAAI,SAAS,CAAC,KAAM,QAAO,IAAI,SAAS,qBAAqB;AAE7D,kBAAgB,EAAE,SAAS,KAAK,SAAS,YAAY,KAAK,KAAK,CAAC;AAEhE,SAAO,GAAG;AAAA,IACR,YAAY;AAAA,IACZ,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,IACZ,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AACH;AAIA,eAAsB,eAAe;AACnC,QAAM,QAAQ,mBAAmB;AACjC,QAAM,EAAE,MAAM,MAAM,IAAI,MAAU,UAAU,MAAM,OAAO;AACzD,MAAI,SAAS,CAAC,KAAM,QAAO,IAAI,SAAS,sBAAsB;AAC9D,SAAO,GAAG,IAAI;AAChB;AAIA,eAAsB,oBAAoB,MAMvC;AACD,QAAM,QAAQ,mBAAmB;AACjC,QAAM,WAAW,QAAQ,IAAI;AAE7B,QAAM,EAAE,MAAM,MAAM,IAAI,MAAU,cAAc,MAAM,SAAS;AAAA,IAC7D,MAAM,KAAK;AAAA,IACX,WAAW,KAAK;AAAA,IAChB,gBAAgB,KAAK;AAAA,IACrB,MAAM,KAAK;AAAA,IACX,YAAY,KAAK;AAAA,IACjB;AAAA,EACF,CAAC;AAED,MAAI,SAAS,CAAC,KAAM,QAAO,IAAI,SAAS,uBAAuB;AAE/D,SAAO,GAAG;AAAA,IACR,GAAG;AAAA,IACH,oBAAoB;AAAA,IACpB,SAAS,iBAAiB,KAAK,KAAK;AAAA,EACtC,CAAC;AACH;AAIA,eAAsB,gBAAgB,MAA8B;AAClE,QAAM,QAAQ,mBAAmB;AACjC,QAAM,EAAE,MAAM,MAAM,IAAI,MAAU,UAAU,MAAM,SAAS,KAAK,UAAU;AAC1E,MAAI,SAAS,CAAC,KAAM,QAAO,IAAI,SAAS,kBAAkB;AAE1D,MAAI,CAAC,KAAK,MAAM,KAAK,gBAAgB;AACnC,WAAO,IAAI,uDAAuD;AAAA,EACpE;AAEA,SAAO,GAAG;AAAA,IACR,IAAI,KAAK;AAAA,IACT,SAAS,KAAK,KAAK,kDAAkD;AAAA,EACvE,CAAC;AACH;AAIA,eAAsB,kBAAkB,MAA+B;AACrE,QAAM,QAAQ,mBAAmB;AACjC,QAAM,EAAE,MAAM,MAAM,IAAI,MAAU,YAAY,MAAM,SAAS,KAAK,UAAU;AAC5E,MAAI,SAAS,CAAC,KAAM,QAAO,IAAI,SAAS,2BAA2B;AAEnE,SAAO,GAAG;AAAA,IACR,UAAU,KAAK;AAAA,IACf,SACE;AAAA,IACF,SACE;AAAA,EACJ,CAAC;AACH;AAIA,eAAsB,iBAAiB,MAAyB;AAC9D,QAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,IAAI,KAAM,KAAK,KAAK,CAAC;AACrD,QAAM,QAAQ,gBAAgB;AAC9B,QAAM,OAAO,OAAO,cAAc,oBAAoB,KAAK,IAAI,CAAC;AAEhE,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI,OAAO,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AACzD,QAAM,WAAW,KAAK,IAAI;AAE1B,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,WAAO,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAAA,EACvD;AAEA,QAAM,SAAS,KAAK,IAAI;AACxB,QAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,SAAO,GAAG;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,SAAS,YAAY,KAAK,aAAa,QAAQ;AAAA,EACjD,CAAC;AACH;AAIA,eAAsB,kBAAkB,MAAwB;AAC9D,QAAM,EAAE,MAAM,MAAM,IAAI,MAAU,YAAY,KAAK,IAAI;AACvD,MAAI,SAAS,CAAC,KAAM,QAAO,IAAI,SAAS,qBAAqB;AAC7D,SAAO,GAAG,IAAI;AAChB;AAIA,eAAsB,YAAY,MAA8B;AAC9D,QAAM,QAAQ,mBAAmB;AAEjC,QAAM,EAAE,MAAM,MAAM,IAAI,MAAU,WAAW,MAAM,SAAS;AAAA,IAC1D,WAAW,KAAK;AAAA,IAChB,YAAY,MAAM;AAAA,EACpB,CAAC;AAED,MAAI,SAAS,CAAC,KAAM,QAAO,IAAI,SAAS,cAAc;AAEtD,SAAO,GAAG;AAAA,IACR,GAAG;AAAA,IACH,SAAS,wBAAwB,KAAK,UAAU;AAAA,IAChD,UAAU;AAAA,EACZ,CAAC;AACH;AAIA,eAAsB,iBAAiB,MAAyB;AAC9D,QAAM,QAAQ,gBAAgB;AAC9B,QAAM,aAAa,KAAK,QAAQ,OAAO;AAEvC,MAAI,CAAC,YAAY;AACf,WAAO,IAAI,iGAAiG;AAAA,EAC9G;AAEA,QAAM,EAAE,MAAM,MAAM,IAAI,MAAU,WAAW,UAAU;AACvD,MAAI,SAAS,CAAC,KAAM,QAAO,IAAI,SAAS,0BAA0B;AAClE,SAAO,GAAG,IAAI;AAChB;;;ADtLA,IAAM,SAAS,IAAI;AAAA,EACjB,EAAE,MAAM,cAAc,SAAS,QAAQ;AAAA,EACvC,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,EAAE;AAChC;AAGA,OAAO,kBAAkB,wBAAwB,aAAa;AAAA,EAC5D,OAAO,iBAAiB,IAAI,CAAC,OAAO;AAAA,IAClC,MAAM,EAAE;AAAA,IACR,aAAa,EAAE;AAAA,IACf,aAAa,EAAE;AAAA,EACjB,EAAE;AACJ,EAAE;AAGF,OAAO,kBAAkB,uBAAuB,OAAO,YAAY;AACjE,QAAM,EAAE,MAAM,WAAW,OAAO,CAAC,EAAE,IAAI,QAAQ;AAC/C,QAAM,IAAI;AAEV,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,eAAe;AAAA,QACpB,MAAM,EAAE;AAAA,QACR,WAAW,EAAE;AAAA,MACf,CAAC;AAAA,IAEH,KAAK;AACH,aAAO,aAAa;AAAA,IAEtB,KAAK;AACH,aAAO,oBAAoB;AAAA,QACzB,MAAM,EAAE;AAAA,QACR,WAAW,EAAE;AAAA,QACb,gBAAgB,EAAE;AAAA,QAClB,MAAM,EAAE;AAAA,QACR,YAAY,EAAE;AAAA,MAChB,CAAC;AAAA,IAEH,KAAK;AACH,aAAO,gBAAgB,EAAE,YAAY,EAAE,WAAqB,CAAC;AAAA,IAE/D,KAAK;AACH,aAAO,kBAAkB,EAAE,YAAY,EAAE,WAAiC,CAAC;AAAA,IAE7E,KAAK;AACH,aAAO,iBAAiB,EAAE,OAAO,EAAE,MAAgB,CAAC;AAAA,IAEtD,KAAK;AACH,aAAO,kBAAkB,EAAE,MAAM,EAAE,KAAe,CAAC;AAAA,IAErD,KAAK;AACH,aAAO,YAAY,EAAE,YAAY,EAAE,WAAqB,CAAC;AAAA,IAE3D,KAAK;AACH,aAAO,iBAAiB,EAAE,MAAM,EAAE,KAA2B,CAAC;AAAA,IAEhE;AACE,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,iBAAiB,IAAI,GAAG,CAAC;AAAA,QACzD,SAAS;AAAA,MACX;AAAA,EACJ;AACF,CAAC;AAGD,eAAe,OAAO;AACpB,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAChC;AAEA,KAAK,EAAE,MAAM,CAACC,SAAQ;AACpB,UAAQ,OAAO,MAAM,UAAWA,KAAc,OAAO;AAAA,CAAI;AACzD,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["err","data","error","err"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/handlers.ts","../src/credentials.ts","../src/client.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport {\r\n CallToolRequestSchema,\r\n ListToolsRequestSchema,\r\n} from '@modelcontextprotocol/sdk/types.js';\r\n\r\nimport { PROVENONCE_TOOLS } from './tools.js';\r\nimport {\r\n handleRegister,\r\n handleStatus,\r\n handlePurchaseSigil,\r\n handleHeartbeat,\r\n handleGetPassport,\r\n handleBeatsProof,\r\n handleVerifyAgent,\r\n handleSpawn,\r\n handleGetLineage,\r\n} from './handlers.js';\r\n\r\nconst server = new Server(\r\n { name: 'provenonce', version: '1.0.0' },\r\n { capabilities: { tools: {} } },\r\n);\r\n\r\n// List available tools\r\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({\r\n tools: PROVENONCE_TOOLS.map((t) => ({\r\n name: t.name,\r\n description: t.description,\r\n inputSchema: t.inputSchema,\r\n })),\r\n}));\r\n\r\n// Handle tool calls\r\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\r\n const { name, arguments: args = {} } = request.params;\r\n const a = args as Record<string, unknown>;\r\n\r\n switch (name) {\r\n case 'provenonce_register':\r\n return handleRegister({\r\n name: a.name as string | undefined,\r\n skill_ref: a.skill_ref as string | undefined,\r\n });\r\n\r\n case 'provenonce_status':\r\n return handleStatus();\r\n\r\n case 'provenonce_purchase_sigil':\r\n return handlePurchaseSigil({\r\n name: a.name as string,\r\n principal: a.principal as string,\r\n identity_class: a.identity_class as string,\r\n tier: a.tier as string,\r\n payment_tx: a.payment_tx as string,\r\n });\r\n\r\n case 'provenonce_heartbeat':\r\n return handleHeartbeat({ payment_tx: a.payment_tx as string });\r\n\r\n case 'provenonce_get_passport':\r\n return handleGetPassport({ payment_tx: a.payment_tx as string | undefined });\r\n\r\n case 'provenonce_beats_proof':\r\n return handleBeatsProof({\r\n count: a.count as number,\r\n difficulty: a.difficulty as number | undefined,\r\n });\r\n\r\n case 'provenonce_verify_agent':\r\n return handleVerifyAgent({ hash: a.hash as string });\r\n\r\n case 'provenonce_spawn':\r\n return handleSpawn({ child_name: a.child_name as string });\r\n\r\n case 'provenonce_get_lineage':\r\n return handleGetLineage({ hash: a.hash as string | undefined });\r\n\r\n default:\r\n return {\r\n content: [{ type: 'text', text: `Unknown tool: ${name}` }],\r\n isError: true,\r\n };\r\n }\r\n});\r\n\r\n// Start stdio transport\r\nasync function main() {\r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n}\r\n\r\nmain().catch((err) => {\r\n process.stderr.write(`Fatal: ${(err as Error).message}\\n`);\r\n process.exit(1);\r\n});\r\n","import { createHash, randomBytes } from 'crypto';\r\nimport { loadCredentials, saveCredentials } from './credentials.js';\r\nimport * as api from './client.js';\r\nimport type { WorkProofReceipt } from './types.js';\r\n\r\nfunction requireCredentials() {\r\n const creds = loadCredentials();\r\n if (!creds) {\r\n throw new Error(\r\n 'Not registered. Call provenonce_register first.',\r\n );\r\n }\r\n return creds;\r\n}\r\n\r\nfunction ok(data: unknown): { content: [{ type: 'text'; text: string }] } {\r\n return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };\r\n}\r\n\r\nfunction err(message: string): { content: [{ type: 'text'; text: string }]; isError: true } {\r\n return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };\r\n}\r\n\r\n// ── provenonce_register ───────────────────────────────────────────────────────\r\n\r\nexport async function handleRegister(args: { name?: string; skill_ref?: string }) {\r\n // Return existing identity if already registered\r\n const existing = loadCredentials();\r\n if (existing) {\r\n const { data, error } = await api.getStatus(existing.api_key);\r\n if (data) {\r\n return ok({\r\n registered: false,\r\n message: 'Already registered β€” returning existing identity.',\r\n hash: existing.agent_hash,\r\n sigil: data.sigil,\r\n identity_class: data.identity_class,\r\n _hint: data._hint,\r\n });\r\n }\r\n if (error) {\r\n // Credentials stale or invalid β€” fall through to re-register\r\n }\r\n }\r\n\r\n const { data, error } = await api.registerAgent({\r\n name: args.name,\r\n skillRef: args.skill_ref,\r\n });\r\n\r\n if (error || !data) return err(error ?? 'Registration failed');\r\n\r\n saveCredentials({ api_key: data.api_key, agent_hash: data.hash });\r\n\r\n return ok({\r\n registered: true,\r\n hash: data.hash,\r\n api_key: data.api_key,\r\n depth: data.depth,\r\n message: 'Agent registered. Credentials saved. Call provenonce_status to see your full state.',\r\n _warning: 'Save your api_key securely. It will not be shown again after this session.',\r\n });\r\n}\r\n\r\n// ── provenonce_status ─────────────────────────────────────────────────────────\r\n\r\nexport async function handleStatus() {\r\n const creds = requireCredentials();\r\n const { data, error } = await api.getStatus(creds.api_key);\r\n if (error || !data) return err(error ?? 'Failed to get status');\r\n return ok(data);\r\n}\r\n\r\n// ── provenonce_purchase_sigil ─────────────────────────────────────────────────\r\n\r\nexport async function handlePurchaseSigil(args: {\r\n name: string;\r\n principal: string;\r\n identity_class: string;\r\n tier: string;\r\n payment_tx: string;\r\n}) {\r\n const creds = requireCredentials();\r\n const skillRef = process.env.PROVENONCE_SKILL_REF;\r\n\r\n const { data, error } = await api.purchaseSigil(creds.api_key, {\r\n name: args.name,\r\n principal: args.principal,\r\n identity_class: args.identity_class,\r\n tier: args.tier,\r\n payment_tx: args.payment_tx,\r\n skillRef,\r\n });\r\n\r\n if (error || !data) return err(error ?? 'SIGIL purchase failed');\r\n\r\n return ok({\r\n ...data,\r\n heartbeat_unlocked: true,\r\n message: `SIGIL issued: ${data.sigil}. You can now call provenonce_heartbeat and provenonce_get_passport.`,\r\n });\r\n}\r\n\r\n// ── provenonce_heartbeat ──────────────────────────────────────────────────────\r\n\r\nexport async function handleHeartbeat(args: { payment_tx: string }) {\r\n const creds = requireCredentials();\r\n const { data, error } = await api.heartbeat(creds.api_key, args.payment_tx);\r\n if (error || !data) return err(error ?? 'Heartbeat failed');\r\n\r\n if (!data.ok && data.sigil_required) {\r\n return err('SIGIL required. Call provenonce_purchase_sigil first.');\r\n }\r\n\r\n return ok({\r\n ok: data.ok,\r\n message: data.ok ? 'Heartbeat recorded. Agent liveness confirmed.' : 'Heartbeat failed.',\r\n });\r\n}\r\n\r\n// ── provenonce_get_passport ───────────────────────────────────────────────────\r\n\r\nexport async function handleGetPassport(args: { payment_tx?: string }) {\r\n const creds = requireCredentials();\r\n const { data, error } = await api.getPassport(creds.api_key, args.payment_tx);\r\n if (error || !data) return err(error ?? 'Passport retrieval failed');\r\n\r\n return ok({\r\n passport: data.lineage_proof,\r\n message:\r\n 'Passport issued. Share this signed document with any third party to prove your identity offline.',\r\n _verify:\r\n 'Verify at: GET https://provenonce.io/.well-known/provenonce-authority.json for the authority public key.',\r\n });\r\n}\r\n\r\n// ── provenonce_beats_proof ────────────────────────────────────────────────────\r\n\r\n/**\r\n * Compute a single beat using the canonical Provenonce formula from lib/beat.ts.\r\n * seed = `${prevHash}:${beatIndex}::${anchorHash}` (empty nonce)\r\n * hash = sha256(seed), then sha256(hash) `difficulty` times.\r\n */\r\nfunction computeBeatHash(prevHash: string, beatIndex: number, difficulty: number, anchorHash?: string): string {\r\n const seed = anchorHash\r\n ? `${prevHash}:${beatIndex}::${anchorHash}`\r\n : `${prevHash}:${beatIndex}:`;\r\n\r\n let current = createHash('sha256').update(seed, 'utf8').digest('hex');\r\n for (let i = 0; i < difficulty; i++) {\r\n current = createHash('sha256').update(current, 'utf8').digest('hex');\r\n }\r\n return current;\r\n}\r\n\r\n/**\r\n * Compute a full beats work-proof and submit to the Beats service for a signed receipt.\r\n */\r\nexport async function computeWorkProof(\r\n count: number,\r\n difficulty: number,\r\n): Promise<{ receipt: WorkProofReceipt | null; localProof: { from_hash: string; to_hash: string; beats_computed: number; duration_ms: number }; error?: string }> {\r\n // 1. Fetch current anchor\r\n const anchorRes = await api.fetchAnchor();\r\n const anchor = anchorRes.data?.anchor;\r\n const anchorHash = anchor?.hash;\r\n const anchorIndex = anchor?.beat_index ?? 0;\r\n\r\n // 2. Generate genesis hash\r\n const genesisInput = `provenonce:beats:${randomBytes(16).toString('hex')}`;\r\n const genesisHash = createHash('sha256').update(genesisInput, 'utf8').digest('hex');\r\n\r\n // 3. Compute beats with proper formula + collect spot checks\r\n const spotCheckIndices = selectSpotCheckIndices(count);\r\n const spotChecks: { index: number; hash: string; prev: string }[] = [];\r\n\r\n const start = Date.now();\r\n let prevHash = genesisHash;\r\n\r\n for (let i = 1; i <= count; i++) {\r\n const hash = computeBeatHash(prevHash, i, difficulty, anchorHash);\r\n\r\n if (spotCheckIndices.has(i)) {\r\n spotChecks.push({ index: i, hash, prev: prevHash });\r\n }\r\n\r\n prevHash = hash;\r\n }\r\n\r\n const duration = Date.now() - start;\r\n const fromHash = genesisHash;\r\n const toHash = prevHash;\r\n\r\n const localProof = {\r\n from_hash: fromHash,\r\n to_hash: toHash,\r\n beats_computed: count,\r\n duration_ms: duration,\r\n };\r\n\r\n // 4. Submit to Beats service for a signed receipt\r\n const submitRes = await api.submitWorkProof({\r\n from_hash: fromHash,\r\n to_hash: toHash,\r\n beats_computed: count,\r\n difficulty,\r\n anchor_index: anchorIndex,\r\n anchor_hash: anchorHash,\r\n spot_checks: spotChecks,\r\n });\r\n\r\n if (submitRes.error) {\r\n return { receipt: null, localProof, error: `Beats submission failed: ${submitRes.error}` };\r\n }\r\n\r\n if (!submitRes.data?.valid) {\r\n return { receipt: null, localProof, error: `Beats rejected proof: ${submitRes.data?.reason ?? 'unknown'}` };\r\n }\r\n\r\n return { receipt: submitRes.data.receipt ?? null, localProof };\r\n}\r\n\r\n/**\r\n * Select spot check indices for a given beat count.\r\n * Rules: first beat + last beat + evenly-spaced interior.\r\n * Density: 1 per 1000 beats, min 3.\r\n */\r\nfunction selectSpotCheckIndices(count: number): Set<number> {\r\n const minChecks = 3;\r\n const density = 1000;\r\n const maxChecks = 25;\r\n const needed = Math.max(\r\n Math.min(count, minChecks),\r\n Math.min(Math.ceil(count / density), maxChecks),\r\n );\r\n\r\n const indices = new Set<number>();\r\n indices.add(1); // first beat (genesis binding)\r\n indices.add(count); // last beat (terminal binding)\r\n\r\n // Fill interior evenly\r\n if (needed > 2 && count > 2) {\r\n const interiorNeeded = needed - 2;\r\n for (let j = 1; j <= interiorNeeded; j++) {\r\n const idx = Math.round(1 + (j * (count - 1)) / (interiorNeeded + 1));\r\n if (idx > 1 && idx < count) {\r\n indices.add(idx);\r\n }\r\n }\r\n }\r\n\r\n return indices;\r\n}\r\n\r\nexport async function handleBeatsProof(args: { count: number; difficulty?: number }) {\r\n const count = Math.max(10, Math.min(10000, args.count));\r\n const difficulty = Math.max(100, Math.min(5000, args.difficulty ?? 1000));\r\n\r\n const { receipt, localProof, error } = await computeWorkProof(count, difficulty);\r\n\r\n if (receipt) {\r\n return ok({\r\n ...localProof,\r\n difficulty,\r\n receipt,\r\n message: `Computed ${count} beats at difficulty ${difficulty} in ${localProof.duration_ms}ms. Signed receipt obtained from Beats service.`,\r\n });\r\n }\r\n\r\n return ok({\r\n ...localProof,\r\n difficulty,\r\n receipt: null,\r\n _warning: error ?? 'Could not obtain signed receipt from Beats service.',\r\n message: `Computed ${count} beats locally in ${localProof.duration_ms}ms but receipt not available. ${error ?? ''}`,\r\n });\r\n}\r\n\r\n// ── provenonce_verify_agent ───────────────────────────────────────────────────\r\n\r\nexport async function handleVerifyAgent(args: { hash: string }) {\r\n const { data, error } = await api.verifyAgent(args.hash);\r\n if (error || !data) return err(error ?? 'Verification failed');\r\n return ok(data);\r\n}\r\n\r\n// ── provenonce_spawn ──────────────────────────────────────────────────────────\r\n\r\nexport async function handleSpawn(args: { child_name: string }) {\r\n const creds = requireCredentials();\r\n\r\n // Auto-compute a work-proof receipt for spawn authorization.\r\n // Spawn cost at depth 0 / 0 siblings = 1000 beats. We compute 1050 for margin.\r\n // The spawn endpoint will reject without a receipt when BEATS_REQUIRED=true.\r\n const SPAWN_BEATS = 1050;\r\n const SPAWN_DIFFICULTY = 1000;\r\n\r\n const { receipt, error: proofError } = await computeWorkProof(SPAWN_BEATS, SPAWN_DIFFICULTY);\r\n\r\n if (!receipt) {\r\n return err(\r\n `Failed to obtain Beats work-proof receipt for spawn. ${proofError ?? 'Unknown error'}. ` +\r\n 'You can try calling provenonce_beats_proof with count=1050 manually, then retry spawn.',\r\n );\r\n }\r\n\r\n const { data, error } = await api.spawnChild(creds.api_key, {\r\n childName: args.child_name,\r\n parentHash: creds.agent_hash,\r\n beatsReceipt: receipt,\r\n });\r\n\r\n if (error || !data) return err(error ?? 'Spawn failed');\r\n\r\n return ok({\r\n ...data,\r\n message: `Child agent spawned: ${data.child_hash}. Save the child_api_key β€” it will not be shown again.`,\r\n _warning: 'The child agent has its own identity. Configure it with PROVENONCE_API_KEY + PROVENONCE_AGENT_HASH.',\r\n });\r\n}\r\n\r\n// ── provenonce_get_lineage ────────────────────────────────────────────────────\r\n\r\nexport async function handleGetLineage(args: { hash?: string }) {\r\n const creds = loadCredentials();\r\n const targetHash = args.hash ?? creds?.agent_hash;\r\n\r\n if (!targetHash) {\r\n return err('No hash provided and agent is not registered. Call provenonce_register first or provide a hash.');\r\n }\r\n\r\n const { data, error } = await api.getLineage(targetHash);\r\n if (error || !data) return err(error ?? 'Lineage retrieval failed');\r\n return ok(data);\r\n}\r\n","import { readFileSync, writeFileSync, mkdirSync, chmodSync, existsSync } from 'fs';\r\nimport { join } from 'path';\r\nimport { homedir } from 'os';\r\nimport type { StoredCredentials } from './types.js';\r\n\r\nfunction getConfigDir(): string {\r\n return join(homedir(), '.provenonce');\r\n}\r\n\r\nfunction getConfigPath(): string {\r\n return join(getConfigDir(), 'config.json');\r\n}\r\n\r\n/** Load credentials β€” env vars take priority over config file */\r\nexport function loadCredentials(): StoredCredentials | null {\r\n const apiKey = process.env.PROVENONCE_API_KEY;\r\n const agentHash = process.env.PROVENONCE_AGENT_HASH;\r\n\r\n if (apiKey && agentHash) {\r\n return { api_key: apiKey, agent_hash: agentHash };\r\n }\r\n\r\n const configPath = getConfigPath();\r\n if (!existsSync(configPath)) return null;\r\n\r\n try {\r\n const raw = readFileSync(configPath, 'utf-8');\r\n const parsed = JSON.parse(raw) as Partial<StoredCredentials>;\r\n if (parsed.api_key && parsed.agent_hash) {\r\n return { api_key: parsed.api_key, agent_hash: parsed.agent_hash };\r\n }\r\n } catch {\r\n // Corrupt config β€” treat as missing\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/** Persist credentials to ~/.provenonce/config.json (chmod 600) */\r\nexport function saveCredentials(creds: StoredCredentials): void {\r\n const dir = getConfigDir();\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n\r\n const configPath = getConfigPath();\r\n const data: StoredCredentials = {\r\n api_key: creds.api_key,\r\n agent_hash: creds.agent_hash,\r\n };\r\n\r\n writeFileSync(configPath, JSON.stringify(data, null, 2), 'utf-8');\r\n\r\n // chmod 600 β€” owner read/write only (Unix only; no-op on Windows)\r\n try {\r\n chmodSync(configPath, 0o600);\r\n } catch {\r\n // Windows β€” chmod not supported; recommend env var instead\r\n }\r\n}\r\n\r\n/** Clear stored credentials */\r\nexport function clearCredentials(): void {\r\n const configPath = getConfigPath();\r\n if (existsSync(configPath)) {\r\n writeFileSync(configPath, '{}', 'utf-8');\r\n }\r\n}\r\n","import type {\r\n RegisterResult,\r\n AgentStatus,\r\n HeartbeatResult,\r\n PassportResult,\r\n SigilResult,\r\n VerifyAgentResult,\r\n LineageResult,\r\n SpawnResult,\r\n AnchorResponse,\r\n WorkProofReceipt,\r\n} from './types.js';\r\n\r\nconst REGISTRY_URL = process.env.PROVENONCE_REGISTRY_URL || 'https://provenonce.io';\r\nconst BEATS_URL = process.env.PROVENONCE_BEATS_URL || 'https://beats.provenonce.dev';\r\n\r\nasync function apiFetch<T>(\r\n path: string,\r\n opts: { method?: string; body?: unknown; apiKey?: string; isPublic?: boolean } = {},\r\n): Promise<{ data: T | null; error: string | null }> {\r\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\r\n if (opts.apiKey) headers['Authorization'] = `Bearer ${opts.apiKey}`;\r\n\r\n try {\r\n const res = await fetch(`${REGISTRY_URL}${path}`, {\r\n method: opts.method ?? 'GET',\r\n headers,\r\n body: opts.body ? JSON.stringify(opts.body) : undefined,\r\n });\r\n\r\n const json = await res.json() as Record<string, unknown>;\r\n\r\n if (!res.ok) {\r\n const msg = (json.error as string) ?? `HTTP ${res.status}`;\r\n return { data: null, error: msg };\r\n }\r\n\r\n return { data: json as T, error: null };\r\n } catch (err) {\r\n return { data: null, error: (err as Error).message };\r\n }\r\n}\r\n\r\n/** Fetch the latest global anchor from the Registry */\r\nexport async function fetchAnchor(): Promise<{ data: AnchorResponse | null; error: string | null }> {\r\n return apiFetch<AnchorResponse>('/api/v1/beat/anchor');\r\n}\r\n\r\n/** Submit a work-proof to the Beats service for a signed receipt */\r\nexport async function submitWorkProof(proof: {\r\n from_hash: string;\r\n to_hash: string;\r\n beats_computed: number;\r\n difficulty: number;\r\n anchor_index: number;\r\n anchor_hash?: string;\r\n spot_checks: { index: number; hash: string; prev: string }[];\r\n}): Promise<{ data: { valid: boolean; receipt?: WorkProofReceipt; reason?: string } | null; error: string | null }> {\r\n try {\r\n const res = await fetch(`${BEATS_URL}/api/v1/beat/work-proof`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ work_proof: proof }),\r\n });\r\n\r\n const json = await res.json() as Record<string, unknown>;\r\n if (!res.ok) {\r\n const msg = (json.error as string) ?? `HTTP ${res.status}`;\r\n return { data: null, error: msg };\r\n }\r\n\r\n return { data: json as { valid: boolean; receipt?: WorkProofReceipt; reason?: string }, error: null };\r\n } catch (err) {\r\n return { data: null, error: (err as Error).message };\r\n }\r\n}\r\n\r\n/** Register a new agent (no-wallet path) */\r\nexport async function registerAgent(opts: {\r\n name?: string;\r\n skillRef?: string;\r\n}): Promise<{ data: RegisterResult | null; error: string | null }> {\r\n // Step 1: Obtain a self-service registration token (RFC-010, 5-min TTL)\r\n const tokenRes = await apiFetch<{ token: string }>('/api/v1/register/token', {\r\n method: 'POST',\r\n body: {},\r\n });\r\n if (tokenRes.error || !tokenRes.data?.token) {\r\n return { data: null, error: tokenRes.error ?? 'Failed to obtain registration token' };\r\n }\r\n\r\n // Step 2: Register with the token\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n 'x-registration-token': tokenRes.data.token,\r\n };\r\n try {\r\n const res = await fetch(`${REGISTRY_URL}/api/v1/register`, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify({\r\n name: opts.name,\r\n wallet: 'none',\r\n ...(opts.skillRef ? { ref: opts.skillRef } : {}),\r\n }),\r\n });\r\n const json = await res.json() as Record<string, unknown>;\r\n if (!res.ok) {\r\n return { data: null, error: (json.error as string) ?? `HTTP ${res.status}` };\r\n }\r\n return { data: json as RegisterResult, error: null };\r\n } catch (err) {\r\n return { data: null, error: (err as Error).message };\r\n }\r\n}\r\n\r\n/** Get full agent status */\r\nexport async function getStatus(apiKey: string): Promise<{ data: AgentStatus | null; error: string | null }> {\r\n return apiFetch<AgentStatus>('/api/v1/skill/bootstrap', {\r\n method: 'POST',\r\n apiKey,\r\n body: {},\r\n });\r\n}\r\n\r\n/** Submit heartbeat */\r\nexport async function heartbeat(apiKey: string, paymentTx?: string): Promise<{ data: HeartbeatResult | null; error: string | null }> {\r\n return apiFetch<HeartbeatResult>('/api/v1/agent/heartbeat', {\r\n method: 'POST',\r\n apiKey,\r\n body: { payment_tx: paymentTx },\r\n });\r\n}\r\n\r\n/** Reissue passport / lineage proof */\r\nexport async function getPassport(apiKey: string, paymentTx?: string): Promise<{ data: { lineage_proof: PassportResult } | null; error: string | null }> {\r\n return apiFetch<{ lineage_proof: PassportResult }>('/api/v1/agent/reissue-proof', {\r\n method: 'POST',\r\n apiKey,\r\n body: paymentTx ? { payment_tx: paymentTx } : {},\r\n });\r\n}\r\n\r\n/** Purchase a SIGIL */\r\nexport async function purchaseSigil(apiKey: string, opts: {\r\n name: string;\r\n principal: string;\r\n identity_class: string;\r\n tier: string;\r\n payment_tx: string;\r\n skillRef?: string;\r\n}): Promise<{ data: SigilResult | null; error: string | null }> {\r\n return apiFetch<SigilResult>('/api/v1/sigil', {\r\n method: 'POST',\r\n apiKey,\r\n body: {\r\n name: opts.name,\r\n principal: opts.principal,\r\n identity_class: opts.identity_class,\r\n tier: opts.tier,\r\n payment_tx: opts.payment_tx,\r\n ...(opts.skillRef ? { ref: opts.skillRef } : {}),\r\n },\r\n });\r\n}\r\n\r\n/** Verify another agent's identity (public) */\r\nexport async function verifyAgent(hash: string): Promise<{ data: VerifyAgentResult | null; error: string | null }> {\r\n return apiFetch<VerifyAgentResult>(`/api/v1/verify/${encodeURIComponent(hash)}`);\r\n}\r\n\r\n/** Get agent lineage chain (public) */\r\nexport async function getLineage(hash: string): Promise<{ data: LineageResult | null; error: string | null }> {\r\n return apiFetch<LineageResult>(`/api/v1/agent/lineage/${encodeURIComponent(hash)}`);\r\n}\r\n\r\n/** Spawn a child agent β€” handles full 3-step flow internally */\r\nexport async function spawnChild(apiKey: string, opts: {\r\n childName: string;\r\n parentHash: string;\r\n beatsReceipt?: WorkProofReceipt;\r\n}): Promise<{ data: SpawnResult | null; error: string | null }> {\r\n // Step 1: Get spawn authorization (include receipt if available)\r\n const step1Body: Record<string, unknown> = { child_name: opts.childName };\r\n if (opts.beatsReceipt) {\r\n step1Body.beats_receipt = opts.beatsReceipt;\r\n }\r\n\r\n const step1 = await apiFetch<{\r\n spawn_authorization: string;\r\n child_name?: string;\r\n }>('/api/v1/agent/spawn', {\r\n method: 'POST',\r\n apiKey,\r\n body: step1Body,\r\n });\r\n\r\n if (step1.error || !step1.data?.spawn_authorization) {\r\n return { data: null, error: step1.error ?? 'Spawn step 1 failed: no authorization returned' };\r\n }\r\n\r\n const spawnAuth = step1.data.spawn_authorization;\r\n\r\n // Step 2: Register the child with the spawn_authorization\r\n const reg = await apiFetch<RegisterResult>('/api/v1/register', {\r\n method: 'POST',\r\n apiKey,\r\n body: {\r\n name: opts.childName,\r\n wallet: 'none',\r\n spawn_authorization: spawnAuth,\r\n },\r\n });\r\n\r\n if (reg.error || !reg.data?.hash) {\r\n return { data: null, error: reg.error ?? 'Spawn step 2 (child registration) failed' };\r\n }\r\n\r\n const childHash = reg.data.hash;\r\n const childApiKey = reg.data.api_key;\r\n\r\n // Step 3: Finalize the spawn\r\n const step3 = await apiFetch<{ ok: boolean }>('/api/v1/agent/spawn', {\r\n method: 'POST',\r\n apiKey,\r\n body: { child_hash: childHash },\r\n });\r\n\r\n if (step3.error) {\r\n return { data: null, error: step3.error };\r\n }\r\n\r\n return {\r\n data: {\r\n child_hash: childHash,\r\n child_api_key: childApiKey,\r\n child_depth: reg.data.depth,\r\n parent_hash: opts.parentHash,\r\n },\r\n error: null,\r\n };\r\n}\r\n"],"mappings":"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","names":["err","data","error","err"]}
package/dist/tools.d.ts CHANGED
@@ -88,9 +88,15 @@ declare const PROVENONCE_TOOLS: readonly [{
88
88
  readonly properties: {
89
89
  readonly count: {
90
90
  readonly type: "integer";
91
- readonly description: "Number of beats to compute (min 10, max 1000)";
91
+ readonly description: "Number of beats to compute (min 10, max 10000)";
92
92
  readonly minimum: 10;
93
- readonly maximum: 1000;
93
+ readonly maximum: 10000;
94
+ };
95
+ readonly difficulty: {
96
+ readonly type: "integer";
97
+ readonly description: "Hash iterations per beat (default 1000, min 100, max 5000). Usually auto-detected from network.";
98
+ readonly minimum: 100;
99
+ readonly maximum: 5000;
94
100
  };
95
101
  };
96
102
  readonly required: readonly ["count"];
package/dist/tools.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // @provenonce/mcp β€” Provenonce Skill for AI agents
2
2
  import {
3
3
  PROVENONCE_TOOLS
4
- } from "./chunk-COVXPAEW.js";
4
+ } from "./chunk-ONDCXFYW.js";
5
5
  export {
6
6
  PROVENONCE_TOOLS
7
7
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@provenonce/mcp",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "Provenonce Skill β€” MCP server giving any AI agent cryptographic identity, SIGIL, heartbeat, passport, and beats proofs.",
5
5
  "keywords": ["provenonce", "mcp", "ai-agent", "identity", "provenance", "sigil"],
6
6
  "homepage": "https://provenonce.io",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools.ts"],"sourcesContent":["/** Provenonce Skill β€” 9 MCP tool definitions (JSON Schema) */\r\nexport const PROVENONCE_TOOLS = [\r\n {\r\n name: 'provenonce_register',\r\n description:\r\n 'Register this agent with Provenonce to get a cryptographic identity (hash + API key). ' +\r\n 'Safe to call multiple times β€” returns existing identity if already registered. ' +\r\n 'No wallet required. Free.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n name: {\r\n type: 'string',\r\n description: 'Human-readable name for this agent (optional, max 64 chars)',\r\n maxLength: 64,\r\n },\r\n skill_ref: {\r\n type: 'string',\r\n description:\r\n '16-character hex ref token of the skill that deployed you β€” for rev-share attribution (optional)',\r\n pattern: '^[0-9a-f]{16}$',\r\n },\r\n },\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_status',\r\n description:\r\n 'Get this agent\\'s current Provenonce status: identity, SIGIL, beats balance, and next steps. ' +\r\n 'Requires prior provenonce_register call.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_purchase_sigil',\r\n description:\r\n 'Purchase a Provenonce SIGIL to unlock full provenance: heartbeat access, signed passport, ' +\r\n 'and a permanent identity record. Requires a Solana payment transaction. ' +\r\n 'SIGIL format: name*principal*tier (e.g. my-agent*acme*ind).',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n name: {\r\n type: 'string',\r\n description: 'SIGIL name segment β€” identifies this specific agent (e.g. \"my-agent\")',\r\n },\r\n principal: {\r\n type: 'string',\r\n description: 'Principal segment β€” identifies the operator or organisation (e.g. \"acme\")',\r\n },\r\n identity_class: {\r\n type: 'string',\r\n enum: ['narrow_task', 'autonomous', 'orchestrator'],\r\n description:\r\n 'Agent identity class (pricing axis): narrow_task=single-purpose, autonomous=independent decision-maker, orchestrator=coordinates other agents',\r\n },\r\n tier: {\r\n type: 'string',\r\n enum: ['sov', 'org', 'ind', 'eph', 'sbx'],\r\n description:\r\n 'Trust governance tier: sov=sovereign/root, org=organisation, ind=individual, eph=ephemeral, sbx=sandbox',\r\n },\r\n payment_tx: {\r\n type: 'string',\r\n description: 'Solana transaction signature for the SIGIL fee payment',\r\n },\r\n },\r\n required: ['name', 'principal', 'identity_class', 'tier', 'payment_tx'],\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_heartbeat',\r\n description:\r\n 'Submit a heartbeat to prove this agent is alive. Requires a SIGIL (call provenonce_purchase_sigil first). ' +\r\n 'Requires a Solana payment transaction for the heartbeat fee.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n payment_tx: {\r\n type: 'string',\r\n description: 'Solana transaction signature for the heartbeat fee payment',\r\n },\r\n },\r\n required: ['payment_tx'],\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_get_passport',\r\n description:\r\n 'Get this agent\\'s cryptographically signed Passport β€” a verifiable identity document ' +\r\n 'any third party can verify offline using the Provenonce authority public key. ' +\r\n 'Requires an active SIGIL and at least one heartbeat.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n payment_tx: {\r\n type: 'string',\r\n description: 'Solana transaction signature for the passport reissue fee (if applicable)',\r\n },\r\n },\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_beats_proof',\r\n description:\r\n 'Compute a local Beats work-proof β€” cryptographic evidence of computational effort by this agent. ' +\r\n 'Returns a hash chain proof that can be shared as evidence of work. No network call required.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n count: {\r\n type: 'integer',\r\n description: 'Number of beats to compute (min 10, max 1000)',\r\n minimum: 10,\r\n maximum: 1000,\r\n },\r\n },\r\n required: ['count'],\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_verify_agent',\r\n description:\r\n 'Verify another agent\\'s Provenonce identity. Returns their SIGIL, identity class, and registration status. ' +\r\n 'Public β€” no authentication required.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n hash: {\r\n type: 'string',\r\n description: 'The agent hash to verify (0x + 64 hex chars)',\r\n pattern: '^0x[0-9a-fA-F]{64}$',\r\n },\r\n },\r\n required: ['hash'],\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_spawn',\r\n description:\r\n 'Spawn a child agent under this agent\\'s identity. The child inherits lineage from the parent. ' +\r\n 'Returns the child\\'s hash and API key. Requires sufficient beats balance or a work-proof receipt.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n child_name: {\r\n type: 'string',\r\n description: 'Name for the child agent (max 64 chars)',\r\n maxLength: 64,\r\n },\r\n },\r\n required: ['child_name'],\r\n },\r\n },\r\n\r\n {\r\n name: 'provenonce_get_lineage',\r\n description:\r\n 'Get the full lineage chain for an agent β€” all events in its provenance history ' +\r\n '(registration, SIGIL issuance, heartbeats, spawns). Public β€” no authentication required.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n hash: {\r\n type: 'string',\r\n description:\r\n 'The agent hash to get lineage for (0x + 64 hex chars). Defaults to this agent if omitted.',\r\n pattern: '^0x[0-9a-fA-F]{64}$',\r\n },\r\n },\r\n },\r\n },\r\n] as const;\r\n\r\nexport type ToolName = (typeof PROVENONCE_TOOLS)[number]['name'];\r\n"],"mappings":"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","names":[]}