@odla-ai/cli 0.45.0 → 0.46.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": "@odla-ai/cli",
3
- "version": "0.45.0",
3
+ "version": "0.46.0",
4
4
  "description": "Agent-operable CLI for odla provisioning, calendar consent and connection lifecycle, System AI administration, Worker secrets, security jobs, and smoke checks.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://odla.ai/docs/packages/cli",
@@ -157,6 +157,67 @@ never asks for provider keys. The lower-level library flow remains available
157
157
  for custom orchestrators; active reproduction still requires an explicitly
158
158
  injected isolated executor and never falls back to the host shell.
159
159
 
160
+ ## @odla-ai/chat — discussions humans and agents share
161
+
162
+ Messaging as a **schema + default-deny rules + injectable client** on odla-db —
163
+ no server to run, and no separate identity system: the same rule-governed graph
164
+ serves people and agents.
165
+
166
+ ```ts
167
+ import { CHAT_RULES, createChatClient } from "@odla-ai/chat";
168
+ const chat = createChatClient(db, { selfId: myAuthId, selfEmail, displayName });
169
+ ```
170
+
171
+ `botTrigger()` wakes an agent on a message; `chatSkill()` ships the agent-side
172
+ skill. `@odla-ai/pm` rides this for every comment and audit entry, which is why
173
+ a PM item's discussion and a group topic behave identically.
174
+
175
+ ## @odla-ai/granola — meeting notes into odla-db and the CRM
176
+
177
+ Two triggers, **one** ingest path: a mountable webhook receiver
178
+ (`createGranolaRoutes`, Standard Webhooks verified) for live updates, and an
179
+ incremental `updated_after` poll (`syncNotes`) for backfill and reconciliation.
180
+ Both land in `ingestNoteById`.
181
+
182
+ ```bash
183
+ odla-ai secrets set granola_api_key --env dev --stdin # Granola: Settings -> Connectors -> API keys
184
+ ```
185
+
186
+ ```ts
187
+ import { GRANOLA_RULES, GRANOLA_SCHEMA, initGranola, syncNotes } from "@odla-ai/granola";
188
+ const client = initGranola({ apiKey: env.GRANOLA_API_KEY });
189
+ await syncNotes({ db }, client); // { ingested, failed, lastUpdatedAt, truncated }
190
+ ```
191
+
192
+ Install `GRANOLA_SCHEMA` and `GRANOLA_RULES` like any other namespace set. The
193
+ rules are **deny-all on purpose** — these rows hold meeting transcripts, the
194
+ most sensitive thing most apps will store — so reads go through your worker,
195
+ never an end-user credential.
196
+
197
+ Wire `crmPort` from the separate `@odla-ai/granola/crm` entry and every attendee
198
+ becomes a person record, every email domain a company, and the note lands once
199
+ per person as a `kind: "meeting"` activity. Idempotency is a ledger
200
+ (`granola_note_link`), not a hope: a redelivered webhook writes no second
201
+ activity, and a re-run poll converges on identical rows.
202
+
203
+ ## @odla-ai/email — structured Cloudflare Email Service sending
204
+
205
+ ```ts
206
+ import { sendMessage, renderInvite, buildReply, parseInbound } from "@odla-ai/email";
207
+ await sendMessage(sender, { to, subject, html, attachments }); // fail-closed validation
208
+ ```
209
+
210
+ The transport is injected, so tests never send. `parseInbound`/`verifyInbound`
211
+ handle mail arriving, `buildReply` threads the response. Sending needs the
212
+ sending domain onboarded first — ask `runbook ask "email sending domain"`.
213
+
214
+ ## @odla-ai/workflows — effect-safety for Cloudflare Workflows
215
+
216
+ Replay-stable identities, canonical input fingerprints, an explicit idempotency
217
+ boundary, checkpoint validation, and a transactional-outbox reconciler
218
+ (`runIdempotentEffect`, `checkpoint`, `enqueueOutbox`, `reconcileOutbox`).
219
+ Web-standard APIs only — no Node built-ins, no `cloudflare:workers`.
220
+
160
221
  ## Others
161
222
 
162
223
  - **@odla-ai/chapter** — membership sites from one `defineChapter()` config:
@@ -177,3 +238,27 @@ injected isolated executor and never falls back to the host shell.
177
238
  - **@odla-ai/blog** — static-first blogging; files in, site out.
178
239
  - **@odla-ai/apps** — control-plane SDK (create apps, toggle services); the CLI
179
240
  and registry usually handle this for you.
241
+ - **@odla-ai/pm** — the project board this repository runs on: products ->
242
+ projects -> goals, kanban tasks, decisions, bugs, and versioned runbooks, on
243
+ odla-db and shared across co-owned projects. Usually driven through
244
+ `odla-ai pm ...` rather than the library.
245
+ - **@odla-ai/brand** — conversational brand-book builder: doc/image uploads,
246
+ agent-driven colour exploration with human-gated palette proposals, and a
247
+ compiler from the approved book to `@odla-ai/ui` design tokens.
248
+ - **@odla-ai/docs** — build-time docs engine: one Markdown source becomes both a
249
+ themed static site and a serializable in-app manifest, so an app renders docs
250
+ without shipping a Markdown parser.
251
+ - **@odla-ai/camel** — prompt-injection boundary for authority-bearing agents:
252
+ Safe/Unsafe values, closed conversions, effect authorization, and the dual-LLM
253
+ runners in `@odla-ai/camel/runner`. "Safe" means safe to place in a privileged
254
+ model's context — never factual, authorized, or harmless to display.
255
+ - **@odla-ai/graph** — dependency-free property graph with one traversal algebra
256
+ over any edge kind, plus extractors that build one from a codebase (imports,
257
+ exported symbols, the data surfaces a module reads and writes).
258
+ - **@odla-ai/test** — strict deterministic Worker/fetch/KV/D1/Workflow/clock
259
+ doubles for fast agent feedback: an unexpected network or database call fails
260
+ immediately rather than silently passing.
261
+ - **@odla-ai/harness** — the coding-task protocol and safe Mac/Linux runner
262
+ behind odla Code: disposable workspaces, container-isolated agents, and
263
+ Studio-controlled task leases. The agent gets no workspace mount, no
264
+ credentials, and no network — everything crosses a typed tool channel.