Repository navigation
feat(documents): edit docx/xlsx/pptx structurally, render PDF from HTML, and fix the #7109 text-log regression #7163
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
3c061af
ad3304d
6f2168b
98a7fd2
85593b9
d186eb1
d8867d8
f46bc94
6fd61d0
415b75b
480a500
0e7c656
1d6bc1a
b9efa58
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -42,7 +42,7 @@ that owns that boundary — never thread it through a UI or runtime crate. | |
|
|
||
| ## The ten families | ||
|
|
||
| Counts measured 2026-08-05 (`cargo metadata --no-deps`; the enforcing gate is | ||
| Counts updated 2026-08-12 (`cargo metadata --no-deps`; the enforcing gate is | ||
| `python3 scripts/ci/check-target-tree.py`). Every family has an `AGENTS.md` | ||
| (its boundary and crate table) and an in-depth spec in | ||
| [`docs/internal/reborn/target-architecture/families/`](../docs/internal/reborn/target-architecture/families/); | ||
|
|
@@ -51,7 +51,7 @@ every crate has a `README.md`. | |
| | Directory | Crates | What lives there | | ||
| | --- | --- | --- | | ||
| | [`contracts/`](./contracts/AGENTS.md) | 6 | `host_api`, `common`, `prompt_envelope`, `loop_contracts`, `extension_contracts`, `product_contracts` | | ||
| | [`substrates/`](./substrates/AGENTS.md) | 6 | `filesystem`, `libsql_runtime`, `secrets`, `network`, `safety`, `observability` | | ||
| | [`substrates/`](./substrates/AGENTS.md) | 7 | `filesystem`, `documents`, `libsql_runtime`, `secrets`, `network`, `safety`, `observability` | | ||
| | [`events/`](./events/AGENTS.md) | 4 | `event_log`, `event_store`, `event_projections`, `event_streams` | | ||
| | [`domains/`](./domains/AGENTS.md) | 12 | `threads`, `conversations`, `triggers`, `memory`, `skills`, `auth`, `attachments`, `extractors`, `identity`, `llm`, `trace_commons`, `outbound` | | ||
| | [`kernel/`](./kernel/AGENTS.md) | 9 | `trust`, `authorization`, `approvals`, `resources`, `runtime_policy`, `capabilities`, `processes`, `turns`, `host_runtime` | | ||
|
|
@@ -79,7 +79,7 @@ directory has its own `README.md`, crate or not. | |
|
|
||
| ### The workspace beyond `crates/` | ||
|
|
||
| 62 of the workspace's **64 packages** live under `crates/`. The other two are | ||
| 65 of the workspace's **67 packages** live under `crates/`. The other two are | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/bin/bash
# Count workspace packages and packages under crates/ to settle the documented totals.
set -euo pipefail
cargo metadata --no-deps --format-version 1 2>/dev/null | jq -r '
[.packages[] | {name, path: (.manifest_path)}] as $p
| "total: \($p | length)",
"under crates/: \([$p[] | select(.path | test("/crates/"))] | length)"'
# Per-family counts for the table.
fd -t f Cargo.toml crates --max-depth 3 | sed 's#^crates/\([^/]*\)/.*#\1#' | sort | uniq -cRepository: nearai/ironclaw Length of output: 153 🏁 Script executed: #!/bin/bash
set -euo pipefail
printf '%s\n' '--- README excerpt ---'
sed -n '45,90p' crates/README.md
printf '%s\n' '--- repository guidance ---'
find .. -name AGENTS.md -o -name CLAUDE.md -o -path '*/.claude/rules/*' | sort
printf '%s\n' '--- workspace manifests ---'
sed -n '1,180p' Cargo.toml
printf '%s\n' '--- crate manifests ---'
find crates -name Cargo.toml -print | sortRepository: nearai/ironclaw Length of output: 27322 🏁 Script executed: #!/bin/bash
set -euo pipefail
python3 - <<'PY'
import pathlib, tomllib
root = pathlib.Path("Cargo.toml")
data = tomllib.loads(root.read_text())
members = data["workspace"]["members"]
exclude = set(data["workspace"].get("exclude", []))
workspace_paths = [pathlib.Path(".")] + [pathlib.Path(p) for p in members]
packages = []
for path in workspace_paths:
manifest = root if path == pathlib.Path(".") else path / "Cargo.toml"
if manifest.exists():
package = tomllib.loads(manifest.read_text()).get("package")
if package:
packages.append((package["name"], manifest.as_posix()))
print("workspace package count:", len(packages))
print("workspace packages under crates/:",
sum("/crates/" in f"/{p}" or p.startswith("crates/") for _, p in packages))
print("workspace packages outside crates/:",
[(n, p) for n, p in packages if not p.startswith("crates/")])
print("workspace member paths:", len(members))
print("excluded paths:", sorted(exclude))
print("\npackage count by top-level family:")
counts = {}
for name, manifest in packages:
parts = pathlib.Path(manifest).parts
if len(parts) >= 2 and parts[0] == "crates":
counts[parts[1]] = counts.get(parts[1], 0) + 1
print(counts)
PY
printf '%s\n' '--- canonical crate guidance mentioning counts or README invariants ---'
rg -n -i 'count|README|family|package|crate table|target tree' AGENTS.md crates/AGENTS.md crates/*/AGENTS.md .claude/rules 2>/dev/null | head -160
printf '%s\n' '--- README diff ---'
git diff -- crates/README.mdRepository: nearai/ironclaw Length of output: 273 🏁 Script executed: #!/bin/bash
set -u
printf '%s\n' '--- cargo metadata status and diagnostics ---'
meta=$(mktemp)
err=$(mktemp)
cargo metadata --no-deps --format-version 1 >"$meta" 2>"$err"
status=$?
printf 'status: %s\n' "$status"
cat "$err"
if [ "$status" -eq 0 ]; then
python3 - "$meta" <<'PY'
import json, pathlib, sys
d = json.load(open(sys.argv[1]))
p = d["packages"]
print("workspace package count:", len(p))
print("workspace packages under crates/:",
sum(pathlib.PurePosixPath(x["manifest_path"]).parts[-4:-3] == ("crates",) for x in []))
for x in p:
print(x["name"], x["manifest_path"])
PY
fi
rm -f "$meta" "$err"
printf '%s\n' '--- explicit workspace member paths ---'
python3 - <<'PY'
import re
text = open("Cargo.toml").read()
members = re.search(r'members\s*=\s*\[(.*?)\]\s*default-members', text, re.S).group(1)
paths = re.findall(r'"([^"]+)"', members)
print("member paths:", len(paths))
print("member paths under crates/:", sum(p.startswith("crates/") for p in paths))
print("member paths outside crates/:", [p for p in paths if not p.startswith("crates/")])
PY
printf '%s\n' '--- canonical count guidance ---'
rg -n -i 'count|package|crate table|family' AGENTS.md crates/AGENTS.md crates/*/AGENTS.md .claude/rules 2>/dev/null | head -160Repository: nearai/ironclaw Length of output: 21498 🏁 Script executed: #!/bin/bash
set -euo pipefail
printf '%s\n' '--- documented workspace/package invariants ---'
sed -n '88,115p' crates/AGENTS.md
printf '%s\n' '--- family tables ---'
for f in crates/*/AGENTS.md; do
printf '\n### %s\n' "$f"
sed -n '1,8p' "$f"
done
printf '%s\n' '--- workspace member paths grouped by family ---'
python3 - <<'PY'
import re
text = open("Cargo.toml").read()
body = re.search(r'members\s*=\s*\[(.*?)\]\s*default-members', text, re.S).group(1)
paths = re.findall(r'"([^"]+)"', body)
families = {}
for p in paths:
if p.startswith("crates/"):
family = p.split("/")[1]
families.setdefault(family, []).append(p)
for family, values in families.items():
print(f"{family}: {len(values)}")
for value in values:
print(f" {value}")
PY
printf '%s\n' '--- README tracked changes ---'
git diff --stat -- crates/README.md
git diff --unified=3 -- crates/README.mdRepository: nearai/ironclaw Length of output: 11273 Update the family table, not the workspace totals
🤖 Prompt for AI Agents |
||
| the root package `ironclaw_integration_tests` (the in-process integration | ||
| suite driving `tests/integration/`) and `tools/ironclaw_stress`. One package | ||
| is deliberately excluded from the workspace: `tools/ironclaw_silk_decoder`, | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
One workspace package count, written twice with two different values. Both files were changed in this PR to record the package total after
ironclaw_documentswas added, and they disagree by two.python3 scripts/ci/check-target-tree.pyenforces the documented package set as an equality, so at most one of the two can pass. Re-derive the count once from the tree, then write the same pair of numbers in both places.crates/AGENTS.md#L95-L104: states 67 packages / 65 undercrates/. Correct the pair if the live count differs, and update the quotedtarget tree: OK (67 workspace members against 67 documented packages…)transcript on line 103 so the evidence string matches the gate's real output.crates/README.md#L82-L82: states 65 packages / 63 undercrates/. Set the pair to the re-derived numbers so it agrees withcrates/AGENTS.md.📍 Affects 2 files
crates/AGENTS.md#L95-L104(this comment)crates/README.md#L82-L82🤖 Prompt for AI Agents
Source: Coding guidelines
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Addressed in
1d6bc1a2229efa1e3600de7f22523817c7bf2e28: Corrected the workspace package counts to 67 total and 65 under crates/. Verification includes the 86-test document suite, caller-path capability tests, integration journeys, architecture tests, formatting, and zero-warning clippy.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rate Limit Exceeded
@serrrfirathave exceeded the limit for the number of chat messages per hour. Please wait 56 minutes and 55 seconds before sending another message.