mirror of
https://github.com/openprose/prose.git
synced 2026-09-19 05:55:05 +08:00
63c8ce4b23
Move the standard library (previously `github.com/openprose/std`) and
the company-as-prose library (previously local dir
`/Users/sl/code/openprose/company-as-prose`) into this repository
under `packages/std/` and `packages/co/` respectively.
Motivation: concentrate attention on one repository so stars,
discussions, and issues aggregate. `openprose/std` was a genuinely
useful asset nobody could find because ~50 stars on its own repo
told a much worse story than 1,106 stars on `openprose/prose`
would have. Same logic applies to co.
Layout choice: `packages/{std,co}/` rather than `std/` + `co/` at
the repo root. Root siblings accumulate over time, and a flat
top-level made future libraries (hub, kit, dev, etc.) compete with
spec infrastructure. `packages/` is bounded — new libraries land
there without cluttering root. Matches pnpm/Deno/monorepo tooling
conventions.
Changes:
- New: `packages/std/` (copied from openprose/std, `.git` excluded)
- New: `packages/co/` (copied from company-as-prose, README updated
for new name and location)
- `packages/std/README.md`: updated shorthand expansion reference
- `packages/co/README.md`: renamed "company-as-prose" to "co" in
self-references, added std-vs-co split heuristic, updated
`prose run` examples to use `co/` shorthand
- `skills/open-prose/deps.md`:
- `std/` shorthand now expands to
`github.com/openprose/prose/packages/std/`
- `co/` shorthand added, expands to
`github.com/openprose/prose/packages/co/`
- Both shorthands resolve into the same clone of
`openprose/prose` under `.deps/github.com/openprose/prose/`;
`packages/std/` and `packages/co/` are sibling subdirectories
- `prose.lock` format row updated to `host/owner/repo sha`
(matches the explicit-host resolution that landed in #35)
- `.deps/` directory structure example redrawn to show the
`{host}/{owner}/{repo}/packages/{std,co}/...` shape
- Error message and Interaction tables refreshed accordingly
- Resolution Algorithm step 1 now documents both shorthands
- `skills/open-prose/forme.md`: Step 2 resolution list updated to
include co/ shorthand and the host-keyed `.deps/` layout
- `skills/open-prose/help.md`: Q&A "How do dependencies work?"
rewritten to name both shorthands and the new explicit-host model
- `skills/open-prose/state/filesystem.md`: `.deps/` directory
tree re-drawn to include the `{host}/` layer with std/co as
sibling packages inside the clone
- `skills/open-prose/guidance/patterns.md`,
`skills/open-prose/guidance/antipatterns.md`: examples now use
the `std/` shorthand or explicit `github.com/...` rather than
the deprecated bare `openprose/std/` form
- `skills/open-prose/examples/registry-import/index.md`: sample
service reference switched to `std/evals/inspector`
- `README.md`: Stdlib badge replaced with internal `packages/std/`
link plus new `packages/co/` link; "Standard Library" section
rewritten as "Libraries" with both packages described
Out of scope for this PR (deliberately):
- Tooling changes to `prose install` and Forme's `.deps/` writer
to adopt the `{host}/{owner}/{repo}/` layout in practice — this
PR is spec-only. Existing tooling continues to work against
whatever layout it currently implements; the spec now describes
the target.
- Retiring the `openprose/std` GitHub repo. Delete that repo
separately after this merges.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
80 lines
2.7 KiB
Markdown
80 lines
2.7 KiB
Markdown
---
|
|
name: map-reduce
|
|
kind: composite
|
|
---
|
|
|
|
# Map-Reduce
|
|
|
|
Split input, delegate chunks to mappers in parallel, merge results with a reducer.
|
|
|
|
### Metadata
|
|
|
|
- `version`: 0.2.0
|
|
- `role`: coordinator
|
|
|
|
### Runtime
|
|
|
|
- `state.reads`: &controlState
|
|
- `state.writes`: &controlState
|
|
|
|
### Slots
|
|
|
|
- `mapper`
|
|
- `reducer`
|
|
|
|
### Shape
|
|
|
|
- `self`: partition input into chunks, fan out to mappers, collect results, delegate to reducer
|
|
- `delegates`:
|
|
- `mapper`: process one chunk of the input
|
|
- `reducer`: merge all mapper outputs into a single result
|
|
- `prohibited`: none
|
|
|
|
### Requires
|
|
|
|
- &controlState exists at __controlState with:
|
|
mapper: string -- component name for each mapper
|
|
reducer: string -- component name for the reducer
|
|
task_brief: string -- overall task description
|
|
chunks: any[] -- the pre-partitioned input chunks
|
|
|
|
### Ensures
|
|
|
|
- Each mapper receives one chunk and the overall task brief as context
|
|
- Mapper does not know other mappers exist or what chunks they received
|
|
- All mappers execute in parallel
|
|
- Reducer receives ALL mapper outputs and the overall task brief
|
|
- Reducer reasons about how to merge — handles conflicts and overlaps
|
|
- &controlState.result contains the merged output
|
|
- &controlState.mapper_results contains individual mapper outputs
|
|
|
|
### Delegation
|
|
|
|
```javascript
|
|
const { mapper, reducer, task_brief, chunks } = __controlState;
|
|
|
|
// Map phase — all mappers run in parallel
|
|
const mapperResults = await Promise.all(
|
|
chunks.map((chunk, i) => {
|
|
const mapBrief = `${task_brief}\n\nProcess this chunk (${i + 1} of ${chunks.length}):\n${typeof chunk === 'string' ? chunk : JSON.stringify(chunk)}`;
|
|
return rlm(mapBrief, null, { use: mapper });
|
|
})
|
|
);
|
|
|
|
// Reduce phase
|
|
const reduceBrief = `Merge these ${mapperResults.length} results into a single coherent output. Handle conflicts and overlaps.\n\nOverall task: ${task_brief}\n\nResults to merge:\n${mapperResults.map((r, i) => `--- Chunk ${i + 1} ---\n${r}`).join("\n\n")}`;
|
|
const merged = await rlm(reduceBrief, null, { use: reducer });
|
|
|
|
__controlState.result = merged;
|
|
__controlState.mapper_results = mapperResults;
|
|
return(merged);
|
|
```
|
|
|
|
### Notes
|
|
|
|
The parent is responsible for partitioning the input into chunks before delegating to map-reduce. Mappers do not know other mappers exist. The reducer does not know it is part of a map-reduce pipeline.
|
|
|
|
Mappers run in parallel by default (`Promise.all`). For sequential execution (e.g., when mappers share rate-limited resources), replace `Promise.all` with a `for` loop — but this sacrifices the primary advantage of map-reduce.
|
|
|
|
Different from `fan-out`: map-reduce includes a reducer that merges results into a single output. Fan-out returns all results to the parent, which decides how to use them.
|