diff --git a/frontend/src/lib/common.ts b/frontend/src/lib/common.ts
index 9bd03af131..64e7fb762f 100644
--- a/frontend/src/lib/common.ts
+++ b/frontend/src/lib/common.ts
@@ -26,9 +26,10 @@ export interface SchemaProperty {
contentEncoding?: 'base64' | 'binary'
format?: string
items?: {
- type?: 'string' | 'number' | 'bytes' | 'object'
+ type?: 'string' | 'number' | 'bytes' | 'object' | 'resource'
contentEncoding?: 'base64'
enum?: string[]
+ resourceType?: string
}
min?: number
max?: number
diff --git a/frontend/src/lib/components/ArgInput.svelte b/frontend/src/lib/components/ArgInput.svelte
index a1b7edc7a1..85c7f70491 100644
--- a/frontend/src/lib/components/ArgInput.svelte
+++ b/frontend/src/lib/components/ArgInput.svelte
@@ -47,12 +47,14 @@
export let disabled = false
export let itemsType:
| {
- type?: 'string' | 'number' | 'bytes' | 'object'
+ type?: 'string' | 'number' | 'bytes' | 'object' | 'resource'
contentEncoding?: 'base64'
enum?: string[]
multiselect?: string[]
+ resourceType?: string
}
| undefined = undefined
+
export let displayHeader = true
export let properties: { [name: string]: SchemaProperty } | undefined = undefined
export let nestedRequired: string[] | undefined = undefined
@@ -372,7 +374,7 @@
on:change={(x) => fileChanged(x, (val) => (value[i] = val))}
multiple={false}
/>
- {:else if itemsType?.type == 'object'}
+ {:else if itemsType?.type == 'object' && itemsType?.resourceType === undefined}
{:else if Array.isArray(itemsType?.enum)}
+ {:else if itemsType?.type == 'resource' && itemsType?.resourceType}
+
{:else}
{/if}
diff --git a/frontend/src/lib/components/ArrayTypeNarrowing.svelte b/frontend/src/lib/components/ArrayTypeNarrowing.svelte
index 49449d00b2..b3be754331 100644
--- a/frontend/src/lib/components/ArrayTypeNarrowing.svelte
+++ b/frontend/src/lib/components/ArrayTypeNarrowing.svelte
@@ -3,16 +3,21 @@
import { Button } from './common'
import { fade } from 'svelte/transition'
import Label from './Label.svelte'
+ import ResourceTypePicker from './ResourceTypePicker.svelte'
+ import Badge from './common/badge/Badge.svelte'
+ import Alert from './common/alert/Alert.svelte'
+ export let canEditResourceType: boolean = false
export let itemsType:
| {
- type?: 'string' | 'number' | 'bytes' | 'object'
+ type?: 'string' | 'number' | 'bytes' | 'object' | 'resource'
contentEncoding?: 'base64'
enum?: string[]
+ resourceType?: string
}
| undefined
- let selected: 'string' | 'number' | 'object' | 'bytes' | 'enum' | undefined =
+ let selected: 'string' | 'number' | 'object' | 'bytes' | 'enum' | 'resource' | undefined =
itemsType?.type != 'string'
? itemsType?.type
: Array.isArray(itemsType?.enum)
@@ -20,33 +25,62 @@
: 'string'
-
+ The value passed is the path of the resource, not the resource itself. You can use the SDK to
+ get the resource by using the path.
+
+{/if}
+
+{#if canEditResourceType && itemsType?.type == 'resource'}
+
+{/if}
+
{#if Array.isArray(itemsType?.enum)}
Enums
diff --git a/frontend/src/lib/components/LightweightArgInput.svelte b/frontend/src/lib/components/LightweightArgInput.svelte
index 70d7ffcfc4..6b9c2d5384 100644
--- a/frontend/src/lib/components/LightweightArgInput.svelte
+++ b/frontend/src/lib/components/LightweightArgInput.svelte
@@ -40,10 +40,11 @@
export let enum_: EnumType = undefined
export let itemsType:
| {
- type?: 'string' | 'number' | 'bytes' | 'object'
+ type?: 'string' | 'number' | 'bytes' | 'object' | 'resource'
contentEncoding?: 'base64'
enum?: string[]
multiselect?: string[]
+ resourceType?: string
}
| undefined = undefined
export let displayHeader = true
@@ -329,6 +330,11 @@
{/each}
+ {:else if itemsType?.type == 'resource' && itemsType?.resourceType}
+
{:else}
{/if}
diff --git a/frontend/src/lib/components/schema/PropertyEditor.svelte b/frontend/src/lib/components/schema/PropertyEditor.svelte
index a96221ee97..ac1ac8f933 100644
--- a/frontend/src/lib/components/schema/PropertyEditor.svelte
+++ b/frontend/src/lib/components/schema/PropertyEditor.svelte
@@ -34,9 +34,10 @@
export let order: string[] | undefined = undefined
export let itemsType:
| {
- type?: 'string' | 'number' | 'bytes' | 'object'
+ type?: 'string' | 'number' | 'bytes' | 'object' | 'resource'
contentEncoding?: 'base64'
enum?: string[]
+ resourceType?: string
multiselect?: string[]
}
| undefined = undefined
@@ -157,7 +158,7 @@
{#if type == 'array'}
-
+
{:else if type == 'string' || ['number', 'integer', 'object'].includes(type ?? '')}
diff --git a/frontend/src/lib/inferArgSig.ts b/frontend/src/lib/inferArgSig.ts
index ec4fcdd819..302427c671 100644
--- a/frontend/src/lib/inferArgSig.ts
+++ b/frontend/src/lib/inferArgSig.ts
@@ -101,6 +101,8 @@ export function argSigToJsonSchemaType(
newS.items = { type: 'string' }
} else if (t.list && typeof t.list == 'object' && 'str' in t.list) {
newS.items = { type: 'string', enum: t.list.str }
+ } else if (t.list && typeof t.list == 'object' && 'resource' in t.list && t.list.resource) {
+ newS.items = { type: 'resource', resourceType: t.list.resource as string }
} else {
newS.items = { type: 'object' }
}