obolos 1.4.1 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obolos",
3
- "version": "1.4.1",
3
+ "version": "1.6.0",
4
4
  "description": "Agent-friendly command line interface for the obolos protocol",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "repository": {
@@ -58,7 +58,7 @@ skill together; run it when a command or flag this skill names is missing.
58
58
  obolos doctor --json # RPC, chain, deployments, whether a key is configured
59
59
  obolos login # connect this terminal as one of the user's agent wallets
60
60
  obolos login --try # the same on try.obolos.io, when that is where the user's account is
61
- obolos companies # companies the acting wallet holds a role in
61
+ obolos companies # companies the acting wallet holds a role in, or the agent holds powers at
62
62
  obolos use '#3' # select a company by #id or address
63
63
  obolos whoami # the agent wallet and its powers, or the key's roles there
64
64
  obolos company show
@@ -113,28 +113,31 @@ stand, so nothing is signed again. `obolos login --key` signs in with the user's
113
113
  An agent wallet does only what the user gave it on the Passport page, per wallet and company: Read
114
114
  opens the company, that wallet's holdings and the documents it can open; Vote casts votes and gives
115
115
  proxies; Manage equity runs share classes, shares, grants, vesting, notes, SAFEs and the data room,
116
- within the roles the wallet holds; Raise creates and runs rounds; Create a company sets up the one
117
- company the user named there. Role grants, upgrades and treasury withdrawals take the user's own
118
- key: `cli.missing_power` with `power: null` says so; pass that on. Run `obolos company incorporate` with that ticker,
119
- jurisdiction and entity; its deploy works once. `workflow.company.incorporate.plan_moved` means
120
- another company was created from that wallet since: deploy nothing and ask the user to give Create a
121
- company again. Its sends are sponsored and count against the user's daily limit.
116
+ within the roles the wallet holds; Raise creates and runs rounds. Role grants, upgrades and treasury
117
+ withdrawals are the user's to do in the app: `cli.missing_power` with `power: null` says so; pass that
118
+ on, and never ask the user for a key. Its sends are sponsored and count against the user's daily limit.
122
119
 
123
120
  An agent buys no credits. `obolos credits topup [--amount <usd>]` opens the company's billing page in
124
121
  the user's browser and waits up to 15 minutes for the credits. Off a terminal, add `--no-wait`: it
125
122
  exits 6 with `cli.awaiting_credits` and `details.link`. Give the user the link, wait for them to say
126
123
  they loaded the credits, then check with `obolos credits show`.
127
124
 
125
+ An agent activates no module either: activation is permanent and spends credits. `obolos company
126
+ module activate <name>` checks the module can be activated, opens it on the company's Modules page in
127
+ the user's browser and waits up to 15 minutes for it to be active. Off a terminal, add `--no-wait`: it
128
+ exits 6 with `cli.awaiting_module` and `details.link`. Give the user the link, wait for them to say
129
+ they activated it, then check with `obolos company modules`, whose `cost` is in credits. A company
130
+ short of credits gets the same link (`creditsShort: true`): the activation there offers Add credits, so
131
+ tell the user they add credits first, and don't send them to `credits topup`.
132
+
128
133
  - **Exit 3, `cli.session_ended`**: the session ended (disconnected, or past its 3 days). On a terminal
129
134
  the CLI offers to connect again; otherwise ask the user, then run `obolos login`.
130
135
  - **Exit 3, `cli.missing_power`**: `details` names the `power`, the `wallet` and the `company`. Tell
131
136
  the user to give it under the agent wallet's Powers on the Passport page; never route around it.
132
- - **Exit 3, `cli.outside_power`**: the call's values differ from the ones the user approved, such as
133
- another ticker. Use the approved values, or ask the user to give the power again with these.
137
+ - **Exit 3, `cli.outside_power`**: the call's values differ from the ones the user approved. Use the
138
+ approved values, or ask the user to give the power again with these.
134
139
  - **Exit 3, `cli.approval_stale`**: the approval was removed or used up, or the wallet changed. The user
135
140
  gives the powers again on the Passport page.
136
- - **Exit 3, `cli.split_operation`**: one operation can't carry these calls together; the deploy goes in an
137
- operation of its own, one company at a time.
138
141
  - **Exit 5, `cli.nonce_taken`**: another operation from the wallet went first, and this one never went
139
142
  out. Run the command again.
140
143
  - **Exit 5, `cli.send_failed` with `details.operation`**: the operation went out, but how it ended
@@ -147,6 +150,29 @@ they loaded the credits, then check with `obolos credits show`.
147
150
  `obolos agents check <address>` asks whether a verified person stands behind any agent wallet. It
148
151
  never says who.
149
152
 
153
+ ### Making a company with the user
154
+
155
+ An agent doesn't create companies; the user does, in one obolos window the agent opens. When the user
156
+ wants a company:
157
+
158
+ 1. Ask for its name with the legal ending (Acme Inc.), a ticker, the jurisdiction (an ISO code such as
159
+ US, GB, CH) and the entity type (c-corp, llc, ...). An unknown one fails with `invalid_jurisdiction`
160
+ or `invalid_entity`, whose details list the choices. A share class name and authorized shares are
161
+ optional: the default is common stock, 10,000,000 authorized. Don't ask about founders or shares yet.
162
+ 2. Run `obolos company incorporate --name ... --ticker ... --jurisdiction ... --entity ...`
163
+ (`--class`, `--authorized` when given), nothing else. Tell the user the window shows the company,
164
+ asks whether they want Plus, and creates it once they confirm; its agent then gets every power
165
+ there and this terminal connects to it.
166
+ 3. When it returns, this terminal works as the company's agent, at the company. Offer what comes next,
167
+ one at a time: loading credits (`obolos credits topup`), issuing the user's shares to their wallet at
168
+ the company (`obolos whoami` names it) with `obolos shares issue`, vesting, documents for the data
169
+ room the window created (`obolos docs upload`). The legal details of an existing entity (state, file
170
+ number, address) go in the company's Settings in the app. Every send still waits for the user's yes.
171
+
172
+ Off a terminal, add `--no-wait` in step 2: it exits 6 with `cli.awaiting_approval`, `details.link` and
173
+ `details.userCode`. Give the user both, wait for them to say the company is created, then run
174
+ `obolos login --resume`.
175
+
150
176
  ## Runs and sending
151
177
 
152
178
  A prepared command writes a hash-verified run file (`.obolos/runs/<workflow>-<id>.json`) and prints
@@ -61,7 +61,7 @@ Choose the remedy from the structured SDK error:
61
61
  - compliance error: identify the rule and the legitimate state, credential or approval needed.
62
62
  - insufficient credits: quote the deficit and prepare a top-up separately. A top-up or preload under
63
63
  the ledger's minimum is refused (`below_minimum`, `preload_below_minimum`). As an agent, the user
64
- loads them: `obolos credits topup` opens their browser, and a preload is refused (`agent_preload`).
64
+ loads them: `obolos credits topup` opens their browser.
65
65
  - `cli.no_agent_here` (exit 6): no agent this terminal is connected as works at the company. Ask the
66
66
  user to run the `obolos login --company <company>` it names; the page gives their agent there
67
67
  Invest and Read, and the command then goes on as that agent. Never connect it without their word.
@@ -61,7 +61,7 @@ is the key's address, or after `obolos login` the user's wallet the agent wallet
61
61
  needs only that wallet, and sealing confidential inputs binds them to it. With a key, decrypting,
62
62
  publishing verdicts and sending need the key. As an agent wallet, decrypting needs Read on that wallet
63
63
  at the company, sending needs the power that makes each call, and a command that signs as the wallet
64
- itself, such as publishing a verdict, needs the user's key: `obolos login --key`.
64
+ itself, such as publishing a verdict, is the user's to do in the app. Never ask the user for a key.
65
65
 
66
66
  A terminal can hold several agent wallets; each `obolos login` adds one and puts it in use. At a
67
67
  company the CLI acts as the agent in use when it holds powers there, otherwise as a connected agent
@@ -170,7 +170,7 @@ A denied verdict is a valid outcome, not a reason to vary the quantity until one
170
170
  ## Fundraising round
171
171
 
172
172
  ```bash
173
- obolos fundraise create --type safe --name Seed --target 1,000,000 --hard-cap 2,000,000 --cap 10,000,000 --discount 20% --agreement <round agreement ref>
173
+ obolos fundraise create --type safe --name Seed --target 1,000,000 --hard-cap 2,000,000 --cap 10,000,000 --discount 20% --agreement ./term-sheet.pdf
174
174
  obolos fundraise reserve <round> --investor <wallet> --amount 250,000 # a spot, its amount sealed, signed for the company by a document signer
175
175
  obolos fundraise reservation sign <round> --reservation <id> # investor, with their key: signs the spot (--accept-terms only once they agree to terms that differ from the round's)
176
176
  obolos fundraise subscribe <round> --amount 50,000 # investor, with their key
@@ -181,12 +181,17 @@ obolos fundraise close <round> && obolos fundraise finalize <round>
181
181
  obolos fundraise publish <round>
182
182
  ```
183
183
 
184
- Confirm the company profile supports the round and instrument and that the engine is deployed.
184
+ Confirm the round is one `obolos company show` lists under `jurisdiction.instruments`. One with
185
+ `active: false` needs each module in its `activate` list activated first (`obolos company module
186
+ activate <module>`); every round runs on `fundraise`.
185
187
  Prepare round creation, document references, whitelist changes and reservations in their natural
186
188
  stages; counterparty-signed reservations and encrypted investor inputs are not manager batches.
187
189
 
188
190
  - **Create** makes the round's data room, publishes the round's agreement unsigned in its Term Sheets,
189
- then opens the round (its document reference is the room), so the run is staged.
191
+ then opens the round (its document reference is the room), so the run is staged. Give the agreement
192
+ as a document on this machine (.pdf, .md, .txt or .docx). The run pins its hash and stores it
193
+ unsealed once the user sends the run's first step, the data room, which says so. Don't upload it to a
194
+ data room first; the round refuses an `obolos://` reference.
190
195
  - **Sealed figures.** Money never moves through the contract, and every amount is sealed. A priced
191
196
  round's price per share is sealed too, with a public commitment the round's agreement names. The
192
197
  company reads it; adding an address to the whitelist shows it the price for good; `subscribe` first