CoAIA unified TypeScript package — a library, a CLI (coaia), and an MCP server (coaiajs-mcp) consolidating coaia-narrative, coaia-pde, coaia-planning, and coaiapy into one installable package.
npm install coaiajs
import { tash, fetch, narrative, planning } from 'coaiajs';
import { parsePlan } from 'coaiajs/planning';
import type { StructuralTensionPlan, Entity } from 'coaiajs';
"type": "module") · MITcoaiajs is the TypeScript consolidation of the CoAIA (Creative Orientation AI Architecture) ecosystem. It unifies four previously separate projects behind one type system:
| Origin Project | What it did | Where it lives now |
|---|---|---|
coaia-narrative |
JSONL knowledge graph, structural tension charts, narrative beats | src/narrative/ |
coaia-pde |
Prompt Decomposition Engine | src/pde/ |
coaia-planning |
Action planning, structural tension chart management | src/planning/ |
coaiapy |
Redis, LLM, audio, GitHub, config, environment | src/ (core modules) |
The shared type system in src/types.ts is the union of all four.
It can be consumed three ways — as a library you import, a CLI you run, or an MCP server an AI client connects to. All three share the same underlying modules.
Import from the root, or from a subpath to pull in only what you need. Every entry point carries its own .d.ts.
| Import path | Exports |
|---|---|
coaiajs |
Everything below, plus langfuse / narrative / pde / planning / pipeline namespaces and all shared types |
coaiajs/config |
readConfig, getConfig, resetConfig, config, mergeConfigs, findExistingConfig, findEnvFiles |
coaiajs/redis |
tash, fetch, del, keys, exists, disconnect, getClient, resetClient |
coaiajs/llm |
llm, transcribeAudio, generateImage, abstractProcess, resetClient |
coaiajs/audio |
synthesize, resetClient |
coaiajs/github |
listIssues, getIssue, getIssueComments, resetClient |
coaiajs/environment |
EnvironmentManager, createEnvironment, findEnvironment |
coaiajs/version |
getPackageVersion, getPackageRoot |
coaiajs/langfuse |
Langfuse JS SDK v5/OpenTelemetry tracing plus v4 observations, prompts, datasets, scores, comments, media, projects, and formatters (56 runtime exports) |
coaiajs/media-upload-proxy |
Deployable Custom GPT conversation-file to Langfuse media bridge |
coaiajs/narrative |
KnowledgeGraphManager, chart operations, markdown export, tool definitions, JSONL preservation, argument hygiene, GitHub bridge |
coaiajs/narrative/contract |
The store read contract for renderers — zero I/O, tolerant of a bad line |
coaiajs/skill |
The packaged agent skill: showSkill, installSkill, checkSkill, renderSkill, renderToolMap |
coaiajs/pde |
SessionManager, StcMapper, handlePdeTool, PDE_MCP_TOOLS (10 exports) |
coaiajs/planning |
parsePlan, planToSTC, syncToChart, syncToPlan, handlePlanningTool (10 exports) |
coaiajs/pipeline |
MobileTemplateEngine, TemplateLoader, TemplateRenderer |
Root-namespace access is equivalent to the subpath:
import { narrative } from 'coaiajs';
import * as narrative from 'coaiajs/narrative'; // same module
Redis key/value (coaiapy tash/fetch semantics)
import { tash, fetch, disconnect } from 'coaiajs/redis';
await tash('session:42', JSON.stringify({ phase: 'design' }));
const raw = await fetch('session:42');
await disconnect(); // clients are lazy; close when done
Parse a plan into a structural tension chart
import { parsePlan, planToSTC } from 'coaiajs/planning';
const plan = await parsePlan('./PLAN.md');
const chart = planToSTC(plan);
Knowledge graph
import { KnowledgeGraphManager } from 'coaiajs/narrative';
const kg = new KnowledgeGraphManager('./memory.jsonl');
const graph = await kg.readGraph();
Redis, OpenAI, Polly, and Octokit clients are created lazily on first use — importing a module never opens a connection or reads a file. Each module exports resetClient() so tests can drop cached state:
import { resetRedisClient, resetLlmClient } from 'coaiajs';
npx coaia <command> # or: npm i -g coaiajs && coaia <command>
Global options: --env <path> · -M, --memory-path <path> · --json · --no-color · -V, --version
| Command | Purpose |
|---|---|
tash (m) |
Store a key-value pair in Redis |
fetch |
Get a value from Redis |
llm |
Make a raw LLM call |
summarize (s) |
Summarize text |
transcribe (t) |
Transcribe audio via Whisper |
p <tag> [text] |
Process text with a custom tag |
init |
Create a sample coaia.json |
fuse |
Langfuse operations — traces, prompts, datasets, scores, score-configs, sessions, comments, media, projects, dataset-items |
skill |
The packaged agent skill — show, install, check |
narrative (n) |
Chart operations — list, view, current, update, add-action, add-obs, complete, export, export-all, stats, progress, mmot, set-date, link-issue |
pde |
import, list, sessions, show |
plan |
parse, convert, sync-to-chart, sync-to-plan |
pipeline |
list, show, create, init |
env |
init, list, source, set, get, unset, clear, save |
gh |
issues |
coaia tash follows coaiapy semantics: -F/--file reads the value from a file, -T/--ttl is in minutes, default TTL 5555.
coaia fuse prompts get <name> outputs Markdown by default (--md is available explicitly); use the global --json option for JSON.
coaia fuse uses the current scoped Langfuse JS SDK v5. Trace writes are exported as immutable OpenTelemetry spans to POST /api/public/otel/v1/traces with ingestion version 4. Trace, observation, and session reads use Observations API v2; score reads use Scores API v3. The removed v4 concepts are reflected in the CLI: sessions are reconstructed from observations, and legacy trace-output patching is no longer exposed. Langfuse Cloud sunsets the legacy APIs on November 16, 2026.
Migration references: Langfuse v4 · versions and compatibility · deprecated API mapping · custom ingestion migration · current OpenAPI reference.
agents/custom_gpt/ceremony-observations.yml is a focused OpenAPI 3.1 action specification for creating a root observation and appending child observations to the same Langfuse trace through OTLP/HTTP JSON. It contains 23 core actions—below the 30-action limit—including media upload-record, retrieval, and finalization capabilities; destructive operations remain omitted. Media hashes use the required 44-character padded Base64 SHA-256 digest of the exact upload bytes, and the documented workflow distinguishes URL creation from the actual presigned PUT. Setup, authentication, ID/timestamp rules, and ready-to-paste GPT instructions are in ceremony-observations.instructions.md. The broader imported API surface remains available in ceremony.yml.
For autonomous conversation-file uploads, deploy the included coaiajs-media-proxy service and import ceremony-media-proxy.yml as a second Action. It uses OpenAI’s openaiFileIdRefs transfer, downloads the actual user/DALL-E/Code Interpreter file, performs the Langfuse media record + presigned PUT + finalization sequence, and returns a renderable @@@langfuseMedia...@@@ token. Deployment and security instructions are in ceremony-media-proxy.instructions.md. Together both specs expose 24 actions.
npx coaiajs-mcp
Serves 67 tools, 3 prompts, and 1 listable resource over stdio.
| Group | Count | Examples |
|---|---|---|
| coaiapy + Langfuse | 19 | coaia_tash, coaia_fetch, coaia_fuse_trace_create, coaia_fuse_traces_list |
| Narrative / knowledge graph | 27 | create_entities, read_graph, create_structural_tension_chart, perform_mmot_evaluation |
| PDE | 10 | import_pde_decomposition, create_stc_from_pde, complete_session |
| Planning | 6 | parse_plan_structural, plan_to_stc, sync_plan_to_chart, pde_to_plan |
Four PDE tools carry a pde_ prefix (pde_add_action_step, pde_mark_action_complete, pde_update_action_progress, pde_update_current_reality) because their unprefixed names belong to the narrative group.
Prompts: mia_miette_duo, create_observability_pipeline, analyze_audio_workflow
Resources: coaia://templates/ is listable; coaia://templates/{name} and coaia://templates/{name}/variables are readable URI patterns.
Set COAIAJS_FEATURES to control the exposed tool set (default STANDARD):
| Level | Effect |
|---|---|
MINIMAL |
Core tash/fetch and essential graph tools |
STANDARD |
Default — the 67 tools above |
OBSERVABILITY |
Same set as STANDARD |
FULL |
Everything, including media tools |
coaiajs ships a skill describing its own surface. The tool map inside it is generated
from the server’s tool definitions at install time, so it cannot advertise a tool this
package does not serve.
coaia skill show # print it
coaia skill install --yes # ./.agents/skills/coaiajs + the .claude/skills symlink
coaia skill install --global # ~/.agents/skills/coaiajs
coaia skill check # is the installed copy current?
Run coaia skill check after upgrading. A skill installed by an older version describes an
older tool surface, and nothing else reports that. It exits non-zero when stale or missing.
A ready-made plugin lives in coaiajs-langfuse-claude-plugin/. It registers this server via npx rather than vendoring a copy. Or wire it manually:
{
"mcpServers": {
"coaia": { "command": "npx", "args": ["-y", "--package=coaiajs", "coaiajs-mcp"] }
}
}
Loaded with the following priority (highest wins):
.env files — explicit --env, then COAIAJS_ENV_PATH, COAIAPY_ENV_PATH, ./.env, ~/.coaia/.envcoaia.json — ./coaia.json, ~/coaia.json, ~/.coaia/config.json| Variable | Description |
|---|---|
UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN |
Upstash Redis endpoint and token, preferred over direct Redis URLs |
KV_REST_API_URL / KV_REST_API_TOKEN |
Vercel KV REST aliases for Upstash Redis |
KV_URL / REDIS_URL |
Redis connection URL (redis:// or rediss://) |
REDIS_HOST / REDIS_PORT / REDIS_PASSWORD / REDIS_SSL |
Traditional Redis configuration |
UPSTASH_HOST / UPSTASH_PASSWORD |
coaiapy-compatible fallback aliases |
OPENAI_API_KEY |
OpenAI API key |
LANGFUSE_PUBLIC_KEY / LANGFUSE_SECRET_KEY |
Langfuse credentials |
AWS_ACCESS_KEY_ID |
AWS credentials for Polly |
GITHUB_TOKEN |
GitHub API token |
COAIAJS_FEATURES |
MCP feature level (see above) |
{
"redis": { "url": "redis://localhost:6379" },
"openai": { "apiKey": "sk-...", "model": "gpt-4o" },
"langfuse": { "publicKey": "pk-...", "secretKey": "sk-..." },
"github": { "token": "ghp_..." }
}
The data model follows the structural tension pattern from Robert Fritz’s creative process framework:
Each module operates independently but shares the unified type system in src/types.ts, which is what lets the CLI and the MCP server expose the same capabilities through different protocols.
coaiajs/
├── src/
│ ├── types.ts # Shared types (union of all four origin projects)
│ ├── index.ts # Public library entry point
│ ├── config.ts # Configuration resolution
│ ├── redis.ts # Redis tash/fetch
│ ├── environment.ts # Environment variable management
│ ├── llm.ts # OpenAI wrapper
│ ├── audio.ts # AWS Polly text-to-speech
│ ├── github.ts # GitHub API wrapper
│ ├── version.ts # Runtime version resolution
│ ├── cli.ts # CLI entry point
│ ├── langfuse/ # Langfuse observability
│ ├── narrative/ # Knowledge graph, charts, beats
│ ├── pde/ # Prompt Decomposition Engine
│ ├── planning/ # Action planning
│ └── pipeline/ # Pipeline template engine
├── mcp/ # MCP server and tool definitions
├── test/ # Tests (node:test)
├── rispecs/ # RISE specification files
└── coaiajs-langfuse-claude-plugin/ # Claude Code plugin
npm install
npm run build # tsc
npm run lint # tsc --noEmit
npm test # node --test
npm run dev # tsc --watch
Conventions: ESM only, all relative imports end in .js · strict: true, no unjustified any · all shared types in src/types.ts · no side effects at import time.
llms.txt is a compact orientation file; llms-full.txt documents the complete API surface, every MCP tool, and the CLI in one pass.
MIT