@instruktlabs/kiln 1.0.0 → 1.2.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG.md +60 -3
- package/CONTRIBUTING.md +16 -7
- package/README.md +95 -381
- package/dist/agent-run.mjs +220 -150
- package/dist/build.json +40 -28
- package/dist/cli.mjs +242 -163
- package/dist/mcp-engine.mjs +412 -154
- package/dist/mcp-server.mjs +1 -1
- package/docs/architecture.md +6 -3
- package/docs/chatgpt.md +20 -5
- package/docs/examples.md +40 -170
- package/docs/install.md +100 -35
- package/docs/migration.md +20 -0
- package/docs/sdk.md +49 -5
- package/docs/tools-operations.md +1529 -0
- package/lib/asset-widget-uri.d.ts +9 -0
- package/lib/asset-widget-uri.js +9 -0
- package/lib/cli-render-mode.js +10 -3
- package/lib/discovery/index.d.ts +1 -1
- package/lib/discovery/index.js +2 -2
- package/lib/discovery/portable.d.ts +9 -0
- package/lib/discovery/portable.js +6 -0
- package/lib/discovery/service.d.ts +3 -1
- package/lib/discovery/service.js +4 -2
- package/lib/engine-identity.d.ts +1 -1
- package/lib/engine-identity.js +1 -1
- package/lib/evaluator/isolation.js +19 -5
- package/lib/evaluator/probe-invariants.d.ts +11 -0
- package/lib/evaluator/probe-invariants.js +36 -0
- package/lib/evaluator/probe-worker.js +16 -4
- package/lib/loopback.d.ts +6 -0
- package/lib/loopback.js +6 -0
- package/lib/mcp-core.d.ts +210 -0
- package/lib/mcp-core.js +279 -0
- package/lib/mcp-engine.d.ts +59 -0
- package/lib/mcp-engine.js +289 -0
- package/lib/mcp-manifest.d.ts +15 -0
- package/lib/mcp-manifest.js +65 -0
- package/lib/mcp.d.ts +5 -0
- package/lib/mcp.js +2 -0
- package/lib/render-service-host.js +1 -1
- package/lib/tools/discovery.d.ts +1 -1
- package/lib/tools/discovery.js +11 -9
- package/lib/tools/materials.d.ts +1 -1
- package/lib/tools/materials.js +44 -14
- package/lib/tools/operation-contract.d.ts +8 -0
- package/lib/tools/operation-contract.js +37 -0
- package/lib/tools/operations.d.ts +3 -0
- package/lib/tools/operations.js +154 -0
- package/lib/tools/registry.d.ts +6 -2
- package/lib/tools/registry.js +71 -23
- package/package.json +23 -1
- package/plugin.json +1 -1
- package/plugins/kiln-engine/.claude-plugin/icon.png +0 -0
- package/plugins/kiln-engine/.claude-plugin/plugin.json +9 -3
- package/plugins/kiln-engine/PRIVACY.md +100 -0
- package/plugins/kiln-engine/README.md +103 -18
- package/plugins/kiln-engine/{scripts/setup-workspace.mjs → bin/kiln-setup-workspace.mjs} +37 -9
- package/plugins/kiln-engine/package-provenance.json +15 -8
- package/plugins/kiln-engine/plugin.json +10 -4
- package/plugins/kiln-engine/runtime.json +10 -1
- package/plugins/kiln-engine/skills/kiln-setup-workspace/SKILL.md +17 -18
- package/plugins/kiln-engine/skills/kiln-setup-workspace/references/plugin-install.md +28 -8
- package/plugins/kiln-engine/skills/kiln-setup-workspace/references/renderer-setup.md +11 -0
- package/scripts/create-workspace.mjs +71 -13
- package/scripts/workspace-config.mjs +239 -0
- package/scripts/workspace-project.mjs +384 -0
- package/scripts/workspace-transaction.mjs +504 -0
- package/skills/kiln-setup-workspace/SKILL.md +17 -18
- package/skills/kiln-setup-workspace/references/plugin-install.md +28 -8
- package/skills/kiln-setup-workspace/references/renderer-setup.md +11 -0
- package/src/cli-render-mode.ts +9 -9
- package/src/cli.ts +3 -3
- package/src/discovery/index.ts +2 -0
- package/src/discovery/portable.ts +9 -0
- package/src/discovery/service.ts +3 -1
- package/src/engine-identity.ts +1 -1
- package/src/evaluator/isolation.ts +27 -6
- package/src/evaluator/probe-invariants.ts +50 -0
- package/src/evaluator/probe-worker.ts +22 -4
- package/src/mcp-core.ts +3 -0
- package/src/mcp-engine.ts +11 -1
- package/src/mcp.ts +5 -0
- package/src/render-service-host.ts +1 -1
- package/src/tools/discovery.ts +20 -10
- package/src/tools/materials.ts +59 -15
- package/src/tools/operation-contract.ts +51 -0
- package/src/tools/operations.ts +177 -0
- package/src/tools/registry.ts +100 -20
package/lib/tools/registry.js
CHANGED
|
@@ -13,6 +13,7 @@ import { createKilnMaterialDef } from "./materials.js";
|
|
|
13
13
|
import { createKilnReviewDef } from "./review.js";
|
|
14
14
|
import { withWorkspaceContext } from "./workspace.js";
|
|
15
15
|
import { describeInputError } from "./actions.js";
|
|
16
|
+
import { projectOperationDefs } from "./operations.js";
|
|
16
17
|
import { advancedCaptureInput, cameraShotInput, cameraShotRecordInput, cameraVec3Input, captureInput, captureRecordInput, } from "./capture-input.js";
|
|
17
18
|
import { compactEditResult, compactReviewResult, partsHint, requestedDetail, reviewDetailInput, } from "./review-detail.js";
|
|
18
19
|
import { createCachedEvaluatorPort, MemoryBuildCache } from "../build-cache.js";
|
|
@@ -1605,22 +1606,25 @@ const rendererInput = z.strictObject({
|
|
|
1605
1606
|
action: z.enum(['status', 'reprobe']).default('status'),
|
|
1606
1607
|
});
|
|
1607
1608
|
/** A saved-revision read whose failure names the listing call instead of a filesystem path (rule 9). */
|
|
1608
|
-
async function readSavedRevision(target, collection, assetId, revisionId) {
|
|
1609
|
+
async function readSavedRevision(target, collection, assetId, revisionId, listCall = `kiln_assets { action: 'list', collection: '${collection}' }`) {
|
|
1609
1610
|
try {
|
|
1610
1611
|
return await target.read(collection, assetId, revisionId);
|
|
1611
1612
|
}
|
|
1612
1613
|
catch (error) {
|
|
1613
1614
|
if (error.code === 'ENOENT')
|
|
1614
|
-
throw new Error(`Unknown asset ${assetId} revision ${revisionId} in collection ${collection}.
|
|
1615
|
+
throw new Error(`Unknown asset ${assetId} revision ${revisionId} in collection ${collection}. ${listCall} lists the saved revisions.`);
|
|
1615
1616
|
throw error;
|
|
1616
1617
|
}
|
|
1617
1618
|
}
|
|
1618
1619
|
export function createKilnProgramToolRegistry(suppliedContext = {}) {
|
|
1620
|
+
return createProgramDefs(suppliedContext, 'grouped');
|
|
1621
|
+
}
|
|
1622
|
+
function createProgramDefs(suppliedContext, presentation) {
|
|
1619
1623
|
toolRequirements(suppliedContext);
|
|
1620
1624
|
const store = suppliedContext.programStore ?? new MemoryProgramStore();
|
|
1621
1625
|
const context = withCaptureCache(withBuildCache({ ...suppliedContext, programStore: store }));
|
|
1622
1626
|
return [
|
|
1623
|
-
createKilnDiscoveryDef({ ...suppliedContext, programStore: store }),
|
|
1627
|
+
createKilnDiscoveryDef({ ...suppliedContext, programStore: store }, presentation),
|
|
1624
1628
|
{
|
|
1625
1629
|
name: 'kiln_renderer',
|
|
1626
1630
|
description: 'Inspect status, or reprobe after renderer setup/repair to refresh this session and reset failed starts. Never installs, starts, stops or renders. Preserves CPU/local/remote selection; environment/credential changes require a host restart. Read viewFidelity after rendering.',
|
|
@@ -1665,7 +1669,9 @@ export function createKilnProgramToolRegistry(suppliedContext = {}) {
|
|
|
1665
1669
|
...(context.projectStore
|
|
1666
1670
|
? [createKilnProjectDef(context.projectStore, context.projectBundleReader)]
|
|
1667
1671
|
: []),
|
|
1668
|
-
...(context.materialLibrary
|
|
1672
|
+
...(context.materialLibrary
|
|
1673
|
+
? [createKilnMaterialDef(context.materialLibrary, presentation)]
|
|
1674
|
+
: []),
|
|
1669
1675
|
...(context.reviewStore && context.assetLibrary
|
|
1670
1676
|
? [
|
|
1671
1677
|
createKilnReviewDef({
|
|
@@ -1675,7 +1681,7 @@ export function createKilnProgramToolRegistry(suppliedContext = {}) {
|
|
|
1675
1681
|
}),
|
|
1676
1682
|
]
|
|
1677
1683
|
: []),
|
|
1678
|
-
...createKilnAssetDefs({ ...context, programStore: store }),
|
|
1684
|
+
...createKilnAssetDefs({ ...context, programStore: store }, presentation),
|
|
1679
1685
|
]
|
|
1680
1686
|
.map((def) => withWorkspaceContext(def, context))
|
|
1681
1687
|
.map((def) => ({
|
|
@@ -1689,6 +1695,10 @@ export function createKilnProgramToolRegistry(suppliedContext = {}) {
|
|
|
1689
1695
|
},
|
|
1690
1696
|
}));
|
|
1691
1697
|
}
|
|
1698
|
+
/** Opt-in named domain operations; grouped local/native contracts remain unchanged. */
|
|
1699
|
+
export function createKilnOperationToolRegistry(context = {}) {
|
|
1700
|
+
return projectOperationDefs(createProgramDefs(context, 'operations'), context);
|
|
1701
|
+
}
|
|
1692
1702
|
/** Canonical native workflow: shared definitions plus one host-owned terminal. */
|
|
1693
1703
|
export function createKilnNativeToolRegistry(suppliedContext, completion) {
|
|
1694
1704
|
const active = toolRequirements(suppliedContext);
|
|
@@ -1772,15 +1782,42 @@ const assetSelector = {
|
|
|
1772
1782
|
assetId: z.string().regex(/^[a-z][a-z0-9_-]{0,79}$/),
|
|
1773
1783
|
revisionId: z.string().regex(/^[a-z][a-z0-9_-]{0,79}$/),
|
|
1774
1784
|
};
|
|
1785
|
+
const ASSET_CONTRACT = {
|
|
1786
|
+
collections: {
|
|
1787
|
+
fields: [],
|
|
1788
|
+
required: [],
|
|
1789
|
+
description: 'List configured asset storage collections. Collection is not project membership.',
|
|
1790
|
+
},
|
|
1791
|
+
catalog: {
|
|
1792
|
+
fields: ['assetId', 'query', 'offset', 'limit'],
|
|
1793
|
+
required: [],
|
|
1794
|
+
description: 'Search saved assets across configured collections with pagination.',
|
|
1795
|
+
},
|
|
1796
|
+
list: {
|
|
1797
|
+
fields: ['collection', 'assetId', 'query', 'offset', 'limit'],
|
|
1798
|
+
required: [],
|
|
1799
|
+
description: 'Search saved assets in one collection with pagination.',
|
|
1800
|
+
},
|
|
1801
|
+
get: {
|
|
1802
|
+
fields: ['collection', 'assetId', 'revisionId'],
|
|
1803
|
+
required: ['assetId'],
|
|
1804
|
+
description: 'Read a saved revision and its download descriptors. Omit revisionId for the newest revision.',
|
|
1805
|
+
},
|
|
1806
|
+
restore: {
|
|
1807
|
+
fields: ['collection', 'assetId', 'revisionId'],
|
|
1808
|
+
required: ['assetId'],
|
|
1809
|
+
description: 'Restore exact saved source as programRef for editing or rendering. Omit revisionId for the newest revision. Does not overwrite the saved revision. Binary-only assets have no source.',
|
|
1810
|
+
},
|
|
1811
|
+
};
|
|
1775
1812
|
/**
|
|
1776
1813
|
* The revision a get or restore without `revisionId` means: the newest, the
|
|
1777
1814
|
* one no later revision names as its parent, ties to the latest `createdAt`
|
|
1778
1815
|
* (c40 of 1 October 2026 called get with the asset id alone and was refused).
|
|
1779
1816
|
*/
|
|
1780
|
-
export async function newestRevision(target, collection, assetId) {
|
|
1817
|
+
export async function newestRevision(target, collection, assetId, listCall = `kiln_assets { action: 'list', collection: '${collection}' }`) {
|
|
1781
1818
|
const revisions = (await target.list(collection)).filter((a) => a.assetId === assetId);
|
|
1782
1819
|
if (!revisions.length)
|
|
1783
|
-
throw new Error(`Unknown asset ${assetId} in ${collection};
|
|
1820
|
+
throw new Error(`Unknown asset ${assetId} in ${collection}; ${listCall} lists them.`);
|
|
1784
1821
|
const parents = new Set(revisions.map((a) => a.parentRevision).filter(Boolean));
|
|
1785
1822
|
const heads = revisions.filter((a) => !parents.has(a.revisionId));
|
|
1786
1823
|
const newest = (heads.length ? heads : revisions).sort((a, b) => a.createdAt < b.createdAt ? 1 : a.createdAt > b.createdAt ? -1 : 0);
|
|
@@ -1857,7 +1894,16 @@ export async function buildProgramAssetDraft(code, context, backdrop) {
|
|
|
1857
1894
|
};
|
|
1858
1895
|
}
|
|
1859
1896
|
/** All asset operation schemas live here, alongside the existing tool definitions. */
|
|
1860
|
-
export function createKilnAssetDefs(context) {
|
|
1897
|
+
export function createKilnAssetDefs(context, presentation = 'grouped') {
|
|
1898
|
+
const listCall = (collection) => presentation === 'operations'
|
|
1899
|
+
? `kiln_assets_search({ collection: '${collection}' })`
|
|
1900
|
+
: `kiln_assets { action: 'list', collection: '${collection}' }`;
|
|
1901
|
+
const selector = presentation === 'operations'
|
|
1902
|
+
? {
|
|
1903
|
+
...assetSelector,
|
|
1904
|
+
collection: assetSelector.collection.describe('Collection ID from kiln_assets_collections; default project.'),
|
|
1905
|
+
}
|
|
1906
|
+
: assetSelector;
|
|
1861
1907
|
const library = () => {
|
|
1862
1908
|
if (!context.assetLibrary)
|
|
1863
1909
|
throw new Error('No asset library configured. The local CLI/MCP host supplies workspace collections; embedded hosts must inject assetLibrary.');
|
|
@@ -1886,11 +1932,11 @@ export function createKilnAssetDefs(context) {
|
|
|
1886
1932
|
downloadUrls: await context.assetDownloadUrls?.(collection, asset.assetId, asset.revisionId),
|
|
1887
1933
|
});
|
|
1888
1934
|
const saveInput = z.object({
|
|
1889
|
-
collection:
|
|
1935
|
+
collection: selector.collection,
|
|
1890
1936
|
programRef: z.string(),
|
|
1891
1937
|
name: z.string().min(1).max(200),
|
|
1892
|
-
assetId:
|
|
1893
|
-
parentRevision:
|
|
1938
|
+
assetId: selector.assetId.optional(),
|
|
1939
|
+
parentRevision: selector.revisionId.optional(),
|
|
1894
1940
|
tags: z.array(z.string().max(80)).max(30).optional(),
|
|
1895
1941
|
brief: z.string().max(8000).optional(),
|
|
1896
1942
|
description: z.string().max(4000).optional(),
|
|
@@ -1908,16 +1954,16 @@ export function createKilnAssetDefs(context) {
|
|
|
1908
1954
|
});
|
|
1909
1955
|
const assetsInput = z.object({
|
|
1910
1956
|
action: z.enum(['collections', 'catalog', 'list', 'get', 'restore']).default('list'),
|
|
1911
|
-
collection:
|
|
1912
|
-
assetId:
|
|
1913
|
-
revisionId:
|
|
1957
|
+
collection: selector.collection,
|
|
1958
|
+
assetId: selector.assetId.optional(),
|
|
1959
|
+
revisionId: selector.revisionId
|
|
1914
1960
|
.optional()
|
|
1915
1961
|
.describe('get, restore: the saved revision; omitted, the newest.'),
|
|
1916
1962
|
query: z.string().max(200).optional(),
|
|
1917
1963
|
offset: z.number().int().min(0).default(0),
|
|
1918
1964
|
limit: z.number().int().min(1).max(50).default(20),
|
|
1919
1965
|
});
|
|
1920
|
-
const exportInput = z.object(
|
|
1966
|
+
const exportInput = z.object(selector);
|
|
1921
1967
|
const profileExportInput = exportInput.extend({
|
|
1922
1968
|
profile: z
|
|
1923
1969
|
.enum(['editable', 'runtime'])
|
|
@@ -1925,8 +1971,8 @@ export function createKilnAssetDefs(context) {
|
|
|
1925
1971
|
.describe('editable preserves canonical source/GLB/build resources. runtime returns a standalone GLB and versioned review-metadata sidecar; no source bundle or geometry optimization.'),
|
|
1926
1972
|
});
|
|
1927
1973
|
const importInput = z.object({
|
|
1928
|
-
...
|
|
1929
|
-
sourceCollection:
|
|
1974
|
+
...selector,
|
|
1975
|
+
sourceCollection: selector.collection,
|
|
1930
1976
|
});
|
|
1931
1977
|
return [
|
|
1932
1978
|
{
|
|
@@ -1942,7 +1988,7 @@ export function createKilnAssetDefs(context) {
|
|
|
1942
1988
|
requirements: activeRequirements.binding,
|
|
1943
1989
|
};
|
|
1944
1990
|
if (input.assetId && input.parentRevision) {
|
|
1945
|
-
const previous = await readSavedRevision(target, input.collection, input.assetId, input.parentRevision);
|
|
1991
|
+
const previous = await readSavedRevision(target, input.collection, input.assetId, input.parentRevision, listCall(input.collection));
|
|
1946
1992
|
assertSavedRequirementsAuthorized(previous.manifest, activeRequirements);
|
|
1947
1993
|
}
|
|
1948
1994
|
const code = await context.programStore.get(input.programRef);
|
|
@@ -1957,6 +2003,7 @@ export function createKilnAssetDefs(context) {
|
|
|
1957
2003
|
name: 'kiln_assets',
|
|
1958
2004
|
description: 'Browse saved assets: collections discovers storage; catalog searches all configured collections; list searches one. Both searches paginate. get returns a build record/downloads; restore loads exact source for kiln_source/kiln_edit. Collection is not project membership. Binary-only assets cannot restore source.',
|
|
1959
2005
|
inputSchema: assetsInput,
|
|
2006
|
+
actionContract: ASSET_CONTRACT,
|
|
1960
2007
|
run: async (raw) => {
|
|
1961
2008
|
const input = assetsInput.parse(raw);
|
|
1962
2009
|
const activeRequirements = toolRequirements(context);
|
|
@@ -2005,10 +2052,11 @@ export function createKilnAssetDefs(context) {
|
|
|
2005
2052
|
})),
|
|
2006
2053
|
};
|
|
2007
2054
|
}
|
|
2008
|
-
if (
|
|
2055
|
+
if (ASSET_CONTRACT[input.action].required.some((field) => !input[field]))
|
|
2009
2056
|
throw new Error(`kiln_assets ${input.action} requires assetId; kiln_assets { action: 'list', collection: '${input.collection}' } lists them.`);
|
|
2010
|
-
const revisionId = input.revisionId ??
|
|
2011
|
-
|
|
2057
|
+
const revisionId = input.revisionId ??
|
|
2058
|
+
(await newestRevision(target, input.collection, input.assetId, listCall(input.collection)));
|
|
2059
|
+
const record = await readSavedRevision(target, input.collection, input.assetId, revisionId, listCall(input.collection));
|
|
2012
2060
|
if (input.action === 'get')
|
|
2013
2061
|
return links(input.collection, record.manifest);
|
|
2014
2062
|
const saved = assertSavedRequirementsAuthorized(record.manifest, activeRequirements);
|
|
@@ -2080,7 +2128,7 @@ export function createKilnAssetDefs(context) {
|
|
|
2080
2128
|
inputSchema: profileExportInput,
|
|
2081
2129
|
run: async (raw) => {
|
|
2082
2130
|
const input = profileExportInput.parse(raw);
|
|
2083
|
-
const record = await readSavedRevision(library(), input.collection, input.assetId, input.revisionId);
|
|
2131
|
+
const record = await readSavedRevision(library(), input.collection, input.assetId, input.revisionId, listCall(input.collection));
|
|
2084
2132
|
const { inspectDrawDiagnostics } = await import("../draw-diagnostics.js");
|
|
2085
2133
|
if (input.profile === 'runtime') {
|
|
2086
2134
|
const output = await (await import("../asset-export.js")).exportAssetGlb(record, {
|
|
@@ -2114,7 +2162,7 @@ export function createKilnAssetDefs(context) {
|
|
|
2114
2162
|
run: async (raw) => {
|
|
2115
2163
|
const input = importInput.parse(raw);
|
|
2116
2164
|
const target = library();
|
|
2117
|
-
const record = await readSavedRevision(target, input.sourceCollection, input.assetId, input.revisionId);
|
|
2165
|
+
const record = await readSavedRevision(target, input.sourceCollection, input.assetId, input.revisionId, listCall(input.sourceCollection));
|
|
2118
2166
|
await target.import(input.collection, [record]);
|
|
2119
2167
|
return links(input.collection, record.manifest);
|
|
2120
2168
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@instruktlabs/kiln",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Create and refine procedural 3D assets with JavaScript, image feedback, and reusable source revisions.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Matthew Kissinger",
|
|
@@ -83,6 +83,14 @@
|
|
|
83
83
|
"types": "./lib/tools/registry.d.ts",
|
|
84
84
|
"import": "./lib/tools/registry.js"
|
|
85
85
|
},
|
|
86
|
+
"./tools/input": {
|
|
87
|
+
"types": "./lib/tools/actions.d.ts",
|
|
88
|
+
"import": "./lib/tools/actions.js"
|
|
89
|
+
},
|
|
90
|
+
"./mcp": {
|
|
91
|
+
"types": "./lib/mcp.d.ts",
|
|
92
|
+
"import": "./lib/mcp.js"
|
|
93
|
+
},
|
|
86
94
|
"./arena": {
|
|
87
95
|
"types": "./lib/arena/index.d.ts",
|
|
88
96
|
"import": "./lib/arena/index.js"
|
|
@@ -115,6 +123,10 @@
|
|
|
115
123
|
"types": "./lib/views/index.d.ts",
|
|
116
124
|
"import": "./lib/views/index.js"
|
|
117
125
|
},
|
|
126
|
+
"./views/port": {
|
|
127
|
+
"types": "./lib/views/port.d.ts",
|
|
128
|
+
"import": "./lib/views/port.js"
|
|
129
|
+
},
|
|
118
130
|
"./validation": {
|
|
119
131
|
"types": "./lib/validation.d.ts",
|
|
120
132
|
"import": "./lib/validation.js"
|
|
@@ -207,6 +219,10 @@
|
|
|
207
219
|
"types": "./lib/discovery/index.d.ts",
|
|
208
220
|
"import": "./lib/discovery/index.js"
|
|
209
221
|
},
|
|
222
|
+
"./discovery/portable": {
|
|
223
|
+
"types": "./lib/discovery/portable.d.ts",
|
|
224
|
+
"import": "./lib/discovery/portable.js"
|
|
225
|
+
},
|
|
210
226
|
"./metrics": {
|
|
211
227
|
"types": "./lib/metrics.d.ts",
|
|
212
228
|
"import": "./lib/metrics.js"
|
|
@@ -253,6 +269,9 @@
|
|
|
253
269
|
"plugins/kiln-engine/",
|
|
254
270
|
".mcp.json",
|
|
255
271
|
"scripts/create-workspace.mjs",
|
|
272
|
+
"scripts/workspace-config.mjs",
|
|
273
|
+
"scripts/workspace-project.mjs",
|
|
274
|
+
"scripts/workspace-transaction.mjs",
|
|
256
275
|
"scripts/package-plugin.mjs",
|
|
257
276
|
"render-service/src/",
|
|
258
277
|
"render-service/package.json",
|
|
@@ -280,6 +299,7 @@
|
|
|
280
299
|
"docs/runtime.md",
|
|
281
300
|
"docs/sdk.md",
|
|
282
301
|
"docs/tools.md",
|
|
302
|
+
"docs/tools-operations.md",
|
|
283
303
|
"README.md",
|
|
284
304
|
"CONTRIBUTING.md",
|
|
285
305
|
"LICENSE",
|
|
@@ -327,10 +347,12 @@
|
|
|
327
347
|
"acorn": "^8.18.0",
|
|
328
348
|
"acorn-walk": "^8.3.5",
|
|
329
349
|
"gltf-validator": "2.0.0-dev.3.10",
|
|
350
|
+
"jsonc-parser": "3.3.1",
|
|
330
351
|
"manifold-3d": "^3.5.4",
|
|
331
352
|
"minisearch": "7.2.0",
|
|
332
353
|
"pngjs": "7.0.0",
|
|
333
354
|
"sharp": "^0.35.5",
|
|
355
|
+
"smol-toml": "1.9.0",
|
|
334
356
|
"three": "0.186.1",
|
|
335
357
|
"three-subdivide": "1.1.5",
|
|
336
358
|
"xatlasjs": "^0.2.0",
|
package/plugin.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "kiln",
|
|
3
3
|
"displayName": "Kiln",
|
|
4
4
|
"description": "Build and revise 3D assets with your coding agent. Write JavaScript, inspect selected views, edit saved source revisions, and export GLB files locally.",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.2.0",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://github.com/instruktlabs/kiln",
|
|
8
8
|
"keywords": [
|
|
Binary file
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kiln-engine",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Set up a local Kiln workspace to create, inspect and revise editable 3D assets with Claude Code or Codex.",
|
|
5
5
|
"author": {
|
|
6
|
-
"name": "Instrukt Labs"
|
|
6
|
+
"name": "Instrukt Labs",
|
|
7
|
+
"email": "support@instruktlabs.com"
|
|
7
8
|
},
|
|
8
9
|
"homepage": "https://github.com/instruktlabs/kiln",
|
|
9
10
|
"repository": "https://github.com/instruktlabs/kiln",
|
|
@@ -14,5 +15,10 @@
|
|
|
14
15
|
"gltf",
|
|
15
16
|
"asset-generation",
|
|
16
17
|
"gamedev"
|
|
17
|
-
]
|
|
18
|
+
],
|
|
19
|
+
"icon": "./.claude-plugin/icon.png",
|
|
20
|
+
"documentationUrl": "https://github.com/instruktlabs/kiln/tree/main/plugins/kiln-engine",
|
|
21
|
+
"supportUrl": "https://github.com/instruktlabs/kiln/blob/main/plugins/kiln-engine/README.md#support-and-security",
|
|
22
|
+
"privacyPolicyUrl": "https://github.com/instruktlabs/kiln/blob/main/docs/local-plugin-privacy.md",
|
|
23
|
+
"termsOfServiceUrl": "https://github.com/instruktlabs/kiln/blob/main/LICENSE"
|
|
18
24
|
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Kiln local plugin privacy
|
|
2
|
+
|
|
3
|
+
Draft for owner review before directory submission. Updated 7 October 2026.
|
|
4
|
+
|
|
5
|
+
This notice covers the `kiln-engine` local plugin maintained by Instrukt Labs and
|
|
6
|
+
the local workspace it sets up. It does not cover the separate hosted Kiln service
|
|
7
|
+
or your coding assistant's account and conversation history. The local plugin does
|
|
8
|
+
not require a Kiln account, an email address, payment details or a model API key.
|
|
9
|
+
|
|
10
|
+
## What stays on your computer
|
|
11
|
+
|
|
12
|
+
Setup reads its public package/version pin, locates Node and npm, and checks the
|
|
13
|
+
workspace and runtime directories you select. It installs the engine in a persistent
|
|
14
|
+
data directory outside the plugin cache. Paths can contain your device account
|
|
15
|
+
name; paths, package identity and file hashes appear in local configuration,
|
|
16
|
+
installation records and command results returned to your assistant.
|
|
17
|
+
|
|
18
|
+
When adding Kiln to an existing project, setup reads the selected client's
|
|
19
|
+
configuration and records ownership of Kiln's own entries. It preserves unrelated
|
|
20
|
+
settings and existing project instructions. A recoverable setup transaction
|
|
21
|
+
temporarily copies the affected files into private local recovery storage outside
|
|
22
|
+
the project. Those copies can contain credentials already present in the client's
|
|
23
|
+
configuration. They are not uploaded, printed or added to the workspace manifest.
|
|
24
|
+
This storage uses filesystem permissions; Kiln does not encrypt these snapshots.
|
|
25
|
+
|
|
26
|
+
Your workspace and configured asset libraries hold authored JavaScript, material
|
|
27
|
+
files, asset names, metadata, previews and GLBs. Local tools read and write the
|
|
28
|
+
work you ask them to handle and return requested source, images and results to
|
|
29
|
+
your coding assistant. Avoid putting personal or confidential information in a
|
|
30
|
+
source file, asset name or tool argument unless you intend your assistant to see it.
|
|
31
|
+
|
|
32
|
+
The local plugin does not send these assets to an Instrukt Labs service or add
|
|
33
|
+
analytics reporting. Your assistant can send prompts and tool results to its own
|
|
34
|
+
provider. That processing, and any assistant history or backups, follows the
|
|
35
|
+
assistant's settings and privacy policy. Kiln does not control those copies.
|
|
36
|
+
|
|
37
|
+
## Network access and other services
|
|
38
|
+
|
|
39
|
+
- Installing or updating the marketplace/plugin contacts GitHub through your
|
|
40
|
+
coding assistant or Git. Setup downloads the exact engine version and its
|
|
41
|
+
dependencies through npm using `https://registry.npmjs.org`. Those services
|
|
42
|
+
receive download requests and ordinary connection information, including your
|
|
43
|
+
IP address. No asset upload is part of setup.
|
|
44
|
+
- npm runs with lifecycle scripts, audit and funding requests disabled. It can
|
|
45
|
+
still use your existing npm configuration and inherited environment, including
|
|
46
|
+
registry authentication you already configured. Kiln does not request an npm
|
|
47
|
+
login or registry token for this public package, copy credentials into the
|
|
48
|
+
plugin, or promise to strip npm's normal credential configuration. npm also
|
|
49
|
+
writes to its normal cache and log directories.
|
|
50
|
+
- CPU rendering is local. An optional local render service stays on your machine.
|
|
51
|
+
If you explicitly configure a renderer on another machine, Kiln sends the GLB
|
|
52
|
+
and capture settings to that chosen endpoint and uses its configured
|
|
53
|
+
authentication. Review that operator's privacy and retention practices first.
|
|
54
|
+
- Opening documentation, filing a GitHub issue or contacting support uses the
|
|
55
|
+
service you choose. Information in a public issue is public; it is not private
|
|
56
|
+
telemetry from your local workspace.
|
|
57
|
+
|
|
58
|
+
Relevant service policies: [npm](https://docs.npmjs.com/policies/privacy/),
|
|
59
|
+
[GitHub](https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement),
|
|
60
|
+
[Claude](https://www.anthropic.com/legal/privacy) and
|
|
61
|
+
[OpenAI](https://openai.com/policies/privacy-policy/). Other assistants and optional
|
|
62
|
+
renderer operators provide their own policies.
|
|
63
|
+
|
|
64
|
+
## Retention and deletion
|
|
65
|
+
|
|
66
|
+
Local source, saved assets, runtime installations and workspace configuration
|
|
67
|
+
remain until you delete them. Uninstalling the plugin removes neither your assets
|
|
68
|
+
nor its separately installed engine. Plugin updates also leave existing
|
|
69
|
+
workspaces on their installed engine until you request a managed upgrade.
|
|
70
|
+
|
|
71
|
+
Setup removes recovery snapshots after a successful transaction or completed
|
|
72
|
+
recovery. Interrupted setup can leave them until recovery succeeds or you resolve
|
|
73
|
+
the interruption. The default location is
|
|
74
|
+
`%LOCALAPPDATA%/InstruktLabs/Kiln/setup-transactions` on Windows, or
|
|
75
|
+
`$XDG_DATA_HOME/instruktlabs/kiln/setup-transactions` elsewhere, falling back to
|
|
76
|
+
`~/.local/share/instruktlabs/kiln/setup-transactions`. Use the setup helper's
|
|
77
|
+
`--recover` operation before retrying an interrupted change. Do not upload recovery
|
|
78
|
+
files to a public issue or delete them while setup or recovery is active.
|
|
79
|
+
|
|
80
|
+
There is no automatic seven-day expiry for local work; that is a separate hosted
|
|
81
|
+
service policy. Remove selected local work using Kiln's library controls or your
|
|
82
|
+
filesystem, and manage independent exports, backups, npm caches and assistant
|
|
83
|
+
histories through their respective applications. Preserve copies you want before
|
|
84
|
+
deleting a workspace or runtime.
|
|
85
|
+
|
|
86
|
+
## Support and security
|
|
87
|
+
|
|
88
|
+
Contact [support@instruktlabs.com](mailto:support@instruktlabs.com) for privacy
|
|
89
|
+
questions, deletion requests concerning information you sent to support, or
|
|
90
|
+
private security reports. Support receives only what you send, including your
|
|
91
|
+
email address and message. Support mail is forwarded through Cloudflare to the
|
|
92
|
+
maintainer's Google inbox; see [Cloudflare's privacy policy](https://www.cloudflare.com/privacypolicy/)
|
|
93
|
+
and [Google's privacy policy](https://policies.google.com/privacy). We use support
|
|
94
|
+
correspondence to handle the request; this is not an automatic local-plugin alert
|
|
95
|
+
or a mailing-list signup.
|
|
96
|
+
|
|
97
|
+
Do not send passwords, tokens, recovery codes or private assets with a bug report.
|
|
98
|
+
Sanitize logs and paths before posting publicly. Instrukt Labs cannot remotely
|
|
99
|
+
access or erase your local workspace, your assistant's copies or a renderer
|
|
100
|
+
operator's records through this plugin.
|
|
@@ -1,25 +1,110 @@
|
|
|
1
|
-
# Kiln
|
|
1
|
+
# Kiln local plugin
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Plugin version 1.2.0, maintained by Instrukt Labs under the MIT license.
|
|
4
|
+
This plugin pins engine 1.2.0. Registry setup requires that exact version
|
|
5
|
+
to be published. Use a published release tag for normal installation or a reviewed
|
|
6
|
+
local archive for development qualification. The installation ID remains
|
|
7
|
+
`kiln-engine@instruktlabs`.
|
|
4
8
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
Set up Kiln in an existing project or a new asset workspace, then create and revise
|
|
10
|
+
editable 3D assets with your coding agent. Use a supported Node.js installation
|
|
11
|
+
with npm. No Bun, engine checkout, Kiln account or separate model API key is needed.
|
|
12
|
+
The plugin requires a local shell and filesystem; Claude chat and Cowork are not
|
|
13
|
+
supported by this local bundle.
|
|
9
14
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
For Claude Code:
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
claude plugin marketplace add instruktlabs/kiln
|
|
21
|
+
claude plugin install kiln-engine@instruktlabs
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
For Codex:
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
codex plugin marketplace add instruktlabs/kiln
|
|
28
|
+
codex plugin add kiln-engine@instruktlabs
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Restart or reload your coding agent's plugins as its installation message directs.
|
|
32
|
+
Then ask it to set up a Kiln workspace. The maintained setup skill runs this
|
|
33
|
+
plugin's `bin/kiln-setup-workspace.mjs` with Node, installs
|
|
34
|
+
`@instruktlabs/kiln@1.2.0` outside the project and configures your chosen
|
|
35
|
+
workspace. The same initializer supports existing projects and new workspaces.
|
|
36
|
+
|
|
37
|
+
The plugin registers setup only. The workspace supplies authoring skills and one
|
|
38
|
+
local MCP server, `kiln_workspace`. Open Claude Code in that workspace or launch
|
|
39
|
+
Codex there with `codex`. For headless Codex execution, use
|
|
40
|
+
`node codex.mjs "TASK"` with an explicit prompt. Read `.kiln/START.md` after
|
|
41
|
+
adoption or `START.md` in a legacy workspace, accept the host's ordinary trust
|
|
42
|
+
prompts and verify live tool discovery before authoring.
|
|
43
|
+
|
|
44
|
+
## Setup examples
|
|
45
|
+
|
|
46
|
+
1. **Create:** “Set up a new Kiln workspace in an empty directory outside this
|
|
47
|
+
checkout, using my current coding agent. Verify its tools before I author an
|
|
48
|
+
asset.” The installer downloads the pinned engine when needed, creates the
|
|
49
|
+
selected workspace and keeps its engine in a separate runtime store. npm also
|
|
50
|
+
uses its normal cache and log directories.
|
|
51
|
+
2. **Adopt:** “Add Kiln to this project without replacing my instructions or other
|
|
52
|
+
MCP settings. Show the planned changes first.” Use `--adopt --check` to
|
|
53
|
+
preview, then `--adopt` to apply. Read `.kiln/AGENTS.md` alongside the
|
|
54
|
+
project's instructions. Repeat with another supported `--harness` to add
|
|
55
|
+
that integration around the same saved assets. The engine's adapter list is
|
|
56
|
+
included in `runtime.json`; it does not imply this plugin can be installed
|
|
57
|
+
in every listed client. Published engine 1.0.0 does not support adoption.
|
|
58
|
+
3. **Check:** “Check my existing Kiln workspace without changing it.” The helper's
|
|
59
|
+
`--check` mode reports whether managed files and the installed engine are
|
|
60
|
+
current. A missing runtime is reported without installing one.
|
|
61
|
+
4. **Upgrade:** “Upgrade my managed Kiln workspace while preserving my sources,
|
|
62
|
+
saved assets and customizations.” Stop the workspace's harness session first.
|
|
63
|
+
The helper's `--upgrade` mode uses the pinned engine and refuses conflicts
|
|
64
|
+
rather than replacing customized managed files.
|
|
14
65
|
|
|
15
66
|
The engine installation and your assets stay outside the disposable plugin cache.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
67
|
+
Removing or updating the plugin does not delete them. Existing workspaces stay on
|
|
68
|
+
their installed engine until an explicit managed upgrade. Read the
|
|
69
|
+
[setup and upgrade guide](skills/kiln-setup-workspace/references/plugin-install.md)
|
|
70
|
+
for paths, repair and failure recovery.
|
|
71
|
+
|
|
72
|
+
## Execution and network access
|
|
73
|
+
|
|
74
|
+
The setup skill asks your coding agent to execute a bundled Node installer. That
|
|
75
|
+
installer runs npm with lifecycle scripts disabled and invokes Kiln's workspace
|
|
76
|
+
generator. It does this before the workspace MCP server exists; it does not
|
|
77
|
+
silently install a global MCP server or grant itself shell permissions.
|
|
78
|
+
|
|
79
|
+
Adoption and managed project updates temporarily keep recovery copies outside
|
|
80
|
+
the project. Client configuration can already contain credentials, so these
|
|
81
|
+
private copies may too. They are removed after successful setup or recovery;
|
|
82
|
+
interrupted transactions retain them. See [local privacy](PRIVACY.md) for the
|
|
83
|
+
storage location and protection limits. Use `--recover` before retrying an
|
|
84
|
+
interrupted project update.
|
|
85
|
+
|
|
86
|
+
Marketplace installation and updates contact `https://github.com`. First engine
|
|
87
|
+
installation and dependency downloads use `https://registry.npmjs.org`. npm can
|
|
88
|
+
use your existing npm configuration and environment. No npm login or token is
|
|
89
|
+
required for this public package. Normal local asset work does not upload your
|
|
90
|
+
assets to Instrukt Labs. Tool results can enter your coding assistant's model
|
|
91
|
+
context; its provider handles those copies.
|
|
92
|
+
|
|
93
|
+
CPU rendering is local. Material appearance needs a compatible local renderer or
|
|
94
|
+
one you explicitly configure on another machine; a remote renderer receives the
|
|
95
|
+
GLB and requested capture settings. Follow the setup skill's renderer checks.
|
|
96
|
+
The separate hosted Kiln integration has its own authentication and privacy notice.
|
|
97
|
+
|
|
98
|
+
## Support and security
|
|
99
|
+
|
|
100
|
+
Send private security or privacy questions to
|
|
101
|
+
[support@instruktlabs.com](mailto:support@instruktlabs.com). Never include
|
|
102
|
+
passwords, tokens, recovery codes or private assets in public issues. For a normal
|
|
103
|
+
bug report, provide the plugin and engine versions, operating system and a small
|
|
104
|
+
sanitized reproduction at [GitHub issues](https://github.com/instruktlabs/kiln/issues).
|
|
19
105
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
Hosted ChatGPT access is a separate integration, and this local bundle is not a
|
|
23
|
-
public OpenAI directory submission.
|
|
106
|
+
If setup fails, retain the error, check Node/npm and network access, and follow the
|
|
107
|
+
setup guide. Do not delete an unfamiliar runtime or another installer's lock.
|
|
24
108
|
|
|
25
|
-
[
|
|
109
|
+
[Local privacy notice](PRIVACY.md) · [MIT license](LICENSE) ·
|
|
110
|
+
[Source](https://github.com/instruktlabs/kiln)
|