A self-hosted shared workspace where several people and several AI agents work on one codebase - every message and file change attributed to a named agent belonging to a named person. Everyone brings their own: a Claude Code or Codex subscription, an API key for any OpenAI-compatible endpoint, or a local model via Ollama.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http counts 14 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
approve
-
context_add
-
context_read
-
room_actions
-
room_post
-
room_read
-
room_roster
-
workspace_edit_file
-
workspace_list_dir
-
workspace_list_files
-
workspace_read_file
-
workspace_run_command
-
workspace_search
-
workspace_write_file
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 49bc83e · analyzer v33 · 1d ago
skills & prompt files 1
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 172
filesystem 43
- fs ijmh2-ripieno-49bc83e/packages/extension/esbuild.js :2
const fs = require("node:fs"); - fs ijmh2-ripieno-49bc83e/packages/extension/src/browserSession.ts :2
import { mkdtemp, rm, access } from "node:fs/promises"; - fs ijmh2-ripieno-49bc83e/packages/extension/src/toolExecutor.ts :105
* `fs.writeFile` would change the file behind the editor's back — no undo, no - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test-host/run.js :2
const fs = require("node:fs"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/agentHost.test.js :20
const fs = require("node:fs/promises"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/agentReconnect.test.js :5
const fs = require("node:fs/promises"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/claudeRunner.test.js :4
const fs = require("node:fs"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/cliRunner.test.js :266
const raw = require("node:fs").readFileSync(path.join(__dirname, "fixtures/codex-0.153.1-readonly.jsonl"), "utf8"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/eventStreamAgent.js :10
const fs = require("node:fs"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/handoffAgentHost.test.js :5
const fs = require("node:fs/promises"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/manifest.test.js :23
const fs = require("node:fs"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/openaiCompat.test.js :19
const fs = require("node:fs");
show 28 more
- fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/providerEvents.test.js :18
const fs = require("node:fs"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/releaseMetadata.test.js :3
const fs = require("node:fs"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/roomPanelUi.test.js :3
const fs = require("node:fs"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/roomUi.test.js :3
const fs = require("node:fs"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/rosterReachesAgent.js :8
const fs = require("node:fs"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/soloRelay.test.js :17
const fs = require("node:fs/promises"); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/workspaceFs.test.js :90
await fs.readFile({ path: "/src/a.ts" }); - fs (weak) ijmh2-ripieno-49bc83e/packages/extension/test/workspaceHosting.test.js :3
const fs = require("node:fs"); - fs ijmh2-ripieno-49bc83e/packages/relay/src/bootstrap.ts :14
import { mkdir, readFile, writeFile } from "node:fs/promises"; - fs ijmh2-ripieno-49bc83e/packages/relay/src/roomStore.ts :15
import { mkdir, readFile, rename, writeFile } from "node:fs/promises"; - fs (weak) ijmh2-ripieno-49bc83e/packages/relay/test/bootstrap.test.ts :14
import { mkdtemp, readFile, writeFile, mkdir } from "node:fs/promises"; - fs (weak) ijmh2-ripieno-49bc83e/packages/relay/test/collaboration.test.ts :2
import { mkdtemp, rm } from "node:fs/promises"; - fs (weak) ijmh2-ripieno-49bc83e/packages/relay/test/roomStore.test.ts :14
import { mkdtemp, rm, stat, writeFile } from "node:fs/promises"; - fs (weak) ijmh2-ripieno-49bc83e/packages/relay/test/shutdown.test.ts :13
import { mkdtemp, rm, readdir } from "node:fs/promises"; - fs ijmh2-ripieno-49bc83e/packages/workspace-core/src/index.ts :21
import * as fs from "fs/promises"; - fs ijmh2-ripieno-49bc83e/packages/workspace-core/src/paths.ts :17
import * as fs from "fs/promises"; - fs ijmh2-ripieno-49bc83e/packages/workspace-core/src/walk.ts :16
import * as fs from "fs/promises"; - fs (weak) ijmh2-ripieno-49bc83e/packages/workspace-core/test/escapes.test.ts :12
import { mkdtemp, rm, mkdir, writeFile, symlink } from "node:fs/promises"; - fs (weak) ijmh2-ripieno-49bc83e/packages/workspace-core/test/paths.test.ts :14
import { mkdtemp, rm, mkdir, writeFile, symlink } from "node:fs/promises"; - fs (weak) ijmh2-ripieno-49bc83e/packages/workspace-core/test/tools.test.ts :14
import { mkdtemp, rm, mkdir, writeFile, readFile } from "node:fs/promises"; - fs ijmh2-ripieno-49bc83e/packages/workspace-host/src/gate.ts :15
import { writeFile, mkdir } from "node:fs/promises"; - fs ijmh2-ripieno-49bc83e/packages/workspace-host/src/git.ts :18
import { access, chmod, mkdir, readFile, rm, writeFile } from "node:fs/promises"; - fs ijmh2-ripieno-49bc83e/packages/workspace-host/src/host.ts :14
import { realpath } from "node:fs/promises"; - fs (weak) ijmh2-ripieno-49bc83e/packages/workspace-host/test/concurrency.test.ts :17
import { mkdtemp, rm, mkdir, writeFile, readFile } from "node:fs/promises"; - fs (weak) ijmh2-ripieno-49bc83e/packages/workspace-host/test/gate.test.ts :12
import { mkdtemp, rm, readFile, writeFile } from "node:fs/promises"; - fs (weak) ijmh2-ripieno-49bc83e/packages/workspace-host/test/git.test.ts :13
import { mkdtemp, rm, mkdir, writeFile, readFile } from "node:fs/promises"; - fs (weak) ijmh2-ripieno-49bc83e/packages/workspace-host/test/integration.test.ts :15
import { mkdtemp, rm, writeFile, readFile, mkdir } from "node:fs/promises"; - fs (weak) ijmh2-ripieno-49bc83e/scripts/demo-provenance.js :21
const { mkdtemp, mkdir, writeFile, rm } = require("node:fs/promises");
3 more not shown — this panel samples each group; the count above is the real total.
shell / exec 12
- shell ijmh2-ripieno-49bc83e/packages/extension/src/browserSession.ts :1
import { spawn, type ChildProcess } from "node:child_process"; - shell ijmh2-ripieno-49bc83e/packages/extension/src/extension.ts :4
import { spawn } from "child_process"; - shell ijmh2-ripieno-49bc83e/packages/extension/src/runners.ts :15
import { spawn, type ChildProcess } from "child_process"; - shell (weak) ijmh2-ripieno-49bc83e/packages/extension/test/claudeRunner.test.js :3
const cp = require("node:child_process"); - shell ijmh2-ripieno-49bc83e/packages/workspace-core/src/index.ts :24
import { exec } from "child_process"; - shell ijmh2-ripieno-49bc83e/packages/workspace-host/src/git.ts :16
import { exec } from "node:child_process"; - shell (weak) ijmh2-ripieno-49bc83e/packages/workspace-host/test/concurrency.test.ts :18
import { exec } from "node:child_process"; - shell (weak) ijmh2-ripieno-49bc83e/packages/workspace-host/test/git.test.ts :14
import { exec } from "node:child_process"; - shell (weak) ijmh2-ripieno-49bc83e/packages/workspace-host/test/integration.test.ts :16
import { exec } from "node:child_process"; - shell (weak) ijmh2-ripieno-49bc83e/scripts/demo-provenance.js :22
const { exec } = require("node:child_process"); - shell (weak) ijmh2-ripieno-49bc83e/scripts/screenshots.js :18
const { execFileSync } = require("node:child_process"); - shell (weak) ijmh2-ripieno-49bc83e/scripts/setup.js :19
const { execFileSync, execSync } = require("node:child_process");
network 10
- net ijmh2-ripieno-49bc83e/packages/extension/src/identity.ts :96
const res = await fetch(`${API}/user`, { - net ijmh2-ripieno-49bc83e/packages/extension/src/runners.ts :496
response = await fetch(`${url}/chat/completions`, { - net (weak) ijmh2-ripieno-49bc83e/packages/extension/test/agentHost.test.js :21
const http = require("node:http"); - net (weak) ijmh2-ripieno-49bc83e/packages/extension/test/browserSession.test.js :3
const http=require('node:http'); - net (weak) ijmh2-ripieno-49bc83e/packages/extension/test/openaiCompat.test.js :18
const http = require("node:http"); - net ijmh2-ripieno-49bc83e/packages/relay-client/src/index.ts :7
import { isIP } from "node:net"; - net ijmh2-ripieno-49bc83e/packages/relay/src/server.ts :8
import { createServer } from "node:http"; - net (weak) ijmh2-ripieno-49bc83e/packages/relay/test/resilience.test.ts :17
import net from "node:net"; - net ijmh2-ripieno-49bc83e/packages/workspace-host/src/index.ts :9
import { createServer } from "node:http"; - net (weak) ijmh2-ripieno-49bc83e/scripts/site.js :231
const http = require("node:http");
secrets 5
- secrets ijmh2-ripieno-49bc83e/packages/extension/src/permissionServer.ts :24
const TOKEN = process.env.RIPIENO_APPROVAL_TOKEN; - secrets ijmh2-ripieno-49bc83e/packages/extension/src/workspaceServer.ts :22
const TOKEN = process.env.RIPIENO_WORKSPACE_TOKEN; - secrets ijmh2-ripieno-49bc83e/packages/mcp/src/index.ts :33
token: process.env.RIPIENO_TOKEN, - secrets ijmh2-ripieno-49bc83e/packages/relay/src/index.ts :24
const workspaceToken = process.env.RIPIENO_WORKSPACE_TOKEN; - secrets ijmh2-ripieno-49bc83e/packages/workspace-host/src/index.ts :15
const workspaceToken = process.env.RIPIENO_WORKSPACE_TOKEN;
tool registrations 21
- approve ijmh2-ripieno-49bc83e/packages/extension/src/permissionServer.ts :101
- context_read ijmh2-ripieno-49bc83e/packages/extension/src/workspaceServer.ts :111
- context_add ijmh2-ripieno-49bc83e/packages/extension/src/workspaceServer.ts :123
- workspace_read_file ijmh2-ripieno-49bc83e/packages/extension/src/workspaceServer.ts :141
- workspace_list_dir ijmh2-ripieno-49bc83e/packages/extension/src/workspaceServer.ts :155
- workspace_search ijmh2-ripieno-49bc83e/packages/extension/src/workspaceServer.ts :165
- workspace_write_file ijmh2-ripieno-49bc83e/packages/extension/src/workspaceServer.ts :175
- workspace_edit_file ijmh2-ripieno-49bc83e/packages/extension/src/workspaceServer.ts :185
- workspace_run_command ijmh2-ripieno-49bc83e/packages/extension/src/workspaceServer.ts :196
- room_read ijmh2-ripieno-49bc83e/packages/mcp/src/index.ts :52
- room_post ijmh2-ripieno-49bc83e/packages/mcp/src/index.ts :75
- room_roster ijmh2-ripieno-49bc83e/packages/mcp/src/index.ts :104
show 9 more
- context_read ijmh2-ripieno-49bc83e/packages/mcp/src/index.ts :139
- context_add ijmh2-ripieno-49bc83e/packages/mcp/src/index.ts :181
- workspace_read_file ijmh2-ripieno-49bc83e/packages/mcp/src/index.ts :241
- workspace_list_files ijmh2-ripieno-49bc83e/packages/mcp/src/index.ts :258
- workspace_search ijmh2-ripieno-49bc83e/packages/mcp/src/index.ts :272
- workspace_write_file ijmh2-ripieno-49bc83e/packages/mcp/src/index.ts :286
- workspace_edit_file ijmh2-ripieno-49bc83e/packages/mcp/src/index.ts :302
- workspace_run_command ijmh2-ripieno-49bc83e/packages/mcp/src/index.ts :320
- room_actions ijmh2-ripieno-49bc83e/packages/mcp/src/index.ts :335
install hooks 1
- prepare ijmh2-ripieno-49bc83e/package.json :24
npm run build:relay --if-present
declared dependencies 1
- markdown-it@^14.1.0
ide-extension 1
- eager-activation (medium) ijmh2-ripieno-49bc83e/packages/extension/test-host/driver/package.json
activationEvents includes "*" — runs on every window load
transport_posture 2
- network-listening, binds all interfaces, no auth detected ijmh2-ripieno-49bc83e/packages/relay/test/identityDefault.test.ts :82
() => startServer({ port: 0, mode: "byo", host: "0.0.0.0" }), - network-listening, binds all interfaces, no auth detected ijmh2-ripieno-49bc83e/packages/workspace-host/src/index.ts :105
http.listen(port, "0.0.0.0");